From ee5be0735bfdd5dec79c1ddf16d50b67027d47f4 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 30 Oct 2021 10:00:46 -0400 Subject: [PATCH 01/74] Set up development container --- .devcontainer/Dockerfile | 30 ++++++++++++++++++++++++++++++ .devcontainer/devcontainer.json | 6 ++++++ 2 files changed, 36 insertions(+) create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/devcontainer.json diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..ef657c5 --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,30 @@ +ARG UBUNTU_TAG=20.04 +FROM ubuntu:"$UBUNTU_TAG" + +ENV LANG=C.UTF-8 +RUN \ + apt-get update && \ + apt-get install --assume-yes curl gcc git libgmp-dev libtinfo-dev make sudo + +ARG GHCUP_VERSION=0.1.17.3 +RUN \ + curl --output /usr/local/bin/ghcup "https://downloads.haskell.org/~ghcup/$GHCUP_VERSION/x86_64-linux-ghcup-$GHCUP_VERSION" && \ + chmod +x /usr/local/bin/ghcup && \ + ghcup --version + +ARG USER_NAME=haskell +RUN \ + useradd --create-home --shell "$( which bash )" "$USER_NAME" && \ + echo "$USER_NAME ALL=(ALL) NOPASSWD: ALL" | tee "/etc/sudoers.d/$USER_NAME" +USER "$USER_NAME" +ENV PATH="/home/$USER_NAME/.cabal/bin:/home/$USER_NAME/.ghcup/bin:$PATH" + +ARG GHC_VERSION=9.2.1 +RUN \ + ghcup install ghc "$GHC_VERSION" --set && \ + ghc --version + +ARG CABAL_VERSION=3.6.2.0 +RUN \ + ghcup install cabal "$CABAL_VERSION" --set && \ + cabal --version diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..582acff --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,6 @@ +{ + "build": { + "dockerfile": "Dockerfile" + }, + "postCreateCommand": "cabal update" +} -- 2.30.2 From 9940aa4ae540b755f5efafb3b2a4118ba6eaafa8 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 30 Oct 2021 14:48:37 +0000 Subject: [PATCH 02/74] Get a working build plan --- .devcontainer/Dockerfile | 7 +++++- .github/workflows/ci.yaml | 48 +++++++++++++-------------------------- .gitignore | 3 ++- brittany.cabal | 6 ++--- cabal.project | 12 ++++++++++ 5 files changed, 39 insertions(+), 37 deletions(-) create mode 100644 cabal.project diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index ef657c5..2328b4d 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -19,7 +19,7 @@ RUN \ USER "$USER_NAME" ENV PATH="/home/$USER_NAME/.cabal/bin:/home/$USER_NAME/.ghcup/bin:$PATH" -ARG GHC_VERSION=9.2.1 +ARG GHC_VERSION=9.0.1 RUN \ ghcup install ghc "$GHC_VERSION" --set && \ ghc --version @@ -28,3 +28,8 @@ ARG CABAL_VERSION=3.6.2.0 RUN \ ghcup install cabal "$CABAL_VERSION" --set && \ cabal --version + +ARG HLS_VERSION=1.4.0 +RUN \ + ghcup install hls "$HLS_VERSION" --set && \ + haskell-language-server-wrapper --version diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 466e206..0189cb7 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -2,38 +2,34 @@ name: CI on: pull_request: branches: - - master + - main push: branches: - - master + - main jobs: build: strategy: fail-fast: false matrix: os: - - macos-10.15 - - ubuntu-18.04 + - macos-11 + - ubuntu-20.04 - windows-2019 ghc: - - 8.10.2 + - 9.0.1 cabal: - - 3.2.0.0 - include: - - os: ubuntu-18.04 - ghc: 8.8.4 - cabal: 3.2.0.0 - - os: ubuntu-18.04 - ghc: 8.6.5 - cabal: 3.2.0.0 + - 3.6.2.0 runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v2 + - run: mkdir artifact + - run: mkdir artifact/${{ matrix.os }} - id: setup-haskell - uses: actions/setup-haskell@v1 + uses: haskell/actions/setup@v1 with: ghc-version: ${{ matrix.ghc }} cabal-version: ${{ matrix.cabal }} + - run: cabal configure --enable-tests - run: cabal freeze - run: cat cabal.project.freeze - uses: actions/cache@v2 @@ -43,24 +39,12 @@ jobs: restore-keys: | ${{ matrix.os }}-${{ matrix.ghc }}-${{ matrix.cabal }}- ${{ matrix.os }}-${{ matrix.ghc }}- + - run: cabal build + - run: cabal install --installdir artifact/${{ matrix.os }} --install-method copy - run: cabal test --test-show-details direct - - run: cabal install --installdir output --install-method copy - - run: strip output/brittany* + - run: cabal check + - run: cabal sdist --output-dir artifact/${{ matrix.os }} - uses: actions/upload-artifact@v2 with: - path: output/brittany* - name: brittany-${{ matrix.os }}-ghc-${{ matrix.ghc }}-${{ github.sha }} - - if: matrix.os == 'ubuntu-18.04' && matrix.ghc == '8.10.2' - uses: actions/upload-artifact@v2 - with: - path: dist-newstyle/sdist/brittany-*.tar.gz - name: brittany-${{ github.sha }}.tar.gz - - run: cabal check - - - nix: - runs-on: ubuntu-latest - steps: - - uses: cachix/install-nix-action@v12 - - uses: actions/checkout@v2 - - run: nix-build + path: artifact + name: brittany-${{ github.sha }} diff --git a/.gitignore b/.gitignore index 4cdb828..f04e47c 100644 --- a/.gitignore +++ b/.gitignore @@ -10,7 +10,8 @@ local/ .cabal-sandbox/ .stack-work/ cabal.sandbox.config -cabal.project.local +cabal.project.local* +cabal.project.freeze .ghc.environment.* result .stack-work* diff --git a/brittany.cabal b/brittany.cabal index fa058f4..f533c7f 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -91,8 +91,8 @@ library { -fno-warn-redundant-constraints } build-depends: - { base >=4.12 && <4.15 - , ghc >=8.6.1 && <8.11 + { base >=4.12 && <4.16 + , ghc >=8.6.1 && <8.11 || >=9.0.1 && <9.1 , ghc-paths >=0.1.0.9 && <0.2 , ghc-exactprint >=0.5.8 && <0.6.5 , transformers >=0.5.2.0 && <0.6 @@ -118,7 +118,7 @@ library { , semigroups >=0.18.2 && <0.20 , cmdargs >=0.10.14 && <0.11 , czipwith >=1.0.1.0 && <1.1 - , ghc-boot-th >=8.6.1 && <8.11 + , ghc-boot-th >=8.6.1 && <8.11 || >=9.0.1 && <9.1 , filepath >=1.4.1.0 && <1.5 , random >= 1.1 && <1.3 } diff --git a/cabal.project b/cabal.project new file mode 100644 index 0000000..6d724ea --- /dev/null +++ b/cabal.project @@ -0,0 +1,12 @@ +packages: . + +allow-newer: + , butcher:base + , data-tree-print:base + , multistate:base + +-- https://github.com/lspitzner/czipwith/pull/2 +source-repository-package + type: git + location: https://github.com/mithrandi/czipwith + tag: b6245884ae83e00dd2b5261762549b37390179f8 -- 2.30.2 From abba8668f70a8f501c7a8f47c3a5383ddec34dcf Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 30 Oct 2021 14:49:03 +0000 Subject: [PATCH 03/74] Sort dependencies --- brittany.cabal | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/brittany.cabal b/brittany.cabal index f533c7f..c36814a 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -92,35 +92,35 @@ library { } build-depends: { base >=4.12 && <4.16 - , ghc >=8.6.1 && <8.11 || >=9.0.1 && <9.1 - , ghc-paths >=0.1.0.9 && <0.2 - , ghc-exactprint >=0.5.8 && <0.6.5 - , transformers >=0.5.2.0 && <0.6 - , containers >=0.5.7.1 && <0.7 - , mtl >=2.2.1 && <2.3 - , text >=1.2 && <1.3 - , multistate >=0.7.1.1 && <0.9 - , syb >=0.6 && <0.8 - , data-tree-print - , pretty >=1.1.3.3 && <1.2 - , bytestring >=0.10.8.1 && <0.11 - , directory >=1.2.6.2 && <1.4 - , butcher >=1.3.1 && <1.4 - , yaml >=0.8.18 && <0.12 , aeson >=1.0.1.0 && <1.6 - , extra >=1.4.10 && <1.8 - , uniplate >=1.6.12 && <1.7 - , strict >=0.3.2 && <0.5 - , monad-memo >=0.4.1 && <0.6 - , unsafe >=0.0 && <0.1 - , safe >=0.3.9 && <0.4 - , deepseq >=1.4.2.0 && <1.5 - , semigroups >=0.18.2 && <0.20 + , butcher >=1.3.1 && <1.4 + , bytestring >=0.10.8.1 && <0.11 , cmdargs >=0.10.14 && <0.11 + , containers >=0.5.7.1 && <0.7 , czipwith >=1.0.1.0 && <1.1 - , ghc-boot-th >=8.6.1 && <8.11 || >=9.0.1 && <9.1 + , data-tree-print + , deepseq >=1.4.2.0 && <1.5 + , directory >=1.2.6.2 && <1.4 + , extra >=1.4.10 && <1.8 , filepath >=1.4.1.0 && <1.5 + , ghc >=8.6.1 && <8.11 || >=9.0.1 && <9.1 + , ghc-boot-th >=8.6.1 && <8.11 || >=9.0.1 && <9.1 + , ghc-exactprint >=0.5.8 && <0.6.5 + , ghc-paths >=0.1.0.9 && <0.2 + , monad-memo >=0.4.1 && <0.6 + , mtl >=2.2.1 && <2.3 + , multistate >=0.7.1.1 && <0.9 + , pretty >=1.1.3.3 && <1.2 , random >= 1.1 && <1.3 + , safe >=0.3.9 && <0.4 + , semigroups >=0.18.2 && <0.20 + , strict >=0.3.2 && <0.5 + , syb >=0.6 && <0.8 + , text >=1.2 && <1.3 + , transformers >=0.5.2.0 && <0.6 + , uniplate >=1.6.12 && <1.7 + , unsafe >=0.0 && <0.1 + , yaml >=0.8.18 && <0.12 } default-extensions: { CPP -- 2.30.2 From 7bd98ffb1c0c3265cba0af857ad1a04fb9d3a0dc Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 30 Oct 2021 15:02:35 +0000 Subject: [PATCH 04/74] Upgrade dependencies and tighten bounds --- brittany.cabal | 62 +++++++++++++++++++++++++------------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/brittany.cabal b/brittany.cabal index c36814a..000c2bc 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -16,7 +16,7 @@ copyright: Copyright (C) 2016-2019 Lennart Spitzner Copyright (C) 2019 PRODA LTD category: Language build-type: Simple -cabal-version: 1.18 +cabal-version: 2.0 homepage: https://github.com/lspitzner/brittany/ bug-reports: https://github.com/lspitzner/brittany/issues extra-doc-files: { @@ -91,36 +91,36 @@ library { -fno-warn-redundant-constraints } build-depends: - { base >=4.12 && <4.16 - , aeson >=1.0.1.0 && <1.6 - , butcher >=1.3.1 && <1.4 - , bytestring >=0.10.8.1 && <0.11 - , cmdargs >=0.10.14 && <0.11 - , containers >=0.5.7.1 && <0.7 - , czipwith >=1.0.1.0 && <1.1 - , data-tree-print - , deepseq >=1.4.2.0 && <1.5 - , directory >=1.2.6.2 && <1.4 - , extra >=1.4.10 && <1.8 - , filepath >=1.4.1.0 && <1.5 - , ghc >=8.6.1 && <8.11 || >=9.0.1 && <9.1 - , ghc-boot-th >=8.6.1 && <8.11 || >=9.0.1 && <9.1 - , ghc-exactprint >=0.5.8 && <0.6.5 - , ghc-paths >=0.1.0.9 && <0.2 - , monad-memo >=0.4.1 && <0.6 - , mtl >=2.2.1 && <2.3 - , multistate >=0.7.1.1 && <0.9 - , pretty >=1.1.3.3 && <1.2 - , random >= 1.1 && <1.3 - , safe >=0.3.9 && <0.4 - , semigroups >=0.18.2 && <0.20 - , strict >=0.3.2 && <0.5 - , syb >=0.6 && <0.8 - , text >=1.2 && <1.3 - , transformers >=0.5.2.0 && <0.6 - , uniplate >=1.6.12 && <1.7 - , unsafe >=0.0 && <0.1 - , yaml >=0.8.18 && <0.12 + { base ^>= 4.15.0 + , aeson ^>= 2.0.1 + , butcher ^>= 1.3.3 + , bytestring ^>= 0.10.12 + , cmdargs ^>= 0.10.21 + , containers ^>= 0.6.4 + , czipwith ^>= 1.0.1 + , data-tree-print ^>= 0.1.0 + , deepseq ^>= 1.4.5 + , directory ^>= 1.3.6 + , extra ^>= 1.7.10 + , filepath ^>= 1.4.2 + , ghc ^>= 9.0.1 + , ghc-boot-th ^>= 9.0.1 + , ghc-exactprint ^>= 0.6.4 + , ghc-paths ^>= 0.1.0 + , monad-memo ^>= 0.5.3 + , mtl ^>= 2.2.2 + , multistate ^>= 0.8.0 + , pretty ^>= 1.1.3 + , random ^>= 1.2.1 + , safe ^>= 0.3.19 + , semigroups ^>= 0.19.2 + , strict ^>= 0.4.0 + , syb ^>= 0.7.2 + , text ^>= 1.2.5 + , transformers ^>= 0.5.6 + , uniplate ^>= 1.6.13 + , unsafe ^>= 0.0 + , yaml ^>= 0.11.7 } default-extensions: { CPP -- 2.30.2 From 116930ac2b6f815964fa04b609f3ce410a24d1d6 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 30 Oct 2021 16:20:13 +0000 Subject: [PATCH 05/74] Get everything building with (only) GHC 9.0 --- .vscode/extensions.json | 5 + src/Language/Haskell/Brittany/Internal.hs | 47 ++++------ .../Haskell/Brittany/Internal/Config/Types.hs | 14 +-- .../Internal/Config/Types/Instances.hs | 22 ++--- .../Brittany/Internal/ExactPrintUtils.hs | 50 ++++------ .../Brittany/Internal/LayouterBasics.hs | 14 +-- .../Brittany/Internal/Layouters/DataDecl.hs | 32 +++---- .../Brittany/Internal/Layouters/Decl.hs | 58 +++--------- .../Brittany/Internal/Layouters/Expr.hs | 91 ++----------------- .../Brittany/Internal/Layouters/Expr.hs-boot | 6 +- .../Haskell/Brittany/Internal/Layouters/IE.hs | 13 +-- .../Brittany/Internal/Layouters/Import.hs | 25 ++--- .../Brittany/Internal/Layouters/Module.hs | 19 ++-- .../Brittany/Internal/Layouters/Pattern.hs | 42 +++------ .../Brittany/Internal/Layouters/Stmt.hs | 14 +-- .../Brittany/Internal/Layouters/Stmt.hs-boot | 10 +- .../Brittany/Internal/Layouters/Type.hs | 40 +++----- .../Haskell/Brittany/Internal/Prelude.hs | 18 +--- .../Haskell/Brittany/Internal/Utils.hs | 20 +--- src/Language/Haskell/Brittany/Main.hs | 4 +- 20 files changed, 162 insertions(+), 382 deletions(-) create mode 100644 .vscode/extensions.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..8c8df54 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "haskell.haskell" + ] +} diff --git a/src/Language/Haskell/Brittany/Internal.hs b/src/Language/Haskell/Brittany/Internal.hs index 8489136..8c22c8d 100644 --- a/src/Language/Haskell/Brittany/Internal.hs +++ b/src/Language/Haskell/Brittany/Internal.hs @@ -53,21 +53,17 @@ import Language.Haskell.Brittany.Internal.Transformations.Indent import qualified GHC as GHC hiding ( parseModule ) -import ApiAnnotation ( AnnKeywordId(..) ) +import GHC.Parser.Annotation ( AnnKeywordId(..) ) import GHC ( Located , runGhc , GenLocated(L) , moduleNameString ) -import RdrName ( RdrName(..) ) -import SrcLoc ( SrcSpan ) -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ +import GHC.Types.Name.Reader ( RdrName(..) ) +import GHC.Types.SrcLoc ( SrcSpan ) import GHC.Hs -import Bag -#else -import HsSyn -#endif -import qualified DynFlags as GHC +import GHC.Data.Bag +import qualified GHC.Driver.Session as GHC import qualified GHC.LanguageExtensions.Type as GHC import Data.Char ( isSpace ) @@ -226,7 +222,7 @@ extractCommentConfigs anns (TopLevelDeclNameMap declNameMap) = do getTopLevelDeclNameMap :: GHC.ParsedSource -> TopLevelDeclNameMap -getTopLevelDeclNameMap (L _ (HsModule _name _exports _ decls _ _)) = +getTopLevelDeclNameMap (L _ (HsModule _ _name _exports _ decls _ _)) = TopLevelDeclNameMap $ Map.fromList [ (ExactPrint.mkAnnKey decl, name) | decl <- decls @@ -385,11 +381,7 @@ parsePrintModuleTests conf filename input = do let inputStr = Text.unpack input parseResult <- ExactPrint.Parsers.parseModuleFromString filename inputStr case parseResult of -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ Left err -> return $ Left $ "parsing error: " ++ show (bagToList (show <$> err)) -#else - Left (_ , s ) -> return $ Left $ "parsing error: " ++ s -#endif Right (anns, parsedModule) -> runExceptT $ do (inlineConf, perItemConf) <- case extractCommentConfigs anns (getTopLevelDeclNameMap parsedModule) of @@ -460,8 +452,8 @@ toLocal conf anns m = do MultiRWSS.mGetRawW >>= \w -> MultiRWSS.mPutRawW (w `mappend` write) pure x -ppModule :: GenLocated SrcSpan (HsModule GhcPs) -> PPM () -ppModule lmod@(L _loc _m@(HsModule _name _exports _ decls _ _)) = do +ppModule :: GenLocated SrcSpan HsModule -> PPM () +ppModule lmod@(L _loc _m@(HsModule _ _name _exports _ decls _ _)) = do post <- ppPreamble lmod decls `forM_` \decl -> do let declAnnKey = ExactPrint.mkAnnKey decl @@ -505,10 +497,10 @@ ppModule lmod@(L _loc _m@(HsModule _name _exports _ decls _ _)) = do (ExactPrint.AnnComment (ExactPrint.Comment cmStr _ _), l) -> do ppmMoveToExactLoc l mTell $ Text.Builder.fromString cmStr - (ExactPrint.G AnnEofPos, (ExactPrint.DP (eofZ, eofX))) -> + (ExactPrint.G _, (ExactPrint.DP (eofZ, eofX))) -> let folder (acc, _) (kw, ExactPrint.DP (y, x)) = case kw of ExactPrint.AnnComment cm - | GHC.RealSrcSpan span <- ExactPrint.commentIdentifier cm + | span <- ExactPrint.commentIdentifier cm -> ( acc + y + GHC.srcSpanEndLine span - GHC.srcSpanStartLine span , x + GHC.srcSpanEndCol span - GHC.srcSpanStartCol span ) @@ -520,16 +512,16 @@ ppModule lmod@(L _loc _m@(HsModule _name _exports _ decls _ _)) = do getDeclBindingNames :: LHsDecl GhcPs -> [String] getDeclBindingNames (L _ decl) = case decl of SigD _ (TypeSig _ ns _) -> ns <&> \(L _ n) -> Text.unpack (rdrNameToText n) - ValD _ (FunBind _ (L _ n) _ _ _) -> [Text.unpack $ rdrNameToText n] + ValD _ (FunBind _ (L _ n) _ _) -> [Text.unpack $ rdrNameToText n] _ -> [] -- Prints the information associated with the module annotation -- This includes the imports ppPreamble - :: GenLocated SrcSpan (HsModule GhcPs) + :: GenLocated SrcSpan HsModule -> PPM [(ExactPrint.KeywordId, ExactPrint.DeltaPos)] -ppPreamble lmod@(L loc m@(HsModule _ _ _ _ _ _)) = do +ppPreamble lmod@(L loc m@(HsModule _ _ _ _ _ _ _)) = do filteredAnns <- mAsk <&> \annMap -> Map.findWithDefault Map.empty (ExactPrint.mkAnnKey lmod) annMap -- Since ghc-exactprint adds annotations following (implicit) @@ -550,15 +542,10 @@ ppPreamble lmod@(L loc m@(HsModule _ _ _ _ _ _)) = do modAnnsDp = ExactPrint.annsDP mAnn isWhere (ExactPrint.G AnnWhere) = True isWhere _ = False - isEof (ExactPrint.G AnnEofPos) = True - isEof _ = False whereInd = List.findIndex (isWhere . fst) modAnnsDp - eofInd = List.findIndex (isEof . fst) modAnnsDp - (pre, post') = case (whereInd, eofInd) of - (Nothing, Nothing) -> ([], modAnnsDp) - (Just i , Nothing) -> List.splitAt (i + 1) modAnnsDp - (Nothing, Just _i) -> ([], modAnnsDp) - (Just i , Just j ) -> List.splitAt (min (i + 1) j) modAnnsDp + (pre, post') = case whereInd of + Nothing -> ([], modAnnsDp) + Just i -> List.splitAt (i + 1) modAnnsDp mAnn' = mAnn { ExactPrint.annsDP = pre } filteredAnns'' = Map.insert (ExactPrint.mkAnnKey lmod) mAnn' filteredAnns @@ -585,7 +572,7 @@ _sigHead = \case _bindHead :: HsBind GhcPs -> String _bindHead = \case - FunBind _ fId _ _ [] -> "FunBind " ++ (Text.unpack $ lrdrNameToText $ fId) + FunBind _ fId _ [] -> "FunBind " ++ (Text.unpack $ lrdrNameToText $ fId) PatBind _ _pat _ ([], []) -> "PatBind smth" _ -> "unknown bind" diff --git a/src/Language/Haskell/Brittany/Internal/Config/Types.hs b/src/Language/Haskell/Brittany/Internal/Config/Types.hs index c5d8eb0..46b2ba1 100644 --- a/src/Language/Haskell/Brittany/Internal/Config/Types.hs +++ b/src/Language/Haskell/Brittany/Internal/Config/Types.hs @@ -340,16 +340,16 @@ data ExactPrintFallbackMode -- A PROGRAM BY TRANSFORMING IT. deriving (Show, Generic, Data) -instance CFunctor CDebugConfig -instance CFunctor CLayoutConfig -instance CFunctor CErrorHandlingConfig -instance CFunctor CForwardOptions -instance CFunctor CPreProcessorConfig -instance CFunctor CConfig - deriveCZipWith ''CDebugConfig deriveCZipWith ''CLayoutConfig deriveCZipWith ''CErrorHandlingConfig deriveCZipWith ''CForwardOptions deriveCZipWith ''CPreProcessorConfig deriveCZipWith ''CConfig + +instance CFunctor CDebugConfig +instance CFunctor CLayoutConfig +instance CFunctor CErrorHandlingConfig +instance CFunctor CForwardOptions +instance CFunctor CPreProcessorConfig +instance CFunctor CConfig diff --git a/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs b/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs index 74dfe0e..7bf38f4 100644 --- a/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs +++ b/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs @@ -21,6 +21,7 @@ where #include "prelude.inc" import Data.Yaml +import qualified Data.Aeson.Key as Key import qualified Data.Aeson.Types as Aeson import Language.Haskell.Brittany.Internal.Config.Types @@ -113,18 +114,17 @@ makeToJSONMaybe(CConfig) -- config file content. instance FromJSON (CConfig Maybe) where parseJSON (Object v) = Config - <$> v .:? Text.pack "conf_version" - <*> v .:?= Text.pack "conf_debug" - <*> v .:?= Text.pack "conf_layout" - <*> v .:?= Text.pack "conf_errorHandling" - <*> v .:?= Text.pack "conf_forward" - <*> v .:?= Text.pack "conf_preprocessor" - <*> v .:? Text.pack "conf_roundtrip_exactprint_only" - <*> v .:? Text.pack "conf_disable_formatting" - <*> v .:? Text.pack "conf_obfuscate" + <$> v .:? Key.fromString "conf_version" + <*> v .:?= Key.fromString "conf_debug" + <*> v .:?= Key.fromString "conf_layout" + <*> v .:?= Key.fromString "conf_errorHandling" + <*> v .:?= Key.fromString "conf_forward" + <*> v .:?= Key.fromString "conf_preprocessor" + <*> v .:? Key.fromString "conf_roundtrip_exactprint_only" + <*> v .:? Key.fromString "conf_disable_formatting" + <*> v .:? Key.fromString "conf_obfuscate" parseJSON invalid = Aeson.typeMismatch "Config" invalid -- Pretends that the value is {} when the key is not present. -(.:?=) :: FromJSON a => Object -> Text -> Parser a +(.:?=) :: FromJSON a => Object -> Key.Key -> Parser a o .:?= k = o .:? k >>= maybe (parseJSON (Aeson.object [])) pure - diff --git a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs index 9992dfd..2f9aba6 100644 --- a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs +++ b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs @@ -20,27 +20,22 @@ import Language.Haskell.Brittany.Internal.Utils import Data.Data import Data.HList.HList -import DynFlags ( getDynFlags ) +import GHC.Driver.Session ( getDynFlags ) import GHC ( runGhc, GenLocated(L), moduleNameString ) -import qualified DynFlags as GHC +import qualified GHC.Driver.Session 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 qualified CmdLineParser as GHC +import qualified GHC.Parser as GHC +import qualified GHC.Types.SrcLoc as GHC +import qualified GHC.Data.FastString as GHC +import qualified GHC.Parser.Lexer as GHC +import qualified GHC.Data.StringBuffer as GHC +import qualified GHC.Utils.Outputable as GHC +import qualified GHC.Driver.CmdLine as GHC -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ import GHC.Hs -import Bag -#else -import HsSyn -#endif +import GHC.Data.Bag -import SrcLoc ( SrcSpan, Located ) +import GHC.Types.SrcLoc ( SrcSpan, Located ) import qualified Language.Haskell.GHC.ExactPrint as ExactPrint @@ -96,11 +91,7 @@ parseModuleWithCpp cpp opts args fp dynCheck = ++ show (warnings <&> warnExtractorCompat) x <- ExceptT.ExceptT $ liftIO $ dynCheck dflags2 res <- lift $ ExactPrint.parseModuleApiAnnsWithCppInternal cpp dflags2 fp -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ either (\err -> ExceptT.throwE $ "transform error: " ++ show (bagToList (show <$> err))) -#else - either (\(span, err) -> ExceptT.throwE $ show span ++ ": " ++ err) -#endif (\(a, m) -> pure (a, m, x)) $ ExactPrint.postParseTransform res opts @@ -133,11 +124,7 @@ parseModuleFromString args fp dynCheck str = dynCheckRes <- ExceptT.ExceptT $ liftIO $ dynCheck dflags1 let res = ExactPrint.parseModuleFromStringInternal dflags1 fp str case res of -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ Left err -> ExceptT.throwE $ "parse error: " ++ show (bagToList (show <$> err)) -#else - Left (span, err) -> ExceptT.throwE $ showOutputable span ++ ": " ++ err -#endif Right (a , m ) -> pure (a, m, dynCheckRes) @@ -153,7 +140,7 @@ commentAnnFixTransformGlob ast = do annsMap = Map.fromListWith (flip const) [ (GHC.realSrcSpanEnd span, annKey) - | (GHC.RealSrcSpan span, annKey) <- Foldable.toList nodes + | (GHC.RealSrcSpan span _, annKey) <- Foldable.toList nodes ] nodes `forM_` (snd .> processComs annsMap) where @@ -168,9 +155,8 @@ commentAnnFixTransformGlob ast = do :: (ExactPrint.Comment, ExactPrint.DeltaPos) -> ExactPrint.TransformT Identity Bool processCom comPair@(com, _) = - case GHC.srcSpanStart $ ExactPrint.commentIdentifier com of - GHC.UnhelpfulLoc{} -> return True -- retain comment at current node. - GHC.RealSrcLoc comLoc -> case Map.lookupLE comLoc annsMap of + case GHC.realSrcSpanStart $ ExactPrint.commentIdentifier com of + comLoc -> case Map.lookupLE comLoc annsMap of Just (_, annKey2) | loc1 /= loc2 -> case (con1, con2) of (ExactPrint.CN "RecordCon", ExactPrint.CN "HsRecField") -> move $> False @@ -179,8 +165,8 @@ commentAnnFixTransformGlob ast = do where ExactPrint.AnnKey annKeyLoc1 con1 = annKey1 ExactPrint.AnnKey annKeyLoc2 con2 = annKey2 - loc1 = GHC.srcSpanStart annKeyLoc1 - loc2 = GHC.srcSpanStart annKeyLoc2 + loc1 = GHC.realSrcSpanStart annKeyLoc1 + loc2 = GHC.realSrcSpanStart annKeyLoc2 move = ExactPrint.modifyAnnsT $ \anns -> let ann2 = Data.Maybe.fromJust $ Map.lookup annKey2 anns @@ -271,12 +257,12 @@ moveTrailingComments astFrom astTo = do -- elements to the relevant annotations. Avoids quadratic behaviour a trivial -- implementation would have. extractToplevelAnns - :: Located (HsModule GhcPs) + :: Located HsModule -> ExactPrint.Anns -> Map ExactPrint.AnnKey ExactPrint.Anns extractToplevelAnns lmod anns = output where - (L _ (HsModule _ _ _ ldecls _ _)) = lmod + (L _ (HsModule _ _ _ _ ldecls _ _)) = lmod declMap1 :: Map ExactPrint.AnnKey ExactPrint.AnnKey declMap1 = Map.unions $ ldecls <&> \ldecl -> Map.fromSet (const (ExactPrint.mkAnnKey ldecl)) (foldedAnnKeys ldecl) diff --git a/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs b/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs index 770cbdd..a93996c 100644 --- a/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs +++ b/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs @@ -99,13 +99,13 @@ import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.Utils import Language.Haskell.Brittany.Internal.ExactPrintUtils -import RdrName ( RdrName(..) ) +import GHC.Types.Name.Reader ( RdrName(..) ) import GHC ( Located, runGhc, GenLocated(L), moduleNameString ) -import qualified SrcLoc as GHC -import OccName ( occNameString ) -import Name ( getOccString ) -import Module ( moduleName ) -import ApiAnnotation ( AnnKeywordId(..) ) +import qualified GHC.Types.SrcLoc as GHC +import GHC.Types.Name.Occurrence ( occNameString ) +import GHC.Types.Name ( getOccString ) +import GHC ( moduleName ) +import GHC.Parser.Annotation ( AnnKeywordId(..) ) import Data.Data import Data.Generics.Schemes @@ -299,7 +299,7 @@ filterAnns ast = -- b) after (in source code order) the node. hasAnyCommentsBelow :: Data ast => GHC.Located ast -> ToBriDocM Bool hasAnyCommentsBelow ast@(L l _) = - List.any (\(c, _) -> ExactPrint.commentIdentifier c > l) + List.any (\(c, _) -> ExactPrint.commentIdentifier c > ExactPrint.Utils.rs l) <$> astConnectedComments ast hasCommentsBetween diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs index 22f11d4..999f6fb 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs @@ -16,16 +16,12 @@ import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.LayouterBasics import Language.Haskell.Brittany.Internal.Config.Types -import RdrName ( RdrName(..) ) +import GHC.Types.Name.Reader ( RdrName(..) ) import GHC ( Located, runGhc, GenLocated(L), moduleNameString ) import qualified GHC -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ import GHC.Hs -#else -import HsSyn -#endif -import Name -import BasicTypes +import GHC.Types.Name +import GHC.Types.Basic import Language.Haskell.GHC.ExactPrint.Types ( mkAnnKey ) import Language.Haskell.Brittany.Internal.Layouters.Type @@ -34,7 +30,7 @@ import {-# SOURCE #-} Language.Haskell.Brittany.Internal.Layouters.Stmt import Language.Haskell.Brittany.Internal.Layouters.Pattern import Language.Haskell.Brittany.Internal.Utils -import Bag ( mapBagM ) +import GHC.Data.Bag ( mapBagM ) @@ -242,11 +238,11 @@ createContextDoc (t1 : tR) = do ] ] -createBndrDoc :: [LHsTyVarBndr GhcPs] -> ToBriDocM BriDocNumbered +createBndrDoc :: [LHsTyVarBndr tag GhcPs] -> ToBriDocM BriDocNumbered createBndrDoc bs = do tyVarDocs <- bs `forM` \case - (L _ (UserTyVar _ext vname)) -> return $ (lrdrNameToText vname, Nothing) - (L _ (KindedTyVar _ext lrdrName kind)) -> do + (L _ (UserTyVar _ _ext vname)) -> return $ (lrdrNameToText vname, Nothing) + (L _ (KindedTyVar _ _ext lrdrName kind)) -> do d <- docSharedWrapper layoutType kind return $ (lrdrNameToText lrdrName, Just $ d) (L _ (XTyVarBndr ext)) -> absurdExt ext @@ -334,21 +330,21 @@ createDetailsDoc consNameStr details = case details of , docForceSingleline $ docSeq $ List.intersperse docSeparator - $ args <&> layoutType + $ fmap hsScaledThing args <&> layoutType ] leftIndented = docSetParSpacing . docAddBaseY BrIndentRegular . docPar (docLit consNameStr) . docLines - $ layoutType <$> args + $ layoutType <$> fmap hsScaledThing args multiAppended = docSeq [ docLit consNameStr , docSeparator - , docSetBaseY $ docLines $ layoutType <$> args + , docSetBaseY $ docLines $ layoutType <$> fmap hsScaledThing args ] multiIndented = docSetBaseY $ docAddBaseY BrIndentRegular $ docPar (docLit consNameStr) - (docLines $ layoutType <$> args) + (docLines $ layoutType <$> fmap hsScaledThing args) case indentPolicy of IndentPolicyLeft -> docAlt [singleLine, leftIndented] IndentPolicyMultiple -> docAlt [singleLine, multiAppended, leftIndented] @@ -424,11 +420,11 @@ createDetailsDoc consNameStr details = case details of ] ) InfixCon arg1 arg2 -> docSeq - [ layoutType arg1 + [ layoutType $ hsScaledThing arg1 , docSeparator , docLit consNameStr , docSeparator - , layoutType arg2 + , layoutType $ hsScaledThing arg2 ] where mkFieldDocs @@ -438,7 +434,7 @@ createDetailsDoc consNameStr details = case details of L _ (ConDeclField _ext names t _) -> createNamesAndTypeDoc lField names t L _ (XConDeclField x) -> absurdExt x -createForallDoc :: [LHsTyVarBndr GhcPs] -> Maybe (ToBriDocM BriDocNumbered) +createForallDoc :: [LHsTyVarBndr tag GhcPs] -> Maybe (ToBriDocM BriDocNumbered) createForallDoc [] = Nothing createForallDoc lhsTyVarBndrs = Just $ docSeq [docLitS "forall ", createBndrDoc lhsTyVarBndrs] diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs index f6f59a4..669e285 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs @@ -27,6 +27,7 @@ import Language.Haskell.Brittany.Internal.Layouters.Type import qualified Language.Haskell.GHC.ExactPrint as ExactPrint import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint +import qualified Language.Haskell.GHC.ExactPrint.Utils as ExactPrint import Language.Haskell.Brittany.Internal.ExactPrintUtils import Language.Haskell.Brittany.Internal.Utils @@ -35,17 +36,12 @@ import GHC ( runGhc , moduleNameString , AnnKeywordId(..) ) -import SrcLoc ( SrcSpan, noSrcSpan, Located , getLoc, unLoc ) -import qualified FastString -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ +import GHC.Types.SrcLoc ( SrcSpan, noSrcSpan, Located , getLoc, unLoc ) +import qualified GHC.Data.FastString as FastString import GHC.Hs import GHC.Hs.Extension (NoExtField (..)) -#else -import HsSyn -import HsExtension (NoExt (..)) -#endif -import Name -import BasicTypes ( InlinePragma(..) +import GHC.Types.Name +import GHC.Types.Basic ( InlinePragma(..) , Activation(..) , InlineSpec(..) , RuleMatchInfo(..) @@ -59,7 +55,7 @@ import {-# SOURCE #-} Language.Haskell.Brittany.Internal.Layouters.Stmt import Language.Haskell.Brittany.Internal.Layouters.Pattern import Language.Haskell.Brittany.Internal.Layouters.DataDecl -import Bag ( mapBagM, bagToList, emptyBag ) +import GHC.Data.Bag ( mapBagM, bagToList, emptyBag ) import Data.Char (isUpper) @@ -145,7 +141,7 @@ specStringCompat ast = \case layoutGuardLStmt :: ToBriDoc' (Stmt GhcPs (LHsExpr GhcPs)) layoutGuardLStmt lgstmt@(L _ stmtLR) = docWrapNode lgstmt $ case stmtLR of BodyStmt _ body _ _ -> layoutExpr body - BindStmt _ lPat expr _ _ -> do + BindStmt _ lPat expr -> do patDoc <- docSharedWrapper layoutPat lPat expDoc <- docSharedWrapper layoutExpr expr docCols ColBindStmt @@ -164,7 +160,7 @@ layoutBind (HsBindLR GhcPs GhcPs) (Either [BriDocNumbered] BriDocNumbered) layoutBind lbind@(L _ bind) = case bind of - FunBind _ fId (MG _ lmatches@(L _ matches) _) _ [] -> do + FunBind _ fId (MG _ lmatches@(L _ matches) _) [] -> do idStr <- lrdrNameToTextAnn fId binderDoc <- docLit $ Text.pack "=" funcPatDocs <- @@ -186,11 +182,7 @@ layoutBind lbind@(L _ bind) = case bind of clauseDocs mWhereArg hasComments -#if MIN_VERSION_ghc(8,8,0) PatSynBind _ (PSB _ patID lpat rpat dir) -> do -#else - PatSynBind _ (PSB _ patID lpat rpat dir) -> do -#endif fmap Right $ docWrapNode lbind $ layoutPatSynBind patID lpat dir @@ -226,7 +218,7 @@ layoutLocalBinds lbinds@(L _ binds) = case binds of let unordered = [ BagBind b | b <- Data.Foldable.toList bindlrs ] ++ [ BagSig s | s <- sigs ] - ordered = sortBy (comparing bindOrSigtoSrcSpan) unordered + ordered = sortBy (comparing $ ExactPrint.rs . bindOrSigtoSrcSpan) unordered docs <- docWrapNode lbinds $ join <$> ordered `forM` \case BagBind b -> either id return <$> layoutBind b BagSig s -> return <$> layoutSig s @@ -734,7 +726,7 @@ layoutSynDecl :: Bool -> (ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered) -> Located (IdP GhcPs) - -> [LHsTyVarBndr GhcPs] + -> [LHsTyVarBndr () GhcPs] -> LHsType GhcPs -> ToBriDocM BriDocNumbered layoutSynDecl isInfix wrapNodeRest name vars typ = do @@ -771,14 +763,14 @@ layoutSynDecl isInfix wrapNodeRest name vars typ = do hasComments <- hasAnyCommentsConnected typ layoutLhsAndType hasComments sharedLhs "=" typeDoc -layoutTyVarBndr :: Bool -> ToBriDoc HsTyVarBndr +layoutTyVarBndr :: Bool -> ToBriDoc (HsTyVarBndr ()) layoutTyVarBndr needsSep lbndr@(L _ bndr) = do docWrapNodePrior lbndr $ case bndr of XTyVarBndr{} -> error "brittany internal error: XTyVarBndr" - UserTyVar _ name -> do + UserTyVar _ _ name -> do nameStr <- lrdrNameToTextAnn name docSeq $ [docSeparator | needsSep] ++ [docLit nameStr] - KindedTyVar _ name kind -> do + KindedTyVar _ _ name kind -> do nameStr <- lrdrNameToTextAnn name docSeq $ [ docSeparator | needsSep ] @@ -804,16 +796,10 @@ layoutTyFamInstDecl -> ToBriDocM BriDocNumbered layoutTyFamInstDecl inClass outerNode tfid = do let -#if MIN_VERSION_ghc(8,8,0) FamEqn _ name bndrsMay pats _fixity typ = hsib_body $ tfid_eqn tfid -- bndrsMay isJust e.g. with -- type instance forall a . MyType (Maybe a) = Either () a innerNode = outerNode -#else - FamEqn _ name pats _fixity typ = hsib_body $ tfid_eqn tfid - bndrsMay = Nothing - innerNode = outerNode -#endif docWrapNodePrior outerNode $ do nameStr <- lrdrNameToTextAnn name needsParens <- hasAnnKeyword outerNode AnnOpenP @@ -822,7 +808,7 @@ layoutTyFamInstDecl inClass outerNode tfid = do then docLit $ Text.pack "type" else docSeq [appSep . docLit $ Text.pack "type", docLit $ Text.pack "instance"] - makeForallDoc :: [LHsTyVarBndr GhcPs] -> ToBriDocM BriDocNumbered + makeForallDoc :: [LHsTyVarBndr () GhcPs] -> ToBriDocM BriDocNumbered makeForallDoc bndrs = do bndrDocs <- layoutTyVarBndrs bndrs docSeq @@ -845,7 +831,6 @@ layoutTyFamInstDecl inClass outerNode tfid = do layoutLhsAndType hasComments lhs "=" typeDoc -#if MIN_VERSION_ghc(8,8,0) layoutHsTyPats :: [HsArg (LHsType GhcPs) (LHsKind GhcPs)] -> [ToBriDocM BriDocNumbered] layoutHsTyPats pats = pats <&> \case HsValArg tm -> layoutType tm @@ -854,10 +839,6 @@ layoutHsTyPats pats = pats <&> \case -- is a bit strange. Hopefully this does not ignore any important -- annotations. HsArgPar _l -> error "brittany internal error: HsArgPar{}" -#else -layoutHsTyPats :: [LHsType GhcPs] -> [ToBriDocM BriDocNumbered] -layoutHsTyPats pats = layoutType <$> pats -#endif -------------------------------------------------------------------------------- -- ClsInstDecl @@ -881,21 +862,12 @@ layoutClsInst lcid@(L _ cid) = docLines ] where layoutInstanceHead :: ToBriDocM BriDocNumbered -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ layoutInstanceHead = briDocByExactNoComment $ InstD NoExtField . ClsInstD NoExtField . removeChildren <$> lcid -#else - layoutInstanceHead = - briDocByExactNoComment - $ InstD NoExt - . ClsInstD NoExt - . removeChildren - <$> lcid -#endif removeChildren :: ClsInstDecl p -> ClsInstDecl p removeChildren c = c @@ -909,7 +881,7 @@ layoutClsInst lcid@(L _ cid) = docLines docSortedLines :: [ToBriDocM (Located BriDocNumbered)] -> ToBriDocM BriDocNumbered docSortedLines l = - allocateNode . BDFLines . fmap unLoc . List.sortOn getLoc =<< sequence l + allocateNode . BDFLines . fmap unLoc . List.sortOn (ExactPrint.rs . getLoc) =<< sequence l layoutAndLocateSig :: ToBriDocC (Sig GhcPs) (Located BriDocNumbered) layoutAndLocateSig lsig@(L loc _) = L loc <$> layoutSig lsig diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs index ae514f1..9d1023a 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs @@ -19,14 +19,10 @@ import Language.Haskell.Brittany.Internal.Config.Types import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types import GHC ( runGhc, GenLocated(L), SrcSpan, moduleNameString, AnnKeywordId(..), RdrName(..) ) -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ import GHC.Hs -#else -import HsSyn -#endif -import Name -import qualified FastString -import BasicTypes +import GHC.Types.Name +import qualified GHC.Data.FastString as FastString +import GHC.Types.Basic import Language.Haskell.Brittany.Internal.Utils import Language.Haskell.Brittany.Internal.Layouters.Pattern @@ -46,9 +42,8 @@ layoutExpr lexpr@(L _ expr) = do docWrapNode lexpr $ case expr of HsVar _ vname -> do docLit =<< lrdrNameToTextAnn vname - HsUnboundVar _ var -> case var of - OutOfScope oname _ -> docLit $ Text.pack $ occNameString oname - TrueExprHole oname -> docLit $ Text.pack $ occNameString oname + HsUnboundVar _ oname -> + docLit $ Text.pack $ occNameString oname HsRecFld{} -> do -- TODO briDocByExactInlineOnly "HsRecFld" lexpr @@ -79,8 +74,8 @@ layoutExpr lexpr@(L _ expr) = do -- by wrapping it in docSeq below. We _could_ add alignments for -- stuff like lists-of-lambdas. Nothing terribly important..) let shouldPrefixSeparator = case p of - (ghcDL -> L _ LazyPat{}) -> isFirst - (ghcDL -> L _ BangPat{}) -> isFirst + L _ LazyPat{} -> isFirst + L _ BangPat{} -> isFirst _ -> False patDocSeq <- layoutPat p fixed <- case Seq.viewl patDocSeq of @@ -235,15 +230,9 @@ layoutExpr lexpr@(L _ expr) = do expDoc1 expDoc2 ] -#if MIN_VERSION_ghc(8,8,0) /* ghc-8.8 */ HsAppType _ _ XHsWildCardBndrs{} -> error "brittany internal error: HsAppType XHsWildCardBndrs" HsAppType _ exp1 (HsWC _ ty1) -> do -#else - HsAppType XHsWildCardBndrs{} _ -> - error "brittany internal error: HsAppType XHsWildCardBndrs" - HsAppType (HsWC _ ty1) exp1 -> do -#endif t <- docSharedWrapper layoutType ty1 e <- docSharedWrapper layoutExpr exp1 docAlt @@ -400,17 +389,10 @@ layoutExpr lexpr@(L _ expr) = do rightDoc <- docSharedWrapper layoutExpr right docSeq [opDoc, docSeparator, rightDoc] ExplicitTuple _ args boxity -> do -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ let argExprs = args <&> \arg -> case arg of (L _ (Present _ e)) -> (arg, Just e); (L _ (Missing NoExtField)) -> (arg, Nothing) (L _ XTupArg{}) -> error "brittany internal error: XTupArg" -#else - let argExprs = args <&> \arg -> case arg of - (L _ (Present _ e)) -> (arg, Just e); - (L _ (Missing NoExt)) -> (arg, Nothing) - (L _ XTupArg{}) -> error "brittany internal error: XTupArg" -#endif argDocs <- forM argExprs $ docSharedWrapper $ \(arg, exprM) -> docWrapNode arg $ maybe docEmpty layoutExpr exprM @@ -496,7 +478,7 @@ layoutExpr lexpr@(L _ expr) = do (docSetBaseAndIndent $ docNonBottomSpacing $ docLines $ return <$> funcPatDocs) ) ] - HsIf _ _ ifExpr thenExpr elseExpr -> do + HsIf _ ifExpr thenExpr elseExpr -> do ifExprDoc <- docSharedWrapper layoutExpr ifExpr thenExprDoc <- docSharedWrapper layoutExpr thenExpr elseExprDoc <- docSharedWrapper layoutExpr elseExpr @@ -723,14 +705,14 @@ layoutExpr lexpr@(L _ expr) = do _ -> docSeq [appSep $ docLit $ Text.pack "let in", expDoc1] -- docSeq [appSep $ docLit "let in", expDoc1] HsDo _ stmtCtx (L _ stmts) -> case stmtCtx of - DoExpr -> do + DoExpr _ -> do stmtDocs <- docSharedWrapper layoutStmt `mapM` stmts docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar (docLit $ Text.pack "do") (docSetBaseAndIndent $ docNonBottomSpacing $ docLines stmtDocs) - MDoExpr -> do + MDoExpr _ -> do stmtDocs <- docSharedWrapper layoutStmt `mapM` stmts docSetParSpacing $ docAddBaseY BrIndentRegular @@ -829,18 +811,10 @@ layoutExpr lexpr@(L _ expr) = do else Just <$> docSharedWrapper layoutExpr rFExpr return $ (lfield, lrdrNameToText lnameF, rFExpDoc) recordExpression False indentPolicy lexpr nameDoc rFs -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ HsRecFields [] (Just (L _ 0)) -> do -#else - HsRecFields [] (Just 0) -> do -#endif let t = lrdrNameToText lname docWrapNode lname $ docLit $ t <> Text.pack " { .. }" -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ HsRecFields fs@(_:_) (Just (L _ dotdoti)) | dotdoti == length fs -> do -#else - HsRecFields fs@(_:_) (Just dotdoti) | dotdoti == length fs -> do -#endif let nameDoc = docWrapNode lname $ docLit $ lrdrNameToText lname fieldDocs <- fs `forM` \fieldl@(L _ (HsRecField (L _ fieldOcc) fExpr pun)) -> do let FieldOcc _ lnameF = fieldOcc @@ -863,19 +837,11 @@ layoutExpr lexpr@(L _ expr) = do XAmbiguousFieldOcc{} -> error "brittany internal error: XAmbiguousFieldOcc" recordExpression False indentPolicy lexpr rExprDoc rFs -#if MIN_VERSION_ghc(8,8,0) /* ghc-8.6 */ ExprWithTySig _ _ (HsWC _ XHsImplicitBndrs{}) -> error "brittany internal error: ExprWithTySig HsWC XHsImplicitBndrs" ExprWithTySig _ _ XHsWildCardBndrs{} -> error "brittany internal error: ExprWithTySig XHsWildCardBndrs" ExprWithTySig _ exp1 (HsWC _ (HsIB _ typ1)) -> do -#else - ExprWithTySig (HsWC _ XHsImplicitBndrs{}) _ -> - error "brittany internal error: ExprWithTySig HsWC XHsImplicitBndrs" - ExprWithTySig XHsWildCardBndrs{} _ -> - error "brittany internal error: ExprWithTySig XHsWildCardBndrs" - ExprWithTySig (HsWC _ (HsIB _ typ1)) exp1 -> do -#endif expDoc <- docSharedWrapper layoutExpr exp1 typDoc <- docSharedWrapper layoutType typ1 docSeq @@ -927,12 +893,6 @@ layoutExpr lexpr@(L _ expr) = do ] ArithSeq{} -> briDocByExactInlineOnly "ArithSeq" lexpr - HsSCC{} -> do - -- TODO - briDocByExactInlineOnly "HsSCC{}" lexpr - HsCoreAnn{} -> do - -- TODO - briDocByExactInlineOnly "HsCoreAnn{}" lexpr HsBracket{} -> do -- TODO briDocByExactInlineOnly "HsBracket{}" lexpr @@ -959,43 +919,12 @@ layoutExpr lexpr@(L _ expr) = do HsStatic{} -> do -- TODO briDocByExactInlineOnly "HsStatic{}" lexpr -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ -#else - HsArrApp{} -> do - -- TODO - briDocByExactInlineOnly "HsArrApp{}" lexpr - HsArrForm{} -> do - -- TODO - briDocByExactInlineOnly "HsArrForm{}" lexpr -#endif HsTick{} -> do -- TODO briDocByExactInlineOnly "HsTick{}" lexpr HsBinTick{} -> do -- TODO briDocByExactInlineOnly "HsBinTick{}" lexpr - HsTickPragma{} -> do - -- TODO - briDocByExactInlineOnly "HsTickPragma{}" lexpr -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ -#else - EWildPat{} -> do - docLit $ Text.pack "_" - EAsPat _ asName asExpr -> do - docSeq - [ docLit $ lrdrNameToText asName <> Text.pack "@" - , layoutExpr asExpr - ] - EViewPat{} -> do - -- TODO - briDocByExactInlineOnly "EViewPat{}" lexpr - ELazyPat{} -> do - -- TODO - briDocByExactInlineOnly "ELazyPat{}" lexpr -#endif - HsWrap{} -> do - -- TODO - briDocByExactInlineOnly "HsWrap{}" lexpr HsConLikeOut{} -> do -- TODO briDocByExactInlineOnly "HsWrap{}" lexpr diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot index e3be109..f32fc3a 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot @@ -15,12 +15,8 @@ import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.LayouterBasics import GHC ( runGhc, GenLocated(L), moduleNameString ) -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ import GHC.Hs -#else -import HsSyn -#endif -import Name +import GHC.Types.Name diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs b/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs index 2a722d1..7916d4d 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs @@ -20,17 +20,12 @@ import GHC ( unLoc , Located , ModuleName ) -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ import GHC.Hs import GHC.Hs.ImpExp -#else -import HsSyn -import HsImpExp -#endif -import Name -import FieldLabel -import qualified FastString -import BasicTypes +import GHC.Types.Name +import GHC.Types.FieldLabel +import qualified GHC.Data.FastString +import GHC.Types.Basic import Language.Haskell.Brittany.Internal.Utils diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs index e23c11b..09af4de 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs @@ -12,15 +12,12 @@ import GHC ( unLoc , moduleNameString , Located ) -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ import GHC.Hs -#else -import HsSyn -#endif -import Name -import FieldLabel -import qualified FastString -import BasicTypes +import GHC.Types.Name +import GHC.Types.FieldLabel +import qualified GHC.Data.FastString +import GHC.Types.Basic +import GHC.Unit.Types (IsBootInterface(..)) import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types import Language.Haskell.Brittany.Internal.Utils @@ -50,14 +47,10 @@ layoutImport importD = case importD of hiding = maybe False fst mllies minQLength = length "import qualified " qLengthReal = -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ let qualifiedPart = if q /= NotQualified then length "qualified " else 0 -#else - let qualifiedPart = if q then length "qualified " else 0 -#endif safePart = if safe then length "safe " else 0 pkgPart = maybe 0 ((+ 1) . Text.length) pkgNameT - srcPart = if src then length "{-# SOURCE #-} " else 0 + srcPart = case src of { IsBoot -> length "{-# SOURCE #-} "; NotBoot -> 0 } in length "import " + srcPart + safePart + qualifiedPart + pkgPart qLength = max minQLength qLengthReal -- Cost in columns of importColumn @@ -66,13 +59,9 @@ layoutImport importD = case importD of nameCost = Text.length modNameT + qLength importQualifiers = docSeq [ appSep $ docLit $ Text.pack "import" - , if src then appSep $ docLit $ Text.pack "{-# SOURCE #-}" else docEmpty + , case src of { IsBoot -> appSep $ docLit $ Text.pack "{-# SOURCE #-}"; NotBoot -> docEmpty } , if safe then appSep $ docLit $ Text.pack "safe" else docEmpty -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ , if q /= NotQualified then appSep $ docLit $ Text.pack "qualified" else docEmpty -#else - , if q then appSep $ docLit $ Text.pack "qualified" else docEmpty -#endif , maybe docEmpty (appSep . docLit) pkgNameT ] indentName = diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs index 7887489..a968a97 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs @@ -11,17 +11,12 @@ import Language.Haskell.Brittany.Internal.Layouters.Import import Language.Haskell.Brittany.Internal.Config.Types import GHC (unLoc, runGhc, GenLocated(L), moduleNameString, AnnKeywordId(..)) -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ import GHC.Hs import GHC.Hs.ImpExp -#else -import HsSyn -import HsImpExp -#endif -import Name -import FieldLabel -import qualified FastString -import BasicTypes +import GHC.Types.Name +import GHC.Types.FieldLabel +import qualified GHC.Data.FastString +import GHC.Types.Basic import Language.Haskell.GHC.ExactPrint as ExactPrint import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types import Language.Haskell.GHC.ExactPrint.Types @@ -34,16 +29,16 @@ import Language.Haskell.Brittany.Internal.Utils -layoutModule :: ToBriDoc HsModule +layoutModule :: ToBriDoc' HsModule layoutModule lmod@(L _ mod') = case mod' of -- Implicit module Main - HsModule Nothing _ imports _ _ _ -> do + HsModule _ Nothing _ imports _ _ _ -> do commentedImports <- transformToCommentedImport imports -- groupify commentedImports `forM_` tellDebugMessShow docLines (commentedImportsToDoc <$> sortCommentedImports commentedImports) -- sortedImports <- sortImports imports -- docLines $ [layoutImport y i | (y, i) <- sortedImports] - HsModule (Just n) les imports _ _ _ -> do + HsModule _ (Just n) les imports _ _ _ -> do commentedImports <- transformToCommentedImport imports -- groupify commentedImports `forM_` tellDebugMessShow -- sortedImports <- sortImports imports diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs index 037d693..1fa3800 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs @@ -21,13 +21,9 @@ import GHC ( Located , ol_val ) import qualified GHC -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ import GHC.Hs -#else -import HsSyn -#endif -import Name -import BasicTypes +import GHC.Types.Name +import GHC.Types.Basic import {-# SOURCE #-} Language.Haskell.Brittany.Internal.Layouters.Expr import Language.Haskell.Brittany.Internal.Layouters.Type @@ -45,7 +41,7 @@ import Language.Haskell.Brittany.Internal.Layouters.Type -- We will use `case .. of` as the imagined prefix to the examples used in -- the different cases below. layoutPat :: LPat GhcPs -> ToBriDocM (Seq BriDocNumbered) -layoutPat (ghcDL -> lpat@(L _ pat)) = docWrapNode lpat $ case pat of +layoutPat lpat@(L _ pat) = docWrapNode lpat $ case pat of WildPat _ -> fmap Seq.singleton $ docLit $ Text.pack "_" -- _ -> expr VarPat _ n -> @@ -54,11 +50,7 @@ layoutPat (ghcDL -> lpat@(L _ pat)) = docWrapNode lpat $ case pat of LitPat _ lit -> fmap Seq.singleton $ allocateNode $ litBriDoc lit -- 0 -> expr -#if MIN_VERSION_ghc(8,8,0) /* ghc-8.8 */ ParPat _ inner -> do -#else - ParPat _ inner -> do -#endif -- (nestedpat) -> expr left <- docLit $ Text.pack "(" right <- docLit $ Text.pack ")" @@ -78,7 +70,7 @@ layoutPat (ghcDL -> lpat@(L _ pat)) = docWrapNode lpat $ case pat of -- x1' <- docSeq [docLit $ Text.pack "(", return x1] -- xN' <- docSeq [return xN, docLit $ Text.pack ")"] -- return $ (x1' Seq.<| middle) Seq.|> xN' - ConPatIn lname (PrefixCon args) -> do + ConPat _ lname (PrefixCon args) -> do -- Abc a b c -> expr nameDoc <- lrdrNameToTextAnn lname argDocs <- layoutPat `mapM` args @@ -91,18 +83,18 @@ layoutPat (ghcDL -> lpat@(L _ pat)) = docWrapNode lpat $ case pat of $ spacifyDocs $ fmap colsWrapPat argDocs return $ x1 Seq.<| xR - ConPatIn lname (InfixCon left right) -> do + ConPat _ lname (InfixCon left right) -> do -- a :< b -> expr nameDoc <- lrdrNameToTextAnn lname leftDoc <- appSep . colsWrapPat =<< layoutPat left rightDoc <- colsWrapPat =<< layoutPat right middle <- appSep $ docLit nameDoc return $ Seq.empty Seq.|> leftDoc Seq.|> middle Seq.|> rightDoc - ConPatIn lname (RecCon (HsRecFields [] Nothing)) -> do + ConPat _ 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 + ConPat _ lname (RecCon (HsRecFields fs@(_:_) Nothing)) -> do -- Abc { a = locA, b = locB, c = locC } -> expr1 -- Abc { a, b, c } -> expr2 let t = lrdrNameToText lname @@ -126,22 +118,14 @@ layoutPat (ghcDL -> lpat@(L _ pat)) = docWrapNode lpat $ case pat of , docSeparator , docLit $ Text.pack "}" ] -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ - ConPatIn lname (RecCon (HsRecFields [] (Just (L _ 0)))) -> do -#else - ConPatIn lname (RecCon (HsRecFields [] (Just 0))) -> do -#endif + ConPat _ lname (RecCon (HsRecFields [] (Just (L _ 0)))) -> do -- Abc { .. } -> expr let t = lrdrNameToText lname Seq.singleton <$> docSeq [ appSep $ docLit t , docLit $ Text.pack "{..}" ] -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ - ConPatIn lname (RecCon (HsRecFields fs@(_:_) (Just (L _ dotdoti)))) | dotdoti == length fs -> do -#else - ConPatIn lname (RecCon (HsRecFields fs@(_:_) (Just dotdoti))) | dotdoti == length fs -> do -#endif + ConPat _ lname (RecCon (HsRecFields fs@(_:_) (Just (L _ dotdoti)))) | dotdoti == length fs -> do -- Abc { a = locA, .. } let t = lrdrNameToText lname fds <- fs `forM` \(L _ (HsRecField (L _ fieldOcc) fPat pun)) -> do @@ -172,11 +156,7 @@ layoutPat (ghcDL -> lpat@(L _ pat)) = docWrapNode lpat $ case pat of AsPat _ asName asPat -> do -- bind@nestedpat -> expr wrapPatPrepend asPat (docLit $ lrdrNameToText asName <> Text.pack "@") -#if MIN_VERSION_ghc(8,8,0) /* ghc-8.8 */ - SigPat _ pat1 (HsWC _ (HsIB _ ty1)) -> do -#else - SigPat (HsWC _ (HsIB _ ty1)) pat1 -> do -#endif + SigPat _ pat1 (HsPS _ ty1) -> do -- i :: Int -> expr patDocs <- layoutPat pat1 tyDoc <- docSharedWrapper layoutType ty1 @@ -214,7 +194,7 @@ layoutPat (ghcDL -> lpat@(L _ pat)) = docWrapNode lpat $ case pat of Just{} -> Seq.fromList [negDoc, litDoc] Nothing -> Seq.singleton litDoc - _ -> return <$> briDocByExactInlineOnly "some unknown pattern" (ghcDL lpat) + _ -> return <$> briDocByExactInlineOnly "some unknown pattern" lpat colsWrapPat :: Seq BriDocNumbered -> ToBriDocM BriDocNumbered colsWrapPat = docCols ColPatterns . fmap return . Foldable.toList diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs index 5427d7a..9971979 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs @@ -17,14 +17,10 @@ import GHC ( runGhc , GenLocated(L) , moduleNameString ) -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ import GHC.Hs -#else -import HsSyn -#endif -import Name -import qualified FastString -import BasicTypes +import GHC.Types.Name +import qualified GHC.Data.FastString as FastString +import GHC.Types.Basic import Language.Haskell.Brittany.Internal.Layouters.Pattern import Language.Haskell.Brittany.Internal.Layouters.Decl @@ -38,9 +34,9 @@ layoutStmt lstmt@(L _ stmt) = do indentAmount :: Int <- mAsk <&> _conf_layout .> _lconfig_indentAmount .> confUnpack docWrapNode lstmt $ case stmt of - LastStmt _ body False _ -> do + LastStmt _ body (Just False) _ -> do layoutExpr body - BindStmt _ lPat expr _ _ -> do + BindStmt _ lPat expr -> do patDoc <- fmap return $ colsWrapPat =<< layoutPat lPat expDoc <- docSharedWrapper layoutExpr expr docAlt diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot index 1fab3c5..5fa795b 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot @@ -13,14 +13,10 @@ import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.LayouterBasics import GHC ( runGhc, GenLocated(L), moduleNameString ) -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ import GHC.Hs -#else -import HsSyn -#endif -import Name -import qualified FastString -import BasicTypes +import GHC.Types.Name +import qualified GHC.Data.FastString +import GHC.Types.Basic diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs index 3437fcd..1804bc6 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs @@ -25,15 +25,11 @@ import GHC ( runGhc , AnnKeywordId (..) ) import Language.Haskell.GHC.ExactPrint.Types ( mkAnnKey ) -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ import GHC.Hs -#else -import HsSyn -#endif -import Name -import Outputable ( ftext, showSDocUnsafe ) -import BasicTypes -import qualified SrcLoc +import GHC.Types.Name +import GHC.Utils.Outputable ( ftext, showSDocUnsafe ) +import GHC.Types.Basic +import qualified GHC.Types.SrcLoc import DataTreePrint @@ -45,21 +41,14 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of HsTyVar _ promoted name -> do t <- lrdrNameToTextAnnTypeEqualityIsSpecial name case promoted of -#if MIN_VERSION_ghc(8,8,0) IsPromoted -> docSeq -#else /* ghc-8.6 */ - Promoted -> docSeq -#endif [ docSeparator , docTick , docWrapNode name $ docLit t ] NotPromoted -> docWrapNode name $ docLit t -#if MIN_VERSION_ghc(8,10,1) - HsForAllTy _ _ bndrs (L _ (HsQualTy _ (L _ cntxts) typ2)) -> do -#else - HsForAllTy _ bndrs (L _ (HsQualTy _ (L _ cntxts) typ2)) -> do -#endif + HsForAllTy _ hsf (L _ (HsQualTy _ (L _ cntxts) typ2)) -> do + let bndrs = hsf_vis_bndrs hsf typeDoc <- docSharedWrapper layoutType typ2 tyVarDocs <- layoutTyVarBndrs bndrs cntxtDocs <- cntxts `forM` docSharedWrapper layoutType @@ -145,11 +134,8 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of ] ) ] -#if MIN_VERSION_ghc(8,10,1) - HsForAllTy _ _ bndrs typ2 -> do -#else - HsForAllTy _ bndrs typ2 -> do -#endif + HsForAllTy _ hsf typ2 -> do + let bndrs = hsf_vis_bndrs hsf typeDoc <- layoutType typ2 tyVarDocs <- layoutTyVarBndrs bndrs let maybeForceML = case typ2 of @@ -254,7 +240,7 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of ] ) ] - HsFunTy _ typ1 typ2 -> do + HsFunTy _ _ typ1 typ2 -> do typeDoc1 <- docSharedWrapper layoutType typ1 typeDoc2 <- docSharedWrapper layoutType typ2 let maybeForceML = case typ2 of @@ -624,7 +610,6 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of then docLit $ Text.pack "\x2605" -- Unicode star else docLit $ Text.pack "*" XHsType{} -> error "brittany internal error: XHsType" -#if MIN_VERSION_ghc(8,8,0) HsAppKindTy _ ty kind -> do t <- docSharedWrapper layoutType ty k <- docSharedWrapper layoutType kind @@ -639,14 +624,13 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of t (docSeq [docLit $ Text.pack "@", k ]) ] -#endif layoutTyVarBndrs - :: [LHsTyVarBndr GhcPs] + :: [LHsTyVarBndr () GhcPs] -> ToBriDocM [(Text, Maybe (ToBriDocM BriDocNumbered))] layoutTyVarBndrs = mapM $ \case - (L _ (UserTyVar _ name)) -> return $ (lrdrNameToText name, Nothing) - (L _ (KindedTyVar _ lrdrName kind)) -> do + (L _ (UserTyVar _ _ name)) -> return $ (lrdrNameToText name, Nothing) + (L _ (KindedTyVar _ _ lrdrName kind)) -> do d <- docSharedWrapper layoutType kind return $ (lrdrNameToText lrdrName, Just $ d) (L _ (XTyVarBndr{})) -> error "brittany internal error: XTyVarBndr" diff --git a/src/Language/Haskell/Brittany/Internal/Prelude.hs b/src/Language/Haskell/Brittany/Internal/Prelude.hs index b33e339..ef8cb90 100644 --- a/src/Language/Haskell/Brittany/Internal/Prelude.hs +++ b/src/Language/Haskell/Brittany/Internal/Prelude.hs @@ -8,16 +8,9 @@ where -- rather project-specific stuff: --------------------------------- -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ import GHC.Hs.Extension as E ( GhcPs ) -#else -import HsExtension as E ( GhcPs ) -#endif /* ghc-8.10.1 */ -import RdrName as E ( RdrName ) -#if MIN_VERSION_ghc(8,8,0) -import qualified GHC ( dL, HasSrcSpan, SrcSpanLess ) -#endif +import GHC.Types.Name.Reader as E ( RdrName ) import qualified GHC ( Located ) @@ -402,12 +395,3 @@ import Data.Data as E ( toConstr todo :: a todo = error "todo" - - -#if MIN_VERSION_ghc(8,8,0) -ghcDL :: GHC.HasSrcSpan a => a -> GHC.Located (GHC.SrcSpanLess a) -ghcDL = GHC.dL -#else /* ghc-8.6 */ -ghcDL :: GHC.Located a -> GHC.Located a -ghcDL x = x -#endif diff --git a/src/Language/Haskell/Brittany/Internal/Utils.hs b/src/Language/Haskell/Brittany/Internal/Utils.hs index 5ee7ed2..0654c12 100644 --- a/src/Language/Haskell/Brittany/Internal/Utils.hs +++ b/src/Language/Haskell/Brittany/Internal/Utils.hs @@ -46,11 +46,11 @@ import Data.Generics.Aliases import qualified Text.PrettyPrint as PP import Text.PrettyPrint ( ($+$), (<+>) ) -import qualified Outputable as GHC -import qualified DynFlags as GHC -import qualified FastString as GHC -import qualified SrcLoc as GHC -import OccName ( occNameString ) +import qualified GHC.Utils.Outputable as GHC +import qualified GHC.Driver.Session as GHC +import qualified GHC.Data.FastString as GHC +import qualified GHC.Types.SrcLoc as GHC +import GHC.Types.Name.Occurrence as OccName ( occNameString ) import qualified Data.ByteString as B import DataTreePrint @@ -59,11 +59,7 @@ import Language.Haskell.Brittany.Internal.Config.Types import Language.Haskell.Brittany.Internal.Types import qualified Data.Generics.Uniplate.Direct as Uniplate -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ import qualified GHC.Hs.Extension as HsExtension -#else -import qualified HsExtension -#endif /* ghc-8.10.1 */ @@ -301,11 +297,5 @@ lines' s = case break (== '\n') s of (s1, [_]) -> [s1, ""] (s1, (_:r)) -> s1 : lines' r -#if MIN_VERSION_ghc(8,10,1) /* ghc-8.10.1 */ absurdExt :: HsExtension.NoExtCon -> a absurdExt = HsExtension.noExtCon -#else --- | A method to dismiss NoExt patterns for total matches -absurdExt :: HsExtension.NoExt -> a -absurdExt = error "cannot construct NoExt" -#endif diff --git a/src/Language/Haskell/Brittany/Main.hs b/src/Language/Haskell/Brittany/Main.hs index c2f2254..a84d882 100644 --- a/src/Language/Haskell/Brittany/Main.hs +++ b/src/Language/Haskell/Brittany/Main.hs @@ -16,7 +16,7 @@ import qualified Data.Map as Map import qualified Data.Monoid import GHC ( GenLocated(L) ) -import Outputable ( Outputable(..) +import GHC.Utils.Outputable ( Outputable(..) , showSDocUnsafe ) @@ -46,7 +46,7 @@ import qualified System.Exit import qualified System.Directory as Directory import qualified System.FilePath.Posix as FilePath -import qualified DynFlags as GHC +import qualified GHC.Driver.Session as GHC import qualified GHC.LanguageExtensions.Type as GHC import Paths_brittany -- 2.30.2 From 515595b432463a32e2afc549d890dbdce0cbe410 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 30 Oct 2021 16:28:34 +0000 Subject: [PATCH 06/74] Append final newline --- src-libinterfacetests/Main.hs | 6 +++--- src-literatetests/Main.hs | 6 +++--- src/Language/Haskell/Brittany/Internal.hs | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src-libinterfacetests/Main.hs b/src-libinterfacetests/Main.hs index 8334328..973755e 100644 --- a/src-libinterfacetests/Main.hs +++ b/src-libinterfacetests/Main.hs @@ -26,7 +26,7 @@ main = hspec $ do , " ]" ] output <- liftIO $ parsePrintModule staticDefaultConfig input - input `shouldSatisfy` \_ -> case output of - Right x | x == expected -> True - _ -> False + hush output `shouldBe` Just expected +hush :: Either a b -> Maybe b +hush = either (const Nothing) Just diff --git a/src-literatetests/Main.hs b/src-literatetests/Main.hs index ae469e3..458566b 100644 --- a/src-literatetests/Main.hs +++ b/src-literatetests/Main.hs @@ -188,10 +188,10 @@ roundTripEqual c t = `shouldReturn` Right (PPTextWrapper t) newtype PPTextWrapper = PPTextWrapper Text - deriving Eq + deriving (Eq, Show) -instance Show PPTextWrapper where - show (PPTextWrapper t) = "\n" ++ Text.unpack t +-- instance Show PPTextWrapper where +-- show (PPTextWrapper t) = "\n" ++ Text.unpack t -- brittany-next-binding --columns 160 -- brittany-next-binding { lconfig_indentPolicy: IndentPolicyLeft } diff --git a/src/Language/Haskell/Brittany/Internal.hs b/src/Language/Haskell/Brittany/Internal.hs index 8c22c8d..a90ac27 100644 --- a/src/Language/Haskell/Brittany/Internal.hs +++ b/src/Language/Haskell/Brittany/Internal.hs @@ -313,7 +313,7 @@ parsePrintModule configWithDebugs inputText = runExceptT $ do True -> not $ null errsWarns if hasErrors then throwE $ errsWarns - else pure $ TextL.toStrict outputTextL + else pure $ TextL.toStrict $ TextL.snoc outputTextL '\n' @@ -398,7 +398,7 @@ parsePrintModuleTests conf filename input = do else lift $ pPrintModuleAndCheck moduleConf perItemConf anns parsedModule if null errs - then pure $ TextL.toStrict $ ltext + then pure $ TextL.toStrict $ TextL.snoc ltext '\n' else let errStrs = errs <&> \case -- 2.30.2 From 0f035faf3c7b767f98d4ad9f6bd3884c6b025ab6 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Tue, 2 Nov 2021 02:16:49 +0000 Subject: [PATCH 07/74] Fix matching of `LastStmt` --- src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs index 9971979..14be015 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs @@ -34,7 +34,7 @@ layoutStmt lstmt@(L _ stmt) = do indentAmount :: Int <- mAsk <&> _conf_layout .> _lconfig_indentAmount .> confUnpack docWrapNode lstmt $ case stmt of - LastStmt _ body (Just False) _ -> do + LastStmt _ body Nothing _ -> do layoutExpr body BindStmt _ lPat expr -> do patDoc <- fmap return $ colsWrapPat =<< layoutPat lPat -- 2.30.2 From 22361c4ecd3f576abdd4fcf06c8de40d044ebdbf Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Tue, 2 Nov 2021 02:17:05 +0000 Subject: [PATCH 08/74] Fix getting binders from `HsForAllTy` --- .../Haskell/Brittany/Internal/Layouters/Type.hs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs index 1804bc6..5af9b2d 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs @@ -48,7 +48,7 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of ] NotPromoted -> docWrapNode name $ docLit t HsForAllTy _ hsf (L _ (HsQualTy _ (L _ cntxts) typ2)) -> do - let bndrs = hsf_vis_bndrs hsf + let bndrs = getBinders hsf typeDoc <- docSharedWrapper layoutType typ2 tyVarDocs <- layoutTyVarBndrs bndrs cntxtDocs <- cntxts `forM` docSharedWrapper layoutType @@ -135,7 +135,7 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of ) ] HsForAllTy _ hsf typ2 -> do - let bndrs = hsf_vis_bndrs hsf + let bndrs = getBinders hsf typeDoc <- layoutType typ2 tyVarDocs <- layoutTyVarBndrs bndrs let maybeForceML = case typ2 of @@ -647,3 +647,15 @@ processTyVarBndrsSingleline bndrDocs = bndrDocs >>= \case , docForceSingleline $ doc , docLit $ Text.pack ")" ] + +getBinders :: HsForAllTelescope pass -> [LHsTyVarBndr () pass] +getBinders x = case x of + HsForAllVis _ b -> b + HsForAllInvis _ b -> fmap withoutSpecificity b + XHsForAllTelescope _ -> [] + +withoutSpecificity :: LHsTyVarBndr flag pass -> LHsTyVarBndr () pass +withoutSpecificity = fmap $ \ x -> case x of + UserTyVar a _ c -> UserTyVar a () c + KindedTyVar a _ c d -> KindedTyVar a () c d + XTyVarBndr a -> XTyVarBndr a -- 2.30.2 From bd860f9983a5f65805bb0ca328ca419b4184c260 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Tue, 2 Nov 2021 08:10:44 -0400 Subject: [PATCH 09/74] Fix type variable name --- src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs index 999f6fb..750d0b1 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs @@ -238,7 +238,7 @@ createContextDoc (t1 : tR) = do ] ] -createBndrDoc :: [LHsTyVarBndr tag GhcPs] -> ToBriDocM BriDocNumbered +createBndrDoc :: [LHsTyVarBndr flag GhcPs] -> ToBriDocM BriDocNumbered createBndrDoc bs = do tyVarDocs <- bs `forM` \case (L _ (UserTyVar _ _ext vname)) -> return $ (lrdrNameToText vname, Nothing) @@ -434,7 +434,7 @@ createDetailsDoc consNameStr details = case details of L _ (ConDeclField _ext names t _) -> createNamesAndTypeDoc lField names t L _ (XConDeclField x) -> absurdExt x -createForallDoc :: [LHsTyVarBndr tag GhcPs] -> Maybe (ToBriDocM BriDocNumbered) +createForallDoc :: [LHsTyVarBndr flag GhcPs] -> Maybe (ToBriDocM BriDocNumbered) createForallDoc [] = Nothing createForallDoc lhsTyVarBndrs = Just $ docSeq [docLitS "forall ", createBndrDoc lhsTyVarBndrs] -- 2.30.2 From bfdb28010afb46c294f6bf2bf94468d46a683d8a Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Thu, 4 Nov 2021 23:05:43 +0000 Subject: [PATCH 10/74] Restore custom `Show` instance for `PPTextWrapper` --- src-literatetests/Main.hs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src-literatetests/Main.hs b/src-literatetests/Main.hs index 458566b..ae469e3 100644 --- a/src-literatetests/Main.hs +++ b/src-literatetests/Main.hs @@ -188,10 +188,10 @@ roundTripEqual c t = `shouldReturn` Right (PPTextWrapper t) newtype PPTextWrapper = PPTextWrapper Text - deriving (Eq, Show) + deriving Eq --- instance Show PPTextWrapper where --- show (PPTextWrapper t) = "\n" ++ Text.unpack t +instance Show PPTextWrapper where + show (PPTextWrapper t) = "\n" ++ Text.unpack t -- brittany-next-binding --columns 160 -- brittany-next-binding { lconfig_indentPolicy: IndentPolicyLeft } -- 2.30.2 From 42cf56b1061da92fddbb76085b37abd0f401e2fe Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Thu, 4 Nov 2021 23:14:13 +0000 Subject: [PATCH 11/74] Switch to Purple Yolk --- .vscode/extensions.json | 2 +- .vscode/settings.json | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 8c8df54..c51a4b2 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,5 +1,5 @@ { "recommendations": [ - "haskell.haskell" + "taylorfausak.purple-yolk" ] } diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..0050442 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "purple-yolk.brittany.command": "false", + "purple-yolk.ghci.command": "cabal repl --repl-options -ddump-json", + "purple-yolk.hlint.command": "false", + "purple-yolk.hlint.onSave": false +} -- 2.30.2 From 1ad34aedccc54bcff5af81d6bd811de0453986fe Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 14:50:31 +0000 Subject: [PATCH 12/74] Remove unused HLS --- .devcontainer/Dockerfile | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 2328b4d..bccc565 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -28,8 +28,3 @@ ARG CABAL_VERSION=3.6.2.0 RUN \ ghcup install cabal "$CABAL_VERSION" --set && \ cabal --version - -ARG HLS_VERSION=1.4.0 -RUN \ - ghcup install hls "$HLS_VERSION" --set && \ - haskell-language-server-wrapper --version -- 2.30.2 From 8290109e7fe2c5209ee0e7f43c04b3a68f6d175b Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 15:19:38 +0000 Subject: [PATCH 13/74] Fix handling of EOF --- src/Language/Haskell/Brittany/Internal.hs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Language/Haskell/Brittany/Internal.hs b/src/Language/Haskell/Brittany/Internal.hs index a90ac27..5129f77 100644 --- a/src/Language/Haskell/Brittany/Internal.hs +++ b/src/Language/Haskell/Brittany/Internal.hs @@ -313,7 +313,7 @@ parsePrintModule configWithDebugs inputText = runExceptT $ do True -> not $ null errsWarns if hasErrors then throwE $ errsWarns - else pure $ TextL.toStrict $ TextL.snoc outputTextL '\n' + else pure $ TextL.toStrict outputTextL @@ -398,7 +398,7 @@ parsePrintModuleTests conf filename input = do else lift $ pPrintModuleAndCheck moduleConf perItemConf anns parsedModule if null errs - then pure $ TextL.toStrict $ TextL.snoc ltext '\n' + then pure $ TextL.toStrict ltext else let errStrs = errs <&> \case @@ -497,7 +497,7 @@ ppModule lmod@(L _loc _m@(HsModule _ _name _exports _ decls _ _)) = do (ExactPrint.AnnComment (ExactPrint.Comment cmStr _ _), l) -> do ppmMoveToExactLoc l mTell $ Text.Builder.fromString cmStr - (ExactPrint.G _, (ExactPrint.DP (eofZ, eofX))) -> + (ExactPrint.AnnEofPos, (ExactPrint.DP (eofZ, eofX))) -> let folder (acc, _) (kw, ExactPrint.DP (y, x)) = case kw of ExactPrint.AnnComment cm | span <- ExactPrint.commentIdentifier cm -- 2.30.2 From 85359163cc26be7e11073e74b0f832ec54729eb2 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 15:22:13 +0000 Subject: [PATCH 14/74] Add back EOF handling --- src/Language/Haskell/Brittany/Internal.hs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/Language/Haskell/Brittany/Internal.hs b/src/Language/Haskell/Brittany/Internal.hs index 5129f77..7aa6127 100644 --- a/src/Language/Haskell/Brittany/Internal.hs +++ b/src/Language/Haskell/Brittany/Internal.hs @@ -398,7 +398,7 @@ parsePrintModuleTests conf filename input = do else lift $ pPrintModuleAndCheck moduleConf perItemConf anns parsedModule if null errs - then pure $ TextL.toStrict ltext + then pure $ TextL.toStrict $ ltext else let errStrs = errs <&> \case @@ -542,10 +542,15 @@ ppPreamble lmod@(L loc m@(HsModule _ _ _ _ _ _ _)) = do modAnnsDp = ExactPrint.annsDP mAnn isWhere (ExactPrint.G AnnWhere) = True isWhere _ = False + isEof (ExactPrint.AnnEofPos) = True + isEof _ = False whereInd = List.findIndex (isWhere . fst) modAnnsDp - (pre, post') = case whereInd of - Nothing -> ([], modAnnsDp) - Just i -> List.splitAt (i + 1) modAnnsDp + eofInd = List.findIndex (isEof . fst) modAnnsDp + (pre, post') = case (whereInd, eofInd) of + (Nothing, Nothing) -> ([], modAnnsDp) + (Just i , Nothing) -> List.splitAt (i + 1) modAnnsDp + (Nothing, Just _i) -> ([], modAnnsDp) + (Just i , Just j ) -> List.splitAt (min (i + 1) j) modAnnsDp mAnn' = mAnn { ExactPrint.annsDP = pre } filteredAnns'' = Map.insert (ExactPrint.mkAnnKey lmod) mAnn' filteredAnns -- 2.30.2 From b517eef71e992eccfbe061746e8197ccc1fb4b83 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 16:46:24 +0000 Subject: [PATCH 15/74] Fix handling of type families --- src-literatetests/10-tests.blt | 91 +++++++++++++++++++++++ src/Language/Haskell/Brittany/Internal.hs | 11 ++- 2 files changed, 100 insertions(+), 2 deletions(-) diff --git a/src-literatetests/10-tests.blt b/src-literatetests/10-tests.blt index 806dd47..aa3c7cb 100644 --- a/src-literatetests/10-tests.blt +++ b/src-literatetests/10-tests.blt @@ -1551,6 +1551,97 @@ instance Foo Int where { unBarInt :: Int } +############################################################################### +############################################################################### +############################################################################### +#group gh-357 +############################################################################### +############################################################################### +############################################################################### + +#test type-instance-without-comment + +{-# language TypeFamilies #-} +type family F a +type instance F Int = IO Int + +#test type-instance-with-comment + +{-# language TypeFamilies #-} +type family F a +type instance F Int = IO Int -- x + +#test newtype-instance-without-comment + +{-# language TypeFamilies #-} +data family F a +newtype instance F Int = N Int + +#test newtype-instance-with-comment + +{-# language TypeFamilies #-} +data family F a +newtype instance F Int = N Int -- x + +#test data-instance-without-comment + +{-# language TypeFamilies #-} +data family F a +data instance F Int = D Int + +#test data-instance-with-comment + +{-# language TypeFamilies #-} +data family F a +data instance F Int = D Int -- x + +#test instance-type-without-comment + +{-# language TypeFamilies #-} +class C a where + type family F a +instance C Int where + type F Int = IO Int + +#test instance-type-with-comment + +{-# language TypeFamilies #-} +class C a where + type family F a +instance C Int where + type F Int = IO Int -- x + +#test instance-newtype-without-comment + +{-# language TypeFamilies #-} +class C a where + data family F a +instance C Int where + newtype F Int = N Int + +#test instance-newtype-with-comment + +{-# language TypeFamilies #-} +class C a where + data family F a +instance C Int where + newtype F Int = N Int -- x + +#test instance-data-without-comment + +{-# language TypeFamilies #-} +class C a where + data family F a +instance C Int where + data F Int = D Int + +#test instance-data-with-comment + +{-# language TypeFamilies #-} +class C a where + data family F a +instance C Int where + data F Int = D Int -- x ############################################################################### ############################################################################### diff --git a/src/Language/Haskell/Brittany/Internal.hs b/src/Language/Haskell/Brittany/Internal.hs index 7aa6127..c084c83 100644 --- a/src/Language/Haskell/Brittany/Internal.hs +++ b/src/Language/Haskell/Brittany/Internal.hs @@ -397,7 +397,7 @@ parsePrintModuleTests conf filename input = do then return $ pPrintModule moduleConf perItemConf anns parsedModule else lift $ pPrintModuleAndCheck moduleConf perItemConf anns parsedModule - if null errs + if null $ filter (not . isErrorUnusedComment) errs then pure $ TextL.toStrict $ ltext else let @@ -410,6 +410,10 @@ parsePrintModuleTests conf filename input = do ErrorOutputCheck -> "Output is not syntactically valid." in throwE $ "pretty printing error(s):\n" ++ List.unlines errStrs +isErrorUnusedComment :: BrittanyError -> Bool +isErrorUnusedComment x = case x of + ErrorUnusedComment _ -> True + _ -> False -- this approach would for if there was a pure GHC.parseDynamicFilePragma. -- Unfortunately that does not exist yet, so we cannot provide a nominally @@ -454,6 +458,7 @@ toLocal conf anns m = do ppModule :: GenLocated SrcSpan HsModule -> PPM () ppModule lmod@(L _loc _m@(HsModule _ _name _exports _ decls _ _)) = do + let annKey = ExactPrint.mkAnnKey lmod post <- ppPreamble lmod decls `forM_` \decl -> do let declAnnKey = ExactPrint.mkAnnKey decl @@ -463,7 +468,9 @@ ppModule lmod@(L _loc _m@(HsModule _ _name _exports _ decls _ _)) = do let mBindingConfs = declBindingNames <&> \n -> Map.lookup n $ _icd_perBinding inlineConf filteredAnns <- mAsk - <&> \annMap -> Map.findWithDefault Map.empty declAnnKey annMap + <&> \annMap -> + Map.union (Map.findWithDefault Map.empty annKey annMap) $ + Map.findWithDefault Map.empty declAnnKey annMap traceIfDumpConf "bridoc annotations filtered/transformed" _dconf_dump_annotations -- 2.30.2 From eccd2debb0de328dd7b9dd074a634b27c41f52de Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 16:55:46 +0000 Subject: [PATCH 16/74] Replace `Option` with `Maybe` --- src/Language/Haskell/Brittany/Internal.hs | 2 +- .../Haskell/Brittany/Internal/Config.hs | 17 +++---- .../Haskell/Brittany/Internal/Config/Types.hs | 50 +++++++++---------- .../Internal/Config/Types/Instances.hs | 22 -------- .../Haskell/Brittany/Internal/Prelude.hs | 1 - .../Haskell/Brittany/Internal/Types.hs | 4 +- .../Haskell/Brittany/Internal/Utils.hs | 4 +- 7 files changed, 38 insertions(+), 62 deletions(-) diff --git a/src/Language/Haskell/Brittany/Internal.hs b/src/Language/Haskell/Brittany/Internal.hs index c084c83..e1a111e 100644 --- a/src/Language/Haskell/Brittany/Internal.hs +++ b/src/Language/Haskell/Brittany/Internal.hs @@ -79,7 +79,7 @@ data InlineConfigTarget extractCommentConfigs :: ExactPrint.Anns -> TopLevelDeclNameMap - -> Either (String, String) (CConfig Option, PerItemConfig) + -> Either (String, String) (CConfig Maybe, PerItemConfig) extractCommentConfigs anns (TopLevelDeclNameMap declNameMap) = do let commentLiness = diff --git a/src/Language/Haskell/Brittany/Internal/Config.hs b/src/Language/Haskell/Brittany/Internal/Config.hs index 520be3f..b6ead91 100644 --- a/src/Language/Haskell/Brittany/Internal/Config.hs +++ b/src/Language/Haskell/Brittany/Internal/Config.hs @@ -118,7 +118,7 @@ forwardOptionsSyntaxExtsEnabled = ForwardOptions } -- brittany-next-binding { lconfig_indentPolicy: IndentPolicyLeft, lconfig_cols: 200 } -cmdlineConfigParser :: CmdParser Identity out (CConfig Option) +cmdlineConfigParser :: CmdParser Identity out (CConfig Maybe) cmdlineConfigParser = do -- TODO: why does the default not trigger; ind never should be []!! ind <- addFlagReadParams "" ["indent"] "AMOUNT" (flagHelpStr "spaces per indentation level") @@ -196,10 +196,10 @@ cmdlineConfigParser = do , _conf_obfuscate = wrapLast $ falseToNothing obfuscate } where - falseToNothing = Option . Bool.bool Nothing (Just True) - wrapLast :: Option a -> Option (Semigroup.Last a) + falseToNothing = Bool.bool Nothing (Just True) + wrapLast :: Maybe a -> Maybe (Semigroup.Last a) wrapLast = fmap Semigroup.Last - optionConcat :: (Semigroup.Semigroup (f a), Applicative f) => [a] -> Option (f a) + optionConcat :: (Semigroup.Semigroup (f a), Applicative f) => [a] -> Maybe (f a) optionConcat = mconcat . fmap (pure . pure) -- configParser :: Parser Config @@ -230,7 +230,7 @@ cmdlineConfigParser = do -- If the second parameter is True and the file does not exist, writes the -- staticDefaultConfig to the file. readConfig - :: MonadIO m => System.IO.FilePath -> MaybeT m (Maybe (CConfig Option)) + :: MonadIO m => System.IO.FilePath -> MaybeT m (Maybe (CConfig Maybe)) readConfig path = do -- TODO: probably should catch IOErrors and then omit the existence check. exists <- liftIO $ System.Directory.doesFileExist path @@ -278,7 +278,7 @@ findLocalConfigPath dir = do -- | Reads specified configs. readConfigs - :: CConfig Option -- ^ Explicit options, take highest priority + :: CConfig Maybe -- ^ Explicit options, take highest priority -> [System.IO.FilePath] -- ^ List of config files to load and merge, highest priority first -> MaybeT IO Config readConfigs cmdlineConfig configPaths = do @@ -290,7 +290,7 @@ readConfigs cmdlineConfig configPaths = do -- | Reads provided configs -- but also applies the user default configuration (with lowest priority) readConfigsWithUserConfig - :: CConfig Option -- ^ Explicit options, take highest priority + :: CConfig Maybe -- ^ Explicit options, take highest priority -> [System.IO.FilePath] -- ^ List of config files to load and merge, highest priority first -> MaybeT IO Config readConfigsWithUserConfig cmdlineConfig configPaths = do @@ -300,10 +300,9 @@ readConfigsWithUserConfig cmdlineConfig configPaths = do writeDefaultConfig :: MonadIO m => System.IO.FilePath -> m () writeDefaultConfig path = liftIO $ ByteString.writeFile path $ Data.Yaml.encode $ cMap - (Option . Just . runIdentity) + (Just . runIdentity) staticDefaultConfig showConfigYaml :: Config -> String showConfigYaml = Data.ByteString.Char8.unpack . Data.Yaml.encode . cMap (\(Identity x) -> Just x) - diff --git a/src/Language/Haskell/Brittany/Internal/Config/Types.hs b/src/Language/Haskell/Brittany/Internal/Config/Types.hs index 46b2ba1..18fb92b 100644 --- a/src/Language/Haskell/Brittany/Internal/Config/Types.hs +++ b/src/Language/Haskell/Brittany/Internal/Config/Types.hs @@ -23,7 +23,7 @@ import Data.Data ( Data ) import Data.Coerce ( Coercible, coerce ) import Data.Semigroup.Generic -import Data.Semigroup ( Last, Option ) +import Data.Semigroup ( Last ) import Data.CZipWith @@ -215,12 +215,12 @@ deriving instance Show (CForwardOptions Identity) deriving instance Show (CPreProcessorConfig Identity) deriving instance Show (CConfig Identity) -deriving instance Show (CDebugConfig Option) -deriving instance Show (CLayoutConfig Option) -deriving instance Show (CErrorHandlingConfig Option) -deriving instance Show (CForwardOptions Option) -deriving instance Show (CPreProcessorConfig Option) -deriving instance Show (CConfig Option) +deriving instance Show (CDebugConfig Maybe) +deriving instance Show (CLayoutConfig Maybe) +deriving instance Show (CErrorHandlingConfig Maybe) +deriving instance Show (CForwardOptions Maybe) +deriving instance Show (CPreProcessorConfig Maybe) +deriving instance Show (CConfig Maybe) deriving instance Data (CDebugConfig Identity) deriving instance Data (CLayoutConfig Identity) @@ -229,24 +229,24 @@ deriving instance Data (CForwardOptions Identity) deriving instance Data (CPreProcessorConfig Identity) deriving instance Data (CConfig Identity) -deriving instance Data (CDebugConfig Option) -deriving instance Data (CLayoutConfig Option) -deriving instance Data (CErrorHandlingConfig Option) -deriving instance Data (CForwardOptions Option) -deriving instance Data (CPreProcessorConfig Option) -deriving instance Data (CConfig Option) +deriving instance Data (CDebugConfig Maybe) +deriving instance Data (CLayoutConfig Maybe) +deriving instance Data (CErrorHandlingConfig Maybe) +deriving instance Data (CForwardOptions Maybe) +deriving instance Data (CPreProcessorConfig Maybe) +deriving instance Data (CConfig Maybe) -instance Semigroup.Semigroup (CDebugConfig Option) where +instance Semigroup.Semigroup (CDebugConfig Maybe) where (<>) = gmappend -instance Semigroup.Semigroup (CLayoutConfig Option) where +instance Semigroup.Semigroup (CLayoutConfig Maybe) where (<>) = gmappend -instance Semigroup.Semigroup (CErrorHandlingConfig Option) where +instance Semigroup.Semigroup (CErrorHandlingConfig Maybe) where (<>) = gmappend -instance Semigroup.Semigroup (CForwardOptions Option) where +instance Semigroup.Semigroup (CForwardOptions Maybe) where (<>) = gmappend -instance Semigroup.Semigroup (CPreProcessorConfig Option) where +instance Semigroup.Semigroup (CPreProcessorConfig Maybe) where (<>) = gmappend -instance Semigroup.Semigroup (CConfig Option) where +instance Semigroup.Semigroup (CConfig Maybe) where (<>) = gmappend instance Semigroup.Semigroup (CDebugConfig Identity) where @@ -262,22 +262,22 @@ instance Semigroup.Semigroup (CPreProcessorConfig Identity) where instance Semigroup.Semigroup (CConfig Identity) where (<>) = gmappend -instance Monoid (CDebugConfig Option) where +instance Monoid (CDebugConfig Maybe) where mempty = gmempty mappend = gmappend -instance Monoid (CLayoutConfig Option) where +instance Monoid (CLayoutConfig Maybe) where mempty = gmempty mappend = gmappend -instance Monoid (CErrorHandlingConfig Option) where +instance Monoid (CErrorHandlingConfig Maybe) where mempty = gmempty mappend = gmappend -instance Monoid (CForwardOptions Option) where +instance Monoid (CForwardOptions Maybe) where mempty = gmempty mappend = gmappend -instance Monoid (CPreProcessorConfig Option) where +instance Monoid (CPreProcessorConfig Maybe) where mempty = gmempty mappend = gmappend -instance Monoid (CConfig Option) where +instance Monoid (CConfig Maybe) where mempty = gmempty mappend = gmappend diff --git a/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs b/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs index 7bf38f4..1ea7bab 100644 --- a/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs +++ b/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs @@ -51,27 +51,15 @@ aesonDecodeOptionsBrittany = Aeson.defaultOptions instance FromJSON (type Maybe) where\ parseJSON = Aeson.genericParseJSON aesonDecodeOptionsBrittany;\ {-# NOINLINE parseJSON #-} -#define makeFromJSONOption(type)\ - instance FromJSON (type Option) where\ - parseJSON = fmap (cMap Option) . parseJSON;\ - {-# NOINLINE parseJSON #-} #define makeToJSONMaybe(type)\ instance ToJSON (type Maybe) where\ toJSON = Aeson.genericToJSON aesonDecodeOptionsBrittany;\ {-# NOINLINE toJSON #-};\ toEncoding = Aeson.genericToEncoding aesonDecodeOptionsBrittany;\ {-# NOINLINE toEncoding #-} -#define makeToJSONOption(type)\ - instance ToJSON (type Option) where\ - toJSON = toJSON . cMap getOption;\ - {-# NOINLINE toJSON #-};\ - toEncoding = toEncoding . cMap getOption;\ - {-# NOINLINE toEncoding #-} -makeFromJSONOption(CDebugConfig) makeFromJSONMaybe(CDebugConfig) -makeToJSONOption(CDebugConfig) makeToJSONMaybe(CDebugConfig) makeFromJSON(IndentPolicy) @@ -85,28 +73,18 @@ makeToJSON(CPPMode) makeFromJSON(ExactPrintFallbackMode) makeToJSON(ExactPrintFallbackMode) -makeFromJSONOption(CLayoutConfig) makeFromJSONMaybe(CLayoutConfig) -makeToJSONOption(CLayoutConfig) makeToJSONMaybe(CLayoutConfig) -makeFromJSONOption(CErrorHandlingConfig) makeFromJSONMaybe(CErrorHandlingConfig) -makeToJSONOption(CErrorHandlingConfig) makeToJSONMaybe(CErrorHandlingConfig) -makeFromJSONOption(CForwardOptions) makeFromJSONMaybe(CForwardOptions) -makeToJSONOption(CForwardOptions) makeToJSONMaybe(CForwardOptions) -makeFromJSONOption(CPreProcessorConfig) makeFromJSONMaybe(CPreProcessorConfig) -makeToJSONOption(CPreProcessorConfig) makeToJSONMaybe(CPreProcessorConfig) -makeFromJSONOption(CConfig) -makeToJSONOption(CConfig) makeToJSONMaybe(CConfig) -- This custom instance ensures the "omitNothingFields" behaviour not only for diff --git a/src/Language/Haskell/Brittany/Internal/Prelude.hs b/src/Language/Haskell/Brittany/Internal/Prelude.hs index ef8cb90..6c52450 100644 --- a/src/Language/Haskell/Brittany/Internal/Prelude.hs +++ b/src/Language/Haskell/Brittany/Internal/Prelude.hs @@ -32,7 +32,6 @@ import Data.Char as E ( Char ) import Data.Either as E ( Either(..) ) import Data.IORef as E ( IORef ) import Data.Maybe as E ( Maybe(..) ) -import Data.Semigroup as E ( Option(..) ) import Data.Monoid as E ( Endo(..) , All(..) , Any(..) diff --git a/src/Language/Haskell/Brittany/Internal/Types.hs b/src/Language/Haskell/Brittany/Internal/Types.hs index f402e56..4979a4e 100644 --- a/src/Language/Haskell/Brittany/Internal/Types.hs +++ b/src/Language/Haskell/Brittany/Internal/Types.hs @@ -29,8 +29,8 @@ import Data.Generics.Uniplate.Direct as Uniplate data PerItemConfig = PerItemConfig - { _icd_perBinding :: Map String (CConfig Option) - , _icd_perKey :: Map ExactPrint.Types.AnnKey (CConfig Option) + { _icd_perBinding :: Map String (CConfig Maybe) + , _icd_perKey :: Map ExactPrint.Types.AnnKey (CConfig Maybe) } deriving Data.Data.Data diff --git a/src/Language/Haskell/Brittany/Internal/Utils.hs b/src/Language/Haskell/Brittany/Internal/Utils.hs index 0654c12..ea2b4ac 100644 --- a/src/Language/Haskell/Brittany/Internal/Utils.hs +++ b/src/Language/Haskell/Brittany/Internal/Utils.hs @@ -79,9 +79,9 @@ showOutputable = GHC.showPpr GHC.unsafeGlobalDynFlags fromMaybeIdentity :: Identity a -> Maybe a -> Identity a fromMaybeIdentity x y = Data.Coerce.coerce $ fromMaybe (Data.Coerce.coerce x) y -fromOptionIdentity :: Identity a -> Option a -> Identity a +fromOptionIdentity :: Identity a -> Maybe a -> Identity a fromOptionIdentity x y = - Data.Coerce.coerce $ fromMaybe (Data.Coerce.coerce x) $ getOption y + Data.Coerce.coerce $ fromMaybe (Data.Coerce.coerce x) y -- maximum monoid over N+0 -- or more than N, because Num is allowed. -- 2.30.2 From acdc30c227742c9d7f1126cbe8c5f409f281557f Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 16:56:22 +0000 Subject: [PATCH 17/74] Comment out unused definitions --- .../Brittany/Internal/ExactPrintUtils.hs | 74 +++++++++---------- 1 file changed, 37 insertions(+), 37 deletions(-) diff --git a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs index 2f9aba6..2100c4f 100644 --- a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs +++ b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs @@ -213,45 +213,45 @@ commentAnnFixTransformGlob ast = do -- moveTrailingComments lexpr (List.last fs) -- _ -> return () -commentAnnFixTransform :: GHC.ParsedSource -> ExactPrint.Transform () -commentAnnFixTransform modul = SYB.everything (>>) genF modul - where - genF :: Data.Data.Data a => a -> ExactPrint.Transform () - genF = (\_ -> return ()) `SYB.extQ` exprF - exprF :: Located (HsExpr GhcPs) -> ExactPrint.Transform () - exprF lexpr@(L _ expr) = case expr of - RecordCon _ _ (HsRecFields fs@(_:_) Nothing) -> - moveTrailingComments lexpr (List.last fs) - RecordUpd _ _e fs@(_:_) -> - moveTrailingComments lexpr (List.last fs) - _ -> return () +-- commentAnnFixTransform :: GHC.ParsedSource -> ExactPrint.Transform () +-- commentAnnFixTransform modul = SYB.everything (>>) genF modul +-- where +-- genF :: Data.Data.Data a => a -> ExactPrint.Transform () +-- genF = (\_ -> return ()) `SYB.extQ` exprF +-- exprF :: Located (HsExpr GhcPs) -> ExactPrint.Transform () +-- exprF lexpr@(L _ expr) = case expr of +-- RecordCon _ _ (HsRecFields fs@(_:_) Nothing) -> +-- moveTrailingComments lexpr (List.last fs) +-- RecordUpd _ _e fs@(_:_) -> +-- moveTrailingComments lexpr (List.last fs) +-- _ -> return () -moveTrailingComments :: (Data.Data.Data a,Data.Data.Data b) - => GHC.Located a -> GHC.Located b -> ExactPrint.Transform () -moveTrailingComments astFrom astTo = do - let - k1 = ExactPrint.mkAnnKey astFrom - k2 = ExactPrint.mkAnnKey astTo - moveComments ans = ans' - where - an1 = Data.Maybe.fromJust $ Map.lookup k1 ans - an2 = Data.Maybe.fromJust $ Map.lookup k2 ans - cs1f = ExactPrint.annFollowingComments an1 - cs2f = ExactPrint.annFollowingComments an2 - (comments, nonComments) = flip breakEither (ExactPrint.annsDP an1) - $ \case - (ExactPrint.AnnComment com, dp) -> Left (com, dp) - x -> Right x - an1' = an1 - { ExactPrint.annsDP = nonComments - , ExactPrint.annFollowingComments = [] - } - an2' = an2 - { ExactPrint.annFollowingComments = cs1f ++ cs2f ++ comments - } - ans' = Map.insert k1 an1' $ Map.insert k2 an2' ans +-- moveTrailingComments :: (Data.Data.Data a,Data.Data.Data b) +-- => GHC.Located a -> GHC.Located b -> ExactPrint.Transform () +-- moveTrailingComments astFrom astTo = do +-- let +-- k1 = ExactPrint.mkAnnKey astFrom +-- k2 = ExactPrint.mkAnnKey astTo +-- moveComments ans = ans' +-- where +-- an1 = Data.Maybe.fromJust $ Map.lookup k1 ans +-- an2 = Data.Maybe.fromJust $ Map.lookup k2 ans +-- cs1f = ExactPrint.annFollowingComments an1 +-- cs2f = ExactPrint.annFollowingComments an2 +-- (comments, nonComments) = flip breakEither (ExactPrint.annsDP an1) +-- $ \case +-- (ExactPrint.AnnComment com, dp) -> Left (com, dp) +-- x -> Right x +-- an1' = an1 +-- { ExactPrint.annsDP = nonComments +-- , ExactPrint.annFollowingComments = [] +-- } +-- an2' = an2 +-- { ExactPrint.annFollowingComments = cs1f ++ cs2f ++ comments +-- } +-- ans' = Map.insert k1 an1' $ Map.insert k2 an2' ans - ExactPrint.modifyAnnsT moveComments +-- ExactPrint.modifyAnnsT moveComments -- | split a set of annotations in a module into a map from top-level module -- elements to the relevant annotations. Avoids quadratic behaviour a trivial -- 2.30.2 From c361ba545d0f2800bb98907493454f83efcece99 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 16:57:02 +0000 Subject: [PATCH 18/74] Avoid relying on `StarIsType` --- src/Language/Haskell/Brittany/Internal/Types.hs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Language/Haskell/Brittany/Internal/Types.hs b/src/Language/Haskell/Brittany/Internal/Types.hs index 4979a4e..d24907a 100644 --- a/src/Language/Haskell/Brittany/Internal/Types.hs +++ b/src/Language/Haskell/Brittany/Internal/Types.hs @@ -26,6 +26,8 @@ import Language.Haskell.Brittany.Internal.Config.Types import Data.Generics.Uniplate.Direct as Uniplate +import qualified Data.Kind as Kind + data PerItemConfig = PerItemConfig @@ -218,7 +220,7 @@ type ToBriDocM = MultiRWSS.MultiRWS '[[BrittanyError], Seq String] -- writer '[NodeAllocIndex] -- state -type ToBriDoc (sym :: * -> *) = Located (sym GhcPs) -> ToBriDocM BriDocNumbered +type ToBriDoc (sym :: Kind.Type -> Kind.Type) = Located (sym GhcPs) -> ToBriDocM BriDocNumbered type ToBriDoc' sym = Located sym -> ToBriDocM BriDocNumbered type ToBriDocC sym c = Located sym -> ToBriDocM c -- 2.30.2 From 0c33d9a6fa168b1447d77e397904a5f5ce05bea4 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 17:01:11 +0000 Subject: [PATCH 19/74] Remove redundant pattern matches --- .../Brittany/Internal/Layouters/DataDecl.hs | 7 ------- .../Haskell/Brittany/Internal/Layouters/Decl.hs | 7 +------ .../Haskell/Brittany/Internal/Layouters/Expr.hs | 17 +++-------------- .../Haskell/Brittany/Internal/Layouters/IE.hs | 1 - .../Haskell/Brittany/Internal/Layouters/Type.hs | 1 - 5 files changed, 4 insertions(+), 29 deletions(-) diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs index 750d0b1..b747293 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs @@ -40,7 +40,6 @@ layoutDataDecl -> LHsQTyVars GhcPs -> HsDataDefn GhcPs -> ToBriDocM BriDocNumbered -layoutDataDecl _ _ (XLHsQTyVars ext) _ = absurdExt ext layoutDataDecl ltycl name (HsQTvs _ bndrs) defn = case defn of -- newtype MyType a b = MyType .. HsDataDefn _ext NewType (L _ []) _ctype Nothing [cons] mDerivs -> case cons of @@ -245,7 +244,6 @@ createBndrDoc bs = do (L _ (KindedTyVar _ _ext lrdrName kind)) -> do d <- docSharedWrapper layoutType kind return $ (lrdrNameToText lrdrName, Just $ d) - (L _ (XTyVarBndr ext)) -> absurdExt ext docSeq $ List.intersperse docSeparator $ tyVarDocs @@ -275,7 +273,6 @@ createDerivingPar derivs mainDoc = do <$> types derivingClauseDoc :: LHsDerivingClause GhcPs -> ToBriDocM BriDocNumbered -derivingClauseDoc (L _ (XHsDerivingClause ext)) = absurdExt ext derivingClauseDoc (L _ (HsDerivingClause _ext mStrategy types)) = case types of (L _ []) -> docSeq [] (L _ ts) -> @@ -295,7 +292,6 @@ derivingClauseDoc (L _ (HsDerivingClause _ext mStrategy types)) = case types of $ List.intersperse docCommaSep $ ts <&> \case HsIB _ t -> layoutType t - XHsImplicitBndrs x -> absurdExt x , whenMoreThan1Type ")" , rhsStrategy ] @@ -312,7 +308,6 @@ derivingClauseDoc (L _ (HsDerivingClause _ext mStrategy types)) = case types of , docSeparator , layoutType t ] - XHsImplicitBndrs ext -> absurdExt ext ) docDeriving :: ToBriDocM BriDocNumbered @@ -432,7 +427,6 @@ createDetailsDoc consNameStr details = case details of -> [(ToBriDocM BriDocNumbered, ToBriDocM BriDocNumbered)] mkFieldDocs = fmap $ \lField -> case lField of L _ (ConDeclField _ext names t _) -> createNamesAndTypeDoc lField names t - L _ (XConDeclField x) -> absurdExt x createForallDoc :: [LHsTyVarBndr flag GhcPs] -> Maybe (ToBriDocM BriDocNumbered) createForallDoc [] = Nothing @@ -451,7 +445,6 @@ createNamesAndTypeDoc lField names t = $ List.intersperse docCommaSep $ names <&> \case - L _ (XFieldOcc x) -> absurdExt x L _ (FieldOcc _ fieldName) -> docLit =<< lrdrNameToTextAnn fieldName ] diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs index 669e285..d251dfb 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs @@ -90,6 +90,7 @@ layoutSig lsig@(L _loc sig) = case sig of AlwaysActive -> "" ActiveBefore _ i -> "[~" ++ show i ++ "] " ActiveAfter _ i -> "[" ++ show i ++ "] " + FinalActive -> error "brittany internal error: FinalActive" let conlikeStr = case conlike of FunLike -> "" ConLike -> "CONLIKE " @@ -190,7 +191,6 @@ layoutBind lbind@(L _ bind) = case bind of _ -> Right <$> unknownNodeError "" lbind layoutIPBind :: ToBriDoc IPBind layoutIPBind lipbind@(L _ bind) = case bind of - XIPBind{} -> unknownNodeError "XIPBind" lipbind IPBind _ (Right _) _ -> error "brittany internal error: IPBind Right" IPBind _ (Left (L _ (HsIPName name))) expr -> do ipName <- docLit $ Text.pack $ '?' : FastString.unpackFS name @@ -225,9 +225,6 @@ layoutLocalBinds lbinds@(L _ binds) = case binds of return $ Just $ docs -- x@(HsValBinds (ValBindsOut _binds _lsigs)) -> HsValBinds _ (XValBindsLR{}) -> error "brittany internal error: XValBindsLR" - XHsLocalBindsLR{} -> error "brittany internal error: XHsLocalBindsLR" - x@(HsIPBinds _ XHsIPBinds{}) -> - Just . (: []) <$> unknownNodeError "XHsIPBinds" (L noSrcSpan x) HsIPBinds _ (IPBinds _ bb) -> Just <$> mapM layoutIPBind bb EmptyLocalBinds{} -> return $ Nothing @@ -241,7 +238,6 @@ layoutGrhs lgrhs@(L _ (GRHS _ guards body)) = do guardDocs <- docWrapNode lgrhs $ layoutStmt `mapM` guards bodyDoc <- layoutExpr body return (guardDocs, bodyDoc, body) -layoutGrhs (L _ (XGRHS{})) = error "brittany internal error: XGRHS" layoutPatternBind :: Maybe Text @@ -766,7 +762,6 @@ layoutSynDecl isInfix wrapNodeRest name vars typ = do layoutTyVarBndr :: Bool -> ToBriDoc (HsTyVarBndr ()) layoutTyVarBndr needsSep lbndr@(L _ bndr) = do docWrapNodePrior lbndr $ case bndr of - XTyVarBndr{} -> error "brittany internal error: XTyVarBndr" UserTyVar _ _ name -> do nameStr <- lrdrNameToTextAnn name docSeq $ [docSeparator | needsSep] ++ [docLit nameStr] diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs index 9d1023a..ac6e4ad 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs @@ -127,8 +127,6 @@ layoutExpr lexpr@(L _ expr) = do ] HsLam{} -> unknownNodeError "HsLam too complex" lexpr - HsLamCase _ XMatchGroup{} -> - error "brittany internal error: HsLamCase XMatchGroup" HsLamCase _ (MG _ (L _ []) _) -> do docSetParSpacing $ docAddBaseY BrIndentRegular $ (docLit $ Text.pack "\\case {}") @@ -230,8 +228,6 @@ layoutExpr lexpr@(L _ expr) = do expDoc1 expDoc2 ] - HsAppType _ _ XHsWildCardBndrs{} -> - error "brittany internal error: HsAppType XHsWildCardBndrs" HsAppType _ exp1 (HsWC _ ty1) -> do t <- docSharedWrapper layoutType ty1 e <- docSharedWrapper layoutExpr exp1 @@ -392,7 +388,6 @@ layoutExpr lexpr@(L _ expr) = do let argExprs = args <&> \arg -> case arg of (L _ (Present _ e)) -> (arg, Just e); (L _ (Missing NoExtField)) -> (arg, Nothing) - (L _ XTupArg{}) -> error "brittany internal error: XTupArg" argDocs <- forM argExprs $ docSharedWrapper $ \(arg, exprM) -> docWrapNode arg $ maybe docEmpty layoutExpr exprM @@ -437,8 +432,6 @@ layoutExpr lexpr@(L _ expr) = do lineN = docCols ColTuples [docCommaSep, docNodeAnnKW lexpr (Just AnnOpenP) eN] end = closeLit in docSetBaseY $ docLines $ [start] ++ linesM ++ [lineN, end] - HsCase _ _ XMatchGroup{} -> - error "brittany internal error: HsCase XMatchGroup" HsCase _ cExp (MG _ (L _ []) _) -> do cExpDoc <- docSharedWrapper layoutExpr cExp docAlt @@ -834,13 +827,7 @@ layoutExpr lexpr@(L _ expr) = do return $ case ambName of Unambiguous _ n -> (lfield, lrdrNameToText n, rFExpDoc) Ambiguous _ n -> (lfield, lrdrNameToText n, rFExpDoc) - XAmbiguousFieldOcc{} -> - error "brittany internal error: XAmbiguousFieldOcc" recordExpression False indentPolicy lexpr rExprDoc rFs - ExprWithTySig _ _ (HsWC _ XHsImplicitBndrs{}) -> - error "brittany internal error: ExprWithTySig HsWC XHsImplicitBndrs" - ExprWithTySig _ _ XHsWildCardBndrs{} -> - error "brittany internal error: ExprWithTySig XHsWildCardBndrs" ExprWithTySig _ exp1 (HsWC _ (HsIB _ typ1)) -> do expDoc <- docSharedWrapper layoutExpr exp1 typDoc <- docSharedWrapper layoutType typ1 @@ -931,7 +918,9 @@ layoutExpr lexpr@(L _ expr) = do ExplicitSum{} -> do -- TODO briDocByExactInlineOnly "ExplicitSum{}" lexpr - XExpr{} -> error "brittany internal error: XExpr" + HsPragE{} -> do + -- TODO + briDocByExactInlineOnly "HsPragE{}" lexpr recordExpression :: (Data.Data.Data lExpr, Data.Data.Data name) diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs b/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs index 7916d4d..45cd047 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs @@ -217,7 +217,6 @@ lieToText = \case L _ (IEGroup _ _ _ ) -> Text.pack "@IEGroup" L _ (IEDoc _ _ ) -> Text.pack "@IEDoc" L _ (IEDocNamed _ _ ) -> Text.pack "@IEDocNamed" - L _ (XIE _ ) -> Text.pack "@XIE" where moduleNameToText :: Located ModuleName -> Text moduleNameToText (L _ name) = Text.pack ("@IEModuleContents" ++ moduleNameString name) diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs index 5af9b2d..3d340ba 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs @@ -633,7 +633,6 @@ layoutTyVarBndrs = mapM $ \case (L _ (KindedTyVar _ _ lrdrName kind)) -> do d <- docSharedWrapper layoutType kind return $ (lrdrNameToText lrdrName, Just $ d) - (L _ (XTyVarBndr{})) -> error "brittany internal error: XTyVarBndr" -- there is no specific reason this returns a list instead of a single -- BriDoc node. -- 2.30.2 From d89cf0ad303da37d0215b73cc2b1831bc2c13b28 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 17:03:42 +0000 Subject: [PATCH 20/74] Remove CPP --- .../Haskell/Brittany/Internal/BackendUtils.hs | 48 +------------------ .../Brittany/Internal/Transformations/Alt.hs | 46 ------------------ 2 files changed, 2 insertions(+), 92 deletions(-) diff --git a/src/Language/Haskell/Brittany/Internal/BackendUtils.hs b/src/Language/Haskell/Brittany/Internal/BackendUtils.hs index 1253f1a..201c7c5 100644 --- a/src/Language/Haskell/Brittany/Internal/BackendUtils.hs +++ b/src/Language/Haskell/Brittany/Internal/BackendUtils.hs @@ -1,11 +1,6 @@ -#define INSERTTRACES 0 - {-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE TypeApplications #-} -#if !INSERTTRACES -{-# OPTIONS_GHC -Wno-redundant-constraints #-} -#endif module Language.Haskell.Brittany.Internal.BackendUtils ( layoutWriteAppend @@ -58,13 +53,7 @@ traceLocal :: (MonadMultiState LayoutState m, MonadMultiWriter (Seq String) m, Show a) => a -> m () -#if INSERTTRACES -traceLocal x = do - mGet >>= tellDebugMessShow @LayoutState - tellDebugMessShow x -#else traceLocal _ = return () -#endif layoutWriteAppend @@ -79,21 +68,12 @@ layoutWriteAppend t = do state <- mGet case _lstate_curYOrAddNewline state of Right i -> do -#if INSERTTRACES - tellDebugMessShow (" inserted newlines: ", i) -#endif replicateM_ i $ mTell $ Text.Builder.fromString $ "\n" Left{} -> do -#if INSERTTRACES - tellDebugMessShow (" inserted no newlines") -#endif return () let spaces = case _lstate_addSepSpace state of Just i -> i Nothing -> 0 -#if INSERTTRACES - tellDebugMessShow (" inserted spaces: ", spaces) -#endif mTell $ Text.Builder.fromText $ Text.pack (replicate spaces ' ') mTell $ Text.Builder.fromText $ t mModify $ \s -> s @@ -159,7 +139,7 @@ layoutWriteNewlineBlock = do -- mSet $ state -- { _lstate_addSepSpace = Just -- $ if isJust $ _lstate_addNewline state --- then i +-- then i -- else _lstate_indLevelLinger state + i - _lstate_curY state -- } @@ -303,9 +283,6 @@ layoutRemoveIndentLevelLinger :: ( MonadMultiState LayoutState m , MonadMultiWriter (Seq String) m ) => m () layoutRemoveIndentLevelLinger = do -#if INSERTTRACES - tellDebugMessShow ("layoutRemoveIndentLevelLinger") -#endif mModify $ \s -> s { _lstate_indLevelLinger = lstate_indLevel s } @@ -318,9 +295,6 @@ layoutWithAddBaseCol => m () -> m () layoutWithAddBaseCol m = do -#if INSERTTRACES - tellDebugMessShow ("layoutWithAddBaseCol") -#endif amount <- mAsk <&> _conf_layout .> _lconfig_indentAmount .> confUnpack state <- mGet layoutBaseYPushInternal $ lstate_baseY state + amount @@ -336,9 +310,6 @@ layoutWithAddBaseColBlock => m () -> m () layoutWithAddBaseColBlock m = do -#if INSERTTRACES - tellDebugMessShow ("layoutWithAddBaseColBlock") -#endif amount <- mAsk <&> _conf_layout .> _lconfig_indentAmount .> confUnpack state <- mGet layoutBaseYPushInternal $ lstate_baseY state + amount @@ -390,9 +361,6 @@ layoutWithAddBaseColN -> m () -> m () layoutWithAddBaseColN amount m = do -#if INSERTTRACES - tellDebugMessShow ("layoutWithAddBaseColN", amount) -#endif state <- mGet layoutBaseYPushInternal $ lstate_baseY state + amount m @@ -444,9 +412,6 @@ layoutAddSepSpace :: (MonadMultiState LayoutState m , MonadMultiWriter (Seq String) m) => m () layoutAddSepSpace = do -#if INSERTTRACES - tellDebugMessShow ("layoutAddSepSpace") -#endif state <- mGet mSet $ state { _lstate_addSepSpace = Just $ fromMaybe 1 $ _lstate_addSepSpace state } @@ -523,9 +488,6 @@ layoutWritePriorComments ast = do Map.adjust (\ann -> ann { ExactPrint.annPriorComments = [] }) key anns } return mAnn -#if INSERTTRACES - tellDebugMessShow ("layoutWritePriorComments", ExactPrint.mkAnnKey ast, mAnn) -#endif case mAnn of Nothing -> return () Just priors -> do @@ -559,9 +521,6 @@ layoutWritePostComments ast = do anns } return mAnn -#if INSERTTRACES - tellDebugMessShow ("layoutWritePostComments", ExactPrint.mkAnnKey ast, mAnn) -#endif case mAnn of Nothing -> return () Just posts -> do @@ -584,9 +543,6 @@ layoutIndentRestorePostComment = do state <- mGet let mCommentCol = _lstate_commentCol state let eCurYAddNL = _lstate_curYOrAddNewline state -#if INSERTTRACES - tellDebugMessShow ("layoutIndentRestorePostComment", mCommentCol) -#endif mModify $ \s -> s { _lstate_commentCol = Nothing , _lstate_commentNewlines = 0 } @@ -604,7 +560,7 @@ layoutIndentRestorePostComment = do -- layoutWritePriorCommentsRestore x = do -- layoutWritePriorComments x -- layoutIndentRestorePostComment --- +-- -- layoutWritePostCommentsRestore :: (Data.Data.Data ast, -- MonadMultiWriter Text.Builder.Builder m, -- MonadMultiState LayoutState m diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs b/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs index 6a15eac..d186564 100644 --- a/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs +++ b/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs @@ -1,7 +1,3 @@ -#define INSERTTRACESALT 0 -#define INSERTTRACESALTVISIT 0 -#define INSERTTRACESGETSPACING 0 - {-# LANGUAGE TypeOperators #-} {-# LANGUAGE BangPatterns #-} {-# LANGUAGE DataKinds #-} @@ -117,14 +113,6 @@ transformAlts = rec :: BriDocNumbered -> Memo.MemoT Int [VerticalSpacing] (MultiRWSS.MultiRWS r w (AltCurPos ': s)) BriDocNumbered rec bdX@(brDcId, brDc) = do -#if INSERTTRACESALTVISIT - do - acp :: AltCurPos <- mGet - tellDebugMess $ "transformAlts: visiting: " ++ case brDc of - BDFAnnotationPrior annKey _ -> show (toConstr brDc, annKey, acp) - BDFAnnotationRest annKey _ -> show (toConstr brDc, annKey, acp) - _ -> show (toConstr brDc, acp) -#endif let reWrap = (,) brDcId -- debugAcp :: AltCurPos <- mGet case brDc of @@ -206,20 +194,10 @@ transformAlts = -- TODO: use COMPLETE pragma instead? lineCheck _ = error "ghc exhaustive check is insufficient" lconf <- _conf_layout <$> mAsk -#if INSERTTRACESALT - tellDebugMess $ "considering options with " ++ show (length alts, acp) -#endif let options = -- trace ("considering options:" ++ show (length alts, acp)) $ (zip spacings alts <&> \(vs, bd) -> -- trace ("spacing=" ++ show vs ++ ",hasSpace=" ++ show (hasSpace lconf acp vs) ++ ",lineCheck=" ++ show (lineCheck vs)) ( hasSpace1 lconf acp vs && lineCheck vs, bd)) -#if INSERTTRACESALT - zip spacings options `forM_` \(vs, (_, bd)) -> - tellDebugMess $ " " ++ "spacing=" ++ show vs - ++ ",hasSpace1=" ++ show (hasSpace1 lconf acp vs) - ++ ",lineCheck=" ++ show (lineCheck vs) - ++ " " ++ show (toConstr bd) -#endif id -- - $ (fmap $ \x -> traceShow (briDocToDoc x) x) $ rec $ fromMaybe (-- trace ("choosing last") $ @@ -240,9 +218,6 @@ transformAlts = AltLineModeStateForceML{} -> p /= VerticalSpacingParNone AltLineModeStateContradiction -> False lconf <- _conf_layout <$> mAsk -#if INSERTTRACESALT - tellDebugMess $ "considering options with " ++ show (length alts, acp) -#endif let options = -- trace ("considering options:" ++ show (length alts, acp)) $ (zip spacings alts <&> \(vs, bd) -> -- trace ("spacing=" ++ show vs ++ ",hasSpace=" ++ show (hasSpace lconf acp vs) ++ ",lineCheck=" ++ show (lineCheck vs)) @@ -250,14 +225,6 @@ transformAlts = && any lineCheck vs, bd)) let checkedOptions :: [Maybe (Int, BriDocNumbered)] = zip [1..] options <&> (\(i, (b,x)) -> [ (i, x) | b ]) -#if INSERTTRACESALT - zip spacings options `forM_` \(vs, (_, bd)) -> - tellDebugMess $ " " ++ "spacing=" ++ show vs - ++ ",hasSpace2=" ++ show (hasSpace2 lconf acp <$> vs) - ++ ",lineCheck=" ++ show (lineCheck <$> vs) - ++ " " ++ show (toConstr bd) - tellDebugMess $ " " ++ show (Data.Maybe.mapMaybe (fmap fst) checkedOptions) -#endif id -- - $ (fmap $ \x -> traceShow (briDocToDoc x) x) $ rec $ fromMaybe (-- trace ("choosing last") $ @@ -510,9 +477,6 @@ getSpacing !bridoc = rec bridoc r <- rec bd tellDebugMess $ "getSpacing: BDFDebug " ++ show s ++ " (node-id=" ++ show brDcId ++ "): mVs=" ++ show r return r -#if INSERTTRACESGETSPACING - tellDebugMess $ "getSpacing: visiting: " ++ show (toConstr $ brDc) ++ " -> " ++ show result -#endif return result maxVs :: [LineModeValidity VerticalSpacing] -> LineModeValidity VerticalSpacing maxVs = foldl' @@ -867,16 +831,6 @@ getSpacings limit bridoc = preFilterLimit <$> rec bridoc r <- rec bd tellDebugMess $ "getSpacings: BDFDebug " ++ show s ++ " (node-id=" ++ show brDcId ++ "): vs=" ++ show (take 9 r) return r -#if INSERTTRACESGETSPACING - case brdc of - BDFAnnotationPrior{} -> return () - BDFAnnotationRest{} -> return () - _ -> mTell $ Seq.fromList ["getSpacings: visiting: " - ++ show (toConstr $ brdc) -- (briDocToDoc $ unwrapBriDocNumbered (0, brdc)) - , " -> " - ++ show (take 9 result) - ] -#endif return result maxVs :: [VerticalSpacing] -> VerticalSpacing maxVs = foldl' -- 2.30.2 From 56ccbc91a80c5f8c24dfda99c8da881541c6bbc9 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 17:04:46 +0000 Subject: [PATCH 21/74] Add `Paths_brittany` as an automatically generated module --- brittany.cabal | 1 + 1 file changed, 1 insertion(+) diff --git a/brittany.cabal b/brittany.cabal index 000c2bc..b389fe0 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -65,6 +65,7 @@ library { Language.Haskell.Brittany.Internal.Obfuscation Paths_brittany } + autogen-modules: Paths_brittany other-modules: { Language.Haskell.Brittany.Internal.LayouterBasics Language.Haskell.Brittany.Internal.Backend -- 2.30.2 From 19a092b862d8f73181363228e7d6a5ec2e7963ec Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 17:09:43 +0000 Subject: [PATCH 22/74] Remove CPP instances --- .../Internal/Config/Types/Instances.hs | 99 +++++++++++-------- 1 file changed, 58 insertions(+), 41 deletions(-) diff --git a/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs b/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs index 1ea7bab..b8ba9cf 100644 --- a/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs +++ b/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs @@ -36,56 +36,73 @@ aesonDecodeOptionsBrittany = Aeson.defaultOptions , Aeson.fieldLabelModifier = dropWhile (=='_') } -#define makeFromJSON(type)\ - instance FromJSON (type) where\ - parseJSON = Aeson.genericParseJSON aesonDecodeOptionsBrittany;\ - {-# NOINLINE parseJSON #-} -#define makeToJSON(type)\ - instance ToJSON (type) where\ - toJSON = Aeson.genericToJSON aesonDecodeOptionsBrittany;\ - {-# NOINLINE toJSON #-};\ - toEncoding = Aeson.genericToEncoding aesonDecodeOptionsBrittany;\ - {-# NOINLINE toEncoding #-} +instance FromJSON (CDebugConfig Maybe) where + parseJSON = Aeson.genericParseJSON aesonDecodeOptionsBrittany -#define makeFromJSONMaybe(type)\ - instance FromJSON (type Maybe) where\ - parseJSON = Aeson.genericParseJSON aesonDecodeOptionsBrittany;\ - {-# NOINLINE parseJSON #-} -#define makeToJSONMaybe(type)\ - instance ToJSON (type Maybe) where\ - toJSON = Aeson.genericToJSON aesonDecodeOptionsBrittany;\ - {-# NOINLINE toJSON #-};\ - toEncoding = Aeson.genericToEncoding aesonDecodeOptionsBrittany;\ - {-# NOINLINE toEncoding #-} +instance ToJSON (CDebugConfig Maybe) where + toJSON = Aeson.genericToJSON aesonDecodeOptionsBrittany +instance FromJSON IndentPolicy where + parseJSON = Aeson.genericParseJSON aesonDecodeOptionsBrittany -makeFromJSONMaybe(CDebugConfig) -makeToJSONMaybe(CDebugConfig) +instance ToJSON IndentPolicy where + toJSON = Aeson.genericToJSON aesonDecodeOptionsBrittany + toEncoding = Aeson.genericToEncoding aesonDecodeOptionsBrittany -makeFromJSON(IndentPolicy) -makeToJSON(IndentPolicy) -makeFromJSON(AltChooser) -makeToJSON(AltChooser) -makeFromJSON(ColumnAlignMode) -makeToJSON(ColumnAlignMode) -makeFromJSON(CPPMode) -makeToJSON(CPPMode) -makeFromJSON(ExactPrintFallbackMode) -makeToJSON(ExactPrintFallbackMode) +instance FromJSON AltChooser where + parseJSON = Aeson.genericParseJSON aesonDecodeOptionsBrittany -makeFromJSONMaybe(CLayoutConfig) -makeToJSONMaybe(CLayoutConfig) +instance ToJSON AltChooser where + toJSON = Aeson.genericToJSON aesonDecodeOptionsBrittany + toEncoding = Aeson.genericToEncoding aesonDecodeOptionsBrittany -makeFromJSONMaybe(CErrorHandlingConfig) -makeToJSONMaybe(CErrorHandlingConfig) +instance FromJSON ColumnAlignMode where + parseJSON = Aeson.genericParseJSON aesonDecodeOptionsBrittany -makeFromJSONMaybe(CForwardOptions) -makeToJSONMaybe(CForwardOptions) +instance ToJSON ColumnAlignMode where + toJSON = Aeson.genericToJSON aesonDecodeOptionsBrittany + toEncoding = Aeson.genericToEncoding aesonDecodeOptionsBrittany -makeFromJSONMaybe(CPreProcessorConfig) -makeToJSONMaybe(CPreProcessorConfig) +instance FromJSON CPPMode where + parseJSON = Aeson.genericParseJSON aesonDecodeOptionsBrittany -makeToJSONMaybe(CConfig) +instance ToJSON CPPMode where + toJSON = Aeson.genericToJSON aesonDecodeOptionsBrittany + toEncoding = Aeson.genericToEncoding aesonDecodeOptionsBrittany + +instance FromJSON ExactPrintFallbackMode where + parseJSON = Aeson.genericParseJSON aesonDecodeOptionsBrittany + +instance ToJSON ExactPrintFallbackMode where + toJSON = Aeson.genericToJSON aesonDecodeOptionsBrittany + toEncoding = Aeson.genericToEncoding aesonDecodeOptionsBrittany + +instance FromJSON (CLayoutConfig Maybe) where + parseJSON = Aeson.genericParseJSON aesonDecodeOptionsBrittany + +instance ToJSON (CLayoutConfig Maybe) where + toJSON = Aeson.genericToJSON aesonDecodeOptionsBrittany + +instance FromJSON (CErrorHandlingConfig Maybe) where + parseJSON = Aeson.genericParseJSON aesonDecodeOptionsBrittany + +instance ToJSON (CErrorHandlingConfig Maybe) where + toJSON = Aeson.genericToJSON aesonDecodeOptionsBrittany + +instance FromJSON (CForwardOptions Maybe) where + parseJSON = Aeson.genericParseJSON aesonDecodeOptionsBrittany + +instance ToJSON (CForwardOptions Maybe) where + toJSON = Aeson.genericToJSON aesonDecodeOptionsBrittany + +instance FromJSON (CPreProcessorConfig Maybe) where + parseJSON = Aeson.genericParseJSON aesonDecodeOptionsBrittany + +instance ToJSON (CPreProcessorConfig Maybe) where + toJSON = Aeson.genericToJSON aesonDecodeOptionsBrittany + +instance ToJSON (CConfig Maybe) where + toJSON = Aeson.genericToJSON aesonDecodeOptionsBrittany -- This custom instance ensures the "omitNothingFields" behaviour not only for -- leafs, but for nodes of the config as well. This way e.g. "{}" is valid -- 2.30.2 From 1e7a94e72e330ba1f2837a8b32a57cb09e41a27a Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 17:12:55 +0000 Subject: [PATCH 23/74] Inline `prelude.inc` --- .hlint.yaml | 3 +- brittany.cabal | 6 - src-literatetests/Main.hs | 46 +++++- src-unittests/AsymptoticPerfTests.hs | 46 +++++- src-unittests/TestMain.hs | 46 +++++- src-unittests/TestUtils.hs | 46 +++++- src/Language/Haskell/Brittany.hs | 47 +++++- src/Language/Haskell/Brittany/Internal.hs | 46 +++++- .../Haskell/Brittany/Internal/Backend.hs | 47 +++++- .../Haskell/Brittany/Internal/BackendUtils.hs | 46 +++++- .../Haskell/Brittany/Internal/Config.hs | 46 +++++- .../Haskell/Brittany/Internal/Config/Types.hs | 46 +++++- .../Internal/Config/Types/Instances.hs | 46 +++++- .../Brittany/Internal/ExactPrintUtils.hs | 46 +++++- .../Brittany/Internal/LayouterBasics.hs | 46 +++++- .../Brittany/Internal/Layouters/DataDecl.hs | 46 +++++- .../Brittany/Internal/Layouters/Decl.hs | 46 +++++- .../Brittany/Internal/Layouters/Expr.hs | 46 +++++- .../Brittany/Internal/Layouters/Expr.hs-boot | 46 +++++- .../Haskell/Brittany/Internal/Layouters/IE.hs | 46 +++++- .../Brittany/Internal/Layouters/Import.hs | 46 +++++- .../Brittany/Internal/Layouters/Module.hs | 46 +++++- .../Brittany/Internal/Layouters/Pattern.hs | 46 +++++- .../Brittany/Internal/Layouters/Stmt.hs | 46 +++++- .../Brittany/Internal/Layouters/Stmt.hs-boot | 46 +++++- .../Brittany/Internal/Layouters/Type.hs | 46 +++++- .../Haskell/Brittany/Internal/Obfuscation.hs | 46 +++++- .../Brittany/Internal/Transformations/Alt.hs | 46 +++++- .../Internal/Transformations/Columns.hs | 46 +++++- .../Internal/Transformations/Floating.hs | 46 +++++- .../Internal/Transformations/Indent.hs | 46 +++++- .../Brittany/Internal/Transformations/Par.hs | 46 +++++- .../Haskell/Brittany/Internal/Types.hs | 46 +++++- .../Haskell/Brittany/Internal/Utils.hs | 46 +++++- src/Language/Haskell/Brittany/Main.hs | 46 +++++- srcinc/prelude.inc | 147 ------------------ 36 files changed, 1486 insertions(+), 190 deletions(-) delete mode 100644 srcinc/prelude.inc diff --git a/.hlint.yaml b/.hlint.yaml index 6fecf6a..1aaea27 100644 --- a/.hlint.yaml +++ b/.hlint.yaml @@ -8,8 +8,7 @@ # Specify additional command line arguments - arguments: - [ "--cpp-include=srcinc" - , "--language=GADTs" + [ "--language=GADTs" , "--language=LambdaCase" , "--language=MultiWayIf" , "--language=KindSignatures" diff --git a/brittany.cabal b/brittany.cabal index b389fe0..48f08ca 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -26,7 +26,6 @@ extra-doc-files: { } extra-source-files: { src-literatetests/*.blt - srcinc/prelude.inc } source-repository head { @@ -49,8 +48,6 @@ library { Haskell2010 hs-source-dirs: src - include-dirs: - srcinc exposed-modules: { Language.Haskell.Brittany Language.Haskell.Brittany.Main @@ -206,7 +203,6 @@ test-suite unittests other-modules: TestUtils AsymptoticPerfTests hs-source-dirs: src-unittests - include-dirs: srcinc default-extensions: { CPP @@ -278,7 +274,6 @@ test-suite littests main-is: Main.hs other-modules: hs-source-dirs: src-literatetests - include-dirs: srcinc default-extensions: { CPP @@ -320,7 +315,6 @@ test-suite libinterfacetests main-is: Main.hs other-modules: hs-source-dirs: src-libinterfacetests - include-dirs: srcinc default-extensions: { FlexibleContexts FlexibleInstances diff --git a/src-literatetests/Main.hs b/src-literatetests/Main.hs index ae469e3..bc860ce 100644 --- a/src-literatetests/Main.hs +++ b/src-literatetests/Main.hs @@ -8,7 +8,51 @@ where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import Test.Hspec import Test.Hspec.Runner ( hspecWith diff --git a/src-unittests/AsymptoticPerfTests.hs b/src-unittests/AsymptoticPerfTests.hs index f3f35ba..636ff89 100644 --- a/src-unittests/AsymptoticPerfTests.hs +++ b/src-unittests/AsymptoticPerfTests.hs @@ -7,7 +7,51 @@ where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import Test.Hspec diff --git a/src-unittests/TestMain.hs b/src-unittests/TestMain.hs index ca6dbb5..66eaed2 100644 --- a/src-unittests/TestMain.hs +++ b/src-unittests/TestMain.hs @@ -4,7 +4,51 @@ module Main where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import Test.Hspec diff --git a/src-unittests/TestUtils.hs b/src-unittests/TestUtils.hs index 052ade6..a8b8e2e 100644 --- a/src-unittests/TestUtils.hs +++ b/src-unittests/TestUtils.hs @@ -4,7 +4,51 @@ module TestUtils where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import Test.Hspec diff --git a/src/Language/Haskell/Brittany.hs b/src/Language/Haskell/Brittany.hs index 9d45dde..4eb99ea 100644 --- a/src/Language/Haskell/Brittany.hs +++ b/src/Language/Haskell/Brittany.hs @@ -21,10 +21,53 @@ where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.Config.Types import Language.Haskell.Brittany.Internal.Config - diff --git a/src/Language/Haskell/Brittany/Internal.hs b/src/Language/Haskell/Brittany/Internal.hs index e1a111e..9bdd6cf 100644 --- a/src/Language/Haskell/Brittany/Internal.hs +++ b/src/Language/Haskell/Brittany/Internal.hs @@ -15,7 +15,51 @@ where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass -- brittany { lconfig_importAsColumn: 60, lconfig_importColumn: 60 } import qualified Language.Haskell.GHC.ExactPrint as ExactPrint diff --git a/src/Language/Haskell/Brittany/Internal/Backend.hs b/src/Language/Haskell/Brittany/Internal/Backend.hs index 234d55e..a22da90 100644 --- a/src/Language/Haskell/Brittany/Internal/Backend.hs +++ b/src/Language/Haskell/Brittany/Internal/Backend.hs @@ -12,7 +12,51 @@ where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import qualified Language.Haskell.GHC.ExactPrint as ExactPrint import qualified Language.Haskell.GHC.ExactPrint.Annotate as ExactPrint.Annotate @@ -716,4 +760,3 @@ processInfoIgnore = \case ColInfoStart -> error "should not happen (TM)" ColInfoNo doc -> layoutBriDocM doc ColInfo _ _ list -> list `forM_` (snd .> processInfoIgnore) - diff --git a/src/Language/Haskell/Brittany/Internal/BackendUtils.hs b/src/Language/Haskell/Brittany/Internal/BackendUtils.hs index 201c7c5..99eb46b 100644 --- a/src/Language/Haskell/Brittany/Internal/BackendUtils.hs +++ b/src/Language/Haskell/Brittany/Internal/BackendUtils.hs @@ -32,7 +32,51 @@ module Language.Haskell.Brittany.Internal.BackendUtils where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.Config.Types diff --git a/src/Language/Haskell/Brittany/Internal/Config.hs b/src/Language/Haskell/Brittany/Internal/Config.hs index b6ead91..904c272 100644 --- a/src/Language/Haskell/Brittany/Internal/Config.hs +++ b/src/Language/Haskell/Brittany/Internal/Config.hs @@ -20,7 +20,51 @@ where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.LayouterBasics diff --git a/src/Language/Haskell/Brittany/Internal/Config/Types.hs b/src/Language/Haskell/Brittany/Internal/Config/Types.hs index 18fb92b..d596708 100644 --- a/src/Language/Haskell/Brittany/Internal/Config/Types.hs +++ b/src/Language/Haskell/Brittany/Internal/Config/Types.hs @@ -12,7 +12,51 @@ where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import Data.Yaml import qualified Data.Aeson.Types as Aeson diff --git a/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs b/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs index b8ba9cf..d0838c0 100644 --- a/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs +++ b/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs @@ -18,7 +18,51 @@ where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import Data.Yaml import qualified Data.Aeson.Key as Key diff --git a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs index 2100c4f..036f5d9 100644 --- a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs +++ b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs @@ -12,7 +12,51 @@ where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.Config.Types diff --git a/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs b/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs index a93996c..2c1a37d 100644 --- a/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs +++ b/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs @@ -80,7 +80,51 @@ where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import qualified Control.Monad.Writer.Strict as Writer diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs index b747293..243dbf6 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs @@ -10,7 +10,51 @@ where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.LayouterBasics diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs index d251dfb..38843f6 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs @@ -18,7 +18,51 @@ where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.LayouterBasics diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs index ac6e4ad..1386816 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs @@ -10,7 +10,51 @@ where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.LayouterBasics diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot index f32fc3a..8e77eda 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot @@ -9,7 +9,51 @@ where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.LayouterBasics diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs b/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs index 45cd047..89945cd 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs @@ -6,7 +6,51 @@ module Language.Haskell.Brittany.Internal.Layouters.IE ) where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.LayouterBasics diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs index 09af4de..1eae5d6 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs @@ -1,6 +1,50 @@ module Language.Haskell.Brittany.Internal.Layouters.Import (layoutImport) where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.LayouterBasics diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs index a968a97..014b9fe 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs @@ -2,7 +2,51 @@ module Language.Haskell.Brittany.Internal.Layouters.Module (layoutModule) where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.LayouterBasics diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs index 1fa3800..bf5b8e0 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs @@ -9,7 +9,51 @@ where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.LayouterBasics diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs index 14be015..30867aa 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs @@ -7,7 +7,51 @@ where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.LayouterBasics diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot index 5fa795b..94f0d3c 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot @@ -7,7 +7,51 @@ where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.LayouterBasics diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs index 3d340ba..aac5453 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs @@ -9,7 +9,51 @@ where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Config.Types import Language.Haskell.Brittany.Internal.Types diff --git a/src/Language/Haskell/Brittany/Internal/Obfuscation.hs b/src/Language/Haskell/Brittany/Internal/Obfuscation.hs index 5bdcfa8..7aa2ed6 100644 --- a/src/Language/Haskell/Brittany/Internal/Obfuscation.hs +++ b/src/Language/Haskell/Brittany/Internal/Obfuscation.hs @@ -5,7 +5,51 @@ where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import Data.Char import System.Random diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs b/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs index d186564..7e5677b 100644 --- a/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs +++ b/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs @@ -9,7 +9,51 @@ where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import Data.HList.ContainsType diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Columns.hs b/src/Language/Haskell/Brittany/Internal/Transformations/Columns.hs index d652dda..f10853d 100644 --- a/src/Language/Haskell/Brittany/Internal/Transformations/Columns.hs +++ b/src/Language/Haskell/Brittany/Internal/Transformations/Columns.hs @@ -5,7 +5,51 @@ where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Utils import Language.Haskell.Brittany.Internal.Config.Types diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Floating.hs b/src/Language/Haskell/Brittany/Internal/Transformations/Floating.hs index 4bb227b..992d3b0 100644 --- a/src/Language/Haskell/Brittany/Internal/Transformations/Floating.hs +++ b/src/Language/Haskell/Brittany/Internal/Transformations/Floating.hs @@ -5,7 +5,51 @@ where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Utils import Language.Haskell.Brittany.Internal.Config.Types diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Indent.hs b/src/Language/Haskell/Brittany/Internal/Transformations/Indent.hs index b3d7709..f1c43b2 100644 --- a/src/Language/Haskell/Brittany/Internal/Transformations/Indent.hs +++ b/src/Language/Haskell/Brittany/Internal/Transformations/Indent.hs @@ -5,7 +5,51 @@ where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Utils import Language.Haskell.Brittany.Internal.Config.Types diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Par.hs b/src/Language/Haskell/Brittany/Internal/Transformations/Par.hs index e048584..f1b3973 100644 --- a/src/Language/Haskell/Brittany/Internal/Transformations/Par.hs +++ b/src/Language/Haskell/Brittany/Internal/Transformations/Par.hs @@ -5,7 +5,51 @@ where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Utils import Language.Haskell.Brittany.Internal.Config.Types diff --git a/src/Language/Haskell/Brittany/Internal/Types.hs b/src/Language/Haskell/Brittany/Internal/Types.hs index d24907a..f04d2a6 100644 --- a/src/Language/Haskell/Brittany/Internal/Types.hs +++ b/src/Language/Haskell/Brittany/Internal/Types.hs @@ -10,7 +10,51 @@ where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import qualified Language.Haskell.GHC.ExactPrint as ExactPrint import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types diff --git a/src/Language/Haskell/Brittany/Internal/Utils.hs b/src/Language/Haskell/Brittany/Internal/Utils.hs index ea2b4ac..43f9382 100644 --- a/src/Language/Haskell/Brittany/Internal/Utils.hs +++ b/src/Language/Haskell/Brittany/Internal/Utils.hs @@ -32,7 +32,51 @@ where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass import qualified Language.Haskell.GHC.ExactPrint as ExactPrint import qualified Language.Haskell.GHC.ExactPrint.Annotate as ExactPrint.Annotate diff --git a/src/Language/Haskell/Brittany/Main.hs b/src/Language/Haskell/Brittany/Main.hs index a84d882..354c2ce 100644 --- a/src/Language/Haskell/Brittany/Main.hs +++ b/src/Language/Haskell/Brittany/Main.hs @@ -4,7 +4,51 @@ module Language.Haskell.Brittany.Main (main) where -#include "prelude.inc" +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Reader.Class as Reader.Class +import qualified Control.Monad.RWS.Class as RWS.Class +import qualified Control.Monad.State.Class as State.Class +import qualified Control.Monad.Trans.Except as ExceptT +import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL +import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Trans.State as State +import qualified Control.Monad.Trans.State.Lazy as StateL +import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Control.Monad.Writer.Class as Writer.Class +import qualified Data.Bool as Bool +import qualified Data.ByteString +import qualified Data.ByteString as ByteString +import qualified Data.ByteString.Char8 +import qualified Data.ByteString.Lazy as ByteStringL +import qualified Data.Coerce +import qualified Data.Data +import qualified Data.Either +import qualified Data.Foldable +import qualified Data.Foldable as Foldable +import qualified Data.IntMap.Lazy as IntMapL +import qualified Data.IntMap.Strict as IntMapS +import qualified Data.List.Extra +import qualified Data.Map as Map +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified Data.Set as Set +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text as Text +import qualified Data.Text.Encoding as Text.Encoding +import qualified Data.Text.IO as Text.IO +import qualified Data.Text.Lazy as TextL +import qualified Data.Text.Lazy.Encoding as TextL.Encoding +import qualified Data.Text.Lazy.IO as TextL.IO +import qualified GHC.OldList as List +import qualified Safe as Safe +import qualified System.Directory +import qualified System.IO +import qualified Text.PrettyPrint +import qualified Text.PrettyPrint.Annotated +import qualified Text.PrettyPrint.Annotated.HughesPJ +import qualified Text.PrettyPrint.Annotated.HughesPJClass -- brittany { lconfig_importAsColumn: 60, lconfig_importColumn: 60 } import qualified Language.Haskell.GHC.ExactPrint as ExactPrint diff --git a/srcinc/prelude.inc b/srcinc/prelude.inc deleted file mode 100644 index 81ca53a..0000000 --- a/srcinc/prelude.inc +++ /dev/null @@ -1,147 +0,0 @@ -import qualified Data.ByteString --- import qualified Data.ByteString.Builder --- import qualified Data.ByteString.Builder.Extra --- import qualified Data.ByteString.Builder.Prim -import qualified Data.ByteString.Char8 --- import qualified Data.ByteString.Lazy.Builder --- import qualified Data.ByteString.Lazy.Builder.ASCII --- import qualified Data.ByteString.Lazy.Builder.Extras --- import qualified Data.ByteString.Lazy.Char8 --- import qualified Data.ByteString.Lazy --- import qualified Data.ByteString.Short --- import qualified Data.ByteString.Unsafe - --- import qualified Data.Graph --- import qualified Data.IntMap --- import qualified Data.IntMap.Lazy --- import qualified Data.IntMap.Strict --- import qualified Data.IntSet --- import qualified Data.Map --- import qualified Data.Map.Lazy --- import qualified Data.Map.Strict --- import qualified Data.Sequence --- import qualified Data.Set --- import qualified Data.Tree - -import qualified System.Directory - --- import qualified Control.Concurrent.Extra --- import qualified Control.Exception.Extra --- import qualified Control.Monad.Extra --- import qualified Data.Either.Extra --- import qualified Data.IORef.Extra -import qualified Data.List.Extra --- import qualified Data.Tuple.Extra --- import qualified Data.Version.Extra --- import qualified Numeric.Extra --- import qualified System.Directory.Extra --- import qualified System.Environment.Extra --- import qualified System.IO.Extra --- import qualified System.Info.Extra --- import qualified System.Process.Extra --- import qualified System.Time.Extra - --- import qualified Control.Monad.Trans.MultiRWS.Lazy --- import qualified Control.Monad.Trans.MultiRWS.Strict --- import qualified Control.Monad.Trans.MultiReader --- import qualified Control.Monad.Trans.MultiReader.Class --- import qualified Control.Monad.Trans.MultiReader.Lazy --- import qualified Control.Monad.Trans.MultiReader.Strict --- import qualified Control.Monad.Trans.MultiState --- import qualified Control.Monad.Trans.MultiState.Class --- import qualified Control.Monad.Trans.MultiState.Lazy --- import qualified Control.Monad.Trans.MultiState.Strict --- import qualified Control.Monad.Trans.MultiWriter --- import qualified Control.Monad.Trans.MultiWriter.Class --- import qualified Control.Monad.Trans.MultiWriter.Lazy --- import qualified Control.Monad.Trans.MultiWriter.Strict - -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL - -import qualified Text.PrettyPrint - -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass - --- import qualified Text.PrettyPrint.HughesPJ --- import qualified Text.PrettyPrint.HughesPJClass - --- import qualified Data.Text --- import qualified Data.Text.Array --- import qualified Data.Text.Encoding --- import qualified Data.Text.Encoding.Error --- import qualified Data.Text.Foreign --- import qualified Data.Text.IO --- import qualified Data.Text.Lazy --- import qualified Data.Text.Lazy.Builder - --- import qualified Data.Bifunctor --- import qualified Data.Bits --- import qualified Data.Bool --- import qualified Data.Char -import qualified Data.Coerce --- import qualified Data.Complex -import qualified Data.Data --- import qualified Data.Dynamic -import qualified Data.Either --- import qualified Data.Eq --- import qualified Data.Fixed -import qualified Data.Foldable --- import qualified Data.Function --- import qualified Data.Functor --- import qualified Data.Functor.Identity --- import qualified Data.IORef --- import qualified Data.Int --- import qualified Data.Ix --- import qualified Data.List -import qualified Data.Maybe --- import qualified Data.Monoid --- import qualified Data.Ord --- import qualified Data.Proxy --- import qualified Debug.Trace --- import qualified Numeric --- import qualified Numeric.Natural -import qualified System.IO --- import qualified Unsafe.Coerce - -import qualified Data.Bool as Bool -import qualified Data.Foldable as Foldable -import qualified GHC.OldList as List - -import qualified Data.Semigroup as Semigroup - -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Lazy as ByteStringL - -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.Map as Map -import qualified Data.Sequence as Seq -import qualified Data.Set as Set - -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Writer.Class as Writer.Class - -import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO - -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Trans.Except as ExceptT - -import qualified Data.Strict.Maybe as Strict - -import qualified Safe as Safe - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -- 2.30.2 From 32da5defb54b81d87fa23e4f78a02dd72e2534a5 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 17:27:19 +0000 Subject: [PATCH 24/74] Remove unused imports --- brittany.cabal | 1 - src/Language/Haskell/Brittany.hs | 45 ---------------- src/Language/Haskell/Brittany/Internal.hs | 43 +--------------- .../Haskell/Brittany/Internal/Backend.hs | 44 ---------------- .../Haskell/Brittany/Internal/BackendUtils.hs | 39 +------------- .../Haskell/Brittany/Internal/Config.hs | 45 +--------------- .../Haskell/Brittany/Internal/Config/Types.hs | 46 +---------------- .../Internal/Config/Types/Instances.hs | 46 ----------------- .../Brittany/Internal/ExactPrintUtils.hs | 46 +---------------- .../Brittany/Internal/LayouterBasics.hs | 43 +--------------- .../Brittany/Internal/Layouters/DataDecl.hs | 51 +------------------ .../Brittany/Internal/Layouters/Decl.hs | 51 ++----------------- .../Brittany/Internal/Layouters/Expr.hs | 42 +-------------- .../Brittany/Internal/Layouters/Expr.hs-boot | 47 ----------------- .../Haskell/Brittany/Internal/Layouters/IE.hs | 48 ----------------- .../Brittany/Internal/Layouters/Import.hs | 47 ----------------- .../Brittany/Internal/Layouters/Module.hs | 49 +----------------- .../Brittany/Internal/Layouters/Pattern.hs | 46 +---------------- .../Brittany/Internal/Layouters/Stmt.hs | 48 +---------------- .../Brittany/Internal/Layouters/Stmt.hs-boot | 49 ------------------ .../Brittany/Internal/Layouters/Type.hs | 51 +------------------ .../Haskell/Brittany/Internal/Obfuscation.hs | 39 -------------- .../Haskell/Brittany/Internal/Prelude.hs | 38 ++------------ .../Brittany/Internal/Transformations/Alt.hs | 38 -------------- .../Internal/Transformations/Columns.hs | 45 ---------------- .../Internal/Transformations/Floating.hs | 43 ---------------- .../Internal/Transformations/Indent.hs | 45 ---------------- .../Brittany/Internal/Transformations/Par.hs | 47 ----------------- .../Haskell/Brittany/Internal/Types.hs | 46 ++--------------- .../Haskell/Brittany/Internal/Utils.hs | 43 ---------------- src/Language/Haskell/Brittany/Main.hs | 42 --------------- 31 files changed, 24 insertions(+), 1329 deletions(-) diff --git a/brittany.cabal b/brittany.cabal index 48f08ca..0c447e9 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -85,7 +85,6 @@ library { } ghc-options: { -Wall - -fno-warn-unused-imports -fno-warn-redundant-constraints } build-depends: diff --git a/src/Language/Haskell/Brittany.hs b/src/Language/Haskell/Brittany.hs index 4eb99ea..a4fc839 100644 --- a/src/Language/Haskell/Brittany.hs +++ b/src/Language/Haskell/Brittany.hs @@ -21,51 +21,6 @@ where -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce -import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra -import qualified Data.Map as Map -import qualified Data.Maybe -import qualified Data.Semigroup as Semigroup -import qualified Data.Sequence as Seq -import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict -import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO -import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal import Language.Haskell.Brittany.Internal.Types diff --git a/src/Language/Haskell/Brittany/Internal.hs b/src/Language/Haskell/Brittany/Internal.hs index 9bdd6cf..81c7733 100644 --- a/src/Language/Haskell/Brittany/Internal.hs +++ b/src/Language/Haskell/Brittany/Internal.hs @@ -17,60 +17,24 @@ where import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce -import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra import qualified Data.Map as Map import qualified Data.Maybe import qualified Data.Semigroup as Semigroup import qualified Data.Sequence as Seq -import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass -- brittany { lconfig_importAsColumn: 60, lconfig_importColumn: 60 } import qualified Language.Haskell.GHC.ExactPrint as ExactPrint import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint import qualified Language.Haskell.GHC.ExactPrint.Parsers as ExactPrint.Parsers -import Data.Data import Control.Monad.Trans.Except import Data.HList.HList import qualified Data.Yaml -import qualified Data.ByteString.Char8 import Data.CZipWith import qualified UI.Butcher.Monadic as Butcher @@ -81,7 +45,6 @@ import Language.Haskell.Brittany.Internal.Config.Types import Language.Haskell.Brittany.Internal.Config import Language.Haskell.Brittany.Internal.LayouterBasics -import Language.Haskell.Brittany.Internal.Layouters.Type import Language.Haskell.Brittany.Internal.Layouters.Decl import Language.Haskell.Brittany.Internal.Layouters.Module import Language.Haskell.Brittany.Internal.Utils @@ -98,12 +61,8 @@ import Language.Haskell.Brittany.Internal.Transformations.Indent import qualified GHC as GHC hiding ( parseModule ) import GHC.Parser.Annotation ( AnnKeywordId(..) ) -import GHC ( Located - , runGhc - , GenLocated(L) - , moduleNameString +import GHC ( GenLocated(L) ) -import GHC.Types.Name.Reader ( RdrName(..) ) import GHC.Types.SrcLoc ( SrcSpan ) import GHC.Hs import GHC.Data.Bag diff --git a/src/Language/Haskell/Brittany/Internal/Backend.hs b/src/Language/Haskell/Brittany/Internal/Backend.hs index a22da90..92c29fb 100644 --- a/src/Language/Haskell/Brittany/Internal/Backend.hs +++ b/src/Language/Haskell/Brittany/Internal/Backend.hs @@ -14,56 +14,19 @@ where import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce -import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable import qualified Data.Foldable as Foldable import qualified Data.IntMap.Lazy as IntMapL import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra import qualified Data.Map as Map -import qualified Data.Maybe import qualified Data.Semigroup as Semigroup import qualified Data.Sequence as Seq import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass import qualified Language.Haskell.GHC.ExactPrint as ExactPrint -import qualified Language.Haskell.GHC.ExactPrint.Annotate as ExactPrint.Annotate import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types -import Language.Haskell.GHC.ExactPrint.Types ( AnnKey, Annotation ) - -import GHC ( AnnKeywordId (..) ) import Language.Haskell.Brittany.Internal.LayouterBasics import Language.Haskell.Brittany.Internal.BackendUtils @@ -75,13 +38,6 @@ import Language.Haskell.Brittany.Internal.Types import qualified Data.Text.Lazy.Builder as Text.Builder -import Data.HList.ContainsType - -import Control.Monad.Extra ( whenM ) - -import qualified Control.Monad.Trans.Writer.Strict as WriterS - - type ColIndex = Int diff --git a/src/Language/Haskell/Brittany/Internal/BackendUtils.hs b/src/Language/Haskell/Brittany/Internal/BackendUtils.hs index 99eb46b..93b7dc7 100644 --- a/src/Language/Haskell/Brittany/Internal/BackendUtils.hs +++ b/src/Language/Haskell/Brittany/Internal/BackendUtils.hs @@ -34,62 +34,25 @@ where import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce import qualified Data.Data import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra import qualified Data.Map as Map import qualified Data.Maybe import qualified Data.Semigroup as Semigroup -import qualified Data.Sequence as Seq -import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.Config.Types import Language.Haskell.GHC.ExactPrint.Types ( AnnKey , Annotation - , KeywordId ) import qualified Data.Text.Lazy.Builder as Text.Builder import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint import Language.Haskell.Brittany.Internal.Utils -import GHC ( Located, GenLocated(L), moduleNameString ) +import GHC ( Located ) diff --git a/src/Language/Haskell/Brittany/Internal/Config.hs b/src/Language/Haskell/Brittany/Internal/Config.hs index 904c272..22d7163 100644 --- a/src/Language/Haskell/Brittany/Internal/Config.hs +++ b/src/Language/Haskell/Brittany/Internal/Config.hs @@ -22,68 +22,27 @@ where import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class import qualified Data.Bool as Bool -import qualified Data.ByteString import qualified Data.ByteString as ByteString import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce -import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra -import qualified Data.Map as Map -import qualified Data.Maybe import qualified Data.Semigroup as Semigroup -import qualified Data.Sequence as Seq -import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict -import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO import qualified GHC.OldList as List -import qualified Safe as Safe import qualified System.Directory import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass - -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.LayouterBasics import qualified Data.Yaml import Data.CZipWith import UI.Butcher.Monadic -import Data.Monoid ( (<>) ) import qualified System.Console.CmdArgs.Explicit as CmdArgs import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Config.Types.Instances +import Language.Haskell.Brittany.Internal.Config.Types.Instances () import Language.Haskell.Brittany.Internal.Utils -import Data.Coerce ( Coercible - , coerce +import Data.Coerce ( coerce ) import qualified Data.List.NonEmpty as NonEmpty diff --git a/src/Language/Haskell/Brittany/Internal/Config/Types.hs b/src/Language/Haskell/Brittany/Internal/Config/Types.hs index d596708..e758b2e 100644 --- a/src/Language/Haskell/Brittany/Internal/Config/Types.hs +++ b/src/Language/Haskell/Brittany/Internal/Config/Types.hs @@ -13,53 +13,9 @@ where import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce -import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra -import qualified Data.Map as Map -import qualified Data.Maybe +import Language.Haskell.Brittany.Internal.PreludeUtils () import qualified Data.Semigroup as Semigroup -import qualified Data.Sequence as Seq -import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict -import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO -import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass -import Data.Yaml -import qualified Data.Aeson.Types as Aeson import GHC.Generics import Data.Data ( Data ) diff --git a/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs b/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs index d0838c0..0ad985c 100644 --- a/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs +++ b/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs @@ -19,50 +19,6 @@ where import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce -import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra -import qualified Data.Map as Map -import qualified Data.Maybe -import qualified Data.Semigroup as Semigroup -import qualified Data.Sequence as Seq -import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict -import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO -import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass import Data.Yaml import qualified Data.Aeson.Key as Key @@ -70,8 +26,6 @@ import qualified Data.Aeson.Types as Aeson import Language.Haskell.Brittany.Internal.Config.Types -import GHC.Generics - aesonDecodeOptionsBrittany :: Aeson.Options diff --git a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs index 036f5d9..c17e8b1 100644 --- a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs +++ b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs @@ -14,66 +14,24 @@ where import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class import qualified Control.Monad.State.Class as State.Class import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce -import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra import qualified Data.Map as Map import qualified Data.Maybe -import qualified Data.Semigroup as Semigroup import qualified Data.Sequence as Seq import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict -import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO -import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass -import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Utils import Data.Data import Data.HList.HList -import GHC.Driver.Session ( getDynFlags ) -import GHC ( runGhc, GenLocated(L), moduleNameString ) +import GHC ( GenLocated(L) ) import qualified GHC.Driver.Session as GHC import qualified GHC as GHC hiding (parseModule) -import qualified GHC.Parser as GHC import qualified GHC.Types.SrcLoc as GHC -import qualified GHC.Data.FastString as GHC -import qualified GHC.Parser.Lexer as GHC -import qualified GHC.Data.StringBuffer as GHC -import qualified GHC.Utils.Outputable as GHC import qualified GHC.Driver.CmdLine as GHC import GHC.Hs @@ -83,10 +41,8 @@ import GHC.Types.SrcLoc ( SrcSpan, Located ) 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 import qualified Language.Haskell.GHC.ExactPrint.Parsers as ExactPrint -import qualified Language.Haskell.GHC.ExactPrint.Preprocess as ExactPrint import qualified Language.Haskell.GHC.ExactPrint.Delta as ExactPrint import qualified Data.Generics as SYB diff --git a/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs b/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs index 2c1a37d..296f3ba 100644 --- a/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs +++ b/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs @@ -82,49 +82,13 @@ where import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce -import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra import qualified Data.Map as Map -import qualified Data.Maybe import qualified Data.Semigroup as Semigroup import qualified Data.Sequence as Seq import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass import qualified Control.Monad.Writer.Strict as Writer @@ -134,7 +98,7 @@ import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint import qualified Language.Haskell.GHC.ExactPrint.Utils as ExactPrint.Utils -import Language.Haskell.GHC.ExactPrint.Types ( AnnKey, Annotation, KeywordId ) +import Language.Haskell.GHC.ExactPrint.Types ( AnnKey, Annotation ) import qualified Data.Text.Lazy.Builder as Text.Builder @@ -144,7 +108,7 @@ import Language.Haskell.Brittany.Internal.Utils import Language.Haskell.Brittany.Internal.ExactPrintUtils import GHC.Types.Name.Reader ( RdrName(..) ) -import GHC ( Located, runGhc, GenLocated(L), moduleNameString ) +import GHC ( Located, GenLocated(L), moduleNameString ) import qualified GHC.Types.SrcLoc as GHC import GHC.Types.Name.Occurrence ( occNameString ) import GHC.Types.Name ( getOccString ) @@ -152,14 +116,11 @@ import GHC ( moduleName ) import GHC.Parser.Annotation ( AnnKeywordId(..) ) import Data.Data -import Data.Generics.Schemes import qualified Data.Char as Char import DataTreePrint -import Data.HList.HList - processDefault diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs index 243dbf6..59a54bb 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs @@ -12,69 +12,20 @@ where import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra -import qualified Data.Map as Map -import qualified Data.Maybe import qualified Data.Semigroup as Semigroup -import qualified Data.Sequence as Seq -import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.LayouterBasics import Language.Haskell.Brittany.Internal.Config.Types -import GHC.Types.Name.Reader ( RdrName(..) ) -import GHC ( Located, runGhc, GenLocated(L), moduleNameString ) +import GHC ( Located, GenLocated(L) ) import qualified GHC import GHC.Hs -import GHC.Types.Name -import GHC.Types.Basic -import Language.Haskell.GHC.ExactPrint.Types ( mkAnnKey ) import Language.Haskell.Brittany.Internal.Layouters.Type -import {-# SOURCE #-} Language.Haskell.Brittany.Internal.Layouters.Expr -import {-# SOURCE #-} Language.Haskell.Brittany.Internal.Layouters.Stmt -import Language.Haskell.Brittany.Internal.Layouters.Pattern -import Language.Haskell.Brittany.Internal.Utils - -import GHC.Data.Bag ( mapBagM ) diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs index 38843f6..47a9514 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs @@ -20,49 +20,12 @@ where import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce import qualified Data.Data -import qualified Data.Either import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra -import qualified Data.Map as Map import qualified Data.Maybe import qualified Data.Semigroup as Semigroup -import qualified Data.Sequence as Seq -import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.LayouterBasics @@ -70,21 +33,15 @@ import Language.Haskell.Brittany.Internal.Config.Types import Language.Haskell.Brittany.Internal.Layouters.Type import qualified Language.Haskell.GHC.ExactPrint as ExactPrint -import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint import qualified Language.Haskell.GHC.ExactPrint.Utils as ExactPrint import Language.Haskell.Brittany.Internal.ExactPrintUtils -import Language.Haskell.Brittany.Internal.Utils -import GHC ( runGhc - , GenLocated(L) - , moduleNameString +import GHC ( GenLocated(L) , AnnKeywordId(..) ) -import GHC.Types.SrcLoc ( SrcSpan, noSrcSpan, Located , getLoc, unLoc ) +import GHC.Types.SrcLoc ( SrcSpan, Located , getLoc, unLoc ) import qualified GHC.Data.FastString as FastString import GHC.Hs -import GHC.Hs.Extension (NoExtField (..)) -import GHC.Types.Name import GHC.Types.Basic ( InlinePragma(..) , Activation(..) , InlineSpec(..) @@ -93,14 +50,12 @@ import GHC.Types.Basic ( InlinePragma(..) ) import Language.Haskell.GHC.ExactPrint.Types ( mkAnnKey ) -import Language.Haskell.Brittany.Internal.Layouters.Type import {-# SOURCE #-} Language.Haskell.Brittany.Internal.Layouters.Expr import {-# SOURCE #-} Language.Haskell.Brittany.Internal.Layouters.Stmt import Language.Haskell.Brittany.Internal.Layouters.Pattern import Language.Haskell.Brittany.Internal.Layouters.DataDecl -import GHC.Data.Bag ( mapBagM, bagToList, emptyBag ) -import Data.Char (isUpper) +import GHC.Data.Bag ( bagToList, emptyBag ) diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs index 1386816..f2b9674 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs @@ -12,57 +12,17 @@ where import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra -import qualified Data.Map as Map -import qualified Data.Maybe import qualified Data.Semigroup as Semigroup import qualified Data.Sequence as Seq -import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.LayouterBasics import Language.Haskell.Brittany.Internal.Config.Types -import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types - -import GHC ( runGhc, GenLocated(L), SrcSpan, moduleNameString, AnnKeywordId(..), RdrName(..) ) +import GHC ( GenLocated(L), SrcSpan, AnnKeywordId(..), RdrName(..) ) import GHC.Hs import GHC.Types.Name import qualified GHC.Data.FastString as FastString diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot index 8e77eda..1c748f0 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot @@ -10,57 +10,10 @@ where import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce -import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra -import qualified Data.Map as Map -import qualified Data.Maybe -import qualified Data.Semigroup as Semigroup -import qualified Data.Sequence as Seq -import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict -import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO -import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.LayouterBasics -import GHC ( runGhc, GenLocated(L), moduleNameString ) import GHC.Hs -import GHC.Types.Name diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs b/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs index 89945cd..b7b3bb3 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs @@ -7,57 +7,14 @@ module Language.Haskell.Brittany.Internal.Layouters.IE where import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce -import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS import qualified Data.List.Extra -import qualified Data.Map as Map -import qualified Data.Maybe -import qualified Data.Semigroup as Semigroup -import qualified Data.Sequence as Seq -import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.LayouterBasics -import Language.Haskell.Brittany.Internal.Config.Types import GHC ( unLoc - , runGhc , GenLocated(L) , moduleNameString , AnnKeywordId(..) @@ -65,11 +22,6 @@ import GHC ( unLoc , ModuleName ) import GHC.Hs -import GHC.Hs.ImpExp -import GHC.Types.Name -import GHC.Types.FieldLabel -import qualified GHC.Data.FastString -import GHC.Types.Basic import Language.Haskell.Brittany.Internal.Utils diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs index 1eae5d6..128c13f 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs @@ -2,49 +2,8 @@ module Language.Haskell.Brittany.Internal.Layouters.Import (layoutImport) where import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce -import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra -import qualified Data.Map as Map -import qualified Data.Maybe import qualified Data.Semigroup as Semigroup -import qualified Data.Sequence as Seq -import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO -import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.LayouterBasics @@ -57,14 +16,8 @@ import GHC ( unLoc , Located ) import GHC.Hs -import GHC.Types.Name -import GHC.Types.FieldLabel -import qualified GHC.Data.FastString import GHC.Types.Basic import GHC.Unit.Types (IsBootInterface(..)) -import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types - -import Language.Haskell.Brittany.Internal.Utils diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs index 014b9fe..48d789b 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs @@ -4,49 +4,10 @@ module Language.Haskell.Brittany.Internal.Layouters.Module (layoutModule) where import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce -import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra -import qualified Data.Map as Map import qualified Data.Maybe import qualified Data.Semigroup as Semigroup -import qualified Data.Sequence as Seq -import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.LayouterBasics @@ -54,23 +15,15 @@ import Language.Haskell.Brittany.Internal.Layouters.IE import Language.Haskell.Brittany.Internal.Layouters.Import import Language.Haskell.Brittany.Internal.Config.Types -import GHC (unLoc, runGhc, GenLocated(L), moduleNameString, AnnKeywordId(..)) +import GHC (unLoc, GenLocated(L), moduleNameString, AnnKeywordId(..)) import GHC.Hs -import GHC.Hs.ImpExp -import GHC.Types.Name -import GHC.Types.FieldLabel -import qualified GHC.Data.FastString -import GHC.Types.Basic import Language.Haskell.GHC.ExactPrint as ExactPrint -import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types import Language.Haskell.GHC.ExactPrint.Types ( DeltaPos(..) , deltaRow , commentContents ) -import Language.Haskell.Brittany.Internal.Utils - layoutModule :: ToBriDoc' HsModule diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs index bf5b8e0..9bc39cf 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs @@ -11,62 +11,18 @@ where import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce -import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra -import qualified Data.Map as Map -import qualified Data.Maybe -import qualified Data.Semigroup as Semigroup import qualified Data.Sequence as Seq -import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.LayouterBasics -import GHC ( Located - , runGhc - , GenLocated(L) - , moduleNameString +import GHC ( GenLocated(L) , ol_val ) -import qualified GHC import GHC.Hs -import GHC.Types.Name import GHC.Types.Basic import {-# SOURCE #-} Language.Haskell.Brittany.Internal.Layouters.Expr diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs index 30867aa..2af1ada 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs @@ -9,62 +9,16 @@ where import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce -import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra -import qualified Data.Map as Map -import qualified Data.Maybe import qualified Data.Semigroup as Semigroup -import qualified Data.Sequence as Seq -import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO -import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.LayouterBasics import Language.Haskell.Brittany.Internal.Config.Types -import GHC ( runGhc - , GenLocated(L) - , moduleNameString +import GHC ( GenLocated(L) ) import GHC.Hs -import GHC.Types.Name -import qualified GHC.Data.FastString as FastString -import GHC.Types.Basic import Language.Haskell.Brittany.Internal.Layouters.Pattern import Language.Haskell.Brittany.Internal.Layouters.Decl diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot index 94f0d3c..1b35a55 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot @@ -8,59 +8,10 @@ where import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce -import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra -import qualified Data.Map as Map -import qualified Data.Maybe -import qualified Data.Semigroup as Semigroup -import qualified Data.Sequence as Seq -import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict -import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO -import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.LayouterBasics -import GHC ( runGhc, GenLocated(L), moduleNameString ) import GHC.Hs -import GHC.Types.Name -import qualified GHC.Data.FastString -import GHC.Types.Basic diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs index aac5453..4aead4e 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs @@ -11,51 +11,9 @@ where import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce -import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra -import qualified Data.Map as Map -import qualified Data.Maybe -import qualified Data.Semigroup as Semigroup -import qualified Data.Sequence as Seq -import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass -import Language.Haskell.Brittany.Internal.Config.Types import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.LayouterBasics import Language.Haskell.Brittany.Internal.Utils @@ -63,19 +21,12 @@ import Language.Haskell.Brittany.Internal.Utils , FirstLastView(..) ) -import GHC ( runGhc - , GenLocated(L) - , moduleNameString +import GHC ( GenLocated(L) , AnnKeywordId (..) ) -import Language.Haskell.GHC.ExactPrint.Types ( mkAnnKey ) import GHC.Hs -import GHC.Types.Name import GHC.Utils.Outputable ( ftext, showSDocUnsafe ) import GHC.Types.Basic -import qualified GHC.Types.SrcLoc - -import DataTreePrint diff --git a/src/Language/Haskell/Brittany/Internal/Obfuscation.hs b/src/Language/Haskell/Brittany/Internal/Obfuscation.hs index 7aa2ed6..a214325 100644 --- a/src/Language/Haskell/Brittany/Internal/Obfuscation.hs +++ b/src/Language/Haskell/Brittany/Internal/Obfuscation.hs @@ -7,49 +7,10 @@ where import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce -import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra import qualified Data.Map as Map -import qualified Data.Maybe -import qualified Data.Semigroup as Semigroup -import qualified Data.Sequence as Seq import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass import Data.Char import System.Random diff --git a/src/Language/Haskell/Brittany/Internal/Prelude.hs b/src/Language/Haskell/Brittany/Internal/Prelude.hs index 6c52450..b6c4423 100644 --- a/src/Language/Haskell/Brittany/Internal/Prelude.hs +++ b/src/Language/Haskell/Brittany/Internal/Prelude.hs @@ -11,7 +11,6 @@ where import GHC.Hs.Extension as E ( GhcPs ) import GHC.Types.Name.Reader as E ( RdrName ) -import qualified GHC ( Located ) -- more general: @@ -56,21 +55,11 @@ import Data.Set as E ( Set ) import Data.Text as E ( Text ) -import Prelude as E ( Char - , String - , Int - , Integer - , Float - , Double - , Bool (..) - , undefined +import Prelude as E ( undefined , Eq (..) , Ord (..) , Enum (..) , Bounded (..) - , Maybe (..) - , Either (..) - , IO , (<$>) , (.) , ($) @@ -101,7 +90,6 @@ import Prelude as E ( Char , (||) , curry , uncurry - , Ordering (..) , flip , const , seq @@ -184,14 +172,12 @@ import Data.Word as E ( Word32 ) import Data.Ord as E ( comparing - , Down (..) ) import Data.Either as E ( either ) -import Data.Ratio as E ( Ratio - , (%) +import Data.Ratio as E ( (%) , numerator , denominator ) @@ -240,8 +226,7 @@ import Control.Concurrent as E ( threadDelay , forkOS ) -import Control.Concurrent.MVar as E ( MVar - , newEmptyMVar +import Control.Concurrent.MVar as E ( newEmptyMVar , newMVar , putMVar , readMVar @@ -273,7 +258,7 @@ import Data.Monoid as E ( mconcat ) import Data.Bifunctor as E ( bimap ) -import Data.Functor as E ( (<$), ($>) ) +import Data.Functor as E ( ($>) ) import Data.Function as E ( (&) ) import Data.Semigroup as E ( (<>) , Semigroup(..) @@ -293,12 +278,6 @@ import Control.Arrow as E ( first , (<<<) ) -import Data.Functor.Identity as E ( Identity (..) - ) - -import Data.Proxy as E ( Proxy (..) - ) - import Data.Version as E ( showVersion ) @@ -372,15 +351,6 @@ import Control.Monad.Trans.MultiRWS as E ( -- MultiRWST (..) -- , mPutRawS ) -import Control.Monad.Trans.MultiReader ( runMultiReaderTNil - , runMultiReaderTNil_ - , MultiReaderT (..) - , MultiReader - , MultiReaderTNull - ) - -import Data.Text as E ( Text ) - import Control.Monad.IO.Class as E ( MonadIO (..) ) diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs b/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs index 7e5677b..79f4f38 100644 --- a/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs +++ b/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs @@ -11,49 +11,11 @@ where import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce -import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS import qualified Data.List.Extra -import qualified Data.Map as Map -import qualified Data.Maybe import qualified Data.Semigroup as Semigroup -import qualified Data.Sequence as Seq -import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass import Data.HList.ContainsType diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Columns.hs b/src/Language/Haskell/Brittany/Internal/Transformations/Columns.hs index f10853d..c1da956 100644 --- a/src/Language/Haskell/Brittany/Internal/Transformations/Columns.hs +++ b/src/Language/Haskell/Brittany/Internal/Transformations/Columns.hs @@ -6,53 +6,8 @@ where import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce -import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra -import qualified Data.Map as Map -import qualified Data.Maybe -import qualified Data.Semigroup as Semigroup -import qualified Data.Sequence as Seq -import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict -import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass -import Language.Haskell.Brittany.Internal.Utils -import Language.Haskell.Brittany.Internal.Config.Types import Language.Haskell.Brittany.Internal.Types import qualified Data.Generics.Uniplate.Direct as Uniplate diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Floating.hs b/src/Language/Haskell/Brittany/Internal/Transformations/Floating.hs index 992d3b0..8ffb116 100644 --- a/src/Language/Haskell/Brittany/Internal/Transformations/Floating.hs +++ b/src/Language/Haskell/Brittany/Internal/Transformations/Floating.hs @@ -7,52 +7,9 @@ where import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce -import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra -import qualified Data.Map as Map -import qualified Data.Maybe -import qualified Data.Semigroup as Semigroup -import qualified Data.Sequence as Seq -import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict -import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Utils -import Language.Haskell.Brittany.Internal.Config.Types import Language.Haskell.Brittany.Internal.Types import qualified Data.Generics.Uniplate.Direct as Uniplate diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Indent.hs b/src/Language/Haskell/Brittany/Internal/Transformations/Indent.hs index f1c43b2..de5526f 100644 --- a/src/Language/Haskell/Brittany/Internal/Transformations/Indent.hs +++ b/src/Language/Haskell/Brittany/Internal/Transformations/Indent.hs @@ -6,53 +6,8 @@ where import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce -import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra -import qualified Data.Map as Map -import qualified Data.Maybe -import qualified Data.Semigroup as Semigroup -import qualified Data.Sequence as Seq -import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict -import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass -import Language.Haskell.Brittany.Internal.Utils -import Language.Haskell.Brittany.Internal.Config.Types import Language.Haskell.Brittany.Internal.Types import qualified Data.Generics.Uniplate.Direct as Uniplate diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Par.hs b/src/Language/Haskell/Brittany/Internal/Transformations/Par.hs index f1b3973..7dc5c5a 100644 --- a/src/Language/Haskell/Brittany/Internal/Transformations/Par.hs +++ b/src/Language/Haskell/Brittany/Internal/Transformations/Par.hs @@ -6,57 +6,10 @@ where import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce -import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra -import qualified Data.Map as Map -import qualified Data.Maybe -import qualified Data.Semigroup as Semigroup -import qualified Data.Sequence as Seq -import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict -import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO -import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass import Language.Haskell.Brittany.Internal.Utils -import Language.Haskell.Brittany.Internal.Config.Types import Language.Haskell.Brittany.Internal.Types -import qualified Data.Generics.Uniplate.Direct as Uniplate - transformSimplifyPar :: BriDoc -> BriDoc diff --git a/src/Language/Haskell/Brittany/Internal/Types.hs b/src/Language/Haskell/Brittany/Internal/Types.hs index f04d2a6..c95aa7c 100644 --- a/src/Language/Haskell/Brittany/Internal/Types.hs +++ b/src/Language/Haskell/Brittany/Internal/Types.hs @@ -11,60 +11,20 @@ where import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra -import qualified Data.Map as Map -import qualified Data.Maybe -import qualified Data.Semigroup as Semigroup -import qualified Data.Sequence as Seq -import qualified Data.Set as Set import qualified Data.Strict.Maybe as Strict -import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO -import qualified GHC.OldList as List import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass import qualified Language.Haskell.GHC.ExactPrint as ExactPrint import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types import qualified Data.Text.Lazy.Builder as Text.Builder -import GHC ( Located, runGhc, GenLocated(L), moduleNameString, AnnKeywordId, SrcSpan ) +import GHC ( Located, GenLocated, AnnKeywordId, SrcSpan ) -import Language.Haskell.GHC.ExactPrint ( AnnKey, Comment ) -import Language.Haskell.GHC.ExactPrint.Types ( KeywordId, Anns, DeltaPos, mkAnnKey ) +import Language.Haskell.GHC.ExactPrint ( AnnKey ) +import Language.Haskell.GHC.ExactPrint.Types ( Anns ) import Language.Haskell.Brittany.Internal.Config.Types diff --git a/src/Language/Haskell/Brittany/Internal/Utils.hs b/src/Language/Haskell/Brittany/Internal/Utils.hs index 43f9382..38cf006 100644 --- a/src/Language/Haskell/Brittany/Internal/Utils.hs +++ b/src/Language/Haskell/Brittany/Internal/Utils.hs @@ -34,61 +34,18 @@ where import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL import qualified Data.Coerce -import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra -import qualified Data.Map as Map -import qualified Data.Maybe import qualified Data.Semigroup as Semigroup import qualified Data.Sequence as Seq -import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict -import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass -import qualified Language.Haskell.GHC.ExactPrint as ExactPrint -import qualified Language.Haskell.GHC.ExactPrint.Annotate as ExactPrint.Annotate import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types import qualified Language.Haskell.GHC.ExactPrint.Utils as ExactPrint.Utils import Data.Data -import Data.Generics.Schemes import Data.Generics.Aliases import qualified Text.PrettyPrint as PP -import Text.PrettyPrint ( ($+$), (<+>) ) import qualified GHC.Utils.Outputable as GHC import qualified GHC.Driver.Session as GHC diff --git a/src/Language/Haskell/Brittany/Main.hs b/src/Language/Haskell/Brittany/Main.hs index 354c2ce..1ffa822 100644 --- a/src/Language/Haskell/Brittany/Main.hs +++ b/src/Language/Haskell/Brittany/Main.hs @@ -6,57 +6,18 @@ module Language.Haskell.Brittany.Main (main) where import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce -import qualified Data.Data import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS import qualified Data.List.Extra -import qualified Data.Map as Map -import qualified Data.Maybe import qualified Data.Semigroup as Semigroup -import qualified Data.Sequence as Seq -import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding import qualified Data.Text.IO as Text.IO import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass -- brittany { lconfig_importAsColumn: 60, lconfig_importColumn: 60 } import qualified Language.Haskell.GHC.ExactPrint as ExactPrint -import qualified Language.Haskell.GHC.ExactPrint.Annotate - as ExactPrint.Annotate -import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types -import qualified Language.Haskell.GHC.ExactPrint.Parsers as ExactPrint.Parsers -import qualified Data.Map as Map import qualified Data.Monoid import GHC ( GenLocated(L) ) @@ -67,13 +28,10 @@ import GHC.Utils.Outputable ( Outputable import Text.Read ( Read(..) ) import qualified Text.ParserCombinators.ReadP as ReadP import qualified Text.ParserCombinators.ReadPrec as ReadPrec -import qualified Data.Text.Lazy.Builder as Text.Builder import Control.Monad ( zipWithM ) import Data.CZipWith -import qualified Debug.Trace as Trace - import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal import Language.Haskell.Brittany.Internal.Config -- 2.30.2 From e3deff448a0b6d7f05f1f3bfaf3b3ba950bbb773 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 17:35:09 +0000 Subject: [PATCH 25/74] Switch from `-Wall` to `-Weverything` --- brittany.cabal | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/brittany.cabal b/brittany.cabal index 0c447e9..5a4e662 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -84,8 +84,22 @@ library { Language.Haskell.Brittany.Internal.Transformations.Indent } ghc-options: { - -Wall - -fno-warn-redundant-constraints + -Weverything + -Wno-deriving-typeable + -Wno-incomplete-record-updates + -Wno-incomplete-uni-patterns + -Wno-missing-deriving-strategies + -Wno-missing-export-lists + -Wno-missing-import-lists + -Wno-missing-local-signatures + -Wno-missing-safe-haskell-mode + -Wno-monomorphism-restriction + -Wno-noncanonical-monad-instances + -Wno-noncanonical-monoid-instances + -Wno-prepositive-qualified-module + -Wno-redundant-constraints + -Wno-unsafe + -Wno-unused-packages } build-depends: { base ^>= 4.15.0 -- 2.30.2 From 325798a02bffb637ebf9fcba1e1310187e2b84ac Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 17:35:34 +0000 Subject: [PATCH 26/74] Remove unused dependencies --- brittany.cabal | 3 --- 1 file changed, 3 deletions(-) diff --git a/brittany.cabal b/brittany.cabal index 5a4e662..5fdcb02 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -99,7 +99,6 @@ library { -Wno-prepositive-qualified-module -Wno-redundant-constraints -Wno-unsafe - -Wno-unused-packages } build-depends: { base ^>= 4.15.0 @@ -117,7 +116,6 @@ library { , ghc ^>= 9.0.1 , ghc-boot-th ^>= 9.0.1 , ghc-exactprint ^>= 0.6.4 - , ghc-paths ^>= 0.1.0 , monad-memo ^>= 0.5.3 , mtl ^>= 2.2.2 , multistate ^>= 0.8.0 @@ -130,7 +128,6 @@ library { , text ^>= 1.2.5 , transformers ^>= 0.5.6 , uniplate ^>= 1.6.13 - , unsafe ^>= 0.0 , yaml ^>= 0.11.7 } default-extensions: { -- 2.30.2 From bb3a7d0a5b8cfc458dda415858aeb61a1c3ab98b Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 17:36:35 +0000 Subject: [PATCH 27/74] Remove unnecessary `Typeable` instances --- brittany.cabal | 1 - src/Language/Haskell/Brittany/Internal/Types.hs | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/brittany.cabal b/brittany.cabal index 5fdcb02..fda241c 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -85,7 +85,6 @@ library { } ghc-options: { -Weverything - -Wno-deriving-typeable -Wno-incomplete-record-updates -Wno-incomplete-uni-patterns -Wno-missing-deriving-strategies diff --git a/src/Language/Haskell/Brittany/Internal/Types.hs b/src/Language/Haskell/Brittany/Internal/Types.hs index c95aa7c..5e2b1f7 100644 --- a/src/Language/Haskell/Brittany/Internal/Types.hs +++ b/src/Language/Haskell/Brittany/Internal/Types.hs @@ -217,7 +217,7 @@ data ColSig data BrIndent = BrIndentNone | BrIndentRegular | BrIndentSpecial Int - deriving (Eq, Ord, Typeable, Data.Data.Data, Show) + deriving (Eq, Ord, Data.Data.Data, Show) type ToBriDocM = MultiRWSS.MultiRWS '[Config, Anns] -- reader @@ -231,7 +231,7 @@ type ToBriDocC sym c = Located sym -> ToBriDocM c data DocMultiLine = MultiLineNo | MultiLinePossible - deriving (Eq, Typeable) + deriving (Eq) -- isomorphic to BriDocF Identity. Provided for ease of use, as we do a lot -- of transformations on `BriDocF Identity`s and it is really annoying to -- 2.30.2 From 7ce87381ae5a5a2e92bd7637f2daf69d422c57b9 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 17:37:19 +0000 Subject: [PATCH 28/74] Use canonical `Monad` instance --- brittany.cabal | 1 - src/Language/Haskell/Brittany/Internal/PreludeUtils.hs | 1 - 2 files changed, 2 deletions(-) diff --git a/brittany.cabal b/brittany.cabal index fda241c..6b48791 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -93,7 +93,6 @@ library { -Wno-missing-local-signatures -Wno-missing-safe-haskell-mode -Wno-monomorphism-restriction - -Wno-noncanonical-monad-instances -Wno-noncanonical-monoid-instances -Wno-prepositive-qualified-module -Wno-redundant-constraints diff --git a/src/Language/Haskell/Brittany/Internal/PreludeUtils.hs b/src/Language/Haskell/Brittany/Internal/PreludeUtils.hs index df80168..445a0ab 100644 --- a/src/Language/Haskell/Brittany/Internal/PreludeUtils.hs +++ b/src/Language/Haskell/Brittany/Internal/PreludeUtils.hs @@ -23,7 +23,6 @@ instance Applicative Strict.Maybe where _ <*> _ = Strict.Nothing instance Monad Strict.Maybe where - return = Strict.Just Strict.Nothing >>= _ = Strict.Nothing Strict.Just x >>= f = f x -- 2.30.2 From ce0aa4feec8abc988845186e6792b9fc543daaf9 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 17:37:47 +0000 Subject: [PATCH 29/74] Use canonical `Monoid` instances --- brittany.cabal | 1 - src/Language/Haskell/Brittany/Internal/Config/Types.hs | 6 ------ 2 files changed, 7 deletions(-) diff --git a/brittany.cabal b/brittany.cabal index 6b48791..49cbbe0 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -93,7 +93,6 @@ library { -Wno-missing-local-signatures -Wno-missing-safe-haskell-mode -Wno-monomorphism-restriction - -Wno-noncanonical-monoid-instances -Wno-prepositive-qualified-module -Wno-redundant-constraints -Wno-unsafe diff --git a/src/Language/Haskell/Brittany/Internal/Config/Types.hs b/src/Language/Haskell/Brittany/Internal/Config/Types.hs index e758b2e..791c241 100644 --- a/src/Language/Haskell/Brittany/Internal/Config/Types.hs +++ b/src/Language/Haskell/Brittany/Internal/Config/Types.hs @@ -264,22 +264,16 @@ instance Semigroup.Semigroup (CConfig Identity) where instance Monoid (CDebugConfig Maybe) where mempty = gmempty - mappend = gmappend instance Monoid (CLayoutConfig Maybe) where mempty = gmempty - mappend = gmappend instance Monoid (CErrorHandlingConfig Maybe) where mempty = gmempty - mappend = gmappend instance Monoid (CForwardOptions Maybe) where mempty = gmempty - mappend = gmappend instance Monoid (CPreProcessorConfig Maybe) where mempty = gmempty - mappend = gmappend instance Monoid (CConfig Maybe) where mempty = gmempty - mappend = gmappend data IndentPolicy = IndentPolicyLeft -- never create a new indentation at more -- 2.30.2 From c02edecd1e3d80fa657b444b4e8c14b340b60284 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 17:39:57 +0000 Subject: [PATCH 30/74] Remove redundant constraints --- brittany.cabal | 1 - .../Haskell/Brittany/Internal/BackendUtils.hs | 46 ++++++------------- .../Brittany/Internal/LayouterBasics.hs | 2 +- .../Haskell/Brittany/Internal/Obfuscation.hs | 2 +- 4 files changed, 15 insertions(+), 36 deletions(-) diff --git a/brittany.cabal b/brittany.cabal index 49cbbe0..b257bd3 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -94,7 +94,6 @@ library { -Wno-missing-safe-haskell-mode -Wno-monomorphism-restriction -Wno-prepositive-qualified-module - -Wno-redundant-constraints -Wno-unsafe } build-depends: diff --git a/src/Language/Haskell/Brittany/Internal/BackendUtils.hs b/src/Language/Haskell/Brittany/Internal/BackendUtils.hs index 93b7dc7..6491b07 100644 --- a/src/Language/Haskell/Brittany/Internal/BackendUtils.hs +++ b/src/Language/Haskell/Brittany/Internal/BackendUtils.hs @@ -57,7 +57,7 @@ import GHC ( Located ) traceLocal - :: (MonadMultiState LayoutState m, MonadMultiWriter (Seq String) m, Show a) + :: (MonadMultiState LayoutState m) => a -> m () traceLocal _ = return () @@ -66,7 +66,6 @@ traceLocal _ = return () layoutWriteAppend :: ( MonadMultiWriter Text.Builder.Builder m , MonadMultiState LayoutState m - , MonadMultiWriter (Seq String) m ) => Text -> m () @@ -93,7 +92,6 @@ layoutWriteAppend t = do layoutWriteAppendSpaces :: ( MonadMultiWriter Text.Builder.Builder m , MonadMultiState LayoutState m - , MonadMultiWriter (Seq String) m ) => Int -> m () @@ -108,7 +106,6 @@ layoutWriteAppendSpaces i = do layoutWriteAppendMultiline :: ( MonadMultiWriter Text.Builder.Builder m , MonadMultiState LayoutState m - , MonadMultiWriter (Seq String) m ) => [Text] -> m () @@ -126,7 +123,6 @@ layoutWriteAppendMultiline ts = do layoutWriteNewlineBlock :: ( MonadMultiWriter Text.Builder.Builder m , MonadMultiState LayoutState m - , MonadMultiWriter (Seq String) m ) => m () layoutWriteNewlineBlock = do @@ -151,7 +147,7 @@ layoutWriteNewlineBlock = do -- } layoutSetCommentCol - :: (MonadMultiState LayoutState m, MonadMultiWriter (Seq String) m) => m () + :: (MonadMultiState LayoutState m) => m () layoutSetCommentCol = do state <- mGet let col = case _lstate_curYOrAddNewline state of @@ -166,7 +162,6 @@ layoutSetCommentCol = do layoutMoveToCommentPos :: ( MonadMultiWriter Text.Builder.Builder m , MonadMultiState LayoutState m - , MonadMultiWriter (Seq String) m ) => Int -> Int @@ -199,7 +194,6 @@ layoutMoveToCommentPos y x commentLines = do layoutWriteNewline :: ( MonadMultiWriter Text.Builder.Builder m , MonadMultiState LayoutState m - , MonadMultiWriter (Seq String) m ) => m () layoutWriteNewline = do @@ -219,7 +213,6 @@ _layoutResetCommentNewlines = do layoutWriteEnsureNewlineBlock :: ( MonadMultiWriter Text.Builder.Builder m , MonadMultiState LayoutState m - , MonadMultiWriter (Seq String) m ) => m () layoutWriteEnsureNewlineBlock = do @@ -236,7 +229,6 @@ layoutWriteEnsureNewlineBlock = do layoutWriteEnsureAbsoluteN :: ( MonadMultiWriter Text.Builder.Builder m , MonadMultiState LayoutState m - , MonadMultiWriter (Seq String) m ) => Int -> m () @@ -255,7 +247,7 @@ layoutWriteEnsureAbsoluteN n = do } layoutBaseYPushInternal - :: (MonadMultiState LayoutState m, MonadMultiWriter (Seq String) m) + :: (MonadMultiState LayoutState m) => Int -> m () layoutBaseYPushInternal i = do @@ -263,13 +255,13 @@ layoutBaseYPushInternal i = do mModify $ \s -> s { _lstate_baseYs = i : _lstate_baseYs s } layoutBaseYPopInternal - :: (MonadMultiState LayoutState m, MonadMultiWriter (Seq String) m) => m () + :: (MonadMultiState LayoutState m) => m () layoutBaseYPopInternal = do traceLocal ("layoutBaseYPopInternal") mModify $ \s -> s { _lstate_baseYs = List.tail $ _lstate_baseYs s } layoutIndentLevelPushInternal - :: (MonadMultiState LayoutState m, MonadMultiWriter (Seq String) m) + :: (MonadMultiState LayoutState m) => Int -> m () layoutIndentLevelPushInternal i = do @@ -279,16 +271,14 @@ layoutIndentLevelPushInternal i = do } layoutIndentLevelPopInternal - :: (MonadMultiState LayoutState m, MonadMultiWriter (Seq String) m) => m () + :: (MonadMultiState LayoutState m) => m () layoutIndentLevelPopInternal = do traceLocal ("layoutIndentLevelPopInternal") mModify $ \s -> s { _lstate_indLevelLinger = lstate_indLevel s , _lstate_indLevels = List.tail $ _lstate_indLevels s } -layoutRemoveIndentLevelLinger :: ( MonadMultiState LayoutState m - , MonadMultiWriter (Seq String) m - ) => m () +layoutRemoveIndentLevelLinger :: ( MonadMultiState LayoutState m) => m () layoutRemoveIndentLevelLinger = do mModify $ \s -> s { _lstate_indLevelLinger = lstate_indLevel s } @@ -297,7 +287,6 @@ layoutWithAddBaseCol :: ( MonadMultiWriter Text.Builder.Builder m , MonadMultiState LayoutState m , MonadMultiReader Config m - , MonadMultiWriter (Seq String) m ) => m () -> m () @@ -312,7 +301,6 @@ layoutWithAddBaseColBlock :: ( MonadMultiWriter Text.Builder.Builder m , MonadMultiState LayoutState m , MonadMultiReader Config m - , MonadMultiWriter (Seq String) m ) => m () -> m () @@ -327,7 +315,6 @@ layoutWithAddBaseColBlock m = do layoutWithAddBaseColNBlock :: ( MonadMultiWriter Text.Builder.Builder m , MonadMultiState LayoutState m - , MonadMultiWriter (Seq String) m ) => Int -> m () @@ -343,7 +330,6 @@ layoutWithAddBaseColNBlock amount m = do layoutWriteEnsureBlock :: ( MonadMultiWriter Text.Builder.Builder m , MonadMultiState LayoutState m - , MonadMultiWriter (Seq String) m ) => m () layoutWriteEnsureBlock = do @@ -362,7 +348,6 @@ layoutWriteEnsureBlock = do layoutWithAddBaseColN :: ( MonadMultiWriter Text.Builder.Builder m , MonadMultiState LayoutState m - , MonadMultiWriter (Seq String) m ) => Int -> m () @@ -374,7 +359,7 @@ layoutWithAddBaseColN amount m = do layoutBaseYPopInternal layoutBaseYPushCur - :: (MonadMultiState LayoutState m, MonadMultiWriter (Seq String) m) => m () + :: (MonadMultiState LayoutState m) => m () layoutBaseYPushCur = do traceLocal ("layoutBaseYPushCur") state <- mGet @@ -387,13 +372,13 @@ layoutBaseYPushCur = do Just cCol -> layoutBaseYPushInternal cCol layoutBaseYPop - :: (MonadMultiState LayoutState m, MonadMultiWriter (Seq String) m) => m () + :: (MonadMultiState LayoutState m) => m () layoutBaseYPop = do traceLocal ("layoutBaseYPop") layoutBaseYPopInternal layoutIndentLevelPushCur - :: (MonadMultiState LayoutState m, MonadMultiWriter (Seq String) m) => m () + :: (MonadMultiState LayoutState m) => m () layoutIndentLevelPushCur = do traceLocal ("layoutIndentLevelPushCur") state <- mGet @@ -405,7 +390,7 @@ layoutIndentLevelPushCur = do layoutIndentLevelPushInternal y layoutIndentLevelPop - :: (MonadMultiState LayoutState m, MonadMultiWriter (Seq String) m) => m () + :: (MonadMultiState LayoutState m) => m () layoutIndentLevelPop = do traceLocal ("layoutIndentLevelPop") layoutIndentLevelPopInternal @@ -415,8 +400,7 @@ layoutIndentLevelPop = do -- make sense. layoutRemoveIndentLevelLinger -layoutAddSepSpace :: (MonadMultiState LayoutState m - , MonadMultiWriter (Seq String) m) +layoutAddSepSpace :: (MonadMultiState LayoutState m) => m () layoutAddSepSpace = do state <- mGet @@ -429,7 +413,6 @@ moveToExactAnn :: ( MonadMultiWriter Text.Builder.Builder m , MonadMultiState LayoutState m , MonadMultiReader (Map AnnKey Annotation) m - , MonadMultiWriter (Seq String) m ) => AnnKey -> m () @@ -480,7 +463,6 @@ layoutWritePriorComments :: ( Data.Data.Data ast , MonadMultiWriter Text.Builder.Builder m , MonadMultiState LayoutState m - , MonadMultiWriter (Seq String) m ) => Located ast -> m () @@ -512,8 +494,7 @@ layoutWritePriorComments ast = do -- "..`annFollowingComments` are only added by AST transformations ..". layoutWritePostComments :: (Data.Data.Data ast, MonadMultiWriter Text.Builder.Builder m, - MonadMultiState LayoutState m - , MonadMultiWriter (Seq String) m) + MonadMultiState LayoutState m) => Located ast -> m () layoutWritePostComments ast = do mAnn <- do @@ -543,7 +524,6 @@ layoutWritePostComments ast = do layoutIndentRestorePostComment :: ( MonadMultiState LayoutState m , MonadMultiWriter Text.Builder.Builder m - , MonadMultiWriter (Seq String) m ) => m () layoutIndentRestorePostComment = do diff --git a/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs b/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs index 296f3ba..8050c00 100644 --- a/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs +++ b/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs @@ -177,7 +177,7 @@ briDocByExactNoComment ast = do -- not contain any newlines. If this property is not met, the semantics -- depend on the @econf_AllowRiskyExactPrintUse@ config flag. briDocByExactInlineOnly - :: (ExactPrint.Annotate.Annotate ast, Data ast) + :: (ExactPrint.Annotate.Annotate ast) => String -> Located ast -> ToBriDocM BriDocNumbered diff --git a/src/Language/Haskell/Brittany/Internal/Obfuscation.hs b/src/Language/Haskell/Brittany/Internal/Obfuscation.hs index a214325..67312b3 100644 --- a/src/Language/Haskell/Brittany/Internal/Obfuscation.hs +++ b/src/Language/Haskell/Brittany/Internal/Obfuscation.hs @@ -96,7 +96,7 @@ _randomRange lo hi = do setStdGen gen' pure x -randomFrom :: Random a => [a] -> IO a +randomFrom :: [a] -> IO a randomFrom l = do let hi = length l - 1 gen <- getStdGen -- 2.30.2 From 2dced782b1d210156797fdf2b65460acac3bcd09 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 17:40:55 +0000 Subject: [PATCH 31/74] Make sure record updates are complete --- brittany.cabal | 1 - src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/brittany.cabal b/brittany.cabal index b257bd3..969b882 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -85,7 +85,6 @@ library { } ghc-options: { -Weverything - -Wno-incomplete-record-updates -Wno-incomplete-uni-patterns -Wno-missing-deriving-strategies -Wno-missing-export-lists diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs index 47a9514..f068b6c 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs @@ -863,7 +863,7 @@ layoutClsInst lcid@(L _ cid) = docLines . removeChildren <$> lcid - removeChildren :: ClsInstDecl p -> ClsInstDecl p + removeChildren :: ClsInstDecl GhcPs -> ClsInstDecl GhcPs removeChildren c = c { cid_binds = emptyBag , cid_sigs = [] -- 2.30.2 From 72fd6959f76e451a6f5db7d455fd5d3ee47f492b Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 17:45:56 +0000 Subject: [PATCH 32/74] Don't enable any language extensions by default --- .hlint.yaml | 6 +----- brittany.cabal | 15 --------------- src/Language/Haskell/Brittany.hs | 10 ++++++++++ src/Language/Haskell/Brittany/Internal.hs | 10 ++++++++++ src/Language/Haskell/Brittany/Internal/Backend.hs | 10 ++++++++++ .../Haskell/Brittany/Internal/BackendUtils.hs | 10 ++++++++++ src/Language/Haskell/Brittany/Internal/Config.hs | 10 ++++++++++ .../Haskell/Brittany/Internal/Config/Types.hs | 10 ++++++++++ .../Brittany/Internal/Config/Types/Instances.hs | 10 ++++++++++ .../Haskell/Brittany/Internal/ExactPrintUtils.hs | 10 ++++++++++ .../Haskell/Brittany/Internal/LayouterBasics.hs | 10 ++++++++++ .../Brittany/Internal/Layouters/DataDecl.hs | 10 ++++++++++ .../Haskell/Brittany/Internal/Layouters/Decl.hs | 10 ++++++++++ .../Haskell/Brittany/Internal/Layouters/Expr.hs | 10 ++++++++++ .../Brittany/Internal/Layouters/Expr.hs-boot | 10 ++++++++++ .../Haskell/Brittany/Internal/Layouters/IE.hs | 10 ++++++++++ .../Haskell/Brittany/Internal/Layouters/Import.hs | 10 ++++++++++ .../Haskell/Brittany/Internal/Layouters/Module.hs | 10 ++++++++++ .../Brittany/Internal/Layouters/Pattern.hs | 10 ++++++++++ .../Haskell/Brittany/Internal/Layouters/Stmt.hs | 10 ++++++++++ .../Brittany/Internal/Layouters/Stmt.hs-boot | 10 ++++++++++ .../Haskell/Brittany/Internal/Layouters/Type.hs | 10 ++++++++++ .../Haskell/Brittany/Internal/Obfuscation.hs | 10 ++++++++++ .../Brittany/Internal/Transformations/Alt.hs | 10 ++++++++++ .../Brittany/Internal/Transformations/Columns.hs | 10 ++++++++++ .../Brittany/Internal/Transformations/Floating.hs | 10 ++++++++++ .../Brittany/Internal/Transformations/Indent.hs | 10 ++++++++++ .../Brittany/Internal/Transformations/Par.hs | 10 ++++++++++ src/Language/Haskell/Brittany/Internal/Types.hs | 10 ++++++++++ src/Language/Haskell/Brittany/Internal/Utils.hs | 10 ++++++++++ src/Language/Haskell/Brittany/Main.hs | 10 ++++++++++ 31 files changed, 291 insertions(+), 20 deletions(-) diff --git a/.hlint.yaml b/.hlint.yaml index 1aaea27..9c4c809 100644 --- a/.hlint.yaml +++ b/.hlint.yaml @@ -8,11 +8,7 @@ # Specify additional command line arguments - arguments: - [ "--language=GADTs" - , "--language=LambdaCase" - , "--language=MultiWayIf" - , "--language=KindSignatures" - , "--cross" + [ "--cross" , "--threads=0" ] diff --git a/brittany.cabal b/brittany.cabal index 969b882..a7e5c58 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -125,21 +125,6 @@ library { , uniplate ^>= 1.6.13 , yaml ^>= 0.11.7 } - default-extensions: { - CPP - - NoImplicitPrelude - - GADTs - - FlexibleContexts - FlexibleInstances - ScopedTypeVariables - MonadComprehensions - LambdaCase - MultiWayIf - KindSignatures - } } executable brittany diff --git a/src/Language/Haskell/Brittany.hs b/src/Language/Haskell/Brittany.hs index a4fc839..5e640e8 100644 --- a/src/Language/Haskell/Brittany.hs +++ b/src/Language/Haskell/Brittany.hs @@ -1,3 +1,13 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + {-# LANGUAGE DataKinds #-} module Language.Haskell.Brittany diff --git a/src/Language/Haskell/Brittany/Internal.hs b/src/Language/Haskell/Brittany/Internal.hs index 81c7733..bdcab84 100644 --- a/src/Language/Haskell/Brittany/Internal.hs +++ b/src/Language/Haskell/Brittany/Internal.hs @@ -1,3 +1,13 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + {-# LANGUAGE DataKinds #-} module Language.Haskell.Brittany.Internal diff --git a/src/Language/Haskell/Brittany/Internal/Backend.hs b/src/Language/Haskell/Brittany/Internal/Backend.hs index 92c29fb..68e414c 100644 --- a/src/Language/Haskell/Brittany/Internal/Backend.hs +++ b/src/Language/Haskell/Brittany/Internal/Backend.hs @@ -1,3 +1,13 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + {-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE TypeOperators #-} diff --git a/src/Language/Haskell/Brittany/Internal/BackendUtils.hs b/src/Language/Haskell/Brittany/Internal/BackendUtils.hs index 6491b07..f53a3a9 100644 --- a/src/Language/Haskell/Brittany/Internal/BackendUtils.hs +++ b/src/Language/Haskell/Brittany/Internal/BackendUtils.hs @@ -1,3 +1,13 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + {-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE TypeApplications #-} diff --git a/src/Language/Haskell/Brittany/Internal/Config.hs b/src/Language/Haskell/Brittany/Internal/Config.hs index 22d7163..09b6ed3 100644 --- a/src/Language/Haskell/Brittany/Internal/Config.hs +++ b/src/Language/Haskell/Brittany/Internal/Config.hs @@ -1,3 +1,13 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + module Language.Haskell.Brittany.Internal.Config ( CConfig(..) , CDebugConfig(..) diff --git a/src/Language/Haskell/Brittany/Internal/Config/Types.hs b/src/Language/Haskell/Brittany/Internal/Config/Types.hs index 791c241..49e0c2b 100644 --- a/src/Language/Haskell/Brittany/Internal/Config/Types.hs +++ b/src/Language/Haskell/Brittany/Internal/Config/Types.hs @@ -1,3 +1,13 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE StandaloneDeriving #-} diff --git a/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs b/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs index 0ad985c..7a5638d 100644 --- a/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs +++ b/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs @@ -13,6 +13,16 @@ {-# OPTIONS_GHC -fno-specialise #-} {-# OPTIONS_GHC -fignore-interface-pragmas #-} +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + module Language.Haskell.Brittany.Internal.Config.Types.Instances where diff --git a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs index c17e8b1..2bfeed4 100644 --- a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs +++ b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs @@ -1,3 +1,13 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + {-# LANGUAGE DataKinds #-} module Language.Haskell.Brittany.Internal.ExactPrintUtils diff --git a/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs b/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs index 8050c00..9c20b57 100644 --- a/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs +++ b/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs @@ -1,3 +1,13 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + {-# LANGUAGE GeneralizedNewtypeDeriving #-} module Language.Haskell.Brittany.Internal.LayouterBasics diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs index 59a54bb..cbd9b21 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs @@ -1,3 +1,13 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + {-# LANGUAGE CPP #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE TypeApplications #-} diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs index f068b6c..25bacc5 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs @@ -1,3 +1,13 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + {-# LANGUAGE DataKinds #-} {-# LANGUAGE TypeApplications #-} {-# LANGUAGE PatternSynonyms #-} diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs index f2b9674..13a7bae 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs @@ -1,3 +1,13 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + {-# LANGUAGE DataKinds #-} {-# LANGUAGE ViewPatterns #-} diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot index 1c748f0..f9ceb4f 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot @@ -1,3 +1,13 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + {-# LANGUAGE DataKinds #-} module Language.Haskell.Brittany.Internal.Layouters.Expr diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs b/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs index b7b3bb3..620de4a 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs @@ -1,3 +1,13 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + module Language.Haskell.Brittany.Internal.Layouters.IE ( layoutIE , layoutLLIEs diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs index 128c13f..385983e 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs @@ -1,3 +1,13 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + module Language.Haskell.Brittany.Internal.Layouters.Import (layoutImport) where import Language.Haskell.Brittany.Internal.Prelude diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs index 48d789b..4efb2c1 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs @@ -1,3 +1,13 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + {-# LANGUAGE ViewPatterns #-} module Language.Haskell.Brittany.Internal.Layouters.Module (layoutModule) where diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs index 9bc39cf..80a1337 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs @@ -1,3 +1,13 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + {-# LANGUAGE DataKinds #-} {-# LANGUAGE ViewPatterns #-} diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs index 2af1ada..8012ba6 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs @@ -1,3 +1,13 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + {-# LANGUAGE DataKinds #-} module Language.Haskell.Brittany.Internal.Layouters.Stmt diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot index 1b35a55..7c1f0ff 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot @@ -1,3 +1,13 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + {-# LANGUAGE DataKinds #-} module Language.Haskell.Brittany.Internal.Layouters.Stmt diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs index 4aead4e..7f46688 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs @@ -1,3 +1,13 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + {-# LANGUAGE DataKinds #-} module Language.Haskell.Brittany.Internal.Layouters.Type diff --git a/src/Language/Haskell/Brittany/Internal/Obfuscation.hs b/src/Language/Haskell/Brittany/Internal/Obfuscation.hs index 67312b3..79c8337 100644 --- a/src/Language/Haskell/Brittany/Internal/Obfuscation.hs +++ b/src/Language/Haskell/Brittany/Internal/Obfuscation.hs @@ -1,3 +1,13 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + module Language.Haskell.Brittany.Internal.Obfuscation ( obfuscate ) diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs b/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs index 79f4f38..0746a8c 100644 --- a/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs +++ b/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs @@ -1,3 +1,13 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + {-# LANGUAGE TypeOperators #-} {-# LANGUAGE BangPatterns #-} {-# LANGUAGE DataKinds #-} diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Columns.hs b/src/Language/Haskell/Brittany/Internal/Transformations/Columns.hs index c1da956..c76f31c 100644 --- a/src/Language/Haskell/Brittany/Internal/Transformations/Columns.hs +++ b/src/Language/Haskell/Brittany/Internal/Transformations/Columns.hs @@ -1,3 +1,13 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + module Language.Haskell.Brittany.Internal.Transformations.Columns ( transformSimplifyColumns ) diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Floating.hs b/src/Language/Haskell/Brittany/Internal/Transformations/Floating.hs index 8ffb116..4b68bb9 100644 --- a/src/Language/Haskell/Brittany/Internal/Transformations/Floating.hs +++ b/src/Language/Haskell/Brittany/Internal/Transformations/Floating.hs @@ -1,3 +1,13 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + module Language.Haskell.Brittany.Internal.Transformations.Floating ( transformSimplifyFloating ) diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Indent.hs b/src/Language/Haskell/Brittany/Internal/Transformations/Indent.hs index de5526f..816aecb 100644 --- a/src/Language/Haskell/Brittany/Internal/Transformations/Indent.hs +++ b/src/Language/Haskell/Brittany/Internal/Transformations/Indent.hs @@ -1,3 +1,13 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + module Language.Haskell.Brittany.Internal.Transformations.Indent ( transformSimplifyIndent ) diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Par.hs b/src/Language/Haskell/Brittany/Internal/Transformations/Par.hs index 7dc5c5a..8e686ce 100644 --- a/src/Language/Haskell/Brittany/Internal/Transformations/Par.hs +++ b/src/Language/Haskell/Brittany/Internal/Transformations/Par.hs @@ -1,3 +1,13 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + module Language.Haskell.Brittany.Internal.Transformations.Par ( transformSimplifyPar ) diff --git a/src/Language/Haskell/Brittany/Internal/Types.hs b/src/Language/Haskell/Brittany/Internal/Types.hs index 5e2b1f7..1e2dcbc 100644 --- a/src/Language/Haskell/Brittany/Internal/Types.hs +++ b/src/Language/Haskell/Brittany/Internal/Types.hs @@ -1,3 +1,13 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + {-# LANGUAGE DataKinds #-} {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE DeriveDataTypeable #-} diff --git a/src/Language/Haskell/Brittany/Internal/Utils.hs b/src/Language/Haskell/Brittany/Internal/Utils.hs index 38cf006..c67716a 100644 --- a/src/Language/Haskell/Brittany/Internal/Utils.hs +++ b/src/Language/Haskell/Brittany/Internal/Utils.hs @@ -1,3 +1,13 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + {-# LANGUAGE CPP #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} diff --git a/src/Language/Haskell/Brittany/Main.hs b/src/Language/Haskell/Brittany/Main.hs index 1ffa822..c86c90e 100644 --- a/src/Language/Haskell/Brittany/Main.hs +++ b/src/Language/Haskell/Brittany/Main.hs @@ -1,3 +1,13 @@ +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE GADTs #-} +{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE MultiWayIf #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} + {-# LANGUAGE DataKinds #-} module Language.Haskell.Brittany.Main (main) where -- 2.30.2 From 09fabe8d163ee4a398df58e70186cc7e11375c58 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 17:47:27 +0000 Subject: [PATCH 33/74] Compress executable artifacts --- .github/workflows/ci.yaml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 0189cb7..cc3cd3e 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -11,14 +11,10 @@ jobs: strategy: fail-fast: false matrix: - os: - - macos-11 - - ubuntu-20.04 - - windows-2019 - ghc: - - 9.0.1 - cabal: - - 3.6.2.0 + include: + - { os: macos-11, ghc: 9.0.1, cabal: 3.6.2.0 } + - { os: ubuntu-20.04, ghc: 9.0.1, cabal: 3.6.2.0 } + - { os: windows-2019, ghc: 9.0.1, cabal: 3.6.2.0, ext: .exe } runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v2 @@ -44,6 +40,10 @@ jobs: - run: cabal test --test-show-details direct - run: cabal check - run: cabal sdist --output-dir artifact/${{ matrix.os }} + - uses: svenstaro/upx-action@v2 + with: + file: artifact/${{ matrix.os }}/brittany${{ matrix.ext }} + args: --best - uses: actions/upload-artifact@v2 with: path: artifact -- 2.30.2 From 09f7e1726b1653036e874b47c1d3cd8ebcc2731f Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 17:59:26 +0000 Subject: [PATCH 34/74] Configure HLint --- .hlint.yaml | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/.hlint.yaml b/.hlint.yaml index 9c4c809..9a788b8 100644 --- a/.hlint.yaml +++ b/.hlint.yaml @@ -17,3 +17,46 @@ - ignore: {name: "Redundant do"} - ignore: {name: "Redundant return"} - ignore: {name: "Redundant guard", whithin: "lrdrNameToTextAnn"} + +- ignore: { name: 'Use :' } +- ignore: { name: Avoid lambda } +- ignore: { name: Eta reduce } +- ignore: { name: Move brackets to avoid $ } +- ignore: { name: Redundant <$> } +- ignore: { name: Redundant $ } +- ignore: { name: Redundant bang pattern } +- ignore: { name: Redundant bracket } +- ignore: { name: Redundant flip } +- ignore: { name: Redundant id } +- ignore: { name: Redundant if } +- ignore: { name: Redundant lambda } +- ignore: { name: Replace case with fromMaybe } +- ignore: { name: Unused LANGUAGE pragma } +- ignore: { name: Use <=< } +- ignore: { name: Use <$> } +- ignore: { name: Use all } +- ignore: { name: Use and } +- ignore: { name: Use any } +- ignore: { name: Use concatMap } +- ignore: { name: Use const } +- ignore: { name: Use elem } +- ignore: { name: Use elemIndex } +- ignore: { name: Use fewer imports } +- ignore: { name: Use fewer LANGUAGE pragmas } +- ignore: { name: Use first } +- ignore: { name: Use fromLeft } +- ignore: { name: Use getContents } +- ignore: { name: Use if } +- ignore: { name: Use isNothing } +- ignore: { name: Use lambda-case } +- ignore: { name: Use mapM } +- ignore: { name: Use minimumBy } +- ignore: { name: Use newtype instead of data } +- ignore: { name: Use record patterns } +- ignore: { name: Use second } +- ignore: { name: Use section } +- ignore: { name: Use sortOn } +- ignore: { name: Use sqrt } +- ignore: { name: Use tuple-section } +- ignore: { name: Use unless } +- ignore: { name: Use when } -- 2.30.2 From d1968b5de3cd7218e98ab8f3cd38ceb25a3f0f02 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 18:17:01 +0000 Subject: [PATCH 35/74] Remove redundant language extensions --- .hlint.yaml | 2 -- src-idemtests/cases/LayoutBasics.hs | 18 ++---------------- src-literatetests/Main.hs | 3 --- src-unittests/AsymptoticPerfTests.hs | 2 -- src-unittests/TestMain.hs | 2 -- src-unittests/TestUtils.hs | 2 -- src/Language/Haskell/Brittany.hs | 10 ---------- src/Language/Haskell/Brittany/Internal.hs | 8 -------- .../Haskell/Brittany/Internal/Backend.hs | 13 +------------ .../Haskell/Brittany/Internal/BackendUtils.hs | 11 ----------- .../Haskell/Brittany/Internal/Config.hs | 7 ------- .../Haskell/Brittany/Internal/Config/Types.hs | 19 +++++-------------- .../Internal/Config/Types/Instances.hs | 7 ------- .../Brittany/Internal/ExactPrintUtils.hs | 7 +------ .../Brittany/Internal/LayouterBasics.hs | 10 ++-------- .../Brittany/Internal/Layouters/DataDecl.hs | 12 ------------ .../Brittany/Internal/Layouters/Decl.hs | 11 ----------- .../Brittany/Internal/Layouters/Expr.hs | 9 --------- .../Brittany/Internal/Layouters/Expr.hs-boot | 10 ---------- .../Haskell/Brittany/Internal/Layouters/IE.hs | 6 ------ .../Brittany/Internal/Layouters/Import.hs | 8 -------- .../Brittany/Internal/Layouters/Module.hs | 9 --------- .../Brittany/Internal/Layouters/Pattern.hs | 10 ---------- .../Brittany/Internal/Layouters/Stmt.hs | 8 -------- .../Brittany/Internal/Layouters/Stmt.hs-boot | 10 ---------- .../Brittany/Internal/Layouters/Type.hs | 9 --------- .../Haskell/Brittany/Internal/Obfuscation.hs | 8 -------- .../Brittany/Internal/Transformations/Alt.hs | 17 ++++++----------- .../Internal/Transformations/Columns.hs | 7 ------- .../Internal/Transformations/Floating.hs | 7 ------- .../Internal/Transformations/Indent.hs | 7 ------- .../Brittany/Internal/Transformations/Par.hs | 7 ------- .../Haskell/Brittany/Internal/Types.hs | 16 ++++++---------- .../Haskell/Brittany/Internal/Utils.hs | 11 ++--------- src/Language/Haskell/Brittany/Main.hs | 8 -------- 35 files changed, 25 insertions(+), 286 deletions(-) diff --git a/.hlint.yaml b/.hlint.yaml index 9a788b8..026d8f1 100644 --- a/.hlint.yaml +++ b/.hlint.yaml @@ -31,7 +31,6 @@ - ignore: { name: Redundant if } - ignore: { name: Redundant lambda } - ignore: { name: Replace case with fromMaybe } -- ignore: { name: Unused LANGUAGE pragma } - ignore: { name: Use <=< } - ignore: { name: Use <$> } - ignore: { name: Use all } @@ -42,7 +41,6 @@ - ignore: { name: Use elem } - ignore: { name: Use elemIndex } - ignore: { name: Use fewer imports } -- ignore: { name: Use fewer LANGUAGE pragmas } - ignore: { name: Use first } - ignore: { name: Use fromLeft } - ignore: { name: Use getContents } diff --git a/src-idemtests/cases/LayoutBasics.hs b/src-idemtests/cases/LayoutBasics.hs index 3664d3e..d1331a5 100644 --- a/src-idemtests/cases/LayoutBasics.hs +++ b/src-idemtests/cases/LayoutBasics.hs @@ -1,17 +1,3 @@ -{-# LANGUAGE DataKinds #-} -{-# LANGUAGE DeriveDataTypeable #-} - -{-# LANGUAGE CPP #-} -{-# LANGUAGE NoImplicitPrelude #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE ScopedTypeVariables #-} -{-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MultiWayIf #-} -{-# LANGUAGE KindSignatures #-} - module Language.Haskell.Brittany.Internal.LayoutBasics ( processDefault , layoutByExact @@ -210,7 +196,7 @@ descToMinMax _ _ = rdrNameToText :: RdrName -> Text -- rdrNameToText = Text.pack . show . flip runSDoc unsafeGlobalDynFlags . ppr rdrNameToText ( Unqual occname ) = Text.pack $ occNameString occname -rdrNameToText ( Qual mname occname ) = Text.pack $ moduleNameString mname +rdrNameToText ( Qual mname occname ) = Text.pack $ moduleNameString mname ++ "." ++ occNameString occname rdrNameToText ( Orig modul occname ) = Text.pack $ moduleNameString (moduleName modul) @@ -264,7 +250,7 @@ calcLayoutMin indent linePre (LayoutDesc line block) = case (line, block) of (Just s, _) -> indent + _lColumns_min s _ -> error "bad LayoutDesc mnasdoiucxvlkjasd" --- see +-- see calcLayoutMax :: Int -- basic indentation amount -> Int -- currently used width in current line (after indent) -- used to accurately calc placing of the current-line diff --git a/src-literatetests/Main.hs b/src-literatetests/Main.hs index bc860ce..2cb903c 100644 --- a/src-literatetests/Main.hs +++ b/src-literatetests/Main.hs @@ -1,6 +1,3 @@ -{-# LANGUAGE QuasiQuotes #-} -{-# LANGUAGE CPP #-} - module Main ( main ) diff --git a/src-unittests/AsymptoticPerfTests.hs b/src-unittests/AsymptoticPerfTests.hs index 636ff89..886c3e7 100644 --- a/src-unittests/AsymptoticPerfTests.hs +++ b/src-unittests/AsymptoticPerfTests.hs @@ -1,5 +1,3 @@ -{-# LANGUAGE QuasiQuotes #-} - module AsymptoticPerfTests ( asymptoticPerfTest ) diff --git a/src-unittests/TestMain.hs b/src-unittests/TestMain.hs index 66eaed2..7fa2fa4 100644 --- a/src-unittests/TestMain.hs +++ b/src-unittests/TestMain.hs @@ -1,5 +1,3 @@ -{-# LANGUAGE QuasiQuotes #-} - module Main where diff --git a/src-unittests/TestUtils.hs b/src-unittests/TestUtils.hs index a8b8e2e..94c2375 100644 --- a/src-unittests/TestUtils.hs +++ b/src-unittests/TestUtils.hs @@ -1,5 +1,3 @@ -{-# LANGUAGE QuasiQuotes #-} - module TestUtils where diff --git a/src/Language/Haskell/Brittany.hs b/src/Language/Haskell/Brittany.hs index 5e640e8..8c225c6 100644 --- a/src/Language/Haskell/Brittany.hs +++ b/src/Language/Haskell/Brittany.hs @@ -1,14 +1,4 @@ -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} -{-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NoImplicitPrelude #-} -{-# LANGUAGE ScopedTypeVariables #-} - -{-# LANGUAGE DataKinds #-} module Language.Haskell.Brittany ( parsePrintModule diff --git a/src/Language/Haskell/Brittany/Internal.hs b/src/Language/Haskell/Brittany/Internal.hs index bdcab84..41ac6b1 100644 --- a/src/Language/Haskell/Brittany/Internal.hs +++ b/src/Language/Haskell/Brittany/Internal.hs @@ -1,15 +1,7 @@ -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} {-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE ScopedTypeVariables #-} -{-# LANGUAGE DataKinds #-} - module Language.Haskell.Brittany.Internal ( parsePrintModule , parsePrintModuleTests diff --git a/src/Language/Haskell/Brittany/Internal/Backend.hs b/src/Language/Haskell/Brittany/Internal/Backend.hs index 68e414c..204a16f 100644 --- a/src/Language/Haskell/Brittany/Internal/Backend.hs +++ b/src/Language/Haskell/Brittany/Internal/Backend.hs @@ -1,20 +1,9 @@ +{-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} {-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE ScopedTypeVariables #-} -{-# LANGUAGE DataKinds #-} -{-# LANGUAGE DeriveDataTypeable #-} -{-# LANGUAGE TypeOperators #-} -{-# LANGUAGE BangPatterns #-} -{-# LANGUAGE TypeApplications #-} -{-# LANGUAGE ConstraintKinds #-} - module Language.Haskell.Brittany.Internal.Backend ( layoutBriDocM ) diff --git a/src/Language/Haskell/Brittany/Internal/BackendUtils.hs b/src/Language/Haskell/Brittany/Internal/BackendUtils.hs index f53a3a9..444d548 100644 --- a/src/Language/Haskell/Brittany/Internal/BackendUtils.hs +++ b/src/Language/Haskell/Brittany/Internal/BackendUtils.hs @@ -1,16 +1,5 @@ {-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} -{-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NoImplicitPrelude #-} -{-# LANGUAGE ScopedTypeVariables #-} - -{-# LANGUAGE DataKinds #-} -{-# LANGUAGE DeriveDataTypeable #-} -{-# LANGUAGE TypeApplications #-} module Language.Haskell.Brittany.Internal.BackendUtils ( layoutWriteAppend diff --git a/src/Language/Haskell/Brittany/Internal/Config.hs b/src/Language/Haskell/Brittany/Internal/Config.hs index 09b6ed3..c243e20 100644 --- a/src/Language/Haskell/Brittany/Internal/Config.hs +++ b/src/Language/Haskell/Brittany/Internal/Config.hs @@ -1,12 +1,5 @@ -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} -{-# LANGUAGE LambdaCase #-} {-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NoImplicitPrelude #-} -{-# LANGUAGE ScopedTypeVariables #-} module Language.Haskell.Brittany.Internal.Config ( CConfig(..) diff --git a/src/Language/Haskell/Brittany/Internal/Config/Types.hs b/src/Language/Haskell/Brittany/Internal/Config/Types.hs index 49e0c2b..30d32c3 100644 --- a/src/Language/Haskell/Brittany/Internal/Config/Types.hs +++ b/src/Language/Haskell/Brittany/Internal/Config/Types.hs @@ -1,18 +1,9 @@ -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} -{-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE MultiWayIf #-} -{-# LANGUAGE NoImplicitPrelude #-} -{-# LANGUAGE ScopedTypeVariables #-} - -{-# LANGUAGE TemplateHaskell #-} -{-# LANGUAGE DeriveGeneric #-} -{-# LANGUAGE StandaloneDeriving #-} -{-# LANGUAGE RankNTypes #-} {-# LANGUAGE DeriveDataTypeable #-} +{-# LANGUAGE DeriveGeneric #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE StandaloneDeriving #-} +{-# LANGUAGE TemplateHaskell #-} module Language.Haskell.Brittany.Internal.Config.Types ( module Language.Haskell.Brittany.Internal.Config.Types diff --git a/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs b/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs index 7a5638d..97484b4 100644 --- a/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs +++ b/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs @@ -13,15 +13,8 @@ {-# OPTIONS_GHC -fno-specialise #-} {-# OPTIONS_GHC -fignore-interface-pragmas #-} -{-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} -{-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NoImplicitPrelude #-} -{-# LANGUAGE ScopedTypeVariables #-} module Language.Haskell.Brittany.Internal.Config.Types.Instances where diff --git a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs index 2bfeed4..4c281aa 100644 --- a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs +++ b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs @@ -1,15 +1,10 @@ -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE DataKinds #-} {-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE ScopedTypeVariables #-} -{-# LANGUAGE DataKinds #-} - module Language.Haskell.Brittany.Internal.ExactPrintUtils ( parseModule , parseModuleFromString diff --git a/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs b/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs index 9c20b57..e89549f 100644 --- a/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs +++ b/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs @@ -1,14 +1,8 @@ {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} -{-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE MultiWayIf #-} -{-# LANGUAGE NoImplicitPrelude #-} -{-# LANGUAGE ScopedTypeVariables #-} - {-# LANGUAGE GeneralizedNewtypeDeriving #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE NoImplicitPrelude #-} module Language.Haskell.Brittany.Internal.LayouterBasics ( processDefault diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs index cbd9b21..6a5af9b 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs @@ -1,17 +1,5 @@ -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} {-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NoImplicitPrelude #-} -{-# LANGUAGE ScopedTypeVariables #-} - -{-# LANGUAGE CPP #-} -{-# LANGUAGE DataKinds #-} -{-# LANGUAGE TypeApplications #-} -{-# LANGUAGE KindSignatures #-} module Language.Haskell.Brittany.Internal.Layouters.DataDecl ( layoutDataDecl diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs index 25bacc5..a9621f4 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs @@ -1,19 +1,8 @@ {-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} {-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE ScopedTypeVariables #-} -{-# LANGUAGE DataKinds #-} -{-# LANGUAGE TypeApplications #-} -{-# LANGUAGE PatternSynonyms #-} -{-# LANGUAGE BangPatterns #-} -{-# LANGUAGE ViewPatterns #-} - module Language.Haskell.Brittany.Internal.Layouters.Decl ( layoutDecl , layoutSig diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs index 13a7bae..564fe3f 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs @@ -1,15 +1,6 @@ -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NoImplicitPrelude #-} -{-# LANGUAGE ScopedTypeVariables #-} - -{-# LANGUAGE DataKinds #-} -{-# LANGUAGE ViewPatterns #-} module Language.Haskell.Brittany.Internal.Layouters.Expr ( layoutExpr diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot index f9ceb4f..5ee3716 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot @@ -1,14 +1,4 @@ -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} -{-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NoImplicitPrelude #-} -{-# LANGUAGE ScopedTypeVariables #-} - -{-# LANGUAGE DataKinds #-} module Language.Haskell.Brittany.Internal.Layouters.Expr ( layoutExpr diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs b/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs index 620de4a..481a030 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs @@ -1,12 +1,6 @@ -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} {-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MonadComprehensions #-} {-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NoImplicitPrelude #-} -{-# LANGUAGE ScopedTypeVariables #-} module Language.Haskell.Brittany.Internal.Layouters.IE ( layoutIE diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs index 385983e..2a1edf5 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs @@ -1,12 +1,4 @@ -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} -{-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NoImplicitPrelude #-} -{-# LANGUAGE ScopedTypeVariables #-} module Language.Haskell.Brittany.Internal.Layouters.Import (layoutImport) where diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs index 4efb2c1..00c3bfd 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs @@ -1,14 +1,5 @@ -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} {-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NoImplicitPrelude #-} -{-# LANGUAGE ScopedTypeVariables #-} - -{-# LANGUAGE ViewPatterns #-} module Language.Haskell.Brittany.Internal.Layouters.Module (layoutModule) where diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs index 80a1337..6ea00a1 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs @@ -1,15 +1,5 @@ -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} {-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NoImplicitPrelude #-} -{-# LANGUAGE ScopedTypeVariables #-} - -{-# LANGUAGE DataKinds #-} -{-# LANGUAGE ViewPatterns #-} module Language.Haskell.Brittany.Internal.Layouters.Pattern ( layoutPat diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs index 8012ba6..73bc785 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs @@ -1,15 +1,7 @@ -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} {-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE ScopedTypeVariables #-} -{-# LANGUAGE DataKinds #-} - module Language.Haskell.Brittany.Internal.Layouters.Stmt ( layoutStmt ) diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot index 7c1f0ff..8b6c000 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot @@ -1,14 +1,4 @@ -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} -{-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NoImplicitPrelude #-} -{-# LANGUAGE ScopedTypeVariables #-} - -{-# LANGUAGE DataKinds #-} module Language.Haskell.Brittany.Internal.Layouters.Stmt ( layoutStmt diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs index 7f46688..63fa20a 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs @@ -1,14 +1,5 @@ -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} {-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NoImplicitPrelude #-} -{-# LANGUAGE ScopedTypeVariables #-} - -{-# LANGUAGE DataKinds #-} module Language.Haskell.Brittany.Internal.Layouters.Type ( layoutType diff --git a/src/Language/Haskell/Brittany/Internal/Obfuscation.hs b/src/Language/Haskell/Brittany/Internal/Obfuscation.hs index 79c8337..427fe43 100644 --- a/src/Language/Haskell/Brittany/Internal/Obfuscation.hs +++ b/src/Language/Haskell/Brittany/Internal/Obfuscation.hs @@ -1,12 +1,4 @@ -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} -{-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NoImplicitPrelude #-} -{-# LANGUAGE ScopedTypeVariables #-} module Language.Haskell.Brittany.Internal.Obfuscation ( obfuscate diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs b/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs index 0746a8c..4dfbba2 100644 --- a/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs +++ b/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs @@ -1,16 +1,11 @@ -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} -{-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE MultiWayIf #-} -{-# LANGUAGE NoImplicitPrelude #-} -{-# LANGUAGE ScopedTypeVariables #-} - -{-# LANGUAGE TypeOperators #-} {-# LANGUAGE BangPatterns #-} {-# LANGUAGE DataKinds #-} +{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE NoImplicitPrelude #-} +{-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE TypeOperators #-} module Language.Haskell.Brittany.Internal.Transformations.Alt ( transformAlts diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Columns.hs b/src/Language/Haskell/Brittany/Internal/Transformations/Columns.hs index c76f31c..732e6a1 100644 --- a/src/Language/Haskell/Brittany/Internal/Transformations/Columns.hs +++ b/src/Language/Haskell/Brittany/Internal/Transformations/Columns.hs @@ -1,12 +1,5 @@ -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} {-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NoImplicitPrelude #-} -{-# LANGUAGE ScopedTypeVariables #-} module Language.Haskell.Brittany.Internal.Transformations.Columns ( transformSimplifyColumns diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Floating.hs b/src/Language/Haskell/Brittany/Internal/Transformations/Floating.hs index 4b68bb9..87d551d 100644 --- a/src/Language/Haskell/Brittany/Internal/Transformations/Floating.hs +++ b/src/Language/Haskell/Brittany/Internal/Transformations/Floating.hs @@ -1,12 +1,5 @@ -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} {-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NoImplicitPrelude #-} -{-# LANGUAGE ScopedTypeVariables #-} module Language.Haskell.Brittany.Internal.Transformations.Floating ( transformSimplifyFloating diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Indent.hs b/src/Language/Haskell/Brittany/Internal/Transformations/Indent.hs index 816aecb..e39790a 100644 --- a/src/Language/Haskell/Brittany/Internal/Transformations/Indent.hs +++ b/src/Language/Haskell/Brittany/Internal/Transformations/Indent.hs @@ -1,12 +1,5 @@ -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} {-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NoImplicitPrelude #-} -{-# LANGUAGE ScopedTypeVariables #-} module Language.Haskell.Brittany.Internal.Transformations.Indent ( transformSimplifyIndent diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Par.hs b/src/Language/Haskell/Brittany/Internal/Transformations/Par.hs index 8e686ce..eb186f4 100644 --- a/src/Language/Haskell/Brittany/Internal/Transformations/Par.hs +++ b/src/Language/Haskell/Brittany/Internal/Transformations/Par.hs @@ -1,12 +1,5 @@ -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} {-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NoImplicitPrelude #-} -{-# LANGUAGE ScopedTypeVariables #-} module Language.Haskell.Brittany.Internal.Transformations.Par ( transformSimplifyPar diff --git a/src/Language/Haskell/Brittany/Internal/Types.hs b/src/Language/Haskell/Brittany/Internal/Types.hs index 1e2dcbc..db9e36d 100644 --- a/src/Language/Haskell/Brittany/Internal/Types.hs +++ b/src/Language/Haskell/Brittany/Internal/Types.hs @@ -1,19 +1,15 @@ -{-# LANGUAGE FlexibleContexts #-} +{-# LANGUAGE BangPatterns #-} +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} +{-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE KindSignatures #-} {-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NoImplicitPrelude #-} -{-# LANGUAGE ScopedTypeVariables #-} - -{-# LANGUAGE DataKinds #-} -{-# LANGUAGE StandaloneDeriving #-} -{-# LANGUAGE DeriveDataTypeable #-} -{-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE PatternSynonyms #-} -{-# LANGUAGE BangPatterns #-} +{-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE StandaloneDeriving #-} module Language.Haskell.Brittany.Internal.Types where diff --git a/src/Language/Haskell/Brittany/Internal/Utils.hs b/src/Language/Haskell/Brittany/Internal/Utils.hs index c67716a..a18f874 100644 --- a/src/Language/Haskell/Brittany/Internal/Utils.hs +++ b/src/Language/Haskell/Brittany/Internal/Utils.hs @@ -1,17 +1,10 @@ +{-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} +{-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE ScopedTypeVariables #-} -{-# LANGUAGE CPP #-} -{-# LANGUAGE DeriveDataTypeable #-} -{-# LANGUAGE GeneralizedNewtypeDeriving #-} - module Language.Haskell.Brittany.Internal.Utils ( parDoc , parDocW diff --git a/src/Language/Haskell/Brittany/Main.hs b/src/Language/Haskell/Brittany/Main.hs index c86c90e..e1d482b 100644 --- a/src/Language/Haskell/Brittany/Main.hs +++ b/src/Language/Haskell/Brittany/Main.hs @@ -1,14 +1,6 @@ -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GADTs #-} -{-# LANGUAGE KindSignatures #-} {-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MonadComprehensions #-} {-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NoImplicitPrelude #-} -{-# LANGUAGE ScopedTypeVariables #-} - -{-# LANGUAGE DataKinds #-} module Language.Haskell.Brittany.Main (main) where -- 2.30.2 From 8a4bfe083e5d3fb2b6541a3c3731689851e71caf Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 20:12:17 +0000 Subject: [PATCH 36/74] Use layout for package description --- brittany.cabal | 80 ++++++++++++++++++-------------------------------- 1 file changed, 28 insertions(+), 52 deletions(-) diff --git a/brittany.cabal b/brittany.cabal index a7e5c58..4e31764 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -1,13 +1,12 @@ name: brittany version: 0.13.1.2 synopsis: Haskell source code formatter -description: { +description: See . . If you are interested in the implementation, have a look at ; . The implementation is documented in more detail . -} license: AGPL-3 license-file: LICENSE author: Lennart Spitzner @@ -19,19 +18,16 @@ build-type: Simple cabal-version: 2.0 homepage: https://github.com/lspitzner/brittany/ bug-reports: https://github.com/lspitzner/brittany/issues -extra-doc-files: { +extra-doc-files: ChangeLog.md README.md doc/implementation/*.md -} -extra-source-files: { +extra-source-files: src-literatetests/*.blt -} -source-repository head { +source-repository head type: git location: https://github.com/lspitzner/brittany.git -} flag brittany-dev-lib description: set buildable false for anything but lib @@ -43,12 +39,12 @@ flag brittany-test-perf default: False manual: True -library { +library default-language: Haskell2010 hs-source-dirs: src - exposed-modules: { + exposed-modules: Language.Haskell.Brittany Language.Haskell.Brittany.Main Language.Haskell.Brittany.Internal @@ -61,9 +57,8 @@ library { Language.Haskell.Brittany.Internal.Config.Types.Instances Language.Haskell.Brittany.Internal.Obfuscation Paths_brittany - } autogen-modules: Paths_brittany - other-modules: { + other-modules: Language.Haskell.Brittany.Internal.LayouterBasics Language.Haskell.Brittany.Internal.Backend Language.Haskell.Brittany.Internal.BackendUtils @@ -82,8 +77,7 @@ library { Language.Haskell.Brittany.Internal.Transformations.Par Language.Haskell.Brittany.Internal.Transformations.Columns Language.Haskell.Brittany.Internal.Transformations.Indent - } - ghc-options: { + ghc-options: -Weverything -Wno-incomplete-uni-patterns -Wno-missing-deriving-strategies @@ -94,9 +88,8 @@ library { -Wno-monomorphism-restriction -Wno-prepositive-qualified-module -Wno-unsafe - } build-depends: - { base ^>= 4.15.0 + base ^>= 4.15.0 , aeson ^>= 2.0.1 , butcher ^>= 1.3.3 , bytestring ^>= 0.10.12 @@ -124,41 +117,35 @@ library { , transformers ^>= 0.5.6 , uniplate ^>= 1.6.13 , yaml ^>= 0.11.7 - } -} executable brittany - if flag(brittany-dev-lib) { + if flag(brittany-dev-lib) buildable: False - } else { + else buildable: True - } main-is: Main.hs hs-source-dirs: src-brittany build-depends: - { base + base , brittany - } default-language: Haskell2010 - ghc-options: { + ghc-options: -Wall -fno-spec-constr -fno-warn-unused-imports -fno-warn-redundant-constraints -rtsopts -with-rtsopts "-M2G" - } test-suite unittests - if flag(brittany-dev-lib) || !flag(brittany-test-perf) { + if flag(brittany-dev-lib) || !flag(brittany-test-perf) buildable: False - } else { + else buildable: True - } type: exitcode-stdio-1.0 default-language: Haskell2010 build-depends: - { brittany + brittany , base , ghc , ghc-paths @@ -188,12 +175,11 @@ test-suite unittests , czipwith , ghc-boot-th , hspec >=2.4.1 && <2.9 - } main-is: TestMain.hs other-modules: TestUtils AsymptoticPerfTests hs-source-dirs: src-unittests - default-extensions: { + default-extensions: CPP NoImplicitPrelude @@ -207,8 +193,7 @@ test-suite unittests LambdaCase MultiWayIf KindSignatures - } - ghc-options: { + ghc-options: -Wall -fno-warn-unused-imports -rtsopts @@ -217,18 +202,16 @@ test-suite unittests -- ^ threaded is not necessary at all, but our CI trusts on being able -- to pass -N1, which is not possible without threaded :-/ -- (plus -no-threaded is not a thing, afaict) - } test-suite littests - if flag(brittany-dev-lib) { + if flag(brittany-dev-lib) buildable: False - } else { + else buildable: True - } type: exitcode-stdio-1.0 default-language: Haskell2010 build-depends: - { brittany + brittany , base , ghc , ghc-paths @@ -260,11 +243,10 @@ test-suite littests , hspec >=2.4.1 && <2.9 , filepath , parsec >=3.1.11 && <3.2 - } main-is: Main.hs other-modules: hs-source-dirs: src-literatetests - default-extensions: { + default-extensions: CPP NoImplicitPrelude @@ -278,34 +260,30 @@ test-suite littests LambdaCase MultiWayIf KindSignatures - } - ghc-options: { + ghc-options: -Wall -fno-warn-unused-imports -threaded -rtsopts -with-rtsopts "-M2G -N" - } test-suite libinterfacetests - if flag(brittany-dev-lib) { + if flag(brittany-dev-lib) buildable: False - } else { + else buildable: True - } type: exitcode-stdio-1.0 default-language: Haskell2010 build-depends: - { brittany + brittany , base , text , transformers , hspec >=2.4.1 && <2.9 - } main-is: Main.hs other-modules: hs-source-dirs: src-libinterfacetests - default-extensions: { + default-extensions: FlexibleContexts FlexibleInstances ScopedTypeVariables @@ -313,8 +291,7 @@ test-suite libinterfacetests LambdaCase MultiWayIf KindSignatures - } - ghc-options: { + ghc-options: -Wall -fno-warn-unused-imports -rtsopts @@ -323,4 +300,3 @@ test-suite libinterfacetests -- ^ threaded is not necessary at all, but our CI trusts on being able -- to pass -N1, which is not possible without threaded :-/ -- (plus -no-threaded is not a thing, afaict) - } -- 2.30.2 From 33d2aa87906bd036d8b0bde614978fd70dc8b6d2 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 20:33:43 +0000 Subject: [PATCH 37/74] Use common stanzas in package description --- brittany.cabal | 268 ++++++++------------------- src-libinterfacetests/Main.hs | 1 - src-literatetests/Main.hs | 47 +---- src-unittests/AsymptoticPerfTests.hs | 59 +----- src-unittests/TestMain.hs | 49 ----- src-unittests/TestUtils.hs | 41 ---- 6 files changed, 86 insertions(+), 379 deletions(-) diff --git a/brittany.cabal b/brittany.cabal index 4e31764..83893e4 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -1,3 +1,5 @@ +cabal-version: 2.2 + name: brittany version: 0.13.1.2 synopsis: Haskell source code formatter @@ -7,7 +9,7 @@ description: If you are interested in the implementation, have a look at ; . The implementation is documented in more detail . -license: AGPL-3 +license: AGPL-3.0-only license-file: LICENSE author: Lennart Spitzner maintainer: Lennart Spitzner @@ -15,7 +17,6 @@ copyright: Copyright (C) 2016-2019 Lennart Spitzner Copyright (C) 2019 PRODA LTD category: Language build-type: Simple -cabal-version: 2.0 homepage: https://github.com/lspitzner/brittany/ bug-reports: https://github.com/lspitzner/brittany/issues extra-doc-files: @@ -39,9 +40,62 @@ flag brittany-test-perf default: False manual: True +common library + build-depends: + , aeson ^>= 2.0.1 + , base ^>= 4.15.0 + , butcher ^>= 1.3.3 + , bytestring ^>= 0.10.12 + , cmdargs ^>= 0.10.21 + , containers ^>= 0.6.4 + , czipwith ^>= 1.0.1 + , data-tree-print ^>= 0.1.0 + , deepseq ^>= 1.4.5 + , directory ^>= 1.3.6 + , extra ^>= 1.7.10 + , filepath ^>= 1.4.2 + , ghc ^>= 9.0.1 + , ghc-boot-th ^>= 9.0.1 + , ghc-exactprint ^>= 0.6.4 + , monad-memo ^>= 0.5.3 + , mtl ^>= 2.2.2 + , multistate ^>= 0.8.0 + , pretty ^>= 1.1.3 + , random ^>= 1.2.1 + , safe ^>= 0.3.19 + , semigroups ^>= 0.19.2 + , strict ^>= 0.4.0 + , syb ^>= 0.7.2 + , text ^>= 1.2.5 + , transformers ^>= 0.5.6 + , uniplate ^>= 1.6.13 + , yaml ^>= 0.11.7 + default-language: Haskell2010 + ghc-options: + -Weverything + -Wno-incomplete-uni-patterns + -Wno-missing-deriving-strategies + -Wno-missing-export-lists + -Wno-missing-import-lists + -Wno-missing-local-signatures + -Wno-missing-safe-haskell-mode + -Wno-monomorphism-restriction + -Wno-prepositive-qualified-module + -Wno-unsafe + +common executable + import: library + + build-depends: brittany + ghc-options: + -rtsopts + -threaded + -Wno-implicit-prelude + -Wno-unused-packages + library - default-language: - Haskell2010 + import: library + hs-source-dirs: src exposed-modules: @@ -77,226 +131,52 @@ library Language.Haskell.Brittany.Internal.Transformations.Par Language.Haskell.Brittany.Internal.Transformations.Columns Language.Haskell.Brittany.Internal.Transformations.Indent - ghc-options: - -Weverything - -Wno-incomplete-uni-patterns - -Wno-missing-deriving-strategies - -Wno-missing-export-lists - -Wno-missing-import-lists - -Wno-missing-local-signatures - -Wno-missing-safe-haskell-mode - -Wno-monomorphism-restriction - -Wno-prepositive-qualified-module - -Wno-unsafe - build-depends: - base ^>= 4.15.0 - , aeson ^>= 2.0.1 - , butcher ^>= 1.3.3 - , bytestring ^>= 0.10.12 - , cmdargs ^>= 0.10.21 - , containers ^>= 0.6.4 - , czipwith ^>= 1.0.1 - , data-tree-print ^>= 0.1.0 - , deepseq ^>= 1.4.5 - , directory ^>= 1.3.6 - , extra ^>= 1.7.10 - , filepath ^>= 1.4.2 - , ghc ^>= 9.0.1 - , ghc-boot-th ^>= 9.0.1 - , ghc-exactprint ^>= 0.6.4 - , monad-memo ^>= 0.5.3 - , mtl ^>= 2.2.2 - , multistate ^>= 0.8.0 - , pretty ^>= 1.1.3 - , random ^>= 1.2.1 - , safe ^>= 0.3.19 - , semigroups ^>= 0.19.2 - , strict ^>= 0.4.0 - , syb ^>= 0.7.2 - , text ^>= 1.2.5 - , transformers ^>= 0.5.6 - , uniplate ^>= 1.6.13 - , yaml ^>= 0.11.7 executable brittany + import: executable + if flag(brittany-dev-lib) buildable: False - else - buildable: True + main-is: Main.hs hs-source-dirs: src-brittany - build-depends: - base - , brittany - default-language: Haskell2010 - ghc-options: - -Wall - -fno-spec-constr - -fno-warn-unused-imports - -fno-warn-redundant-constraints - -rtsopts - -with-rtsopts "-M2G" test-suite unittests + import: executable + if flag(brittany-dev-lib) || !flag(brittany-test-perf) buildable: False - else - buildable: True + type: exitcode-stdio-1.0 - default-language: Haskell2010 build-depends: - brittany - , base - , ghc - , ghc-paths - , ghc-exactprint - , transformers - , containers - , mtl - , text - , multistate - , syb - , data-tree-print - , pretty - , bytestring - , directory - , butcher - , yaml - , aeson - , extra - , uniplate - , strict - , monad-memo - , unsafe - , safe - , deepseq - , semigroups - , cmdargs - , czipwith - , ghc-boot-th - , hspec >=2.4.1 && <2.9 + , hspec ^>= 2.8.3 main-is: TestMain.hs other-modules: TestUtils AsymptoticPerfTests hs-source-dirs: src-unittests - default-extensions: - CPP - - NoImplicitPrelude - - GADTs - - FlexibleContexts - FlexibleInstances - ScopedTypeVariables - MonadComprehensions - LambdaCase - MultiWayIf - KindSignatures - ghc-options: - -Wall - -fno-warn-unused-imports - -rtsopts - -with-rtsopts "-M2G" - -threaded - -- ^ threaded is not necessary at all, but our CI trusts on being able - -- to pass -N1, which is not possible without threaded :-/ - -- (plus -no-threaded is not a thing, afaict) test-suite littests + import: executable + if flag(brittany-dev-lib) buildable: False - else - buildable: True + type: exitcode-stdio-1.0 default-language: Haskell2010 build-depends: - brittany - , base - , ghc - , ghc-paths - , ghc-exactprint - , transformers - , containers - , mtl - , text - , multistate - , syb - , data-tree-print - , pretty - , bytestring - , directory - , butcher - , yaml - , aeson - , extra - , uniplate - , strict - , monad-memo - , unsafe - , safe - , deepseq - , semigroups - , cmdargs - , czipwith - , ghc-boot-th - , hspec >=2.4.1 && <2.9 - , filepath - , parsec >=3.1.11 && <3.2 + , hspec ^>= 2.8.3 + , parsec ^>= 3.1.14 main-is: Main.hs - other-modules: hs-source-dirs: src-literatetests - default-extensions: - CPP - - NoImplicitPrelude - - GADTs - - FlexibleContexts - FlexibleInstances - ScopedTypeVariables - MonadComprehensions - LambdaCase - MultiWayIf - KindSignatures - ghc-options: - -Wall - -fno-warn-unused-imports - -threaded - -rtsopts - -with-rtsopts "-M2G -N" test-suite libinterfacetests + import: executable + if flag(brittany-dev-lib) buildable: False - else - buildable: True + type: exitcode-stdio-1.0 - default-language: Haskell2010 build-depends: - brittany - , base - , text - , transformers - , hspec >=2.4.1 && <2.9 + , hspec ^>= 2.8.3 main-is: Main.hs - other-modules: hs-source-dirs: src-libinterfacetests - default-extensions: - FlexibleContexts - FlexibleInstances - ScopedTypeVariables - MonadComprehensions - LambdaCase - MultiWayIf - KindSignatures - ghc-options: - -Wall - -fno-warn-unused-imports - -rtsopts - -with-rtsopts "-M2G" - -threaded - -- ^ threaded is not necessary at all, but our CI trusts on being able - -- to pass -N1, which is not possible without threaded :-/ - -- (plus -no-threaded is not a thing, afaict) diff --git a/src-libinterfacetests/Main.hs b/src-libinterfacetests/Main.hs index 973755e..f663174 100644 --- a/src-libinterfacetests/Main.hs +++ b/src-libinterfacetests/Main.hs @@ -5,7 +5,6 @@ module Main where import Test.Hspec import Language.Haskell.Brittany import qualified Data.Text as Text -import qualified System.Exit as Exit import Control.Monad.IO.Class diff --git a/src-literatetests/Main.hs b/src-literatetests/Main.hs index 2cb903c..399c08e 100644 --- a/src-literatetests/Main.hs +++ b/src-literatetests/Main.hs @@ -1,3 +1,7 @@ +{-# LANGUAGE CPP #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE MonadComprehensions #-} + module Main ( main ) @@ -6,61 +10,18 @@ where import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce -import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS import qualified Data.List.Extra -import qualified Data.Map as Map import qualified Data.Maybe import qualified Data.Semigroup as Semigroup -import qualified Data.Sequence as Seq -import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO import qualified GHC.OldList as List -import qualified Safe as Safe import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass import Test.Hspec -import Test.Hspec.Runner ( hspecWith - , defaultConfig - , configConcurrentJobs - ) import qualified Text.Parsec as Parsec import Text.Parsec.Text ( Parser ) -import Data.Char ( isSpace ) import Data.List ( groupBy ) import Language.Haskell.Brittany.Internal diff --git a/src-unittests/AsymptoticPerfTests.hs b/src-unittests/AsymptoticPerfTests.hs index 886c3e7..6abbf90 100644 --- a/src-unittests/AsymptoticPerfTests.hs +++ b/src-unittests/AsymptoticPerfTests.hs @@ -1,3 +1,5 @@ +{-# LANGUAGE ScopedTypeVariables #-} + module AsymptoticPerfTests ( asymptoticPerfTest ) @@ -5,71 +7,26 @@ where -import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce -import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra -import qualified Data.Map as Map -import qualified Data.Maybe -import qualified Data.Semigroup as Semigroup -import qualified Data.Sequence as Seq -import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO -import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass import Test.Hspec -import Language.Haskell.Brittany.Internal - import TestUtils asymptoticPerfTest :: Spec asymptoticPerfTest = do - it "1000 do statements" + it "10 do statements" $ roundTripEqualWithTimeout 1500000 $ (Text.pack "func = do\n") - <> Text.replicate 1000 (Text.pack " statement\n") - it "1000 do nestings" + <> Text.replicate 10 (Text.pack " statement\n") + it "10 do nestings" $ roundTripEqualWithTimeout 4000000 $ (Text.pack "func = ") <> mconcat - ( [0 .. 999] + ( [1 .. 10] <&> \(i :: Int) -> (Text.replicate (2 * i) (Text.pack " ") <> Text.pack "do\n") ) @@ -77,7 +34,7 @@ asymptoticPerfTest = do <> Text.pack "return\n" <> Text.replicate 2002 (Text.pack " ") <> Text.pack "()" - it "1000 AppOps" + it "10 AppOps" $ roundTripEqualWithTimeout 1000000 $ (Text.pack "func = expr") - <> Text.replicate 200 (Text.pack "\n . expr") --TODO + <> Text.replicate 10 (Text.pack "\n . expr") --TODO diff --git a/src-unittests/TestMain.hs b/src-unittests/TestMain.hs index 7fa2fa4..81ec429 100644 --- a/src-unittests/TestMain.hs +++ b/src-unittests/TestMain.hs @@ -1,57 +1,8 @@ module Main where - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce -import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra -import qualified Data.Map as Map -import qualified Data.Maybe -import qualified Data.Semigroup as Semigroup -import qualified Data.Sequence as Seq -import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict -import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO -import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass - import Test.Hspec -import Language.Haskell.Brittany.Internal - import AsymptoticPerfTests diff --git a/src-unittests/TestUtils.hs b/src-unittests/TestUtils.hs index 94c2375..942f4aa 100644 --- a/src-unittests/TestUtils.hs +++ b/src-unittests/TestUtils.hs @@ -3,50 +3,9 @@ module TestUtils where import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Control.Monad.Reader.Class as Reader.Class -import qualified Control.Monad.RWS.Class as RWS.Class -import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT -import qualified Control.Monad.Trans.MultiRWS.Lazy as MultiRWSL -import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Trans.State as State -import qualified Control.Monad.Trans.State.Lazy as StateL -import qualified Control.Monad.Trans.State.Strict as StateS -import qualified Control.Monad.Writer.Class as Writer.Class -import qualified Data.Bool as Bool -import qualified Data.ByteString -import qualified Data.ByteString as ByteString -import qualified Data.ByteString.Char8 -import qualified Data.ByteString.Lazy as ByteStringL -import qualified Data.Coerce -import qualified Data.Data -import qualified Data.Either -import qualified Data.Foldable -import qualified Data.Foldable as Foldable -import qualified Data.IntMap.Lazy as IntMapL -import qualified Data.IntMap.Strict as IntMapS -import qualified Data.List.Extra -import qualified Data.Map as Map import qualified Data.Maybe import qualified Data.Semigroup as Semigroup -import qualified Data.Sequence as Seq -import qualified Data.Set as Set -import qualified Data.Strict.Maybe as Strict import qualified Data.Text as Text -import qualified Data.Text.Encoding as Text.Encoding -import qualified Data.Text.IO as Text.IO -import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Encoding as TextL.Encoding -import qualified Data.Text.Lazy.IO as TextL.IO -import qualified GHC.OldList as List -import qualified Safe as Safe -import qualified System.Directory -import qualified System.IO -import qualified Text.PrettyPrint -import qualified Text.PrettyPrint.Annotated -import qualified Text.PrettyPrint.Annotated.HughesPJ -import qualified Text.PrettyPrint.Annotated.HughesPJClass import Test.Hspec -- 2.30.2 From 69e0f9fedf3b5f9d4b58bbd6554d1913c3b861df Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 20:34:25 +0000 Subject: [PATCH 38/74] Expose all modules --- brittany.cabal | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/brittany.cabal b/brittany.cabal index 83893e4..780ccaf 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -100,37 +100,36 @@ library src exposed-modules: Language.Haskell.Brittany - Language.Haskell.Brittany.Main Language.Haskell.Brittany.Internal - Language.Haskell.Brittany.Internal.Prelude - Language.Haskell.Brittany.Internal.PreludeUtils - Language.Haskell.Brittany.Internal.Types - Language.Haskell.Brittany.Internal.Utils + Language.Haskell.Brittany.Internal.Backend + Language.Haskell.Brittany.Internal.BackendUtils Language.Haskell.Brittany.Internal.Config Language.Haskell.Brittany.Internal.Config.Types Language.Haskell.Brittany.Internal.Config.Types.Instances - Language.Haskell.Brittany.Internal.Obfuscation - Paths_brittany - autogen-modules: Paths_brittany - other-modules: - Language.Haskell.Brittany.Internal.LayouterBasics - Language.Haskell.Brittany.Internal.Backend - Language.Haskell.Brittany.Internal.BackendUtils Language.Haskell.Brittany.Internal.ExactPrintUtils - Language.Haskell.Brittany.Internal.Layouters.Type + Language.Haskell.Brittany.Internal.LayouterBasics + Language.Haskell.Brittany.Internal.Layouters.DataDecl Language.Haskell.Brittany.Internal.Layouters.Decl Language.Haskell.Brittany.Internal.Layouters.Expr - Language.Haskell.Brittany.Internal.Layouters.Stmt - Language.Haskell.Brittany.Internal.Layouters.Pattern Language.Haskell.Brittany.Internal.Layouters.IE Language.Haskell.Brittany.Internal.Layouters.Import Language.Haskell.Brittany.Internal.Layouters.Module - Language.Haskell.Brittany.Internal.Layouters.DataDecl + Language.Haskell.Brittany.Internal.Layouters.Pattern + Language.Haskell.Brittany.Internal.Layouters.Stmt + Language.Haskell.Brittany.Internal.Layouters.Type + Language.Haskell.Brittany.Internal.Obfuscation + Language.Haskell.Brittany.Internal.Prelude + Language.Haskell.Brittany.Internal.PreludeUtils Language.Haskell.Brittany.Internal.Transformations.Alt - Language.Haskell.Brittany.Internal.Transformations.Floating - Language.Haskell.Brittany.Internal.Transformations.Par Language.Haskell.Brittany.Internal.Transformations.Columns + Language.Haskell.Brittany.Internal.Transformations.Floating Language.Haskell.Brittany.Internal.Transformations.Indent + Language.Haskell.Brittany.Internal.Transformations.Par + Language.Haskell.Brittany.Internal.Types + Language.Haskell.Brittany.Internal.Utils + Language.Haskell.Brittany.Main + Paths_brittany + autogen-modules: Paths_brittany executable brittany import: executable -- 2.30.2 From d03deccba88d5abc8c4ec328e142e10943e1a785 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 20:38:28 +0000 Subject: [PATCH 39/74] Remove unnecessary export lists --- src-brittany/Main.hs | 2 - src-libinterfacetests/Main.hs | 4 - src-literatetests/Main.hs | 7 -- src-unittests/AsymptoticPerfTests.hs | 5 +- src-unittests/TestMain.hs | 3 - .../Haskell/Brittany/Internal/Backend.hs | 5 +- .../Haskell/Brittany/Internal/BackendUtils.hs | 29 +------ .../Haskell/Brittany/Internal/Config.hs | 20 +---- .../Haskell/Brittany/Internal/Config/Types.hs | 6 +- .../Internal/Config/Types/Instances.hs | 3 +- .../Brittany/Internal/ExactPrintUtils.hs | 10 +-- .../Brittany/Internal/LayouterBasics.hs | 78 +------------------ .../Brittany/Internal/Layouters/DataDecl.hs | 5 +- .../Brittany/Internal/Layouters/Decl.hs | 12 +-- .../Brittany/Internal/Layouters/Expr.hs | 7 +- .../Brittany/Internal/Layouters/Expr.hs-boot | 7 +- .../Haskell/Brittany/Internal/Layouters/IE.hs | 8 +- .../Brittany/Internal/Layouters/Import.hs | 2 +- .../Brittany/Internal/Layouters/Module.hs | 2 +- .../Brittany/Internal/Layouters/Pattern.hs | 6 +- .../Brittany/Internal/Layouters/Stmt.hs | 5 +- .../Brittany/Internal/Layouters/Stmt.hs-boot | 5 +- .../Brittany/Internal/Layouters/Type.hs | 7 +- .../Haskell/Brittany/Internal/Obfuscation.hs | 5 +- .../Haskell/Brittany/Internal/Prelude.hs | 9 +-- .../Haskell/Brittany/Internal/PreludeUtils.hs | 3 +- .../Brittany/Internal/Transformations/Alt.hs | 5 +- .../Internal/Transformations/Columns.hs | 5 +- .../Internal/Transformations/Floating.hs | 5 +- .../Internal/Transformations/Indent.hs | 5 +- .../Brittany/Internal/Transformations/Par.hs | 5 +- .../Haskell/Brittany/Internal/Types.hs | 3 +- .../Haskell/Brittany/Internal/Utils.hs | 28 +------ src/Language/Haskell/Brittany/Main.hs | 2 +- 34 files changed, 30 insertions(+), 283 deletions(-) diff --git a/src-brittany/Main.hs b/src-brittany/Main.hs index 0312f6b..7a5ae94 100644 --- a/src-brittany/Main.hs +++ b/src-brittany/Main.hs @@ -1,5 +1,3 @@ -module Main where - import qualified Language.Haskell.Brittany.Main as BrittanyMain main :: IO () diff --git a/src-libinterfacetests/Main.hs b/src-libinterfacetests/Main.hs index f663174..2d1924f 100644 --- a/src-libinterfacetests/Main.hs +++ b/src-libinterfacetests/Main.hs @@ -1,7 +1,3 @@ -module Main where - - - import Test.Hspec import Language.Haskell.Brittany import qualified Data.Text as Text diff --git a/src-literatetests/Main.hs b/src-literatetests/Main.hs index 399c08e..5949a55 100644 --- a/src-literatetests/Main.hs +++ b/src-literatetests/Main.hs @@ -2,13 +2,6 @@ {-# LANGUAGE LambdaCase #-} {-# LANGUAGE MonadComprehensions #-} -module Main - ( main - ) -where - - - import Language.Haskell.Brittany.Internal.Prelude import qualified Data.List.Extra import qualified Data.Maybe diff --git a/src-unittests/AsymptoticPerfTests.hs b/src-unittests/AsymptoticPerfTests.hs index 6abbf90..702ab90 100644 --- a/src-unittests/AsymptoticPerfTests.hs +++ b/src-unittests/AsymptoticPerfTests.hs @@ -1,9 +1,6 @@ {-# LANGUAGE ScopedTypeVariables #-} -module AsymptoticPerfTests - ( asymptoticPerfTest - ) -where +module AsymptoticPerfTests where diff --git a/src-unittests/TestMain.hs b/src-unittests/TestMain.hs index 81ec429..2f0f894 100644 --- a/src-unittests/TestMain.hs +++ b/src-unittests/TestMain.hs @@ -1,6 +1,3 @@ -module Main where - - import Test.Hspec import AsymptoticPerfTests diff --git a/src/Language/Haskell/Brittany/Internal/Backend.hs b/src/Language/Haskell/Brittany/Internal/Backend.hs index 204a16f..b8241bf 100644 --- a/src/Language/Haskell/Brittany/Internal/Backend.hs +++ b/src/Language/Haskell/Brittany/Internal/Backend.hs @@ -4,10 +4,7 @@ {-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE ScopedTypeVariables #-} -module Language.Haskell.Brittany.Internal.Backend - ( layoutBriDocM - ) -where +module Language.Haskell.Brittany.Internal.Backend where diff --git a/src/Language/Haskell/Brittany/Internal/BackendUtils.hs b/src/Language/Haskell/Brittany/Internal/BackendUtils.hs index 444d548..8003fd8 100644 --- a/src/Language/Haskell/Brittany/Internal/BackendUtils.hs +++ b/src/Language/Haskell/Brittany/Internal/BackendUtils.hs @@ -1,34 +1,7 @@ {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE NoImplicitPrelude #-} -module Language.Haskell.Brittany.Internal.BackendUtils - ( layoutWriteAppend - , layoutWriteAppendMultiline - , layoutWriteNewlineBlock - , layoutWriteNewline - , layoutWriteEnsureNewlineBlock - , layoutWriteEnsureBlock - , layoutWithAddBaseCol - , layoutWithAddBaseColBlock - , layoutWithAddBaseColN - , layoutWithAddBaseColNBlock - , layoutBaseYPushCur - , layoutBaseYPop - , layoutIndentLevelPushCur - , layoutIndentLevelPop - , layoutWriteEnsureAbsoluteN - , layoutAddSepSpace - , layoutSetCommentCol - , layoutMoveToCommentPos - , layoutIndentRestorePostComment - , moveToExactAnn - , moveToY - , ppmMoveToExactLoc - , layoutWritePriorComments - , layoutWritePostComments - , layoutRemoveIndentLevelLinger - ) -where +module Language.Haskell.Brittany.Internal.BackendUtils where import Language.Haskell.Brittany.Internal.Prelude diff --git a/src/Language/Haskell/Brittany/Internal/Config.hs b/src/Language/Haskell/Brittany/Internal/Config.hs index c243e20..66d6d7f 100644 --- a/src/Language/Haskell/Brittany/Internal/Config.hs +++ b/src/Language/Haskell/Brittany/Internal/Config.hs @@ -1,25 +1,7 @@ {-# LANGUAGE MonadComprehensions #-} {-# LANGUAGE NoImplicitPrelude #-} -module Language.Haskell.Brittany.Internal.Config - ( CConfig(..) - , CDebugConfig(..) - , CLayoutConfig(..) - , DebugConfig - , LayoutConfig - , Config - , cmdlineConfigParser - , staticDefaultConfig - , forwardOptionsSyntaxExtsEnabled - , readConfig - , userConfigPath - , findLocalConfigPath - , readConfigs - , readConfigsWithUserConfig - , writeDefaultConfig - , showConfigYaml - ) -where +module Language.Haskell.Brittany.Internal.Config where diff --git a/src/Language/Haskell/Brittany/Internal/Config/Types.hs b/src/Language/Haskell/Brittany/Internal/Config/Types.hs index 30d32c3..929ac90 100644 --- a/src/Language/Haskell/Brittany/Internal/Config/Types.hs +++ b/src/Language/Haskell/Brittany/Internal/Config/Types.hs @@ -5,11 +5,7 @@ {-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE TemplateHaskell #-} -module Language.Haskell.Brittany.Internal.Config.Types - ( module Language.Haskell.Brittany.Internal.Config.Types - , cMap - ) -where +module Language.Haskell.Brittany.Internal.Config.Types where diff --git a/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs b/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs index 97484b4..2c0c78f 100644 --- a/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs +++ b/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs @@ -16,8 +16,7 @@ {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE NoImplicitPrelude #-} -module Language.Haskell.Brittany.Internal.Config.Types.Instances -where +module Language.Haskell.Brittany.Internal.Config.Types.Instances where diff --git a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs index 4c281aa..f2c7806 100644 --- a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs +++ b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs @@ -5,15 +5,7 @@ {-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE ScopedTypeVariables #-} -module Language.Haskell.Brittany.Internal.ExactPrintUtils - ( parseModule - , parseModuleFromString - , commentAnnFixTransformGlob - , extractToplevelAnns - , foldedAnnKeys - , withTransformedAnns - ) -where +module Language.Haskell.Brittany.Internal.ExactPrintUtils where diff --git a/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs b/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs index e89549f..1d8f48a 100644 --- a/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs +++ b/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs @@ -4,83 +4,7 @@ {-# LANGUAGE LambdaCase #-} {-# LANGUAGE NoImplicitPrelude #-} -module Language.Haskell.Brittany.Internal.LayouterBasics - ( processDefault - , rdrNameToText - , lrdrNameToText - , lrdrNameToTextAnn - , lrdrNameToTextAnnTypeEqualityIsSpecial - , lrdrNameToTextAnnTypeEqualityIsSpecialAndRespectTick - , askIndent - , extractAllComments - , extractRestComments - , filterAnns - , docEmpty - , docLit - , docLitS - , docAlt - , CollectAltM - , addAlternativeCond - , addAlternative - , runFilteredAlternative - , docLines - , docCols - , docSeq - , docPar - , docNodeAnnKW - , docNodeMoveToKWDP - , docWrapNode - , docWrapNodePrior - , docWrapNodeRest - , docForceSingleline - , docForceMultiline - , docEnsureIndent - , docAddBaseY - , docSetBaseY - , docSetIndentLevel - , docSeparator - , docAnnotationPrior - , docAnnotationKW - , docAnnotationRest - , docMoveToKWDP - , docNonBottomSpacing - , docNonBottomSpacingS - , docSetParSpacing - , docForceParSpacing - , docDebug - , docSetBaseAndIndent - , briDocByExact - , briDocByExactNoComment - , briDocByExactInlineOnly - , foldedAnnKeys - , unknownNodeError - , appSep - , docCommaSep - , docParenLSep - , docParenL - , docParenR - , docParenHashLSep - , docParenHashRSep - , docBracketL - , docBracketR - , docTick - , spacifyDocs - , briDocMToPPM - , briDocMToPPMInner - , allocateNode - , docSharedWrapper - , hasAnyCommentsBelow - , hasCommentsBetween - , hasAnyCommentsConnected - , hasAnyCommentsPrior - , hasAnyRegularCommentsConnected - , hasAnyRegularCommentsRest - , hasAnnKeywordComment - , hasAnnKeyword - , astAnn - , allocNodeIndex - ) -where +module Language.Haskell.Brittany.Internal.LayouterBasics where diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs index 6a5af9b..49f615a 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs @@ -1,10 +1,7 @@ {-# LANGUAGE LambdaCase #-} {-# LANGUAGE NoImplicitPrelude #-} -module Language.Haskell.Brittany.Internal.Layouters.DataDecl - ( layoutDataDecl - ) -where +module Language.Haskell.Brittany.Internal.Layouters.DataDecl where diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs index a9621f4..a2d4a00 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs @@ -3,17 +3,7 @@ {-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE ScopedTypeVariables #-} -module Language.Haskell.Brittany.Internal.Layouters.Decl - ( layoutDecl - , layoutSig - , layoutBind - , layoutLocalBinds - , layoutGuardLStmt - , layoutPatternBind - , layoutGrhs - , layoutPatternBindFinal - ) -where +module Language.Haskell.Brittany.Internal.Layouters.Decl where diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs index 564fe3f..b26687c 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs @@ -2,12 +2,7 @@ {-# LANGUAGE MonadComprehensions #-} {-# LANGUAGE NoImplicitPrelude #-} -module Language.Haskell.Brittany.Internal.Layouters.Expr - ( layoutExpr - , litBriDoc - , overLitValBriDoc - ) -where +module Language.Haskell.Brittany.Internal.Layouters.Expr where diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot index 5ee3716..8fb094b 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot @@ -1,11 +1,6 @@ {-# LANGUAGE NoImplicitPrelude #-} -module Language.Haskell.Brittany.Internal.Layouters.Expr - ( layoutExpr - , litBriDoc - , overLitValBriDoc - ) -where +module Language.Haskell.Brittany.Internal.Layouters.Expr where diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs b/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs index 481a030..06aa0cf 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs @@ -2,13 +2,7 @@ {-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NoImplicitPrelude #-} -module Language.Haskell.Brittany.Internal.Layouters.IE - ( layoutIE - , layoutLLIEs - , layoutAnnAndSepLLIEs - , SortItemsFlag(..) - ) -where +module Language.Haskell.Brittany.Internal.Layouters.IE where import Language.Haskell.Brittany.Internal.Prelude import qualified Data.List.Extra diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs index 2a1edf5..1b19145 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs @@ -1,6 +1,6 @@ {-# LANGUAGE NoImplicitPrelude #-} -module Language.Haskell.Brittany.Internal.Layouters.Import (layoutImport) where +module Language.Haskell.Brittany.Internal.Layouters.Import where import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs index 00c3bfd..52c2cd1 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs @@ -1,7 +1,7 @@ {-# LANGUAGE LambdaCase #-} {-# LANGUAGE NoImplicitPrelude #-} -module Language.Haskell.Brittany.Internal.Layouters.Module (layoutModule) where +module Language.Haskell.Brittany.Internal.Layouters.Module where import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs index 6ea00a1..4b99bca 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs @@ -1,11 +1,7 @@ {-# LANGUAGE LambdaCase #-} {-# LANGUAGE NoImplicitPrelude #-} -module Language.Haskell.Brittany.Internal.Layouters.Pattern - ( layoutPat - , colsWrapPat - ) -where +module Language.Haskell.Brittany.Internal.Layouters.Pattern where diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs index 73bc785..95f7273 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs @@ -2,10 +2,7 @@ {-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE ScopedTypeVariables #-} -module Language.Haskell.Brittany.Internal.Layouters.Stmt - ( layoutStmt - ) -where +module Language.Haskell.Brittany.Internal.Layouters.Stmt where diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot index 8b6c000..02b388c 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot @@ -1,9 +1,6 @@ {-# LANGUAGE NoImplicitPrelude #-} -module Language.Haskell.Brittany.Internal.Layouters.Stmt - ( layoutStmt - ) -where +module Language.Haskell.Brittany.Internal.Layouters.Stmt where diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs index 63fa20a..f5efb7f 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs @@ -1,12 +1,7 @@ {-# LANGUAGE LambdaCase #-} {-# LANGUAGE NoImplicitPrelude #-} -module Language.Haskell.Brittany.Internal.Layouters.Type - ( layoutType - , layoutTyVarBndrs - , processTyVarBndrsSingleline - ) -where +module Language.Haskell.Brittany.Internal.Layouters.Type where diff --git a/src/Language/Haskell/Brittany/Internal/Obfuscation.hs b/src/Language/Haskell/Brittany/Internal/Obfuscation.hs index 427fe43..29dc13c 100644 --- a/src/Language/Haskell/Brittany/Internal/Obfuscation.hs +++ b/src/Language/Haskell/Brittany/Internal/Obfuscation.hs @@ -1,9 +1,6 @@ {-# LANGUAGE NoImplicitPrelude #-} -module Language.Haskell.Brittany.Internal.Obfuscation - ( obfuscate - ) -where +module Language.Haskell.Brittany.Internal.Obfuscation where diff --git a/src/Language/Haskell/Brittany/Internal/Prelude.hs b/src/Language/Haskell/Brittany/Internal/Prelude.hs index b6c4423..d09b788 100644 --- a/src/Language/Haskell/Brittany/Internal/Prelude.hs +++ b/src/Language/Haskell/Brittany/Internal/Prelude.hs @@ -1,8 +1,4 @@ -module Language.Haskell.Brittany.Internal.Prelude - ( module E - , module Language.Haskell.Brittany.Internal.Prelude - ) -where +module Language.Haskell.Brittany.Internal.Prelude ( module E ) where @@ -361,6 +357,3 @@ import Control.Monad.Trans.Maybe as E ( MaybeT (..) import Data.Data as E ( toConstr ) - -todo :: a -todo = error "todo" diff --git a/src/Language/Haskell/Brittany/Internal/PreludeUtils.hs b/src/Language/Haskell/Brittany/Internal/PreludeUtils.hs index 445a0ab..cfaed43 100644 --- a/src/Language/Haskell/Brittany/Internal/PreludeUtils.hs +++ b/src/Language/Haskell/Brittany/Internal/PreludeUtils.hs @@ -1,6 +1,5 @@ {-# OPTIONS_GHC -fno-warn-orphans #-} -module Language.Haskell.Brittany.Internal.PreludeUtils -where +module Language.Haskell.Brittany.Internal.PreludeUtils where diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs b/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs index 4dfbba2..57461ca 100644 --- a/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs +++ b/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs @@ -7,10 +7,7 @@ {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeOperators #-} -module Language.Haskell.Brittany.Internal.Transformations.Alt - ( transformAlts - ) -where +module Language.Haskell.Brittany.Internal.Transformations.Alt where diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Columns.hs b/src/Language/Haskell/Brittany/Internal/Transformations/Columns.hs index 732e6a1..89a2c6f 100644 --- a/src/Language/Haskell/Brittany/Internal/Transformations/Columns.hs +++ b/src/Language/Haskell/Brittany/Internal/Transformations/Columns.hs @@ -1,10 +1,7 @@ {-# LANGUAGE LambdaCase #-} {-# LANGUAGE NoImplicitPrelude #-} -module Language.Haskell.Brittany.Internal.Transformations.Columns - ( transformSimplifyColumns - ) -where +module Language.Haskell.Brittany.Internal.Transformations.Columns where diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Floating.hs b/src/Language/Haskell/Brittany/Internal/Transformations/Floating.hs index 87d551d..0231306 100644 --- a/src/Language/Haskell/Brittany/Internal/Transformations/Floating.hs +++ b/src/Language/Haskell/Brittany/Internal/Transformations/Floating.hs @@ -1,10 +1,7 @@ {-# LANGUAGE LambdaCase #-} {-# LANGUAGE NoImplicitPrelude #-} -module Language.Haskell.Brittany.Internal.Transformations.Floating - ( transformSimplifyFloating - ) -where +module Language.Haskell.Brittany.Internal.Transformations.Floating where diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Indent.hs b/src/Language/Haskell/Brittany/Internal/Transformations/Indent.hs index e39790a..7f7d7e5 100644 --- a/src/Language/Haskell/Brittany/Internal/Transformations/Indent.hs +++ b/src/Language/Haskell/Brittany/Internal/Transformations/Indent.hs @@ -1,10 +1,7 @@ {-# LANGUAGE LambdaCase #-} {-# LANGUAGE NoImplicitPrelude #-} -module Language.Haskell.Brittany.Internal.Transformations.Indent - ( transformSimplifyIndent - ) -where +module Language.Haskell.Brittany.Internal.Transformations.Indent where diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Par.hs b/src/Language/Haskell/Brittany/Internal/Transformations/Par.hs index eb186f4..305ee08 100644 --- a/src/Language/Haskell/Brittany/Internal/Transformations/Par.hs +++ b/src/Language/Haskell/Brittany/Internal/Transformations/Par.hs @@ -1,10 +1,7 @@ {-# LANGUAGE LambdaCase #-} {-# LANGUAGE NoImplicitPrelude #-} -module Language.Haskell.Brittany.Internal.Transformations.Par - ( transformSimplifyPar - ) -where +module Language.Haskell.Brittany.Internal.Transformations.Par where diff --git a/src/Language/Haskell/Brittany/Internal/Types.hs b/src/Language/Haskell/Brittany/Internal/Types.hs index db9e36d..55c3746 100644 --- a/src/Language/Haskell/Brittany/Internal/Types.hs +++ b/src/Language/Haskell/Brittany/Internal/Types.hs @@ -11,8 +11,7 @@ {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE StandaloneDeriving #-} -module Language.Haskell.Brittany.Internal.Types -where +module Language.Haskell.Brittany.Internal.Types where diff --git a/src/Language/Haskell/Brittany/Internal/Utils.hs b/src/Language/Haskell/Brittany/Internal/Utils.hs index a18f874..a12f7ea 100644 --- a/src/Language/Haskell/Brittany/Internal/Utils.hs +++ b/src/Language/Haskell/Brittany/Internal/Utils.hs @@ -5,33 +5,7 @@ {-# LANGUAGE NoImplicitPrelude #-} {-# LANGUAGE ScopedTypeVariables #-} -module Language.Haskell.Brittany.Internal.Utils - ( parDoc - , parDocW - , fromMaybeIdentity - , fromOptionIdentity - , traceIfDumpConf - , mModify - , customLayouterF - , astToDoc - , briDocToDoc - -- , displayBriDocSimpleTree - , annsDoc - , Max (..) - , tellDebugMess - , tellDebugMessShow - , briDocToDocWithAnns - , breakEither - , spanMaybe - , transformUp - , transformDownMay - , FirstLastView(..) - , splitFirstLast - , lines' - , showOutputable - , absurdExt - ) -where +module Language.Haskell.Brittany.Internal.Utils where diff --git a/src/Language/Haskell/Brittany/Main.hs b/src/Language/Haskell/Brittany/Main.hs index e1d482b..7df86d5 100644 --- a/src/Language/Haskell/Brittany/Main.hs +++ b/src/Language/Haskell/Brittany/Main.hs @@ -2,7 +2,7 @@ {-# LANGUAGE MultiWayIf #-} {-# LANGUAGE NoImplicitPrelude #-} -module Language.Haskell.Brittany.Main (main) where +module Language.Haskell.Brittany.Main where -- 2.30.2 From 75cf5b83a3c24309ef4fe4171d8de8b3aeb381ab Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 20:40:31 +0000 Subject: [PATCH 40/74] Remove unused tests --- src-idemtests/.gitignore | 4 - src-idemtests/README | 17 - src-idemtests/brittany.yaml | 29 -- src-idemtests/cases/LayoutBasics.hs | 733 ---------------------------- src-idemtests/run.sh | 36 -- 5 files changed, 819 deletions(-) delete mode 100644 src-idemtests/.gitignore delete mode 100644 src-idemtests/README delete mode 100644 src-idemtests/brittany.yaml delete mode 100644 src-idemtests/cases/LayoutBasics.hs delete mode 100755 src-idemtests/run.sh diff --git a/src-idemtests/.gitignore b/src-idemtests/.gitignore deleted file mode 100644 index 4830bd8..0000000 --- a/src-idemtests/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -iterOne/ -iterTwo/ -brittany -report.txt diff --git a/src-idemtests/README b/src-idemtests/README deleted file mode 100644 index 3560f17..0000000 --- a/src-idemtests/README +++ /dev/null @@ -1,17 +0,0 @@ -idempotency testing on real-life examples, i.e. checks that brittany(x) is -equal to brittany(brittany(x)) for some x's. The idea is that these testcases -are not yet transformed, i.e. that x is not brittany(x). This can capture -certain bugs that are not detected by checking that brittany behaves as -identity on "well-formed" input. - -to run: - -- put a "brittany" executable into this directory. -- cd into this directory. -- ./run.sh - -report.txt will contain the results. - -note that only the configuration in brittany.yaml is tested, which contains -the default settings. ideally this would be managed in some other, more -transparent fashion. diff --git a/src-idemtests/brittany.yaml b/src-idemtests/brittany.yaml deleted file mode 100644 index 6e5dcfb..0000000 --- a/src-idemtests/brittany.yaml +++ /dev/null @@ -1,29 +0,0 @@ -conf_errorHandling: - econf_Werror: false - econf_produceOutputOnErrors: false - econf_CPPMode: CPPModeNowarn -conf_layout: - lconfig_indentPolicy: IndentPolicyFree - lconfig_cols: 80 - lconfig_indentAmount: 2 - lconfig_importColumn: 60 - lconfig_altChooser: - tag: AltChooserBoundedSearch - contents: 3 - lconfig_indentWhereSpecial: true - lconfig_indentListSpecial: true -conf_forward: - options_ghc: [] -conf_debug: - dconf_dump_annotations: false - dconf_dump_bridoc_simpl_par: false - dconf_dump_bridoc_simpl_indent: false - dconf_dump_bridoc_simpl_floating: false - dconf_dump_ast_full: false - dconf_dump_bridoc_simpl_columns: false - dconf_dump_ast_unknown: false - dconf_dump_bridoc_simpl_alt: false - dconf_dump_bridoc_final: false - dconf_dump_bridoc_raw: false - dconf_dump_config: false - diff --git a/src-idemtests/cases/LayoutBasics.hs b/src-idemtests/cases/LayoutBasics.hs deleted file mode 100644 index d1331a5..0000000 --- a/src-idemtests/cases/LayoutBasics.hs +++ /dev/null @@ -1,733 +0,0 @@ -module Language.Haskell.Brittany.Internal.LayoutBasics - ( processDefault - , layoutByExact - -- , layoutByExactR - , descToBlockStart - , descToBlockMinMax - , descToMinMax - , rdrNameToText - , lrdrNameToText - , lrdrNameToTextAnn - , askIndent - , calcLayoutMin - , calcLayoutMax - , getCurRemaining - , layoutWriteAppend - , layoutWriteAppendMultiline - , layoutWriteNewline - , layoutWriteNewlinePlain - , layoutWriteEnsureNewline - , layoutWriteEnsureBlock - , layoutWriteEnsureBlockPlusN - , layoutWithAddIndent - , layoutWithAddIndentBlock - , layoutWithAddIndentN - , layoutWithAddIndentNBlock - , layoutWithNonParamIndent - , layoutWriteEnsureAbsoluteN - , layoutAddSepSpace - , moveToExactAnn - , moveToExactAnn' - , setOpIndent - , stringLayouter - , layoutWritePriorComments - , layoutWritePostComments - , layoutIndentRestorePostComment - , layoutWritePriorCommentsRestore - , layoutWritePostCommentsRestore - , extractCommentsPrior - , extractCommentsPost - , applyLayouter - , applyLayouterRestore - , filterAnns - , layouterFToLayouterM - , ppmMoveToExactLoc - , customLayouterF - , docEmpty - , docLit - , docAlt - , docSeq - , docPar - -- , docCols - , docPostComment - , docWrapNode - , briDocByExact - , fromMaybeIdentity - , foldedAnnKeys - ) -where - - - --- more imports here.. - -import qualified Language.Haskell.GHC.ExactPrint as ExactPrint -import qualified Language.Haskell.GHC.ExactPrint.Annotate as ExactPrint.Annotate -import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types -import qualified Language.Haskell.GHC.ExactPrint.Utils as ExactPrint.Utils - -import Language.Haskell.GHC.ExactPrint.Types ( AnnKey, Annotation ) - -import qualified Data.Text.Lazy.Builder as Text.Builder - -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.Utils - -import RdrName ( RdrName(..) ) -import GHC ( runGhc, GenLocated(L), moduleNameString ) -import qualified Outputable as GHC -import qualified DynFlags as GHC -import qualified FastString as GHC -import qualified SrcLoc as GHC -import SrcLoc ( SrcSpan ) -import OccName ( occNameString ) -import Name ( getOccString ) -import Module ( moduleName ) -import ApiAnnotation ( AnnKeywordId(..) ) - -import Data.Data -import Data.Generics.Schemes -import Data.Generics.Aliases - -import DataTreePrint - -import qualified Text.PrettyPrint as PP - -import Data.Function ( fix ) - - - -processDefault :: (ExactPrint.Annotate.Annotate ast, MonadMultiWriter - Text.Builder.Builder m, - MonadMultiReader ExactPrint.Types.Anns m) - => GenLocated SrcSpan ast - -> m () -processDefault x = do - anns <- mAsk - let str = ExactPrint.exactPrint x anns - -- this hack is here so our print-empty-module trick does not add - -- a newline at the start if there actually is no module header / imports - -- / anything. - -- TODO: instead the appropriate annotation could be removed when "cleaning" - -- the module (header). This would remove the need for this hack! - --test - case str of - "\n" -> return () - _ -> mTell $ Text.Builder.fromString $ str - - -layoutByExact :: ( MonadMultiReader Config m - , MonadMultiReader (ExactPrint.Types.Anns) m - , ExactPrint.Annotate.Annotate ast - ) - => GenLocated SrcSpan ast -> m Layouter -layoutByExact x = do - anns <- mAsk - trace (showTreeWithCustom (customLayouterF anns) x) $ layoutByExactR x - -- trace (ExactPrint.Utils.showAnnData anns 2 x) $ layoutByExactR x - -layoutByExactR :: (MonadMultiReader Config m - , MonadMultiReader (ExactPrint.Types.Anns) m - , ExactPrint.Annotate.Annotate ast) - => GenLocated SrcSpan ast -> m Layouter -layoutByExactR x = do - indent <- askIndent - anns <- mAsk - let t = Text.pack $ ExactPrint.exactPrint x anns - let tlines = Text.lines $ t <> Text.pack "\n" - tlineCount = length tlines - let len = indent + maximum (Text.length <$> tlines) - return $ Layouter - { _layouter_desc = LayoutDesc Nothing $ Just $ BlockDesc AllSameIndent len len Nothing - , _layouter_func = \_ -> do - -- layoutWriteEnsureBlock - layoutWriteAppend $ Text.pack $ "{-" ++ show (ExactPrint.Types.mkAnnKey x, Map.lookup (ExactPrint.Types.mkAnnKey x) anns) ++ "-}" - zip [1..] tlines `forM_` \(i, l) -> do - layoutWriteAppend $ l - unless (i==tlineCount) layoutWriteNewline - do - let subKeys = foldedAnnKeys x - state <- mGet - let filterF k _ = not $ k `Set.member` subKeys - mSet $ state - { _lstate_commentsPrior = Map.filterWithKey filterF - $ _lstate_commentsPrior state - , _lstate_commentsPost = Map.filterWithKey filterF - $ _lstate_commentsPost state - } - , _layouter_ast = x - } - -briDocByExact :: (ExactPrint.Annotate.Annotate ast, - MonadMultiReader Config m, - MonadMultiReader ExactPrint.Types.Anns m - ) => GenLocated SrcSpan ast -> m BriDoc -briDocByExact ast = do - anns <- mAsk - traceIfDumpConf "ast" _dconf_dump_ast_unknown - (printTreeWithCustom 100 (customLayouterF anns) ast) - return $ docExt ast anns - -descToBlockStart :: LayoutDesc -> Maybe BlockStart -descToBlockStart (LayoutDesc _ (Just (BlockDesc bs _ _ _))) = Just bs -descToBlockStart (LayoutDesc (Just line) _) = Just $ RestOfLine line -descToBlockStart _ = Nothing - -descToBlockMinMax :: LayoutDesc -> Maybe (Int, Int) -descToBlockMinMax (LayoutDesc _ (Just (BlockDesc _ bmin bmax _))) = Just (bmin, bmax) -descToBlockMinMax _ = Nothing - -descToMinMax :: Int -> LayoutDesc -> Maybe (Int, Int) -descToMinMax p (LayoutDesc _ (Just (BlockDesc start bmin bmax _))) = - Just (max rolMin bmin, max rolMin bmax) - where - rolMin = case start of - RestOfLine rol -> p + _lColumns_min rol - AllSameIndent -> 0 - -descToMinMax p (LayoutDesc (Just (LayoutColumns _ _ lmin)) _) = - Just (len, len) - where - len = p + lmin -descToMinMax _ _ = - Nothing - -rdrNameToText :: RdrName -> Text --- rdrNameToText = Text.pack . show . flip runSDoc unsafeGlobalDynFlags . ppr -rdrNameToText ( Unqual occname ) = Text.pack $ occNameString occname -rdrNameToText ( Qual mname occname ) = Text.pack $ moduleNameString mname - ++ "." - ++ occNameString occname -rdrNameToText ( Orig modul occname ) = Text.pack $ moduleNameString (moduleName modul) - ++ occNameString occname -rdrNameToText ( Exact name ) = Text.pack $ getOccString name - -lrdrNameToText :: GenLocated l RdrName -> Text -lrdrNameToText (L _ n) = rdrNameToText n - -lrdrNameToTextAnn :: ( MonadMultiReader Config m - , MonadMultiReader (Map AnnKey Annotation) m - ) - => GenLocated SrcSpan RdrName - -> m Text -lrdrNameToTextAnn ast@(L _ n) = do - anns <- mAsk - let t = rdrNameToText n - let hasUni x (ExactPrint.Types.G y, _) = x==y - hasUni _ _ = False - -- TODO: in general: we should _always_ process all annotaiton stuff here. - -- whatever we don't probably should have had some effect on the - -- output. in such cases, resorting to byExact is probably the safe - -- choice. - return $ case Map.lookup (ExactPrint.Types.mkAnnKey ast) anns of - Nothing -> traceShow "Nothing" t - Just (ExactPrint.Types.Ann _ _ _ aks _ _) -> if - | any (hasUni AnnBackquote) aks -> Text.pack "`" <> t <> Text.pack "`" - | any (hasUni AnnOpenP) aks -> Text.pack "(" <> t <> Text.pack ")" - | otherwise -> t - - -askIndent :: (MonadMultiReader Config m) => m Int -askIndent = runIdentity . _lconfig_indentAmount . _conf_layout <$> mAsk - --- minimum block width, judged from block info or line, whichever is --- available. --- example: calcLayoutMin doBlock ~~~ atomically $ do --- foo --- ## indent --- ############# linepre --- ############### result (in this case) -calcLayoutMin :: Int -- basic indentation amount - -> Int -- currently used width in current line (after indent) - -- used to accurately calc placing of the current-line - -- stuff ("do" in the above example) and its width. - -> LayoutDesc - -> Int -calcLayoutMin indent linePre (LayoutDesc line block) = case (line, block) of - (_, Just (BlockDesc AllSameIndent m _ _)) -> indent + m - (_, Just (BlockDesc (RestOfLine inl) m _ _)) -> max (linePre + _lColumns_min inl) (indent + m) - (Just s, _) -> indent + _lColumns_min s - _ -> error "bad LayoutDesc mnasdoiucxvlkjasd" - --- see -calcLayoutMax :: Int -- basic indentation amount - -> Int -- currently used width in current line (after indent) - -- used to accurately calc placing of the current-line - -- stuff ("do" in the above example) and its width. - -> LayoutDesc - -> Int -calcLayoutMax indent linePre (LayoutDesc line block) = case (line, block) of - (Just s, _) -> linePre + _lColumns_min s - (_, Just (BlockDesc AllSameIndent _ m _)) -> indent + m - (_, Just (BlockDesc (RestOfLine inl) _ m _)) -> max (linePre + _lColumns_min inl) (indent + m) - _ -> error "bad LayoutDesc msdnfgouvadnfoiu" - -getCurRemaining :: ( MonadMultiReader Config m - , MonadMultiState LayoutState m - ) - => m Int -getCurRemaining = do - cols <- mAsk <&> _conf_layout .> _lconfig_cols .> runIdentity - clc <- _lstate_curLineCols <$> mGet - return $ cols - clc - -layoutWriteAppend :: (MonadMultiWriter - Text.Builder.Builder m, - MonadMultiState LayoutState m) - => Text - -> m () -layoutWriteAppend t = do - state <- mGet - if _lstate_addSepSpace state - then do - mSet $ state { _lstate_curLineCols = _lstate_curLineCols state + Text.length t + 1 - , _lstate_addSepSpace = False - } - mTell $ Text.Builder.fromText $ Text.pack " " <> t - else do - mSet $ state { _lstate_curLineCols = _lstate_curLineCols state + Text.length t } - mTell $ Text.Builder.fromText t - -layoutWriteAppendMultiline :: (MonadMultiWriter - Text.Builder.Builder m, - MonadMultiState LayoutState m) - => Text - -> m () -layoutWriteAppendMultiline t = case Text.lines t of - [] -> return () - (l:lr) -> do - layoutWriteAppend l - lr `forM_` \x -> do - layoutWriteNewlinePlain - layoutWriteAppend x - --- adds a newline and adds spaces to reach the current indentation level. --- TODO: rename newline -> newlineBlock and newlinePlain -> newline -layoutWriteNewline :: (MonadMultiWriter - Text.Builder.Builder m, - MonadMultiState LayoutState m) - => m () -layoutWriteNewline = do - state <- mGet - mSet $ state { _lstate_curLineCols = _lstate_indent state - , _lstate_commentCol = Nothing - , _lstate_addSepSpace = False - } - mTell $ Text.Builder.fromString $ "\n" ++ replicate (_lstate_indent state) ' ' - --- | does _not_ add spaces to again reach the current indentation levels. -layoutWriteNewlinePlain :: (MonadMultiWriter - Text.Builder.Builder m, - MonadMultiState LayoutState m) - => m () -layoutWriteNewlinePlain = do - state <- mGet - mSet $ state { _lstate_curLineCols = 0 - , _lstate_commentCol = Nothing - , _lstate_addSepSpace = False - } - mTell $ Text.Builder.fromString $ "\n" - -layoutWriteEnsureNewline :: (MonadMultiWriter - Text.Builder.Builder m, - MonadMultiState LayoutState m) - => m () -layoutWriteEnsureNewline = do - state <- mGet - when (_lstate_curLineCols state /= _lstate_indent state) - $ layoutWriteNewline - -layoutWriteEnsureBlock :: (MonadMultiWriter - Text.Builder.Builder m, - MonadMultiState LayoutState m) - => m () -layoutWriteEnsureBlock = do - state <- mGet - let diff = _lstate_curLineCols state - _lstate_indent state - if diff>0 - then layoutWriteNewline - else if diff<0 - then do - layoutWriteAppend $ Text.pack $ replicate (negate diff) ' ' - mSet $ state { _lstate_curLineCols = _lstate_indent state - , _lstate_addSepSpace = False - } - else return () - -layoutWriteEnsureAbsoluteN :: (MonadMultiWriter - Text.Builder.Builder m, - MonadMultiState LayoutState m) - => Int -> m () -layoutWriteEnsureAbsoluteN n = do - state <- mGet - let diff = n - _lstate_curLineCols state - if diff>0 - then do - layoutWriteAppend $ Text.pack $ replicate diff ' ' - mSet $ state { _lstate_curLineCols = n - , _lstate_addSepSpace = False - } - else return () - -layoutWriteEnsureBlockPlusN :: (MonadMultiWriter - Text.Builder.Builder m, - MonadMultiState LayoutState m) - => Int -> m () -layoutWriteEnsureBlockPlusN n = do - state <- mGet - let diff = _lstate_curLineCols state - _lstate_indent state - n - if diff>0 - then layoutWriteNewline - else if diff<0 - then do - layoutWriteAppend $ Text.pack $ replicate (negate diff) ' ' - mSet $ state { _lstate_addSepSpace = False } - else return () - -layoutWithAddIndent :: (MonadMultiWriter - Text.Builder.Builder m, - MonadMultiState LayoutState m - ,MonadMultiReader Config m) - => m () - -> m () -layoutWithAddIndent m = do - amount <- mAsk <&> _conf_layout .> _lconfig_indentAmount .> runIdentity - state <- mGet - mSet state { _lstate_indent = _lstate_indent state + amount } - m - do - s <- mGet - mSet $ s { _lstate_indent = _lstate_indent state } - -layoutWithAddIndentBlock :: (MonadMultiWriter - Text.Builder.Builder m, - MonadMultiState LayoutState m - ,MonadMultiReader Config m) - => m () - -> m () -layoutWithAddIndentBlock m = do - amount <- mAsk <&> _conf_layout .> _lconfig_indentAmount .> runIdentity - state <- mGet - mSet state { _lstate_indent = _lstate_indent state + amount } - layoutWriteEnsureBlock - m - do - s <- mGet - mSet $ s { _lstate_indent = _lstate_indent state } - -layoutWithAddIndentNBlock :: (MonadMultiWriter - Text.Builder.Builder m, - MonadMultiState LayoutState m) - => Int - -> m () - -> m () -layoutWithAddIndentNBlock amount m = do - state <- mGet - mSet state { _lstate_indent = _lstate_indent state + amount } - layoutWriteEnsureBlock - m - do - s <- mGet - mSet $ s { _lstate_indent = _lstate_indent state } - -layoutWithAddIndentN :: (MonadMultiWriter - Text.Builder.Builder m, - MonadMultiState LayoutState m) - => Int - -> m () - -> m () -layoutWithAddIndentN amount m = do - state <- mGet - mSet state { _lstate_indent = _lstate_indent state + amount } - m - do - s <- mGet - mSet $ s { _lstate_indent = _lstate_indent state } - -layoutAddSepSpace :: MonadMultiState LayoutState m => m () -layoutAddSepSpace = do - state <- mGet - mSet $ state { _lstate_addSepSpace = True } - -moveToExactAnn :: (Data.Data.Data x, - MonadMultiWriter Text.Builder.Builder m, - MonadMultiState LayoutState m, - MonadMultiReader (Map AnnKey Annotation) m) => GenLocated SrcSpan x -> m () -moveToExactAnn ast = do - anns <- mAsk - case Map.lookup (ExactPrint.Types.mkAnnKey ast) anns of - Nothing -> return () - Just ann -> do - let ExactPrint.Types.DP (x, _y) = ExactPrint.Types.annEntryDelta ann - replicateM_ x $ layoutWriteNewline - --- TODO: when refactoring is complete, the other version of this method --- can probably be removed. -moveToExactAnn' :: (MonadMultiWriter Text.Builder.Builder m, - MonadMultiState LayoutState m, - MonadMultiReader (Map AnnKey Annotation) m) => AnnKey -> m () -moveToExactAnn' annKey = do - anns <- mAsk - case Map.lookup annKey anns of - Nothing -> return () - Just ann -> do - -- curY <- mGet <&> _lstate_curLineCols - let ExactPrint.Types.DP (x, _y) = ExactPrint.Types.annEntryDelta ann - replicateM_ x $ layoutWriteNewline - -- when (x/=0) $ do - -- replicateM_ x $ layoutWriteNewlinePlain - -- mModify $ \s -> s { _lstate_curLineCols = curY } - -- mTell $ Text.Builder.fromString $ replicate curY ' ' - -ppmMoveToExactLoc :: MonadMultiWriter Text.Builder.Builder m - => ExactPrint.Types.DeltaPos - -> m () -ppmMoveToExactLoc (ExactPrint.Types.DP (x,y)) = do - replicateM_ x $ mTell $ Text.Builder.fromString "\n" - replicateM_ y $ mTell $ Text.Builder.fromString " " - -layoutWithNonParamIndent :: (MonadMultiWriter - Text.Builder.Builder m, - MonadMultiState LayoutState m) - => LayoutFuncParams -> m () -> m () -layoutWithNonParamIndent params m = do - case _params_opIndent params of - Nothing -> m - Just x -> layoutWithAddIndentN x m - -setOpIndent :: Int -> LayoutDesc -> LayoutFuncParams -> LayoutFuncParams -setOpIndent i desc p = p - { _params_opIndent = Just $ case _bdesc_opIndentFloatUp =<< _ldesc_block desc of - Nothing -> i - Just j -> max i j - } - -stringLayouter :: Data.Data.Data ast - => GenLocated SrcSpan ast -> Text -> Layouter -stringLayouter ast t = Layouter - { _layouter_desc = LayoutDesc - { _ldesc_line = Just $ LayoutColumns - { _lColumns_key = ColumnKeyUnique - , _lColumns_lengths = [Text.length t] - , _lColumns_min = Text.length t - } - , _ldesc_block = Nothing - } - , _layouter_func = \_ -> do - layoutWritePriorCommentsRestore ast - layoutWriteAppend t - layoutWritePostComments ast - , _layouter_ast = ast - } - -layoutWritePriorComments :: (Data.Data.Data ast, - MonadMultiWriter Text.Builder.Builder m, - MonadMultiState LayoutState m) - => GenLocated SrcSpan ast -> m () -layoutWritePriorComments ast = do - mAnn <- do - state <- mGet - let key = ExactPrint.Types.mkAnnKey ast - let m = _lstate_commentsPrior state - let mAnn = Map.lookup key m - mSet $ state { _lstate_commentsPrior = Map.delete key m } - return mAnn - case mAnn of - Nothing -> return () - Just priors -> do - when (not $ null priors) $ do - state <- mGet - mSet $ state { _lstate_commentCol = Just $ _lstate_curLineCols state } - priors `forM_` \( ExactPrint.Types.Comment comment _ _ - , ExactPrint.Types.DP (x, y) - ) -> do - replicateM_ x layoutWriteNewlinePlain - layoutWriteAppend $ Text.pack $ replicate y ' ' - layoutWriteAppendMultiline $ Text.pack $ comment - --- this currently only extracs from the `annsDP` field of Annotations. --- per documentation, this seems sufficient, as the --- "..`annFollowingComments` are only added by AST transformations ..". -layoutWritePostComments :: (Data.Data.Data ast, - MonadMultiWriter Text.Builder.Builder m, - MonadMultiState LayoutState m) - => GenLocated SrcSpan ast -> m () -layoutWritePostComments ast = do - mAnn <- do - state <- mGet - let key = ExactPrint.Types.mkAnnKey ast - let m = _lstate_commentsPost state - let mAnn = Map.lookup key m - mSet $ state { _lstate_commentsPost = Map.delete key m } - return mAnn - case mAnn of - Nothing -> return () - Just posts -> do - when (not $ null posts) $ do - state <- mGet - mSet $ state { _lstate_commentCol = Just $ _lstate_curLineCols state } - posts `forM_` \( ExactPrint.Types.Comment comment _ _ - , ExactPrint.Types.DP (x, y) - ) -> do - replicateM_ x layoutWriteNewlinePlain - layoutWriteAppend $ Text.pack $ replicate y ' ' - layoutWriteAppendMultiline $ Text.pack $ comment - -layoutIndentRestorePostComment :: ( Monad m - , MonadMultiState LayoutState m - , MonadMultiWriter Text.Builder.Builder m - ) - => m () -layoutIndentRestorePostComment = do - mCommentCol <- _lstate_commentCol <$> mGet - case mCommentCol of - Nothing -> return () - Just commentCol -> do - layoutWriteNewlinePlain - layoutWriteAppend $ Text.pack $ replicate commentCol ' ' - -layoutWritePriorCommentsRestore :: (Data.Data.Data ast, - MonadMultiWriter Text.Builder.Builder m, - MonadMultiState LayoutState m) - => GenLocated SrcSpan ast -> m () -layoutWritePriorCommentsRestore x = do - layoutWritePriorComments x - layoutIndentRestorePostComment - -layoutWritePostCommentsRestore :: (Data.Data.Data ast, - MonadMultiWriter Text.Builder.Builder m, - MonadMultiState LayoutState m) - => GenLocated SrcSpan ast -> m () -layoutWritePostCommentsRestore x = do - layoutWritePostComments x - layoutIndentRestorePostComment - -extractCommentsPrior :: ExactPrint.Types.Anns -> PriorMap -extractCommentsPrior anns = flip Map.mapMaybe anns $ \ann -> - [r | let r = ExactPrint.Types.annPriorComments ann, not (null r)] -extractCommentsPost :: ExactPrint.Types.Anns -> PostMap -extractCommentsPost anns = flip Map.mapMaybe anns $ \ann -> - [r - | let - r = ExactPrint.Types.annsDP ann - >>= \case - (ExactPrint.Types.AnnComment comment, dp) -> [(comment, dp)] - _ -> [] - , not (null r) - ] - - -applyLayouter :: Layouter -> LayoutFuncParams -> LayoutM () -applyLayouter l@(Layouter _ _ ast) params = do - -- (always) write the prior comments at this point. - layoutWritePriorCommentsRestore ast - -- run the real stuff. - _layouter_func l params - -- if the _layouter_func has not done so already at some point - -- (there are nodes for which this makes sense), - -- write the post comments. - -- effect is `return ()` if there are no postComments. - layoutWritePostComments ast - -applyLayouterRestore :: Layouter -> LayoutFuncParams -> LayoutM () -applyLayouterRestore l@(Layouter _ _ ast) params = do - -- (always) write the prior comments at this point. - layoutWritePriorCommentsRestore ast - -- run the real stuff. - _layouter_func l params - -- if the _layouter_func has not done so already at some point - -- (there are nodes for which this makes sense), - -- write the post comments. - -- effect is `return ()` if there are no postComments. - layoutWritePostCommentsRestore ast - -foldedAnnKeys :: Data.Data.Data ast - => ast - -> Set ExactPrint.Types.AnnKey -foldedAnnKeys ast = everything - Set.union - (\x -> maybe - Set.empty - Set.singleton - [ gmapQi 1 (\t -> ExactPrint.Types.mkAnnKey $ L l t) x - | typeRepTyCon (typeOf (L () ())) == (typeRepTyCon (typeOf x)) - , l <- gmapQi 0 cast x - ] - ) - ast - -filterAnns :: Data.Data.Data ast - => ast - -> ExactPrint.Types.Anns - -> ExactPrint.Types.Anns -filterAnns ast anns = - Map.filterWithKey (\k _ -> k `Set.member` foldedAnnKeys ast) anns - -layouterFToLayouterM :: MultiReader '[Config, ExactPrint.Types.Anns] a -> LayoutM a -layouterFToLayouterM m = do - settings <- mAsk - anns <- mAsk - return $ runIdentity - $ runMultiReaderTNil - $ Control.Monad.Trans.MultiReader.Lazy.withMultiReader anns - $ Control.Monad.Trans.MultiReader.Lazy.withMultiReader settings - $ m - --- new BriDoc stuff - -docEmpty :: BriDoc -docEmpty = BDEmpty - -docLit :: Text -> BriDoc -docLit t = BDLit t - -docExt :: ExactPrint.Annotate.Annotate ast - => GenLocated SrcSpan ast -> ExactPrint.Types.Anns -> BriDoc -docExt x anns = BDExternal - (ExactPrint.Types.mkAnnKey x) - (foldedAnnKeys x) - (Text.pack $ ExactPrint.exactPrint x anns) - -docAlt :: [BriDoc] -> BriDoc -docAlt = BDAlt - - -docSeq :: [BriDoc] -> BriDoc -docSeq = BDSeq - - -docPostComment :: Data.Data.Data ast - => GenLocated SrcSpan ast - -> BriDoc - -> BriDoc -docPostComment ast bd = BDAnnotationPost (ExactPrint.Types.mkAnnKey ast) bd - -docWrapNode :: Data.Data.Data ast - => GenLocated SrcSpan ast - -> BriDoc - -> BriDoc -docWrapNode ast bd = BDAnnotationPrior (ExactPrint.Types.mkAnnKey ast) - $ BDAnnotationPost (ExactPrint.Types.mkAnnKey ast) - $ bd - -docPar :: BriDoc - -> BriDoc - -> BriDoc -docPar line indented = BDPar BrIndentNone line indented - --- docPar :: BriDoc --- -> BrIndent --- -> [BriDoc] --- -> BriDoc --- docPar = BDPar - --- docCols :: ColSig --- -> [BriDoc] --- -> BriDoc --- docCols = BDCols - - -fromMaybeIdentity :: Identity a -> Maybe a -> Identity a -fromMaybeIdentity x y = Data.Coerce.coerce - $ fromMaybe (Data.Coerce.coerce x) y diff --git a/src-idemtests/run.sh b/src-idemtests/run.sh deleted file mode 100755 index 298ecef..0000000 --- a/src-idemtests/run.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/bash - -# set -x -set -e - -rm report.txt &> /dev/null || true - -mkdir iterOne &> /dev/null || true -mkdir iterTwo &> /dev/null || true - -for FILE in ./cases/* -do - NAME=$(basename "$FILE") - ITERNAMEONE="./iterOne/$NAME" - ITERNAMETWO="./iterTwo/$NAME" - if ! ./brittany -i "$FILE" -o "$ITERNAMEONE" - then - echo "FAILED step 1 for $FILE" | tee -a report.txt - continue - fi - if ! ./brittany -i "$ITERNAMEONE" -o "$ITERNAMETWO" - then - echo "FAILED step 2 for $FILE" | tee -a report.txt - continue - fi - if ! diff "$ITERNAMEONE" "$ITERNAMETWO" > diff.temp - then - echo "FAILED diff for $FILE with diff:" | tee -a report.txt - cat diff.temp | tee -a report.txt - echo "# meld $(realpath $ITERNAMEONE) $(realpath $ITERNAMETWO)" | tee -a report.txt - continue - fi - echo "success for $FILE" | tee -a report.txt -done - -rm diff.temp &> /dev/null || true -- 2.30.2 From 392e5b7569f692f1cb98980b29aadaee0338c6c9 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 21:05:10 +0000 Subject: [PATCH 41/74] Fix many HLint warnings --- .hlint.yaml | 50 +------ src-literatetests/Main.hs | 4 +- src/Language/Haskell/Brittany/Internal.hs | 18 +-- .../Haskell/Brittany/Internal/Backend.hs | 31 ++-- .../Haskell/Brittany/Internal/BackendUtils.hs | 8 +- .../Brittany/Internal/ExactPrintUtils.hs | 18 +-- .../Brittany/Internal/LayouterBasics.hs | 3 +- .../Brittany/Internal/Layouters/DataDecl.hs | 10 +- .../Brittany/Internal/Layouters/Decl.hs | 8 +- .../Brittany/Internal/Layouters/Expr.hs | 2 +- .../Haskell/Brittany/Internal/Layouters/IE.hs | 8 +- .../Brittany/Internal/Layouters/Type.hs | 2 +- .../Haskell/Brittany/Internal/Prelude.hs | 137 ++++++++---------- .../Brittany/Internal/Transformations/Alt.hs | 12 +- .../Haskell/Brittany/Internal/Types.hs | 7 +- src/Language/Haskell/Brittany/Main.hs | 16 +- 16 files changed, 134 insertions(+), 200 deletions(-) diff --git a/.hlint.yaml b/.hlint.yaml index 026d8f1..191512f 100644 --- a/.hlint.yaml +++ b/.hlint.yaml @@ -5,56 +5,12 @@ # This file contains a template configuration file, which is typically # placed as .hlint.yaml in the root of your project -# Specify additional command line arguments - -- arguments: - [ "--cross" - , "--threads=0" - ] - -- ignore: {name: "Use camelCase"} -- ignore: {name: "Redundant as"} -- ignore: {name: "Redundant do"} -- ignore: {name: "Redundant return"} -- ignore: {name: "Redundant guard", whithin: "lrdrNameToTextAnn"} - - ignore: { name: 'Use :' } -- ignore: { name: Avoid lambda } - ignore: { name: Eta reduce } - ignore: { name: Move brackets to avoid $ } -- ignore: { name: Redundant <$> } - ignore: { name: Redundant $ } -- ignore: { name: Redundant bang pattern } - ignore: { name: Redundant bracket } -- ignore: { name: Redundant flip } -- ignore: { name: Redundant id } -- ignore: { name: Redundant if } -- ignore: { name: Redundant lambda } -- ignore: { name: Replace case with fromMaybe } -- ignore: { name: Use <=< } -- ignore: { name: Use <$> } -- ignore: { name: Use all } -- ignore: { name: Use and } -- ignore: { name: Use any } -- ignore: { name: Use concatMap } -- ignore: { name: Use const } -- ignore: { name: Use elem } -- ignore: { name: Use elemIndex } -- ignore: { name: Use fewer imports } -- ignore: { name: Use first } -- ignore: { name: Use fromLeft } -- ignore: { name: Use getContents } -- ignore: { name: Use if } -- ignore: { name: Use isNothing } -- ignore: { name: Use lambda-case } -- ignore: { name: Use mapM } -- ignore: { name: Use minimumBy } - ignore: { name: Use newtype instead of data } -- ignore: { name: Use record patterns } -- ignore: { name: Use second } -- ignore: { name: Use section } -- ignore: { name: Use sortOn } -- ignore: { name: Use sqrt } -- ignore: { name: Use tuple-section } -- ignore: { name: Use unless } -- ignore: { name: Use when } +- ignore: {name: "Redundant do"} +- ignore: {name: "Redundant return"} +- ignore: {name: "Use camelCase"} diff --git a/src-literatetests/Main.hs b/src-literatetests/Main.hs index 5949a55..a1dc2af 100644 --- a/src-literatetests/Main.hs +++ b/src-literatetests/Main.hs @@ -94,8 +94,8 @@ main = do fmap groupProcessor $ groupBy grouperG $ filter (not . lineIsSpace) - $ fmap lineMapper - $ Text.lines input + $ lineMapper + <$> Text.lines input where groupProcessor :: [InputLine] -> (Text, [TestCase]) groupProcessor = \case diff --git a/src/Language/Haskell/Brittany/Internal.hs b/src/Language/Haskell/Brittany/Internal.hs index 41ac6b1..71e885b 100644 --- a/src/Language/Haskell/Brittany/Internal.hs +++ b/src/Language/Haskell/Brittany/Internal.hs @@ -60,7 +60,7 @@ import Language.Haskell.Brittany.Internal.Transformations.Par import Language.Haskell.Brittany.Internal.Transformations.Columns import Language.Haskell.Brittany.Internal.Transformations.Indent -import qualified GHC as GHC +import qualified GHC hiding ( parseModule ) import GHC.Parser.Annotation ( AnnKeywordId(..) ) import GHC ( GenLocated(L) @@ -130,7 +130,7 @@ extractCommentConfigs anns (TopLevelDeclNameMap declNameMap) = do , \s -> "{" `isPrefixOf` dropWhile (== ' ') s , Butcher.addCmdPart (Butcher.varPartDesc "yaml-config-document") $ fmap (\lconf -> (mempty { _conf_layout = lconf }, "")) - . either (\_ -> Nothing) Just + . either (const Nothing) Just . Data.Yaml.decodeEither' . Data.ByteString.Char8.pack -- TODO: use some proper utf8 encoder instead? @@ -299,7 +299,7 @@ parsePrintModule configWithDebugs inputText = runExceptT $ do pure $ if hackAroundIncludes then ( ews - , TextL.intercalate (TextL.pack "\n") $ fmap hackF $ TextL.splitOn + , TextL.intercalate (TextL.pack "\n") $ hackF <$> TextL.splitOn (TextL.pack "\n") outRaw ) @@ -311,11 +311,9 @@ parsePrintModule configWithDebugs inputText = runExceptT $ do customErrOrder ErrorUnknownNode{} = 3 customErrOrder ErrorMacroConfig{} = 5 let hasErrors = - case - moduleConfig & _conf_errorHandling & _econf_Werror & confUnpack - of - False -> 0 < maximum (-1 : fmap customErrOrder errsWarns) - True -> not $ null errsWarns + if moduleConfig & _conf_errorHandling & _econf_Werror & confUnpack + then not $ null errsWarns + else 0 < maximum (-1 : fmap customErrOrder errsWarns) if hasErrors then throwE $ errsWarns else pure $ TextL.toStrict outputTextL @@ -402,7 +400,7 @@ parsePrintModuleTests conf filename input = do then return $ pPrintModule moduleConf perItemConf anns parsedModule else lift $ pPrintModuleAndCheck moduleConf perItemConf anns parsedModule - if null $ filter (not . isErrorUnusedComment) errs + if all isErrorUnusedComment errs then pure $ TextL.toStrict $ ltext else let @@ -533,7 +531,7 @@ getDeclBindingNames (L _ decl) = case decl of ppPreamble :: GenLocated SrcSpan HsModule -> PPM [(ExactPrint.KeywordId, ExactPrint.DeltaPos)] -ppPreamble lmod@(L loc m@(HsModule _ _ _ _ _ _ _)) = do +ppPreamble lmod@(L loc m@HsModule{}) = do filteredAnns <- mAsk <&> \annMap -> Map.findWithDefault Map.empty (ExactPrint.mkAnnKey lmod) annMap -- Since ghc-exactprint adds annotations following (implicit) diff --git a/src/Language/Haskell/Brittany/Internal/Backend.hs b/src/Language/Haskell/Brittany/Internal/Backend.hs index b8241bf..142fe2f 100644 --- a/src/Language/Haskell/Brittany/Internal/Backend.hs +++ b/src/Language/Haskell/Brittany/Internal/Backend.hs @@ -11,10 +11,12 @@ module Language.Haskell.Brittany.Internal.Backend where import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Control.Monad.Trans.State.Strict as StateS +import qualified Data.Either as Either import qualified Data.Foldable as Foldable import qualified Data.IntMap.Lazy as IntMapL import qualified Data.IntMap.Strict as IntMapS import qualified Data.Map as Map +import qualified Data.Maybe as Maybe import qualified Data.Semigroup as Semigroup import qualified Data.Sequence as Seq import qualified Data.Set as Set @@ -171,7 +173,7 @@ layoutBriDocM = \case -- layoutResetSepSpace priors `forM_` \(ExactPrint.Types.Comment comment _ _, ExactPrint.Types.DP (y, x)) -> - when (not $ comment == "(" || comment == ")") $ do + when (comment /= "(" && comment /= ")") $ do let commentLines = Text.lines $ Text.pack $ comment case comment of ('#':_) -> layoutMoveToCommentPos y (-999) (length commentLines) @@ -191,7 +193,7 @@ layoutBriDocM = \case let m = _lstate_comments state let mAnn = ExactPrint.annsDP <$> Map.lookup annKey m let mToSpan = case mAnn of - Just anns | keyword == Nothing -> Just anns + Just anns | Maybe.isNothing keyword -> Just anns Just ((ExactPrint.Types.G kw1, _):annR) | keyword == Just kw1 -> Just annR _ -> Nothing @@ -212,7 +214,7 @@ layoutBriDocM = \case Nothing -> pure () Just comments -> do comments `forM_` \(ExactPrint.Types.Comment comment _ _, ExactPrint.Types.DP (y, x)) -> - when (not $ comment == "(" || comment == ")") $ do + when (comment /= "(" && comment /= ")") $ do let commentLines = Text.lines $ Text.pack $ comment -- evil hack for CPP: case comment of @@ -229,7 +231,7 @@ layoutBriDocM = \case state <- mGet let m = _lstate_comments state pure $ Map.lookup annKey m - let mComments = nonEmpty =<< extractAllComments <$> annMay + let mComments = nonEmpty . extractAllComments =<< annMay let semiCount = length [ () | Just ann <- [ annMay ] , (ExactPrint.Types.AnnSemiSep, _) <- ExactPrint.Types.annsDP ann @@ -252,10 +254,10 @@ layoutBriDocM = \case case mComments of Nothing -> do when shouldAddSemicolonNewlines $ do - [1..semiCount] `forM_` \_ -> layoutWriteNewline + [1..semiCount] `forM_` const layoutWriteNewline Just comments -> do comments `forM_` \(ExactPrint.Types.Comment comment _ _, ExactPrint.Types.DP (y, x)) -> - when (not $ comment == "(" || comment == ")") $ do + when (comment /= "(" && comment /= ")") $ do let commentLines = Text.lines $ Text.pack comment case comment of ('#':_) -> layoutMoveToCommentPos y (-999) 1 @@ -351,13 +353,13 @@ briDocIsMultiLine briDoc = rec briDoc BDBaseYPop bd -> rec bd BDIndentLevelPushCur bd -> rec bd BDIndentLevelPop bd -> rec bd - BDPar _ _ _ -> True + BDPar{} -> True BDAlt{} -> error "briDocIsMultiLine BDAlt" BDForceMultiline _ -> True BDForceSingleline bd -> rec bd BDForwardLineMode bd -> rec bd BDExternal _ _ _ t | [_] <- Text.lines t -> False - BDExternal _ _ _ _ -> True + BDExternal{} -> True BDPlain t | [_] <- Text.lines t -> False BDPlain _ -> True BDAnnotationPrior _ bd -> rec bd @@ -453,7 +455,7 @@ alignColsLines bridocs = do -- colInfos `forM_` \colInfo -> do -- tellDebugMess ("alignColsLines: at " ++ take 100 (show $ briDocToDoc $ head bridocs)) curX <- do state <- mGet - return $ either id (const 0) (_lstate_curYOrAddNewline state) + fromMaybe + return $ Either.fromLeft 0 (_lstate_curYOrAddNewline state) + fromMaybe 0 (_lstate_addSepSpace state) colMax <- mAsk <&> _conf_layout .> _lconfig_cols .> confUnpack @@ -543,8 +545,8 @@ alignColsLines bridocs = do -- colInfos `forM_` \colInfo -> do -- personal preference to not break alignment for those, even if -- multiline. Really, this should be configurable.. (TODO) shouldBreakAfter :: BriDoc -> Bool - shouldBreakAfter bd = if alignBreak - then briDocIsMultiLine bd && case bd of + shouldBreakAfter bd = alignBreak && + briDocIsMultiLine bd && case bd of (BDCols ColTyOpPrefix _) -> False (BDCols ColPatternsFuncPrefix _) -> True (BDCols ColPatternsFuncInfix _) -> True @@ -565,7 +567,6 @@ alignColsLines bridocs = do -- colInfos `forM_` \colInfo -> do (BDCols ColTuples _) -> False (BDCols ColOpPrefix _) -> False _ -> True - else False mergeInfoBriDoc :: Bool @@ -644,9 +645,7 @@ processInfo maxSpace m = \case curX <- do state <- mGet -- tellDebugMess ("processInfo: " ++ show (_lstate_curYOrAddNewline state) ++ " - " ++ show ((_lstate_addSepSpace state))) - let spaceAdd = case _lstate_addSepSpace state of - Nothing -> 0 - Just i -> i + let spaceAdd = fromMaybe 0 $ _lstate_addSepSpace state return $ case _lstate_curYOrAddNewline state of Left i -> case _lstate_commentCol state of Nothing -> spaceAdd + i @@ -655,7 +654,7 @@ processInfo maxSpace m = \case let colMax = min colMaxConf (curX + maxSpace) -- tellDebugMess $ show curX let Just (ratio, maxCols1, _colss) = IntMapS.lookup ind m - let maxCols2 = list <&> \e -> case e of + let maxCols2 = list <&> \case (_, ColInfo i _ _) -> let Just (_, ms, _) = IntMapS.lookup i m in sum ms (l, _) -> l diff --git a/src/Language/Haskell/Brittany/Internal/BackendUtils.hs b/src/Language/Haskell/Brittany/Internal/BackendUtils.hs index 8003fd8..6c34ea9 100644 --- a/src/Language/Haskell/Brittany/Internal/BackendUtils.hs +++ b/src/Language/Haskell/Brittany/Internal/BackendUtils.hs @@ -49,9 +49,7 @@ layoutWriteAppend t = do replicateM_ i $ mTell $ Text.Builder.fromString $ "\n" Left{} -> do return () - let spaces = case _lstate_addSepSpace state of - Just i -> i - Nothing -> 0 + let spaces = fromMaybe 0 $ _lstate_addSepSpace state mTell $ Text.Builder.fromText $ Text.pack (replicate spaces ' ') mTell $ Text.Builder.fromText $ t mModify $ \s -> s @@ -452,7 +450,7 @@ layoutWritePriorComments ast = do case mAnn of Nothing -> return () Just priors -> do - when (not $ null priors) $ layoutSetCommentCol + unless (null priors) $ layoutSetCommentCol priors `forM_` \( ExactPrint.Comment comment _ _ , ExactPrint.DP (x, y) ) -> do @@ -484,7 +482,7 @@ layoutWritePostComments ast = do case mAnn of Nothing -> return () Just posts -> do - when (not $ null posts) $ layoutSetCommentCol + unless (null posts) $ layoutSetCommentCol posts `forM_` \( ExactPrint.Comment comment _ _ , ExactPrint.DP (x, y) ) -> do diff --git a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs index f2c7806..46e1b6a 100644 --- a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs +++ b/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs @@ -27,7 +27,7 @@ import Data.HList.HList import GHC ( GenLocated(L) ) import qualified GHC.Driver.Session as GHC -import qualified GHC as GHC hiding (parseModule) +import qualified GHC hiding (parseModule) import qualified GHC.Types.SrcLoc as GHC import qualified GHC.Driver.CmdLine as GHC @@ -78,11 +78,11 @@ parseModuleWithCpp cpp opts args fp dynCheck = -- harmless. See commit 1b7576dcd1823e1c685a44927b1fcaade1319063. void $ lift $ GHC.setSessionDynFlags dflags1 dflags2 <- lift $ ExactPrint.initDynFlags fp - when (not $ null leftover) + unless (null leftover) $ ExceptT.throwE $ "when parsing ghc flags: leftover flags: " ++ show (leftover <&> \(L _ s) -> s) - when (not $ null warnings) + unless (null warnings) $ ExceptT.throwE $ "when parsing ghc flags: encountered warnings: " ++ show (warnings <&> warnExtractorCompat) @@ -110,11 +110,11 @@ parseModuleFromString args fp dynCheck str = dflags0 <- lift $ ExactPrint.initDynFlagsPure fp str (dflags1, leftover, warnings) <- lift $ GHC.parseDynamicFlagsCmdLine dflags0 (GHC.noLoc <$> args) - when (not $ null leftover) + unless (null leftover) $ ExceptT.throwE $ "when parsing ghc flags: leftover flags: " ++ show (leftover <&> \(L _ s) -> s) - when (not $ null warnings) + unless (null warnings) $ ExceptT.throwE $ "when parsing ghc flags: encountered warnings: " ++ show (warnings <&> warnExtractorCompat) @@ -135,7 +135,7 @@ commentAnnFixTransformGlob ast = do let nodes = SYB.everything (<>) extract ast let annsMap :: Map GHC.RealSrcLoc ExactPrint.AnnKey annsMap = Map.fromListWith - (flip const) + (const id) [ (GHC.realSrcSpanEnd span, annKey) | (GHC.RealSrcSpan span _, annKey) <- Foldable.toList nodes ] @@ -174,8 +174,8 @@ commentAnnFixTransformGlob ast = do in Map.insert annKey2 ann2' anns _ -> return True -- retain comment at current node. - priors' <- flip filterM priors processCom - follows' <- flip filterM follows $ processCom + priors' <- filterM processCom priors + follows' <- filterM processCom follows assocs' <- flip filterM assocs $ \case (ExactPrint.AnnComment com, dp) -> processCom (com, dp) _ -> return True @@ -286,7 +286,7 @@ foldedAnnKeys ast = SYB.everything ( \x -> maybe Set.empty Set.singleton - [ SYB.gmapQi 1 (\t -> ExactPrint.mkAnnKey $ L l t) x + [ SYB.gmapQi 1 (ExactPrint.mkAnnKey . L l) x | locTyCon == SYB.typeRepTyCon (SYB.typeOf x) , l :: SrcSpan <- SYB.gmapQi 0 SYB.cast x -- for some reason, ghc-8.8 has forgotten how to infer the type of l, diff --git a/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs b/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs index 1d8f48a..422c7be 100644 --- a/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs +++ b/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs @@ -36,11 +36,10 @@ import Language.Haskell.Brittany.Internal.Utils import Language.Haskell.Brittany.Internal.ExactPrintUtils import GHC.Types.Name.Reader ( RdrName(..) ) -import GHC ( Located, GenLocated(L), moduleNameString ) +import GHC ( Located, GenLocated(L), moduleName, moduleNameString ) import qualified GHC.Types.SrcLoc as GHC import GHC.Types.Name.Occurrence ( occNameString ) import GHC.Types.Name ( getOccString ) -import GHC ( moduleName ) import GHC.Parser.Annotation ( AnnKeywordId(..) ) import Data.Data diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs index 49f615a..acbe186 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs @@ -37,13 +37,13 @@ layoutDataDecl ltycl name (HsQTvs _ bndrs) defn = case defn of docWrapNode ltycl $ do nameStr <- lrdrNameToTextAnn name consNameStr <- lrdrNameToTextAnn consName - tyVarLine <- fmap return $ createBndrDoc bndrs + tyVarLine <- return <$> createBndrDoc bndrs -- headDoc <- fmap return $ docSeq -- [ appSep $ docLitS "newtype") -- , appSep $ docLit nameStr -- , appSep tyVarLine -- ] - rhsDoc <- fmap return $ createDetailsDoc consNameStr details + rhsDoc <- return <$> createDetailsDoc consNameStr details createDerivingPar mDerivs $ docSeq [ appSep $ docLitS "newtype" , appSep $ docLit nameStr @@ -62,7 +62,7 @@ layoutDataDecl ltycl name (HsQTvs _ bndrs) defn = case defn of docWrapNode ltycl $ do lhsContextDoc <- docSharedWrapper createContextDoc lhsContext nameStr <- lrdrNameToTextAnn name - tyVarLine <- fmap return $ createBndrDoc bndrs + tyVarLine <- return <$> createBndrDoc bndrs createDerivingPar mDerivs $ docSeq [ appSep $ docLitS "data" , lhsContextDoc @@ -79,14 +79,14 @@ layoutDataDecl ltycl name (HsQTvs _ bndrs) defn = case defn of lhsContextDoc <- docSharedWrapper createContextDoc lhsContext nameStr <- lrdrNameToTextAnn name consNameStr <- lrdrNameToTextAnn consName - tyVarLine <- fmap return $ createBndrDoc bndrs + tyVarLine <- return <$> createBndrDoc bndrs forallDocMay <- case createForallDoc qvars of Nothing -> pure Nothing Just x -> Just . pure <$> x rhsContextDocMay <- case mRhsContext of Nothing -> pure Nothing Just (L _ ctxt) -> Just . pure <$> createContextDoc ctxt - rhsDoc <- fmap return $ createDetailsDoc consNameStr details + rhsDoc <- return <$> createDetailsDoc consNameStr details consDoc <- fmap pure $ docNonBottomSpacing $ case (forallDocMay, rhsContextDocMay) of diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs index a2d4a00..a96ae47 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs @@ -162,7 +162,7 @@ layoutBind lbind@(L _ bind) = case bind of patDocs <- colsWrapPat =<< layoutPat pat clauseDocs <- layoutGrhs `mapM` grhss mWhereDocs <- layoutLocalBinds whereBinds - let mWhereArg = mWhereDocs <&> \d -> (mkAnnKey lbind, d) -- TODO: is this the right AnnKey? + let mWhereArg = mWhereDocs <&> (,) (mkAnnKey lbind) -- TODO: is this the right AnnKey? binderDoc <- docLit $ Text.pack "=" hasComments <- hasAnyCommentsBelow lbind fmap Right $ docWrapNode lbind $ layoutPatternBindFinal Nothing @@ -206,7 +206,7 @@ layoutLocalBinds lbinds@(L _ binds) = case binds of let unordered = [ BagBind b | b <- Data.Foldable.toList bindlrs ] ++ [ BagSig s | s <- sigs ] - ordered = sortBy (comparing $ ExactPrint.rs . bindOrSigtoSrcSpan) unordered + ordered = List.sortOn (ExactPrint.rs . bindOrSigtoSrcSpan) unordered docs <- docWrapNode lbinds $ join <$> ordered `forM` \case BagBind b -> either id return <$> layoutBind b BagSig s -> return <$> layoutSig s @@ -271,7 +271,7 @@ layoutPatternBind funId binderDoc lmatch@(L _ match) = do $ (List.intersperse docSeparator $ docForceSingleline <$> ps) clauseDocs <- docWrapNodeRest lmatch $ layoutGrhs `mapM` grhss mWhereDocs <- layoutLocalBinds whereBinds - let mWhereArg = mWhereDocs <&> \d -> (mkAnnKey lmatch, d) + let mWhereArg = mWhereDocs <&> (,) (mkAnnKey lmatch) let alignmentToken = if null pats then Nothing else funId hasComments <- hasAnyCommentsBelow lmatch layoutPatternBindFinal alignmentToken @@ -331,7 +331,7 @@ layoutPatternBindFinal alignmentToken binderDoc mPatDoc clauseDocs mWhereDocs ha -- be shared between alternatives. wherePartMultiLine :: [ToBriDocM BriDocNumbered] <- case mWhereDocs of Nothing -> return $ [] - Just (annKeyWhere, [w]) -> fmap (pure . pure) $ docAlt + Just (annKeyWhere, [w]) -> pure . pure <$> docAlt [ docEnsureIndent BrIndentRegular $ docSeq [ docLit $ Text.pack "where" diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs index b26687c..344454c 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs @@ -595,7 +595,7 @@ layoutExpr lexpr@(L _ expr) = do expDoc1 <- docSharedWrapper layoutExpr exp1 -- We jump through some ugly hoops here to ensure proper sharing. hasComments <- hasAnyCommentsBelow lexpr - mBindDocs <- fmap (fmap (fmap pure)) $ layoutLocalBinds binds + mBindDocs <- fmap (fmap pure) <$> layoutLocalBinds binds let ifIndentFreeElse :: a -> a -> a ifIndentFreeElse x y = diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs b/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs index 06aa0cf..39b7a49 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs @@ -55,7 +55,7 @@ layoutIE lie@(L _ ie) = docWrapNode lie $ case ie of (layoutWrapped lie x) (layoutItems (splitFirstLast sortedNs)) where - nameDoc = (docLit =<<) . lrdrNameToTextAnn . prepareName + nameDoc = docLit <=< lrdrNameToTextAnn . prepareName layoutItem n = docSeq [docCommaSep, docWrapNode n $ nameDoc n] layoutItems FirstLastEmpty = docSetBaseY $ docLines [docSeq [docParenLSep, docNodeAnnKW lie (Just AnnOpenP) docEmpty], docParenR] @@ -208,9 +208,9 @@ lieToText = \case -- Need to check, and either put them at the top (for module) or do some -- other clever thing. L _ (IEModuleContents _ n) -> moduleNameToText n - L _ (IEGroup _ _ _ ) -> Text.pack "@IEGroup" - L _ (IEDoc _ _ ) -> Text.pack "@IEDoc" - L _ (IEDocNamed _ _ ) -> Text.pack "@IEDocNamed" + L _ IEGroup{} -> Text.pack "@IEGroup" + L _ IEDoc{} -> Text.pack "@IEDoc" + L _ IEDocNamed{} -> Text.pack "@IEDocNamed" where moduleNameToText :: Located ModuleName -> Text moduleNameToText (L _ name) = Text.pack ("@IEModuleContents" ++ moduleNameString name) diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs b/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs index f5efb7f..ed0dd26 100644 --- a/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs +++ b/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs @@ -645,7 +645,7 @@ getBinders x = case x of XHsForAllTelescope _ -> [] withoutSpecificity :: LHsTyVarBndr flag pass -> LHsTyVarBndr () pass -withoutSpecificity = fmap $ \ x -> case x of +withoutSpecificity = fmap $ \case UserTyVar a _ c -> UserTyVar a () c KindedTyVar a _ c d -> KindedTyVar a () c d XTyVarBndr a -> XTyVarBndr a diff --git a/src/Language/Haskell/Brittany/Internal/Prelude.hs b/src/Language/Haskell/Brittany/Internal/Prelude.hs index d09b788..87a0c0a 100644 --- a/src/Language/Haskell/Brittany/Internal/Prelude.hs +++ b/src/Language/Haskell/Brittany/Internal/Prelude.hs @@ -14,44 +14,22 @@ import GHC.Types.Name.Reader as E ( RdrName ) import Data.Functor.Identity as E ( Identity(..) ) import Control.Concurrent.Chan as E ( Chan ) -import Control.Concurrent.MVar as E ( MVar ) +import Control.Concurrent.MVar as E ( MVar + , newEmptyMVar + , newMVar + , putMVar + , readMVar + , takeMVar + , swapMVar + ) import Data.Int as E ( Int ) -import Data.Word as E ( Word ) +import Data.Word as E ( Word + , Word32 + ) import Prelude as E ( Integer , Float , Double - ) -import Control.Monad.ST as E ( ST ) -import Data.Bool as E ( Bool(..) ) -import Data.Char as E ( Char ) -import Data.Either as E ( Either(..) ) -import Data.IORef as E ( IORef ) -import Data.Maybe as E ( Maybe(..) ) -import Data.Monoid as E ( Endo(..) - , All(..) - , Any(..) - , Sum(..) - , Product(..) - , Alt(..) - ) -import Data.Ord as E ( Ordering(..) - , Down(..) - ) -import Data.Ratio as E ( Ratio - , Rational - ) -import Data.String as E ( String ) -import Data.Void as E ( Void ) -import System.IO as E ( IO ) -import Data.Proxy as E ( Proxy(..) ) -import Data.Sequence as E ( Seq ) - -import Data.Map as E ( Map ) -import Data.Set as E ( Set ) - -import Data.Text as E ( Text ) - -import Prelude as E ( undefined + , undefined , Eq (..) , Ord (..) , Enum (..) @@ -101,8 +79,58 @@ import Prelude as E ( undefined , Foldable , Traversable ) +import Control.Monad.ST as E ( ST ) +import Data.Bool as E ( Bool(..) ) +import Data.Char as E ( Char + , ord + , chr + ) +import Data.Either as E ( Either(..) + , either + ) +import Data.IORef as E ( IORef ) +import Data.Maybe as E ( Maybe(..) + , fromMaybe + , maybe + , listToMaybe + , maybeToList + , catMaybes + ) +import Data.Monoid as E ( Endo(..) + , All(..) + , Any(..) + , Sum(..) + , Product(..) + , Alt(..) + , mconcat + , Monoid (..) + ) +import Data.Ord as E ( Ordering(..) + , Down(..) + , comparing + ) +import Data.Ratio as E ( Ratio + , Rational + , (%) + , numerator + , denominator + ) +import Data.String as E ( String ) +import Data.Void as E ( Void ) +import System.IO as E ( IO + , hFlush + , stdout + ) +import Data.Proxy as E ( Proxy(..) ) +import Data.Sequence as E ( Seq ) + +import Data.Map as E ( Map ) +import Data.Set as E ( Set ) + +import Data.Text as E ( Text ) import Data.Function as E ( fix + , (&) ) import Data.Foldable as E ( foldl' @@ -153,31 +181,6 @@ import Data.List.NonEmpty as E ( NonEmpty(..) import Data.Tuple as E ( swap ) -import Data.Char as E ( ord - , chr - ) - -import Data.Maybe as E ( fromMaybe - , maybe - , listToMaybe - , maybeToList - , catMaybes - ) - -import Data.Word as E ( Word32 - ) - -import Data.Ord as E ( comparing - ) - -import Data.Either as E ( either - ) - -import Data.Ratio as E ( (%) - , numerator - , denominator - ) - import Text.Read as E ( readMaybe ) @@ -222,14 +225,6 @@ import Control.Concurrent as E ( threadDelay , forkOS ) -import Control.Concurrent.MVar as E ( newEmptyMVar - , newMVar - , putMVar - , readMVar - , takeMVar - , swapMVar - ) - import Control.Exception as E ( evaluate , bracket , assert @@ -249,19 +244,11 @@ import Debug.Trace as E ( trace import Foreign.ForeignPtr as E ( ForeignPtr ) -import Data.Monoid as E ( mconcat - , Monoid (..) - ) - import Data.Bifunctor as E ( bimap ) import Data.Functor as E ( ($>) ) -import Data.Function as E ( (&) ) import Data.Semigroup as E ( (<>) , Semigroup(..) ) -import System.IO as E ( hFlush - , stdout - ) import Data.Typeable as E ( Typeable ) diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs b/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs index 57461ca..ca79995 100644 --- a/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs +++ b/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs @@ -206,8 +206,7 @@ transformAlts = (zip spacings alts <&> \(vs, bd) -> -- trace ("spacing=" ++ show vs ++ ",hasSpace=" ++ show (hasSpace lconf acp vs) ++ ",lineCheck=" ++ show (lineCheck vs)) ( hasSpace1 lconf acp vs && lineCheck vs, bd)) - id -- - $ (fmap $ \x -> traceShow (briDocToDoc x) x) - $ rec + rec $ fromMaybe (-- trace ("choosing last") $ List.last alts) $ Data.List.Extra.firstJust (\(_i::Int, (b,x)) -> @@ -233,8 +232,7 @@ transformAlts = && any lineCheck vs, bd)) let checkedOptions :: [Maybe (Int, BriDocNumbered)] = zip [1..] options <&> (\(i, (b,x)) -> [ (i, x) | b ]) - id -- - $ (fmap $ \x -> traceShow (briDocToDoc x) x) - $ rec + rec $ fromMaybe (-- trace ("choosing last") $ List.last alts) $ Data.List.Extra.firstJust (fmap snd) checkedOptions @@ -325,7 +323,7 @@ transformAlts = LineModeValid (VerticalSpacing i VerticalSpacingParNone _) -> do acp <- mGet mSet $ acp { _acp_line = _acp_line acp + i } - LineModeValid (VerticalSpacing _ _ _) -> error "processSpacingSimple par" + LineModeValid VerticalSpacing{} -> error "processSpacingSimple par" _ -> error "ghc exhaustive check is insufficient" hasSpace1 :: LayoutConfig -> AltCurPos -> LineModeValidity VerticalSpacing -> Bool hasSpace1 _ _ LineModeInvalid = False @@ -630,9 +628,9 @@ getSpacings limit bridoc = preFilterLimit <$> rec bridoc BDFLit t -> return $ [VerticalSpacing (Text.length t) VerticalSpacingParNone False] BDFSeq list -> - fmap sumVs . sequence . fmap filterAndLimit <$> rec `mapM` list + fmap sumVs . mapM filterAndLimit <$> rec `mapM` list BDFCols _sig list -> - fmap sumVs . sequence . fmap filterAndLimit <$> rec `mapM` list + fmap sumVs . mapM filterAndLimit <$> rec `mapM` list BDFSeparator -> return $ [VerticalSpacing 1 VerticalSpacingParNone False] BDFAddBaseY indent bd -> do diff --git a/src/Language/Haskell/Brittany/Internal/Types.hs b/src/Language/Haskell/Brittany/Internal/Types.hs index 55c3746..76b7735 100644 --- a/src/Language/Haskell/Brittany/Internal/Types.hs +++ b/src/Language/Haskell/Brittany/Internal/Types.hs @@ -1,4 +1,3 @@ -{-# LANGUAGE BangPatterns #-} {-# LANGUAGE DataKinds #-} {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE FlexibleInstances #-} @@ -19,7 +18,7 @@ import Language.Haskell.Brittany.Internal.Prelude import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS import qualified Data.Data import qualified Data.Strict.Maybe as Strict -import qualified Safe as Safe +import qualified Safe import qualified Language.Haskell.GHC.ExactPrint as ExactPrint import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types @@ -423,7 +422,7 @@ briDocSeqSpine = \case BDIndentLevelPushCur bd -> briDocSeqSpine bd BDIndentLevelPop bd -> briDocSeqSpine bd BDPar _ind line indented -> briDocSeqSpine line `seq` briDocSeqSpine indented - BDAlt alts -> foldl' (\(!()) -> briDocSeqSpine) () alts + BDAlt alts -> foldl' (\() -> briDocSeqSpine) () alts BDForwardLineMode bd -> briDocSeqSpine bd BDExternal{} -> () BDPlain{} -> () @@ -431,7 +430,7 @@ briDocSeqSpine = \case BDAnnotationKW _annKey _kw bd -> briDocSeqSpine bd BDAnnotationRest _annKey bd -> briDocSeqSpine bd BDMoveToKWDP _annKey _kw _b bd -> briDocSeqSpine bd - BDLines lines -> foldl' (\(!()) -> briDocSeqSpine) () lines + BDLines lines -> foldl' (\() -> briDocSeqSpine) () lines BDEnsureIndent _ind bd -> briDocSeqSpine bd BDForceMultiline bd -> briDocSeqSpine bd BDForceSingleline bd -> briDocSeqSpine bd diff --git a/src/Language/Haskell/Brittany/Main.hs b/src/Language/Haskell/Brittany/Main.hs index 7df86d5..87ebe66 100644 --- a/src/Language/Haskell/Brittany/Main.hs +++ b/src/Language/Haskell/Brittany/Main.hs @@ -240,7 +240,7 @@ mainCmdParser helpDesc = do outputPaths if checkMode - then when (any (== Changes) (Data.Either.rights results)) + then when (Changes `elem` (Data.Either.rights results)) $ System.Exit.exitWith (System.Exit.ExitFailure 1) else case results of xs | all Data.Either.isRight xs -> pure () @@ -310,7 +310,7 @@ coreIO putErrorLnIO config suppressOutput checkMode inputPathM outputPathM = let hackTransform = if hackAroundIncludes && not exactprintOnly then List.intercalate "\n" . fmap hackF . lines' else id - inputString <- liftIO $ System.IO.hGetContents System.IO.stdin + inputString <- liftIO System.IO.getContents parseRes <- liftIO $ parseModuleFromString ghcOptions "stdin" cppCheckFunc @@ -376,8 +376,8 @@ coreIO putErrorLnIO config suppressOutput checkMode inputPathM outputPathM = let out = TextL.toStrict $ if hackAroundIncludes then TextL.intercalate (TextL.pack "\n") - $ fmap hackF - $ TextL.splitOn (TextL.pack "\n") outRaw + $ hackF + <$> TextL.splitOn (TextL.pack "\n") outRaw else outRaw out' <- if moduleConf & _conf_obfuscate & confUnpack then lift $ obfuscate out @@ -389,7 +389,7 @@ coreIO putErrorLnIO config suppressOutput checkMode inputPathM outputPathM = customErrOrder ErrorUnusedComment{} = 2 customErrOrder ErrorUnknownNode{} = -2 :: Int customErrOrder ErrorMacroConfig{} = 5 - when (not $ null errsWarns) $ do + unless (null errsWarns) $ do let groupedErrsWarns = Data.List.Extra.groupOn customErrOrder $ List.sortOn customErrOrder @@ -442,9 +442,9 @@ coreIO putErrorLnIO config suppressOutput checkMode inputPathM outputPathM = -- adds some override? let hasErrors = - case config & _conf_errorHandling & _econf_Werror & confUnpack of - False -> 0 < maximum (-1 : fmap customErrOrder errsWarns) - True -> not $ null errsWarns + if config & _conf_errorHandling & _econf_Werror & confUnpack + then not $ null errsWarns + else 0 < maximum (-1 : fmap customErrOrder errsWarns) outputOnErrs = config & _conf_errorHandling -- 2.30.2 From 95017640a80f60156557faf818a8c0c707ba38b8 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 21:06:23 +0000 Subject: [PATCH 42/74] Move executable --- brittany.cabal | 4 ++-- {src-brittany => source/executable}/Main.hs | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename {src-brittany => source/executable}/Main.hs (100%) diff --git a/brittany.cabal b/brittany.cabal index 780ccaf..86a8e8f 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -137,8 +137,8 @@ executable brittany if flag(brittany-dev-lib) buildable: False - main-is: Main.hs - hs-source-dirs: src-brittany + hs-source-dirs: source/executable + main-is: Main.hs test-suite unittests import: executable diff --git a/src-brittany/Main.hs b/source/executable/Main.hs similarity index 100% rename from src-brittany/Main.hs rename to source/executable/Main.hs -- 2.30.2 From 2ab406471b94acbdae6a21bad0ebace08c55a3c2 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 21:07:34 +0000 Subject: [PATCH 43/74] Move library --- brittany.cabal | 5 ++--- {src => source/library}/Language/Haskell/Brittany.hs | 0 .../library}/Language/Haskell/Brittany/Internal.hs | 0 .../library}/Language/Haskell/Brittany/Internal/Backend.hs | 0 .../Language/Haskell/Brittany/Internal/BackendUtils.hs | 0 .../library}/Language/Haskell/Brittany/Internal/Config.hs | 0 .../Language/Haskell/Brittany/Internal/Config/Types.hs | 0 .../Haskell/Brittany/Internal/Config/Types/Instances.hs | 0 .../Language/Haskell/Brittany/Internal/ExactPrintUtils.hs | 0 .../Language/Haskell/Brittany/Internal/LayouterBasics.hs | 0 .../Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs | 0 .../Language/Haskell/Brittany/Internal/Layouters/Decl.hs | 0 .../Language/Haskell/Brittany/Internal/Layouters/Expr.hs | 0 .../Haskell/Brittany/Internal/Layouters/Expr.hs-boot | 0 .../Language/Haskell/Brittany/Internal/Layouters/IE.hs | 0 .../Language/Haskell/Brittany/Internal/Layouters/Import.hs | 0 .../Language/Haskell/Brittany/Internal/Layouters/Module.hs | 0 .../Language/Haskell/Brittany/Internal/Layouters/Pattern.hs | 0 .../Language/Haskell/Brittany/Internal/Layouters/Stmt.hs | 0 .../Haskell/Brittany/Internal/Layouters/Stmt.hs-boot | 0 .../Language/Haskell/Brittany/Internal/Layouters/Type.hs | 0 .../Language/Haskell/Brittany/Internal/Obfuscation.hs | 0 .../library}/Language/Haskell/Brittany/Internal/Prelude.hs | 0 .../Language/Haskell/Brittany/Internal/PreludeUtils.hs | 0 .../Haskell/Brittany/Internal/Transformations/Alt.hs | 0 .../Haskell/Brittany/Internal/Transformations/Columns.hs | 0 .../Haskell/Brittany/Internal/Transformations/Floating.hs | 0 .../Haskell/Brittany/Internal/Transformations/Indent.hs | 0 .../Haskell/Brittany/Internal/Transformations/Par.hs | 0 .../library}/Language/Haskell/Brittany/Internal/Types.hs | 0 .../library}/Language/Haskell/Brittany/Internal/Utils.hs | 0 {src => source/library}/Language/Haskell/Brittany/Main.hs | 0 32 files changed, 2 insertions(+), 3 deletions(-) rename {src => source/library}/Language/Haskell/Brittany.hs (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal.hs (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal/Backend.hs (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal/BackendUtils.hs (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal/Config.hs (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal/Config/Types.hs (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal/LayouterBasics.hs (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal/Layouters/Decl.hs (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal/Layouters/Expr.hs (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal/Layouters/IE.hs (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal/Layouters/Import.hs (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal/Layouters/Module.hs (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal/Layouters/Type.hs (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal/Obfuscation.hs (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal/Prelude.hs (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal/PreludeUtils.hs (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal/Transformations/Alt.hs (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal/Transformations/Columns.hs (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal/Transformations/Floating.hs (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal/Transformations/Indent.hs (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal/Transformations/Par.hs (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal/Types.hs (100%) rename {src => source/library}/Language/Haskell/Brittany/Internal/Utils.hs (100%) rename {src => source/library}/Language/Haskell/Brittany/Main.hs (100%) diff --git a/brittany.cabal b/brittany.cabal index 86a8e8f..7b238ec 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -96,8 +96,8 @@ common executable library import: library - hs-source-dirs: - src + autogen-modules: Paths_brittany + hs-source-dirs: source/library exposed-modules: Language.Haskell.Brittany Language.Haskell.Brittany.Internal @@ -129,7 +129,6 @@ library Language.Haskell.Brittany.Internal.Utils Language.Haskell.Brittany.Main Paths_brittany - autogen-modules: Paths_brittany executable brittany import: executable diff --git a/src/Language/Haskell/Brittany.hs b/source/library/Language/Haskell/Brittany.hs similarity index 100% rename from src/Language/Haskell/Brittany.hs rename to source/library/Language/Haskell/Brittany.hs diff --git a/src/Language/Haskell/Brittany/Internal.hs b/source/library/Language/Haskell/Brittany/Internal.hs similarity index 100% rename from src/Language/Haskell/Brittany/Internal.hs rename to source/library/Language/Haskell/Brittany/Internal.hs diff --git a/src/Language/Haskell/Brittany/Internal/Backend.hs b/source/library/Language/Haskell/Brittany/Internal/Backend.hs similarity index 100% rename from src/Language/Haskell/Brittany/Internal/Backend.hs rename to source/library/Language/Haskell/Brittany/Internal/Backend.hs diff --git a/src/Language/Haskell/Brittany/Internal/BackendUtils.hs b/source/library/Language/Haskell/Brittany/Internal/BackendUtils.hs similarity index 100% rename from src/Language/Haskell/Brittany/Internal/BackendUtils.hs rename to source/library/Language/Haskell/Brittany/Internal/BackendUtils.hs diff --git a/src/Language/Haskell/Brittany/Internal/Config.hs b/source/library/Language/Haskell/Brittany/Internal/Config.hs similarity index 100% rename from src/Language/Haskell/Brittany/Internal/Config.hs rename to source/library/Language/Haskell/Brittany/Internal/Config.hs diff --git a/src/Language/Haskell/Brittany/Internal/Config/Types.hs b/source/library/Language/Haskell/Brittany/Internal/Config/Types.hs similarity index 100% rename from src/Language/Haskell/Brittany/Internal/Config/Types.hs rename to source/library/Language/Haskell/Brittany/Internal/Config/Types.hs diff --git a/src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs b/source/library/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs similarity index 100% rename from src/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs rename to source/library/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs diff --git a/src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs b/source/library/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs similarity index 100% rename from src/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs rename to source/library/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs diff --git a/src/Language/Haskell/Brittany/Internal/LayouterBasics.hs b/source/library/Language/Haskell/Brittany/Internal/LayouterBasics.hs similarity index 100% rename from src/Language/Haskell/Brittany/Internal/LayouterBasics.hs rename to source/library/Language/Haskell/Brittany/Internal/LayouterBasics.hs diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs similarity index 100% rename from src/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs rename to source/library/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/Decl.hs similarity index 100% rename from src/Language/Haskell/Brittany/Internal/Layouters/Decl.hs rename to source/library/Language/Haskell/Brittany/Internal/Layouters/Decl.hs diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/Expr.hs similarity index 100% rename from src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs rename to source/library/Language/Haskell/Brittany/Internal/Layouters/Expr.hs diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot b/source/library/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot similarity index 100% rename from src/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot rename to source/library/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/IE.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/IE.hs similarity index 100% rename from src/Language/Haskell/Brittany/Internal/Layouters/IE.hs rename to source/library/Language/Haskell/Brittany/Internal/Layouters/IE.hs diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Import.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/Import.hs similarity index 100% rename from src/Language/Haskell/Brittany/Internal/Layouters/Import.hs rename to source/library/Language/Haskell/Brittany/Internal/Layouters/Import.hs diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Module.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/Module.hs similarity index 100% rename from src/Language/Haskell/Brittany/Internal/Layouters/Module.hs rename to source/library/Language/Haskell/Brittany/Internal/Layouters/Module.hs diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs similarity index 100% rename from src/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs rename to source/library/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs similarity index 100% rename from src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs rename to source/library/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot b/source/library/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot similarity index 100% rename from src/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot rename to source/library/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot diff --git a/src/Language/Haskell/Brittany/Internal/Layouters/Type.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/Type.hs similarity index 100% rename from src/Language/Haskell/Brittany/Internal/Layouters/Type.hs rename to source/library/Language/Haskell/Brittany/Internal/Layouters/Type.hs diff --git a/src/Language/Haskell/Brittany/Internal/Obfuscation.hs b/source/library/Language/Haskell/Brittany/Internal/Obfuscation.hs similarity index 100% rename from src/Language/Haskell/Brittany/Internal/Obfuscation.hs rename to source/library/Language/Haskell/Brittany/Internal/Obfuscation.hs diff --git a/src/Language/Haskell/Brittany/Internal/Prelude.hs b/source/library/Language/Haskell/Brittany/Internal/Prelude.hs similarity index 100% rename from src/Language/Haskell/Brittany/Internal/Prelude.hs rename to source/library/Language/Haskell/Brittany/Internal/Prelude.hs diff --git a/src/Language/Haskell/Brittany/Internal/PreludeUtils.hs b/source/library/Language/Haskell/Brittany/Internal/PreludeUtils.hs similarity index 100% rename from src/Language/Haskell/Brittany/Internal/PreludeUtils.hs rename to source/library/Language/Haskell/Brittany/Internal/PreludeUtils.hs diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs b/source/library/Language/Haskell/Brittany/Internal/Transformations/Alt.hs similarity index 100% rename from src/Language/Haskell/Brittany/Internal/Transformations/Alt.hs rename to source/library/Language/Haskell/Brittany/Internal/Transformations/Alt.hs diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Columns.hs b/source/library/Language/Haskell/Brittany/Internal/Transformations/Columns.hs similarity index 100% rename from src/Language/Haskell/Brittany/Internal/Transformations/Columns.hs rename to source/library/Language/Haskell/Brittany/Internal/Transformations/Columns.hs diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Floating.hs b/source/library/Language/Haskell/Brittany/Internal/Transformations/Floating.hs similarity index 100% rename from src/Language/Haskell/Brittany/Internal/Transformations/Floating.hs rename to source/library/Language/Haskell/Brittany/Internal/Transformations/Floating.hs diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Indent.hs b/source/library/Language/Haskell/Brittany/Internal/Transformations/Indent.hs similarity index 100% rename from src/Language/Haskell/Brittany/Internal/Transformations/Indent.hs rename to source/library/Language/Haskell/Brittany/Internal/Transformations/Indent.hs diff --git a/src/Language/Haskell/Brittany/Internal/Transformations/Par.hs b/source/library/Language/Haskell/Brittany/Internal/Transformations/Par.hs similarity index 100% rename from src/Language/Haskell/Brittany/Internal/Transformations/Par.hs rename to source/library/Language/Haskell/Brittany/Internal/Transformations/Par.hs diff --git a/src/Language/Haskell/Brittany/Internal/Types.hs b/source/library/Language/Haskell/Brittany/Internal/Types.hs similarity index 100% rename from src/Language/Haskell/Brittany/Internal/Types.hs rename to source/library/Language/Haskell/Brittany/Internal/Types.hs diff --git a/src/Language/Haskell/Brittany/Internal/Utils.hs b/source/library/Language/Haskell/Brittany/Internal/Utils.hs similarity index 100% rename from src/Language/Haskell/Brittany/Internal/Utils.hs rename to source/library/Language/Haskell/Brittany/Internal/Utils.hs diff --git a/src/Language/Haskell/Brittany/Main.hs b/source/library/Language/Haskell/Brittany/Main.hs similarity index 100% rename from src/Language/Haskell/Brittany/Main.hs rename to source/library/Language/Haskell/Brittany/Main.hs -- 2.30.2 From 75aed1cb8a44816baedc5cc50149dfd796a9b0fd Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 21:11:27 +0000 Subject: [PATCH 44/74] Remove unnecessary GHC version parsing --- src-literatetests/10-tests.blt | 3 --- src-literatetests/14-extensions.blt | 5 ++--- src-literatetests/Main.hs | 25 ++----------------------- 3 files changed, 4 insertions(+), 29 deletions(-) diff --git a/src-literatetests/10-tests.blt b/src-literatetests/10-tests.blt index aa3c7cb..75babb0 100644 --- a/src-literatetests/10-tests.blt +++ b/src-literatetests/10-tests.blt @@ -446,7 +446,6 @@ data Foo = Bar deriving (Show, Eq, Monad, Functor, Traversable, Foldable) #test record multiple deriving strategies -#min-ghc 8.2 data Foo = Bar { foo :: Baz , bars :: Bizzz @@ -461,7 +460,6 @@ data Foo = Bar deriving newtype (Traversable, Foldable) #test record deriving via -#min-ghc 8.6 data Foo = Bar { foo :: Baz , bars :: Bizzz @@ -535,7 +533,6 @@ data Foo = Bar ## maybe we want to switch to a differnt layout when there are such comments. ## Don't hesitate to modify this testcase, it clearly is not the ideal layout ## for this. -#min-ghc 8.6 data Foo = Bar { foo :: Baz diff --git a/src-literatetests/14-extensions.blt b/src-literatetests/14-extensions.blt index d794e9c..18fc24f 100644 --- a/src-literatetests/14-extensions.blt +++ b/src-literatetests/14-extensions.blt @@ -121,7 +121,7 @@ pattern myLeftVariableName `MyInfixPatternMatcher` myRightVariableName <- [myLongLeftVariableName, myLongRightVariableName] where MyInfixPatternMatcher x y = [x, x, y] -#test Pattern synonym types +#test Pattern synonym types {-# LANGUAGE PatternSynonyms #-} pattern J :: a -> Maybe a pattern J x = Just x @@ -152,7 +152,6 @@ pattern Signed x <- (asSigned -> x) where Signed (Pos x) = x -- positive comment #test Pattern synonym types multiple names -#min-ghc 8.2 {-# LANGUAGE PatternSynonyms #-} pattern J, K :: a -> Maybe a @@ -239,4 +238,4 @@ foo = let ?bar = Foo in value #test IP type signature {-# LANGUAGE ImplicitParams #-} foo :: (?bar::Bool) => () -foo = () \ No newline at end of file +foo = () diff --git a/src-literatetests/Main.hs b/src-literatetests/Main.hs index a1dc2af..d11007b 100644 --- a/src-literatetests/Main.hs +++ b/src-literatetests/Main.hs @@ -1,9 +1,7 @@ -{-# LANGUAGE CPP #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE MonadComprehensions #-} import Language.Haskell.Brittany.Internal.Prelude -import qualified Data.List.Extra import qualified Data.Maybe import qualified Data.Semigroup as Semigroup import qualified Data.Text as Text @@ -32,7 +30,6 @@ import System.FilePath ( () ) data InputLine = GroupLine Text | HeaderLine Text - | GhcVersionGuardLine Text | PendingLine | NormalLine Text | CommentLine @@ -41,7 +38,6 @@ data InputLine data TestCase = TestCase { testName :: Text , isPending :: Bool - , minGHCVersion :: Maybe Text , content :: Text } @@ -56,26 +52,17 @@ main = do let groups = createChunks =<< inputs inputCtxFree <- Text.IO.readFile "src-literatetests/30-tests-context-free.blt" let groupsCtxFree = createChunks inputCtxFree - let parseVersion :: Text -> Maybe [Int] - parseVersion = - mapM (readMaybe . Text.unpack) . Text.splitOn (Text.pack ".") - let ghcVersion = Data.Maybe.fromJust $ parseVersion $ Text.pack VERSION_ghc - let checkVersion = \case - Nothing -> True -- no version constraint - Just s -> case parseVersion s of - Nothing -> error $ "could not parse version " ++ Text.unpack s - Just v -> v <= ghcVersion hspec $ do groups `forM_` \(groupname, tests) -> do describe (Text.unpack groupname) $ do - tests `forM_` \test -> when (checkVersion $ minGHCVersion test) $ do + tests `forM_` \test -> do (if isPending test then before_ pending else id) $ it (Text.unpack $ testName test) $ roundTripEqual defaultTestConfig $ content test groupsCtxFree `forM_` \(groupname, tests) -> do describe ("context free: " ++ Text.unpack groupname) $ do - tests `forM_` \test -> when (checkVersion $ minGHCVersion test) $ do + tests `forM_` \test -> do (if isPending test then before_ pending else id) $ it (Text.unpack $ testName test) $ roundTripEqual contextFreeTestConfig @@ -113,15 +100,12 @@ main = do in TestCase { testName = n , isPending = any isPendingLine rest - , minGHCVersion = Data.List.Extra.firstJust extractMinGhc rest , content = Text.unlines normalLines } l -> error $ "first non-empty line must start with #test footest\n" ++ show l extractNormal (NormalLine l) = Just l extractNormal _ = Nothing - extractMinGhc (GhcVersionGuardLine v) = Just v - extractMinGhc _ = Nothing isPendingLine PendingLine{} = True isPendingLine _ = False specialLineParser :: Parser InputLine @@ -138,11 +122,6 @@ main = do , name <- Parsec.many1 $ Parsec.noneOf "\r\n:" , _ <- Parsec.eof ] - , [ GhcVersionGuardLine $ Text.pack version - | _ <- Parsec.try $ Parsec.string "#min-ghc" - , _ <- Parsec.many1 $ Parsec.oneOf " \t" - , version <- Parsec.many1 $ Parsec.noneOf "\r\n:" - ] , [ PendingLine | _ <- Parsec.try $ Parsec.string "#pending" , _ <- Parsec.optional $ many (Parsec.noneOf "\r\n") -- 2.30.2 From 0c720ee032c0d88d9beb3420bbc671fd780d32dc Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 21:12:57 +0000 Subject: [PATCH 45/74] Remove unnecessary flags --- brittany.cabal | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/brittany.cabal b/brittany.cabal index 7b238ec..7eaa0d7 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -30,16 +30,6 @@ source-repository head type: git location: https://github.com/lspitzner/brittany.git -flag brittany-dev-lib - description: set buildable false for anything but lib - default: False - manual: True - -flag brittany-test-perf - description: determines if performance test suite is enabled - default: False - manual: True - common library build-depends: , aeson ^>= 2.0.1 @@ -133,18 +123,12 @@ library executable brittany import: executable - if flag(brittany-dev-lib) - buildable: False - hs-source-dirs: source/executable main-is: Main.hs test-suite unittests import: executable - if flag(brittany-dev-lib) || !flag(brittany-test-perf) - buildable: False - type: exitcode-stdio-1.0 build-depends: , hspec ^>= 2.8.3 @@ -156,9 +140,6 @@ test-suite unittests test-suite littests import: executable - if flag(brittany-dev-lib) - buildable: False - type: exitcode-stdio-1.0 default-language: Haskell2010 build-depends: @@ -170,9 +151,6 @@ test-suite littests test-suite libinterfacetests import: executable - if flag(brittany-dev-lib) - buildable: False - type: exitcode-stdio-1.0 build-depends: , hspec ^>= 2.8.3 -- 2.30.2 From c2248cb99c6aec3d494ba1612c825000f99bba80 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 21:15:03 +0000 Subject: [PATCH 46/74] Ignore missed specializations --- brittany.cabal | 1 + 1 file changed, 1 insertion(+) diff --git a/brittany.cabal b/brittany.cabal index 7eaa0d7..ffd8d42 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -63,6 +63,7 @@ common library default-language: Haskell2010 ghc-options: -Weverything + -Wno-all-missed-specialisations -Wno-incomplete-uni-patterns -Wno-missing-deriving-strategies -Wno-missing-export-lists -- 2.30.2 From d879125264fa3bcc3f94bfd3d5aa8f72159fb20a Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 21:17:57 +0000 Subject: [PATCH 47/74] Combine unit test modules --- brittany.cabal | 3 +- src-unittests/AsymptoticPerfTests.hs | 37 ----------- src-unittests/TestMain.hs | 99 +++++++++++++++++++++++++++- src-unittests/TestUtils.hs | 75 --------------------- 4 files changed, 99 insertions(+), 115 deletions(-) delete mode 100644 src-unittests/AsymptoticPerfTests.hs delete mode 100644 src-unittests/TestUtils.hs diff --git a/brittany.cabal b/brittany.cabal index ffd8d42..ee0035b 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -72,6 +72,7 @@ common library -Wno-missing-safe-haskell-mode -Wno-monomorphism-restriction -Wno-prepositive-qualified-module + -Wno-safe -Wno-unsafe common executable @@ -134,8 +135,6 @@ test-suite unittests build-depends: , hspec ^>= 2.8.3 main-is: TestMain.hs - other-modules: TestUtils - AsymptoticPerfTests hs-source-dirs: src-unittests test-suite littests diff --git a/src-unittests/AsymptoticPerfTests.hs b/src-unittests/AsymptoticPerfTests.hs deleted file mode 100644 index 702ab90..0000000 --- a/src-unittests/AsymptoticPerfTests.hs +++ /dev/null @@ -1,37 +0,0 @@ -{-# LANGUAGE ScopedTypeVariables #-} - -module AsymptoticPerfTests where - - - -import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Data.Text as Text - -import Test.Hspec - -import TestUtils - - - -asymptoticPerfTest :: Spec -asymptoticPerfTest = do - it "10 do statements" - $ roundTripEqualWithTimeout 1500000 - $ (Text.pack "func = do\n") - <> Text.replicate 10 (Text.pack " statement\n") - it "10 do nestings" - $ roundTripEqualWithTimeout 4000000 - $ (Text.pack "func = ") - <> mconcat - ( [1 .. 10] - <&> \(i :: Int) -> - (Text.replicate (2 * i) (Text.pack " ") <> Text.pack "do\n") - ) - <> Text.replicate 2000 (Text.pack " ") - <> Text.pack "return\n" - <> Text.replicate 2002 (Text.pack " ") - <> Text.pack "()" - it "10 AppOps" - $ roundTripEqualWithTimeout 1000000 - $ (Text.pack "func = expr") - <> Text.replicate 10 (Text.pack "\n . expr") --TODO diff --git a/src-unittests/TestMain.hs b/src-unittests/TestMain.hs index 2f0f894..33af44b 100644 --- a/src-unittests/TestMain.hs +++ b/src-unittests/TestMain.hs @@ -1,6 +1,103 @@ +{-# LANGUAGE ScopedTypeVariables #-} + import Test.Hspec -import AsymptoticPerfTests +import Language.Haskell.Brittany.Internal.Prelude +import qualified Data.Maybe +import qualified Data.Semigroup as Semigroup +import qualified Data.Text as Text + +import Language.Haskell.Brittany.Internal + +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Config + +import System.Timeout ( timeout ) + +import Data.Coerce ( coerce ) + + + +import Language.Haskell.Brittany.Internal.PreludeUtils + + + +asymptoticPerfTest :: Spec +asymptoticPerfTest = do + it "10 do statements" + $ roundTripEqualWithTimeout 1500000 + $ (Text.pack "func = do\n") + <> Text.replicate 10 (Text.pack " statement\n") + it "10 do nestings" + $ roundTripEqualWithTimeout 4000000 + $ (Text.pack "func = ") + <> mconcat + ( [1 .. 10] + <&> \(i :: Int) -> + (Text.replicate (2 * i) (Text.pack " ") <> Text.pack "do\n") + ) + <> Text.replicate 2000 (Text.pack " ") + <> Text.pack "return\n" + <> Text.replicate 2002 (Text.pack " ") + <> Text.pack "()" + it "10 AppOps" + $ roundTripEqualWithTimeout 1000000 + $ (Text.pack "func = expr") + <> Text.replicate 10 (Text.pack "\n . expr") --TODO + + + +roundTripEqual :: Text -> Expectation +roundTripEqual t = + fmap (fmap PPTextWrapper) + (parsePrintModuleTests defaultTestConfig "TestFakeFileName.hs" t) + `shouldReturn` Right (PPTextWrapper t) + +roundTripEqualWithTimeout :: Int -> Text -> Expectation +roundTripEqualWithTimeout time t = + timeout time (action >>= evaluate) >>= (`shouldSatisfy`Data.Maybe.isJust) + where + action = fmap (fmap PPTextWrapper) + (parsePrintModuleTests defaultTestConfig "TestFakeFileName.hs" t) + +newtype PPTextWrapper = PPTextWrapper Text + deriving Eq + +instance Show PPTextWrapper where + show (PPTextWrapper t) = "\n" ++ Text.unpack t + +defaultTestConfig :: Config +defaultTestConfig = Config + { _conf_version = _conf_version staticDefaultConfig + , _conf_debug = _conf_debug staticDefaultConfig + , _conf_layout = LayoutConfig + { _lconfig_cols = coerce (80 :: Int) + , _lconfig_indentPolicy = coerce IndentPolicyFree + , _lconfig_indentAmount = coerce (2 :: Int) + , _lconfig_indentWhereSpecial = coerce True + , _lconfig_indentListSpecial = coerce True + , _lconfig_importColumn = coerce (60 :: Int) + , _lconfig_importAsColumn = coerce (60 :: Int) + , _lconfig_altChooser = coerce $ AltChooserBoundedSearch 3 + , _lconfig_columnAlignMode = coerce (ColumnAlignModeMajority 0.7) + , _lconfig_alignmentLimit = coerce (30 :: Int) + , _lconfig_alignmentBreakOnMultiline = coerce True + , _lconfig_hangingTypeSignature = coerce False + , _lconfig_reformatModulePreamble = coerce True + , _lconfig_allowSingleLineExportList = coerce True + , _lconfig_allowHangingQuasiQuotes = coerce True + , _lconfig_experimentalSemicolonNewlines = coerce False + -- , _lconfig_allowSinglelineRecord = coerce False + } + , _conf_errorHandling = (_conf_errorHandling staticDefaultConfig) + { _econf_ExactPrintFallback = coerce ExactPrintFallbackModeNever + } + , _conf_preprocessor = (_conf_preprocessor staticDefaultConfig) + , _conf_forward = ForwardOptions {_options_ghc = Identity []} + , _conf_roundtrip_exactprint_only = coerce False + , _conf_disable_formatting = coerce False + , _conf_obfuscate = coerce False + } diff --git a/src-unittests/TestUtils.hs b/src-unittests/TestUtils.hs deleted file mode 100644 index 942f4aa..0000000 --- a/src-unittests/TestUtils.hs +++ /dev/null @@ -1,75 +0,0 @@ -module TestUtils where - - - -import Language.Haskell.Brittany.Internal.Prelude -import qualified Data.Maybe -import qualified Data.Semigroup as Semigroup -import qualified Data.Text as Text - -import Test.Hspec - --- import NeatInterpolation - -import Language.Haskell.Brittany.Internal - -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Config - -import System.Timeout ( timeout ) - -import Data.Coerce ( coerce ) - - - -roundTripEqual :: Text -> Expectation -roundTripEqual t = - fmap (fmap PPTextWrapper) - (parsePrintModuleTests defaultTestConfig "TestFakeFileName.hs" t) - `shouldReturn` Right (PPTextWrapper t) - -roundTripEqualWithTimeout :: Int -> Text -> Expectation -roundTripEqualWithTimeout time t = - timeout time (action >>= evaluate) >>= (`shouldSatisfy`Data.Maybe.isJust) - where - action = fmap (fmap PPTextWrapper) - (parsePrintModuleTests defaultTestConfig "TestFakeFileName.hs" t) - -newtype PPTextWrapper = PPTextWrapper Text - deriving Eq - -instance Show PPTextWrapper where - show (PPTextWrapper t) = "\n" ++ Text.unpack t - -defaultTestConfig :: Config -defaultTestConfig = Config - { _conf_version = _conf_version staticDefaultConfig - , _conf_debug = _conf_debug staticDefaultConfig - , _conf_layout = LayoutConfig - { _lconfig_cols = coerce (80 :: Int) - , _lconfig_indentPolicy = coerce IndentPolicyFree - , _lconfig_indentAmount = coerce (2 :: Int) - , _lconfig_indentWhereSpecial = coerce True - , _lconfig_indentListSpecial = coerce True - , _lconfig_importColumn = coerce (60 :: Int) - , _lconfig_importAsColumn = coerce (60 :: Int) - , _lconfig_altChooser = coerce $ AltChooserBoundedSearch 3 - , _lconfig_columnAlignMode = coerce (ColumnAlignModeMajority 0.7) - , _lconfig_alignmentLimit = coerce (30 :: Int) - , _lconfig_alignmentBreakOnMultiline = coerce True - , _lconfig_hangingTypeSignature = coerce False - , _lconfig_reformatModulePreamble = coerce True - , _lconfig_allowSingleLineExportList = coerce True - , _lconfig_allowHangingQuasiQuotes = coerce True - , _lconfig_experimentalSemicolonNewlines = coerce False - -- , _lconfig_allowSinglelineRecord = coerce False - } - , _conf_errorHandling = (_conf_errorHandling staticDefaultConfig) - { _econf_ExactPrintFallback = coerce ExactPrintFallbackModeNever - } - , _conf_preprocessor = (_conf_preprocessor staticDefaultConfig) - , _conf_forward = ForwardOptions {_options_ghc = Identity []} - , _conf_roundtrip_exactprint_only = coerce False - , _conf_disable_formatting = coerce False - , _conf_obfuscate = coerce False - } -- 2.30.2 From 9a9b67d410de28356dfb7975d59d407d8f5e9c6c Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 21:21:11 +0000 Subject: [PATCH 48/74] Merge unit tests into literate tests --- brittany.cabal | 9 ---- src-literatetests/Main.hs | 39 ++++++++++++++ src-unittests/TestMain.hs | 109 -------------------------------------- 3 files changed, 39 insertions(+), 118 deletions(-) delete mode 100644 src-unittests/TestMain.hs diff --git a/brittany.cabal b/brittany.cabal index ee0035b..d659a6a 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -128,15 +128,6 @@ executable brittany hs-source-dirs: source/executable main-is: Main.hs -test-suite unittests - import: executable - - type: exitcode-stdio-1.0 - build-depends: - , hspec ^>= 2.8.3 - main-is: TestMain.hs - hs-source-dirs: src-unittests - test-suite littests import: executable diff --git a/src-literatetests/Main.hs b/src-literatetests/Main.hs index d11007b..e97252d 100644 --- a/src-literatetests/Main.hs +++ b/src-literatetests/Main.hs @@ -1,5 +1,6 @@ {-# LANGUAGE LambdaCase #-} {-# LANGUAGE MonadComprehensions #-} +{-# LANGUAGE ScopedTypeVariables #-} import Language.Haskell.Brittany.Internal.Prelude import qualified Data.Maybe @@ -25,6 +26,43 @@ import Data.Coerce ( coerce ) import qualified Data.Text.IO as Text.IO import System.FilePath ( () ) +import System.Timeout ( timeout ) + + + +import Language.Haskell.Brittany.Internal.PreludeUtils + + + +asymptoticPerfTest :: Spec +asymptoticPerfTest = do + it "10 do statements" + $ roundTripEqualWithTimeout 1500000 + $ (Text.pack "func = do\n") + <> Text.replicate 10 (Text.pack " statement\n") + it "10 do nestings" + $ roundTripEqualWithTimeout 4000000 + $ (Text.pack "func = ") + <> mconcat + ( [1 .. 10] + <&> \(i :: Int) -> + (Text.replicate (2 * i) (Text.pack " ") <> Text.pack "do\n") + ) + <> Text.replicate 2000 (Text.pack " ") + <> Text.pack "return\n" + <> Text.replicate 2002 (Text.pack " ") + <> Text.pack "()" + it "10 AppOps" + $ roundTripEqualWithTimeout 1000000 + $ (Text.pack "func = expr") + <> Text.replicate 10 (Text.pack "\n . expr") --TODO + +roundTripEqualWithTimeout :: Int -> Text -> Expectation +roundTripEqualWithTimeout time t = + timeout time (action >>= evaluate) >>= (`shouldSatisfy`Data.Maybe.isJust) + where + action = fmap (fmap PPTextWrapper) + (parsePrintModuleTests defaultTestConfig "TestFakeFileName.hs" t) data InputLine @@ -53,6 +91,7 @@ main = do inputCtxFree <- Text.IO.readFile "src-literatetests/30-tests-context-free.blt" let groupsCtxFree = createChunks inputCtxFree hspec $ do + describe "asymptotic perf roundtrips" $ asymptoticPerfTest groups `forM_` \(groupname, tests) -> do describe (Text.unpack groupname) $ do tests `forM_` \test -> do diff --git a/src-unittests/TestMain.hs b/src-unittests/TestMain.hs deleted file mode 100644 index 33af44b..0000000 --- a/src-unittests/TestMain.hs +++ /dev/null @@ -1,109 +0,0 @@ -{-# LANGUAGE ScopedTypeVariables #-} - -import Test.Hspec - -import Language.Haskell.Brittany.Internal.Prelude -import qualified Data.Maybe -import qualified Data.Semigroup as Semigroup -import qualified Data.Text as Text - -import Language.Haskell.Brittany.Internal - -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Config - -import System.Timeout ( timeout ) - -import Data.Coerce ( coerce ) - - - -import Language.Haskell.Brittany.Internal.PreludeUtils - - - -asymptoticPerfTest :: Spec -asymptoticPerfTest = do - it "10 do statements" - $ roundTripEqualWithTimeout 1500000 - $ (Text.pack "func = do\n") - <> Text.replicate 10 (Text.pack " statement\n") - it "10 do nestings" - $ roundTripEqualWithTimeout 4000000 - $ (Text.pack "func = ") - <> mconcat - ( [1 .. 10] - <&> \(i :: Int) -> - (Text.replicate (2 * i) (Text.pack " ") <> Text.pack "do\n") - ) - <> Text.replicate 2000 (Text.pack " ") - <> Text.pack "return\n" - <> Text.replicate 2002 (Text.pack " ") - <> Text.pack "()" - it "10 AppOps" - $ roundTripEqualWithTimeout 1000000 - $ (Text.pack "func = expr") - <> Text.replicate 10 (Text.pack "\n . expr") --TODO - - - -roundTripEqual :: Text -> Expectation -roundTripEqual t = - fmap (fmap PPTextWrapper) - (parsePrintModuleTests defaultTestConfig "TestFakeFileName.hs" t) - `shouldReturn` Right (PPTextWrapper t) - -roundTripEqualWithTimeout :: Int -> Text -> Expectation -roundTripEqualWithTimeout time t = - timeout time (action >>= evaluate) >>= (`shouldSatisfy`Data.Maybe.isJust) - where - action = fmap (fmap PPTextWrapper) - (parsePrintModuleTests defaultTestConfig "TestFakeFileName.hs" t) - -newtype PPTextWrapper = PPTextWrapper Text - deriving Eq - -instance Show PPTextWrapper where - show (PPTextWrapper t) = "\n" ++ Text.unpack t - -defaultTestConfig :: Config -defaultTestConfig = Config - { _conf_version = _conf_version staticDefaultConfig - , _conf_debug = _conf_debug staticDefaultConfig - , _conf_layout = LayoutConfig - { _lconfig_cols = coerce (80 :: Int) - , _lconfig_indentPolicy = coerce IndentPolicyFree - , _lconfig_indentAmount = coerce (2 :: Int) - , _lconfig_indentWhereSpecial = coerce True - , _lconfig_indentListSpecial = coerce True - , _lconfig_importColumn = coerce (60 :: Int) - , _lconfig_importAsColumn = coerce (60 :: Int) - , _lconfig_altChooser = coerce $ AltChooserBoundedSearch 3 - , _lconfig_columnAlignMode = coerce (ColumnAlignModeMajority 0.7) - , _lconfig_alignmentLimit = coerce (30 :: Int) - , _lconfig_alignmentBreakOnMultiline = coerce True - , _lconfig_hangingTypeSignature = coerce False - , _lconfig_reformatModulePreamble = coerce True - , _lconfig_allowSingleLineExportList = coerce True - , _lconfig_allowHangingQuasiQuotes = coerce True - , _lconfig_experimentalSemicolonNewlines = coerce False - -- , _lconfig_allowSinglelineRecord = coerce False - } - , _conf_errorHandling = (_conf_errorHandling staticDefaultConfig) - { _econf_ExactPrintFallback = coerce ExactPrintFallbackModeNever - } - , _conf_preprocessor = (_conf_preprocessor staticDefaultConfig) - , _conf_forward = ForwardOptions {_options_ghc = Identity []} - , _conf_roundtrip_exactprint_only = coerce False - , _conf_disable_formatting = coerce False - , _conf_obfuscate = coerce False - } - - - -main :: IO () -main = hspec $ tests - -tests :: Spec -tests = do - describe "asymptotic perf roundtrips" $ asymptoticPerfTest -- 2.30.2 From 5631e2500fc762600c3149d1720fcc5fa0c1cd61 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 21:23:06 +0000 Subject: [PATCH 49/74] Merge interface tests into literate tests --- brittany.cabal | 9 --------- src-libinterfacetests/Main.hs | 27 --------------------------- src-literatetests/Main.hs | 18 ++++++++++++++++++ 3 files changed, 18 insertions(+), 36 deletions(-) delete mode 100644 src-libinterfacetests/Main.hs diff --git a/brittany.cabal b/brittany.cabal index d659a6a..3589ed9 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -138,12 +138,3 @@ test-suite littests , parsec ^>= 3.1.14 main-is: Main.hs hs-source-dirs: src-literatetests - -test-suite libinterfacetests - import: executable - - type: exitcode-stdio-1.0 - build-depends: - , hspec ^>= 2.8.3 - main-is: Main.hs - hs-source-dirs: src-libinterfacetests diff --git a/src-libinterfacetests/Main.hs b/src-libinterfacetests/Main.hs deleted file mode 100644 index 2d1924f..0000000 --- a/src-libinterfacetests/Main.hs +++ /dev/null @@ -1,27 +0,0 @@ -import Test.Hspec -import Language.Haskell.Brittany -import qualified Data.Text as Text -import Control.Monad.IO.Class - - - -main :: IO () -main = hspec $ do - describe "library interface basic functionality" $ do - it "gives properly formatted result for valid input" $ do - let - input = Text.pack $ unlines - ["func = [00000000000000000000000, 00000000000000000000000, 00000000000000000000000, 00000000000000000000000]"] - let expected = Text.pack $ unlines - [ "func =" - , " [ 00000000000000000000000" - , " , 00000000000000000000000" - , " , 00000000000000000000000" - , " , 00000000000000000000000" - , " ]" - ] - output <- liftIO $ parsePrintModule staticDefaultConfig input - hush output `shouldBe` Just expected - -hush :: Either a b -> Maybe b -hush = either (const Nothing) Just diff --git a/src-literatetests/Main.hs b/src-literatetests/Main.hs index e97252d..dbc2ee5 100644 --- a/src-literatetests/Main.hs +++ b/src-literatetests/Main.hs @@ -32,6 +32,9 @@ import System.Timeout ( timeout ) import Language.Haskell.Brittany.Internal.PreludeUtils +hush :: Either a b -> Maybe b +hush = either (const Nothing) Just + asymptoticPerfTest :: Spec @@ -92,6 +95,21 @@ main = do let groupsCtxFree = createChunks inputCtxFree hspec $ do describe "asymptotic perf roundtrips" $ asymptoticPerfTest + describe "library interface basic functionality" $ do + it "gives properly formatted result for valid input" $ do + let + input = Text.pack $ unlines + ["func = [00000000000000000000000, 00000000000000000000000, 00000000000000000000000, 00000000000000000000000]"] + let expected = Text.pack $ unlines + [ "func =" + , " [ 00000000000000000000000" + , " , 00000000000000000000000" + , " , 00000000000000000000000" + , " , 00000000000000000000000" + , " ]" + ] + output <- liftIO $ parsePrintModule staticDefaultConfig input + hush output `shouldBe` Just expected groups `forM_` \(groupname, tests) -> do describe (Text.unpack groupname) $ do tests `forM_` \test -> do -- 2.30.2 From 93ba90e64615e4139b4f28a9e95616b897cd1a4b Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 21:23:49 +0000 Subject: [PATCH 50/74] Rename test suite --- brittany.cabal | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/brittany.cabal b/brittany.cabal index 3589ed9..a7cacdc 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -128,7 +128,7 @@ executable brittany hs-source-dirs: source/executable main-is: Main.hs -test-suite littests +test-suite brittany-test-suite import: executable type: exitcode-stdio-1.0 -- 2.30.2 From 79be0ed2002c94d5f217c66c0d2894c5cf5ca085 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 21:25:04 +0000 Subject: [PATCH 51/74] Move test suite --- brittany.cabal | 7 +++---- {src-literatetests => source/test-suite}/Main.hs | 0 2 files changed, 3 insertions(+), 4 deletions(-) rename {src-literatetests => source/test-suite}/Main.hs (100%) diff --git a/brittany.cabal b/brittany.cabal index a7cacdc..4fafd8d 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -131,10 +131,9 @@ executable brittany test-suite brittany-test-suite import: executable - type: exitcode-stdio-1.0 - default-language: Haskell2010 build-depends: , hspec ^>= 2.8.3 , parsec ^>= 3.1.14 - main-is: Main.hs - hs-source-dirs: src-literatetests + hs-source-dirs: source/test-suite + main-is: Main.hs + type: exitcode-stdio-1.0 diff --git a/src-literatetests/Main.hs b/source/test-suite/Main.hs similarity index 100% rename from src-literatetests/Main.hs rename to source/test-suite/Main.hs -- 2.30.2 From e22a647baaba25424dfd04028aae9dca05707e7c Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 21:28:23 +0000 Subject: [PATCH 52/74] Move literate test files --- brittany.cabal | 2 +- {src-literatetests => data}/10-tests.blt | 0 {src-literatetests => data}/14-extensions.blt | 0 {src-literatetests => data}/15-regressions.blt | 0 {src-literatetests => data}/16-pending.blt | 0 {src-literatetests => data}/30-tests-context-free.blt | 0 {src-literatetests => data}/40-indent-policy-multiple.blt | 0 source/test-suite/Main.hs | 6 +++--- 8 files changed, 4 insertions(+), 4 deletions(-) rename {src-literatetests => data}/10-tests.blt (100%) rename {src-literatetests => data}/14-extensions.blt (100%) rename {src-literatetests => data}/15-regressions.blt (100%) rename {src-literatetests => data}/16-pending.blt (100%) rename {src-literatetests => data}/30-tests-context-free.blt (100%) rename {src-literatetests => data}/40-indent-policy-multiple.blt (100%) diff --git a/brittany.cabal b/brittany.cabal index 4fafd8d..d8574e4 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -24,7 +24,7 @@ extra-doc-files: README.md doc/implementation/*.md extra-source-files: - src-literatetests/*.blt + data/*.blt source-repository head type: git diff --git a/src-literatetests/10-tests.blt b/data/10-tests.blt similarity index 100% rename from src-literatetests/10-tests.blt rename to data/10-tests.blt diff --git a/src-literatetests/14-extensions.blt b/data/14-extensions.blt similarity index 100% rename from src-literatetests/14-extensions.blt rename to data/14-extensions.blt diff --git a/src-literatetests/15-regressions.blt b/data/15-regressions.blt similarity index 100% rename from src-literatetests/15-regressions.blt rename to data/15-regressions.blt diff --git a/src-literatetests/16-pending.blt b/data/16-pending.blt similarity index 100% rename from src-literatetests/16-pending.blt rename to data/16-pending.blt diff --git a/src-literatetests/30-tests-context-free.blt b/data/30-tests-context-free.blt similarity index 100% rename from src-literatetests/30-tests-context-free.blt rename to data/30-tests-context-free.blt diff --git a/src-literatetests/40-indent-policy-multiple.blt b/data/40-indent-policy-multiple.blt similarity index 100% rename from src-literatetests/40-indent-policy-multiple.blt rename to data/40-indent-policy-multiple.blt diff --git a/source/test-suite/Main.hs b/source/test-suite/Main.hs index dbc2ee5..774088f 100644 --- a/source/test-suite/Main.hs +++ b/source/test-suite/Main.hs @@ -84,14 +84,14 @@ data TestCase = TestCase main :: IO () main = do - files <- System.Directory.listDirectory "src-literatetests/" + files <- System.Directory.listDirectory "data/" let blts = List.sort $ filter (\x -> not ("tests-context-free.blt" `isSuffixOf` x)) $ filter (".blt" `isSuffixOf`) files - inputs <- blts `forM` \blt -> Text.IO.readFile ("src-literatetests" blt) + inputs <- blts `forM` \blt -> Text.IO.readFile ("data" blt) let groups = createChunks =<< inputs - inputCtxFree <- Text.IO.readFile "src-literatetests/30-tests-context-free.blt" + inputCtxFree <- Text.IO.readFile "data/30-tests-context-free.blt" let groupsCtxFree = createChunks inputCtxFree hspec $ do describe "asymptotic perf roundtrips" $ asymptoticPerfTest -- 2.30.2 From 93172bfd21386be2022c669d6a9f5a8402aeb6cb Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 21:30:05 +0000 Subject: [PATCH 53/74] Add flag for turning warnings into errors --- .github/workflows/ci.yaml | 2 +- brittany.cabal | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index cc3cd3e..ce15348 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -25,7 +25,7 @@ jobs: with: ghc-version: ${{ matrix.ghc }} cabal-version: ${{ matrix.cabal }} - - run: cabal configure --enable-tests + - run: cabal configure --enable-tests --flags pedantic --jobs - run: cabal freeze - run: cat cabal.project.freeze - uses: actions/cache@v2 diff --git a/brittany.cabal b/brittany.cabal index d8574e4..79d5b8b 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -30,6 +30,11 @@ source-repository head type: git location: https://github.com/lspitzner/brittany.git +flag pedantic + default: False + description: Enables @-Werror@, which turns warnings into errors. + manual: True + common library build-depends: , aeson ^>= 2.0.1 @@ -75,6 +80,9 @@ common library -Wno-safe -Wno-unsafe + if flag(pedantic) + ghc-options: -Werror + common executable import: library -- 2.30.2 From 694ce973f4ff7b519c467f3aae97a96681458c1f Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 21:31:23 +0000 Subject: [PATCH 54/74] Remove Travis CI config --- .travis.yml | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index ee15e0e..0000000 --- a/.travis.yml +++ /dev/null @@ -1 +0,0 @@ -language: minimal -- 2.30.2 From 51ca8fd5d7e8d8f0a7ffc63de5d6ba62141eaaba Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 21:31:55 +0000 Subject: [PATCH 55/74] Remove Nix configuration --- README.md | 18 ------------------ default.nix | 18 ------------------ 2 files changed, 36 deletions(-) delete mode 100644 default.nix diff --git a/README.md b/README.md index 5ee23ac..d88aed4 100644 --- a/README.md +++ b/README.md @@ -68,12 +68,6 @@ log the size of the input, but _not_ the full input/output of requests.) you may want to clone the repo and try again (there are several stack.yamls included). -- via `nix`: - ~~~.sh - nix build - nix-env -i ./result - ~~~ - - via `cabal` Due to constant changes to the cabal UI, I have given up on making sure @@ -103,18 +97,6 @@ log the size of the input, but _not_ the full input/output of requests.) # Development tips -## Run a hoogle server - -To host a local Hoogle server with all of Brittany's dependencies run: - -```sh -echo brittany.cabal | - $(nix-build '' --no-link -A entr)/bin/entr -r -- \ - sh -c "nix-shell --run 'hoogle server --local'" -``` - -This will watch `brittany.cabal` for changes and restart the server when new dependencies are added there. - # Editor Integration #### Sublime text diff --git a/default.nix b/default.nix deleted file mode 100644 index ed3dcca..0000000 --- a/default.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ nixpkgsSrc ? builtins.fetchTarball { - url = - "https://github.com/nixos/nixpkgs/archive/069f183f16c3ea5d4b6e7625433b92eba77534f7.tar.gz"; # nixos-unstable - sha256 = "1by9rqvr2k6iz2yipf89yaj254yicpwq384ijgyy8p71lfxbbww2"; -}, pkgs ? import nixpkgsSrc { }, compiler ? null, forShell ? pkgs.lib.inNixShell -}: - -let - haskellPackages = if compiler == null then - pkgs.haskellPackages - else - pkgs.haskell.packages.${compiler}; - -in haskellPackages.developPackage { - name = "brittany"; - root = pkgs.nix-gitignore.gitignoreSource [ ] ./.; - returnShellEnv = forShell; -} -- 2.30.2 From a1cd4c5ed5609c418c524962590328b2f42e70cd Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 21:32:31 +0000 Subject: [PATCH 56/74] Remove Make configuration --- Makefile | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 Makefile diff --git a/Makefile b/Makefile deleted file mode 100644 index 2d5b809..0000000 --- a/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -.PHONY: test -test: - echo "test" - stack test - -.PHONY: test-all -test-all: - $(MAKE) test test-8.8.4 test-8.6.5 - -.PHONY: test-8.8.4 -test-8.8.4: - echo "test 8.8.4" - stack test --stack-yaml stack-8.8.4.yaml --work-dir .stack-work-8.8.4 - -.PHONY: test-8.6.5 -test-8.6.5: - echo "test 8.6.5" - stack test --stack-yaml stack-8.6.5.yaml --work-dir .stack-work-8.6.5 -- 2.30.2 From 4ee386a32378c09d52f1bcfd5185f86c16f671ff Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 21:32:54 +0000 Subject: [PATCH 57/74] Remove unnecessary setup script --- Setup.hs | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 Setup.hs diff --git a/Setup.hs b/Setup.hs deleted file mode 100644 index 9a994af..0000000 --- a/Setup.hs +++ /dev/null @@ -1,2 +0,0 @@ -import Distribution.Simple -main = defaultMain -- 2.30.2 From fdbbe9803df873c8e0eefde0e9f3b55dd316513c Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 21:33:44 +0000 Subject: [PATCH 58/74] Try to spend less time compressing binaries --- .github/workflows/ci.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index ce15348..e3b50a2 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -43,7 +43,6 @@ jobs: - uses: svenstaro/upx-action@v2 with: file: artifact/${{ matrix.os }}/brittany${{ matrix.ext }} - args: --best - uses: actions/upload-artifact@v2 with: path: artifact -- 2.30.2 From 208240b62feaee203c2232bf9d73278d35b907ec Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 21:36:35 +0000 Subject: [PATCH 59/74] Remvoe old Stack configs --- stack-8.6.5.yaml | 1 - stack-8.6.5.yaml.lock | 12 ------------ stack-8.8.4.yaml | 1 - stack-8.8.4.yaml.lock | 12 ------------ 4 files changed, 26 deletions(-) delete mode 100644 stack-8.6.5.yaml delete mode 100644 stack-8.6.5.yaml.lock delete mode 100644 stack-8.8.4.yaml delete mode 100644 stack-8.8.4.yaml.lock diff --git a/stack-8.6.5.yaml b/stack-8.6.5.yaml deleted file mode 100644 index 785b146..0000000 --- a/stack-8.6.5.yaml +++ /dev/null @@ -1 +0,0 @@ -resolver: lts-14.27 diff --git a/stack-8.6.5.yaml.lock b/stack-8.6.5.yaml.lock deleted file mode 100644 index e24dcac..0000000 --- a/stack-8.6.5.yaml.lock +++ /dev/null @@ -1,12 +0,0 @@ -# This file was autogenerated by Stack. -# You should not edit this file by hand. -# For more information, please see the documentation at: -# https://docs.haskellstack.org/en/stable/lock_files - -packages: [] -snapshots: -- completed: - size: 524996 - url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/14/27.yaml - sha256: 7ea31a280c56bf36ff591a7397cc384d0dff622e7f9e4225b47d8980f019a0f0 - original: lts-14.27 diff --git a/stack-8.8.4.yaml b/stack-8.8.4.yaml deleted file mode 100644 index d014f95..0000000 --- a/stack-8.8.4.yaml +++ /dev/null @@ -1 +0,0 @@ -resolver: lts-16.25 diff --git a/stack-8.8.4.yaml.lock b/stack-8.8.4.yaml.lock deleted file mode 100644 index 31befa1..0000000 --- a/stack-8.8.4.yaml.lock +++ /dev/null @@ -1,12 +0,0 @@ -# This file was autogenerated by Stack. -# You should not edit this file by hand. -# For more information, please see the documentation at: -# https://docs.haskellstack.org/en/stable/lock_files - -packages: [] -snapshots: -- completed: - size: 533252 - url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/lts/16/25.yaml - sha256: 147598b98bdd95ec0409bac125a4f1bff3cd4f8d73334d283d098f66a4bcc053 - original: lts-16.25 -- 2.30.2 From ac81c5ce9033bd88e38d0a4f63d70ce06114e718 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 21:44:30 +0000 Subject: [PATCH 60/74] Update Stack config --- stack.yaml | 13 +++++++++-- stack.yaml.lock | 61 +++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 68 insertions(+), 6 deletions(-) diff --git a/stack.yaml b/stack.yaml index 9989a09..647404b 100644 --- a/stack.yaml +++ b/stack.yaml @@ -1,4 +1,13 @@ -resolver: nightly-2020-12-09 - +system-ghc: true +allow-newer: true +resolver: nightly-2021-11-06 extra-deps: + - aeson-2.0.1.0 + - butcher-1.3.3.2 + - Cabal-3.6.2.0 - data-tree-print-0.1.0.2 + - multistate-0.8.0.3 + - parsec-3.1.14.0 + - text-1.2.5.0 + - git: https://github.com/mithrandi/czipwith + commit: b6245884ae83e00dd2b5261762549b37390179f8 diff --git a/stack.yaml.lock b/stack.yaml.lock index 91c9355..087338e 100644 --- a/stack.yaml.lock +++ b/stack.yaml.lock @@ -4,6 +4,27 @@ # https://docs.haskellstack.org/en/stable/lock_files packages: +- completed: + hackage: aeson-2.0.1.0@sha256:ee0847af4d1fb9ece3f24f443d8d8406431c32688a57880314ac36617da937eb,6229 + pantry-tree: + size: 37910 + sha256: e7a9eec09f1ea56548b07c7e82b53bf32a974827ffc402d852c667b5f5d89efd + original: + hackage: aeson-2.0.1.0 +- completed: + hackage: butcher-1.3.3.2@sha256:0be5b914f648ec9c63cb88730d983602aef829a7c8c31343952e4642e6b52a84,3150 + pantry-tree: + size: 1197 + sha256: 96fe696234de07e4d9253d80ddf189f8cfaf2e262e977438343a6069677a39d2 + original: + hackage: butcher-1.3.3.2 +- completed: + hackage: Cabal-3.6.2.0@sha256:e2266e14758c1f799220fad7f0d4b0b4ec567d81b7ba3faea17ff76d4c31de95,12437 + pantry-tree: + size: 19757 + sha256: 6650e54cbbcda6d05c4d8b8094fa61e5ffbda15a798a354d2dad5b35dc3b2859 + original: + hackage: Cabal-3.6.2.0 - completed: hackage: data-tree-print-0.1.0.2@sha256:d845e99f322df70e0c06d6743bf80336f5918d5423498528beb0593a2afc1703,1620 pantry-tree: @@ -11,9 +32,41 @@ packages: sha256: b8778eb1b16fddb91b2eed2b25f33a89d1e4f7a533160de4ccbf226f82456135 original: hackage: data-tree-print-0.1.0.2 +- completed: + hackage: multistate-0.8.0.3@sha256:49d600399f3a4bfd8c8ba2e924c6592e84915b63c52970818982baa274cd9ac3,3588 + pantry-tree: + size: 2143 + sha256: 73b47c11a753963b033b79209a66490013da35854dd1064b3633dd23c3fa5650 + original: + hackage: multistate-0.8.0.3 +- completed: + hackage: text-1.2.5.0@sha256:791f0f6c97ed96113f17ab520cf0efe1a3a4f883a8c85910a5660567c8241c40,7895 + pantry-tree: + size: 7395 + sha256: f41504ec5c04a3f3358ef104362f02fdef29cbce4e5e4e6dbd6b6db70c40d4bf + original: + hackage: text-1.2.5.0 +- completed: + hackage: parsec-3.1.14.0@sha256:72d5c57e6e126adaa781ab97b19dc76f68490c0a3d88f14038219994cabe94e1,4356 + pantry-tree: + size: 2574 + sha256: 495a86688c6e89faf38b8804cc4c9216709e9a6a93cf56c2f07d5bef83f09a17 + original: + hackage: parsec-3.1.14.0 +- completed: + name: czipwith + version: 1.0.1.3 + git: https://github.com/mithrandi/czipwith + pantry-tree: + size: 964 + sha256: 239a37e26558e6272c07dc280ee07a83407ed6b86000047ddb979726c23818c4 + commit: b6245884ae83e00dd2b5261762549b37390179f8 + original: + git: https://github.com/mithrandi/czipwith + commit: b6245884ae83e00dd2b5261762549b37390179f8 snapshots: - completed: - size: 556768 - url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/nightly/2020/12/9.yaml - sha256: bca31ebf05f842be9dd24410eca84f296da1860369a82eb7466f447a76cca762 - original: nightly-2020-12-09 + size: 594850 + url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/nightly/2021/11/6.yaml + sha256: b5d7eef8b8b34d08a9604179e2594a9a5025d872146556b51f9d2f7bfead834b + original: nightly-2021-11-06 -- 2.30.2 From 4398b5880d05340e31186c2460c300b6698dadd4 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sat, 6 Nov 2021 22:29:34 +0000 Subject: [PATCH 61/74] Format Brittany with Brittany --- brittany.yaml | 5 + source/library/Language/Haskell/Brittany.hs | 14 +- .../Language/Haskell/Brittany/Internal.hs | 545 ++++--- .../Haskell/Brittany/Internal/Backend.hs | 540 ++++--- .../Haskell/Brittany/Internal/BackendUtils.hs | 316 ++-- .../Haskell/Brittany/Internal/Config.hs | 275 ++-- .../Haskell/Brittany/Internal/Config/Types.hs | 88 +- .../Internal/Config/Types/Instances.hs | 35 +- .../Brittany/Internal/ExactPrintUtils.hs | 170 +- .../Brittany/Internal/LayouterBasics.hs | 220 ++- .../Brittany/Internal/Layouters/DataDecl.hs | 394 +++-- .../Brittany/Internal/Layouters/Decl.hs | 992 ++++++------ .../Brittany/Internal/Layouters/Expr.hs | 1229 +++++++------- .../Brittany/Internal/Layouters/Expr.hs-boot | 13 +- .../Haskell/Brittany/Internal/Layouters/IE.hs | 149 +- .../Brittany/Internal/Layouters/Import.hs | 201 +-- .../Brittany/Internal/Layouters/Module.hs | 128 +- .../Brittany/Internal/Layouters/Pattern.hs | 109 +- .../Brittany/Internal/Layouters/Stmt.hs | 52 +- .../Brittany/Internal/Layouters/Stmt.hs-boot | 11 +- .../Brittany/Internal/Layouters/Type.hs | 448 +++--- .../Haskell/Brittany/Internal/Obfuscation.hs | 30 +- .../Haskell/Brittany/Internal/Prelude.hs | 537 +++---- .../Haskell/Brittany/Internal/PreludeUtils.hs | 26 +- .../Brittany/Internal/Transformations/Alt.hs | 1415 +++++++++-------- .../Internal/Transformations/Columns.hs | 208 +-- .../Internal/Transformations/Floating.hs | 378 ++--- .../Internal/Transformations/Indent.hs | 32 +- .../Brittany/Internal/Transformations/Par.hs | 40 +- .../Haskell/Brittany/Internal/Types.hs | 268 ++-- .../Haskell/Brittany/Internal/Utils.hs | 141 +- .../library/Language/Haskell/Brittany/Main.hs | 296 ++-- source/test-suite/Main.hs | 182 +-- 33 files changed, 4688 insertions(+), 4799 deletions(-) create mode 100644 brittany.yaml diff --git a/brittany.yaml b/brittany.yaml new file mode 100644 index 0000000..fba01fd --- /dev/null +++ b/brittany.yaml @@ -0,0 +1,5 @@ +conf_layout: + lconfig_cols: 79 + lconfig_columnAlignMode: + tag: ColumnAlignModeDisabled + lconfig_indentPolicy: IndentPolicyLeft diff --git a/source/library/Language/Haskell/Brittany.hs b/source/library/Language/Haskell/Brittany.hs index 8c225c6..a2726c8 100644 --- a/source/library/Language/Haskell/Brittany.hs +++ b/source/library/Language/Haskell/Brittany.hs @@ -16,13 +16,9 @@ module Language.Haskell.Brittany , CForwardOptions(..) , CPreProcessorConfig(..) , BrittanyError(..) - ) -where + ) where - - - -import Language.Haskell.Brittany.Internal -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Config +import Language.Haskell.Brittany.Internal +import Language.Haskell.Brittany.Internal.Config +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Types diff --git a/source/library/Language/Haskell/Brittany/Internal.hs b/source/library/Language/Haskell/Brittany/Internal.hs index 71e885b..f2f0fdc 100644 --- a/source/library/Language/Haskell/Brittany/Internal.hs +++ b/source/library/Language/Haskell/Brittany/Internal.hs @@ -12,68 +12,52 @@ module Language.Haskell.Brittany.Internal , parseModuleFromString , extractCommentConfigs , getTopLevelDeclNameMap - ) -where + ) where - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils +import Control.Monad.Trans.Except import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS import qualified Data.ByteString.Char8 +import Data.CZipWith +import Data.Char (isSpace) +import Data.HList.HList import qualified Data.Map as Map import qualified Data.Maybe import qualified Data.Semigroup as Semigroup import qualified Data.Sequence as Seq import qualified Data.Text as Text import qualified Data.Text.Lazy as TextL -import qualified GHC.OldList as List - --- brittany { lconfig_importAsColumn: 60, lconfig_importColumn: 60 } -import qualified Language.Haskell.GHC.ExactPrint as ExactPrint -import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint -import qualified Language.Haskell.GHC.ExactPrint.Parsers as ExactPrint.Parsers - -import Control.Monad.Trans.Except -import Data.HList.HList +import qualified Data.Text.Lazy.Builder as Text.Builder import qualified Data.Yaml -import Data.CZipWith -import qualified UI.Butcher.Monadic as Butcher - -import qualified Data.Text.Lazy.Builder as Text.Builder - -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Config -import Language.Haskell.Brittany.Internal.LayouterBasics - -import Language.Haskell.Brittany.Internal.Layouters.Decl -import Language.Haskell.Brittany.Internal.Layouters.Module -import Language.Haskell.Brittany.Internal.Utils -import Language.Haskell.Brittany.Internal.Backend -import Language.Haskell.Brittany.Internal.BackendUtils -import Language.Haskell.Brittany.Internal.ExactPrintUtils - -import Language.Haskell.Brittany.Internal.Transformations.Alt -import Language.Haskell.Brittany.Internal.Transformations.Floating -import Language.Haskell.Brittany.Internal.Transformations.Par -import Language.Haskell.Brittany.Internal.Transformations.Columns -import Language.Haskell.Brittany.Internal.Transformations.Indent - -import qualified GHC - hiding ( parseModule ) -import GHC.Parser.Annotation ( AnnKeywordId(..) ) -import GHC ( GenLocated(L) - ) -import GHC.Types.SrcLoc ( SrcSpan ) -import GHC.Hs -import GHC.Data.Bag -import qualified GHC.Driver.Session as GHC -import qualified GHC.LanguageExtensions.Type as GHC - -import Data.Char ( isSpace ) - - +import qualified GHC hiding (parseModule) +import GHC (GenLocated(L)) +import GHC.Data.Bag +import qualified GHC.Driver.Session as GHC +import GHC.Hs +import qualified GHC.LanguageExtensions.Type as GHC +import qualified GHC.OldList as List +import GHC.Parser.Annotation (AnnKeywordId(..)) +import GHC.Types.SrcLoc (SrcSpan) +import Language.Haskell.Brittany.Internal.Backend +import Language.Haskell.Brittany.Internal.BackendUtils +import Language.Haskell.Brittany.Internal.Config +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.ExactPrintUtils +import Language.Haskell.Brittany.Internal.LayouterBasics +import Language.Haskell.Brittany.Internal.Layouters.Decl +import Language.Haskell.Brittany.Internal.Layouters.Module +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Transformations.Alt +import Language.Haskell.Brittany.Internal.Transformations.Columns +import Language.Haskell.Brittany.Internal.Transformations.Floating +import Language.Haskell.Brittany.Internal.Transformations.Indent +import Language.Haskell.Brittany.Internal.Transformations.Par +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.Utils +import qualified Language.Haskell.GHC.ExactPrint as ExactPrint +import qualified Language.Haskell.GHC.ExactPrint.Parsers as ExactPrint.Parsers +import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint +import qualified UI.Butcher.Monadic as Butcher data InlineConfigTarget = InlineConfigTargetModule @@ -91,35 +75,36 @@ extractCommentConfigs anns (TopLevelDeclNameMap declNameMap) = do [ ( k , [ x | (ExactPrint.Comment x _ _, _) <- - ( ExactPrint.annPriorComments ann + (ExactPrint.annPriorComments ann ++ ExactPrint.annFollowingComments ann ) ] - ++ [ x - | (ExactPrint.AnnComment (ExactPrint.Comment x _ _), _) <- - ExactPrint.annsDP ann - ] + ++ [ x + | (ExactPrint.AnnComment (ExactPrint.Comment x _ _), _) <- + ExactPrint.annsDP ann + ] ) | (k, ann) <- Map.toList anns ] - let configLiness = commentLiness <&> second - (Data.Maybe.mapMaybe $ \line -> do - l1 <- - List.stripPrefix "-- BRITTANY" line - <|> List.stripPrefix "--BRITTANY" line - <|> List.stripPrefix "-- brittany" line - <|> List.stripPrefix "--brittany" line - <|> (List.stripPrefix "{- BRITTANY" line >>= stripSuffix "-}") - let l2 = dropWhile isSpace l1 - guard - ( ("@" `isPrefixOf` l2) - || ("-disable" `isPrefixOf` l2) - || ("-next" `isPrefixOf` l2) - || ("{" `isPrefixOf` l2) - || ("--" `isPrefixOf` l2) - ) - pure l2 - ) + let + configLiness = commentLiness <&> second + (Data.Maybe.mapMaybe $ \line -> do + l1 <- + List.stripPrefix "-- BRITTANY" line + <|> List.stripPrefix "--BRITTANY" line + <|> List.stripPrefix "-- brittany" line + <|> List.stripPrefix "--brittany" line + <|> (List.stripPrefix "{- BRITTANY" line >>= stripSuffix "-}") + let l2 = dropWhile isSpace l1 + guard + (("@" `isPrefixOf` l2) + || ("-disable" `isPrefixOf` l2) + || ("-next" `isPrefixOf` l2) + || ("{" `isPrefixOf` l2) + || ("--" `isPrefixOf` l2) + ) + pure l2 + ) let configParser = Butcher.addAlternatives [ ( "commandline-config" @@ -138,39 +123,44 @@ extractCommentConfigs anns (TopLevelDeclNameMap declNameMap) = do ] parser = do -- we will (mis?)use butcher here to parse the inline config -- line. - let nextDecl = do - conf <- configParser - Butcher.addCmdImpl (InlineConfigTargetNextDecl, conf) + let + nextDecl = do + conf <- configParser + Butcher.addCmdImpl (InlineConfigTargetNextDecl, conf) Butcher.addCmd "-next-declaration" nextDecl Butcher.addCmd "-Next-Declaration" nextDecl Butcher.addCmd "-NEXT-DECLARATION" nextDecl - let nextBinding = do - conf <- configParser - Butcher.addCmdImpl (InlineConfigTargetNextBinding, conf) + let + nextBinding = do + conf <- configParser + Butcher.addCmdImpl (InlineConfigTargetNextBinding, conf) Butcher.addCmd "-next-binding" nextBinding Butcher.addCmd "-Next-Binding" nextBinding Butcher.addCmd "-NEXT-BINDING" nextBinding - let disableNextBinding = do - Butcher.addCmdImpl - ( InlineConfigTargetNextBinding - , mempty { _conf_roundtrip_exactprint_only = pure $ pure True } - ) + let + disableNextBinding = do + Butcher.addCmdImpl + ( InlineConfigTargetNextBinding + , mempty { _conf_roundtrip_exactprint_only = pure $ pure True } + ) Butcher.addCmd "-disable-next-binding" disableNextBinding Butcher.addCmd "-Disable-Next-Binding" disableNextBinding Butcher.addCmd "-DISABLE-NEXT-BINDING" disableNextBinding - let disableNextDecl = do - Butcher.addCmdImpl - ( InlineConfigTargetNextDecl - , mempty { _conf_roundtrip_exactprint_only = pure $ pure True } - ) + let + disableNextDecl = do + Butcher.addCmdImpl + ( InlineConfigTargetNextDecl + , mempty { _conf_roundtrip_exactprint_only = pure $ pure True } + ) Butcher.addCmd "-disable-next-declaration" disableNextDecl Butcher.addCmd "-Disable-Next-Declaration" disableNextDecl Butcher.addCmd "-DISABLE-NEXT-DECLARATION" disableNextDecl - let disableFormatting = do - Butcher.addCmdImpl - ( InlineConfigTargetModule - , mempty { _conf_disable_formatting = pure $ pure True } - ) + let + disableFormatting = do + Butcher.addCmdImpl + ( InlineConfigTargetModule + , mempty { _conf_disable_formatting = pure $ pure True } + ) Butcher.addCmd "-disable" disableFormatting Butcher.addCmd "@" $ do -- Butcher.addCmd "module" $ do @@ -178,41 +168,42 @@ extractCommentConfigs anns (TopLevelDeclNameMap declNameMap) = do -- Butcher.addCmdImpl (InlineConfigTargetModule, conf) Butcher.addNullCmd $ do bindingName <- Butcher.addParamString "BINDING" mempty - conf <- configParser + conf <- configParser Butcher.addCmdImpl (InlineConfigTargetBinding bindingName, conf) conf <- configParser Butcher.addCmdImpl (InlineConfigTargetModule, conf) lineConfigss <- configLiness `forM` \(k, ss) -> do r <- ss `forM` \s -> case Butcher.runCmdParserSimple s parser of - Left err -> Left $ (err, s) - Right c -> Right $ c + Left err -> Left $ (err, s) + Right c -> Right $ c pure (k, r) - let perModule = foldl' - (<>) - mempty - [ conf - | (_ , lineConfigs) <- lineConfigss - , (InlineConfigTargetModule, conf ) <- lineConfigs - ] + let + perModule = foldl' + (<>) + mempty + [ conf + | (_, lineConfigs) <- lineConfigss + , (InlineConfigTargetModule, conf) <- lineConfigs + ] let perBinding = Map.fromListWith (<>) [ (n, conf) - | (k , lineConfigs) <- lineConfigss - , (target, conf ) <- lineConfigs - , n <- case target of + | (k, lineConfigs) <- lineConfigss + , (target, conf) <- lineConfigs + , n <- case target of InlineConfigTargetBinding s -> [s] - InlineConfigTargetNextBinding | Just name <- Map.lookup k declNameMap -> - [name] + InlineConfigTargetNextBinding + | Just name <- Map.lookup k declNameMap -> [name] _ -> [] ] let perKey = Map.fromListWith (<>) [ (k, conf) - | (k , lineConfigs) <- lineConfigss - , (target, conf ) <- lineConfigs + | (k, lineConfigs) <- lineConfigss + , (target, conf) <- lineConfigs , case target of InlineConfigTargetNextDecl -> True InlineConfigTargetNextBinding | Nothing <- Map.lookup k declNameMap -> @@ -230,7 +221,7 @@ getTopLevelDeclNameMap :: GHC.ParsedSource -> TopLevelDeclNameMap getTopLevelDeclNameMap (L _ (HsModule _ _name _exports _ decls _ _)) = TopLevelDeclNameMap $ Map.fromList [ (ExactPrint.mkAnnKey decl, name) - | decl <- decls + | decl <- decls , (name : _) <- [getDeclBindingNames decl] ] @@ -248,70 +239,78 @@ getTopLevelDeclNameMap (L _ (HsModule _ _name _exports _ decls _ _)) = -- won't do. parsePrintModule :: Config -> Text -> IO (Either [BrittanyError] Text) parsePrintModule configWithDebugs inputText = runExceptT $ do - let config = - configWithDebugs { _conf_debug = _conf_debug staticDefaultConfig } - let ghcOptions = config & _conf_forward & _options_ghc & runIdentity - let config_pp = config & _conf_preprocessor - let cppMode = config_pp & _ppconf_CPPMode & confUnpack + let + config = + configWithDebugs { _conf_debug = _conf_debug staticDefaultConfig } + let ghcOptions = config & _conf_forward & _options_ghc & runIdentity + let config_pp = config & _conf_preprocessor + let cppMode = config_pp & _ppconf_CPPMode & confUnpack let hackAroundIncludes = config_pp & _ppconf_hackAroundIncludes & confUnpack (anns, parsedSource, hasCPP) <- do - let hackF s = if "#include" `isPrefixOf` s - then "-- BRITANY_INCLUDE_HACK " ++ s - else s - let hackTransform = if hackAroundIncludes - then List.intercalate "\n" . fmap hackF . lines' - else id - let cppCheckFunc dynFlags = if GHC.xopt GHC.Cpp dynFlags - then case cppMode of - CPPModeAbort -> return $ Left "Encountered -XCPP. Aborting." - CPPModeWarn -> return $ Right True - CPPModeNowarn -> return $ Right True - else return $ Right False + let + hackF s = if "#include" `isPrefixOf` s + then "-- BRITANY_INCLUDE_HACK " ++ s + else s + let + hackTransform = if hackAroundIncludes + then List.intercalate "\n" . fmap hackF . lines' + else id + let + cppCheckFunc dynFlags = if GHC.xopt GHC.Cpp dynFlags + then case cppMode of + CPPModeAbort -> return $ Left "Encountered -XCPP. Aborting." + CPPModeWarn -> return $ Right True + CPPModeNowarn -> return $ Right True + else return $ Right False parseResult <- lift $ parseModuleFromString ghcOptions "stdin" cppCheckFunc (hackTransform $ Text.unpack inputText) case parseResult of - Left err -> throwE [ErrorInput err] - Right x -> pure x + Left err -> throwE [ErrorInput err] + Right x -> pure x (inlineConf, perItemConf) <- either (throwE . (: []) . uncurry ErrorMacroConfig) pure $ extractCommentConfigs anns (getTopLevelDeclNameMap parsedSource) - let moduleConfig = cZipWith fromOptionIdentity config inlineConf + let moduleConfig = cZipWith fromOptionIdentity config inlineConf let disableFormatting = moduleConfig & _conf_disable_formatting & confUnpack if disableFormatting then do return inputText else do (errsWarns, outputTextL) <- do - let omitCheck = - moduleConfig - & _conf_errorHandling - & _econf_omit_output_valid_check - & confUnpack + let + omitCheck = + moduleConfig + & _conf_errorHandling + & _econf_omit_output_valid_check + & confUnpack (ews, outRaw) <- if hasCPP || omitCheck then return $ pPrintModule moduleConfig perItemConf anns parsedSource else lift $ pPrintModuleAndCheck moduleConfig perItemConf anns parsedSource - let hackF s = fromMaybe s - $ TextL.stripPrefix (TextL.pack "-- BRITANY_INCLUDE_HACK ") s + let + hackF s = fromMaybe s + $ TextL.stripPrefix (TextL.pack "-- BRITANY_INCLUDE_HACK ") s pure $ if hackAroundIncludes then ( ews - , TextL.intercalate (TextL.pack "\n") $ hackF <$> TextL.splitOn - (TextL.pack "\n") - outRaw + , TextL.intercalate (TextL.pack "\n") + $ hackF + <$> TextL.splitOn (TextL.pack "\n") outRaw ) else (ews, outRaw) - let customErrOrder ErrorInput{} = 4 - customErrOrder LayoutWarning{} = 0 :: Int - customErrOrder ErrorOutputCheck{} = 1 - customErrOrder ErrorUnusedComment{} = 2 - customErrOrder ErrorUnknownNode{} = 3 - customErrOrder ErrorMacroConfig{} = 5 - let hasErrors = - if moduleConfig & _conf_errorHandling & _econf_Werror & confUnpack + let + customErrOrder ErrorInput{} = 4 + customErrOrder LayoutWarning{} = 0 :: Int + customErrOrder ErrorOutputCheck{} = 1 + customErrOrder ErrorUnusedComment{} = 2 + customErrOrder ErrorUnknownNode{} = 3 + customErrOrder ErrorMacroConfig{} = 5 + let + hasErrors = + if moduleConfig & _conf_errorHandling & _econf_Werror & confUnpack then not $ null errsWarns else 0 < maximum (-1 : fmap customErrOrder errsWarns) if hasErrors @@ -331,26 +330,27 @@ pPrintModule -> GHC.ParsedSource -> ([BrittanyError], TextL.Text) pPrintModule conf inlineConf anns parsedModule = - let ((out, errs), debugStrings) = - runIdentity - $ MultiRWSS.runMultiRWSTNil - $ MultiRWSS.withMultiWriterAW - $ MultiRWSS.withMultiWriterAW - $ MultiRWSS.withMultiWriterW - $ MultiRWSS.withMultiReader anns - $ MultiRWSS.withMultiReader conf - $ MultiRWSS.withMultiReader inlineConf - $ MultiRWSS.withMultiReader (extractToplevelAnns parsedModule anns) - $ do - traceIfDumpConf "bridoc annotations raw" _dconf_dump_annotations - $ annsDoc anns - ppModule parsedModule - tracer = if Seq.null debugStrings - then id - else - trace ("---- DEBUGMESSAGES ---- ") - . foldr (seq . join trace) id debugStrings - in tracer $ (errs, Text.Builder.toLazyText out) + let + ((out, errs), debugStrings) = + runIdentity + $ MultiRWSS.runMultiRWSTNil + $ MultiRWSS.withMultiWriterAW + $ MultiRWSS.withMultiWriterAW + $ MultiRWSS.withMultiWriterW + $ MultiRWSS.withMultiReader anns + $ MultiRWSS.withMultiReader conf + $ MultiRWSS.withMultiReader inlineConf + $ MultiRWSS.withMultiReader (extractToplevelAnns parsedModule anns) + $ do + traceIfDumpConf "bridoc annotations raw" _dconf_dump_annotations + $ annsDoc anns + ppModule parsedModule + tracer = if Seq.null debugStrings + then id + else + trace ("---- DEBUGMESSAGES ---- ") + . foldr (seq . join trace) id debugStrings + in tracer $ (errs, Text.Builder.toLazyText out) -- unless () $ do -- -- debugStrings `forM_` \s -> @@ -365,15 +365,17 @@ pPrintModuleAndCheck -> GHC.ParsedSource -> IO ([BrittanyError], TextL.Text) pPrintModuleAndCheck conf inlineConf anns parsedModule = do - let ghcOptions = conf & _conf_forward & _options_ghc & runIdentity + let ghcOptions = conf & _conf_forward & _options_ghc & runIdentity let (errs, output) = pPrintModule conf inlineConf anns parsedModule - parseResult <- parseModuleFromString ghcOptions - "output" - (\_ -> return $ Right ()) - (TextL.unpack output) - let errs' = errs ++ case parseResult of - Left{} -> [ErrorOutputCheck] - Right{} -> [] + parseResult <- parseModuleFromString + ghcOptions + "output" + (\_ -> return $ Right ()) + (TextL.unpack output) + let + errs' = errs ++ case parseResult of + Left{} -> [ErrorOutputCheck] + Right{} -> [] return (errs', output) @@ -384,18 +386,22 @@ parsePrintModuleTests conf filename input = do let inputStr = Text.unpack input parseResult <- ExactPrint.Parsers.parseModuleFromString filename inputStr case parseResult of - Left err -> return $ Left $ "parsing error: " ++ show (bagToList (show <$> err)) + Left err -> + return $ Left $ "parsing error: " ++ show (bagToList (show <$> err)) Right (anns, parsedModule) -> runExceptT $ do (inlineConf, perItemConf) <- - case extractCommentConfigs anns (getTopLevelDeclNameMap parsedModule) of - Left err -> throwE $ "error in inline config: " ++ show err - Right x -> pure x + case + extractCommentConfigs anns (getTopLevelDeclNameMap parsedModule) + of + Left err -> throwE $ "error in inline config: " ++ show err + Right x -> pure x let moduleConf = cZipWith fromOptionIdentity conf inlineConf - let omitCheck = - conf - & _conf_errorHandling - .> _econf_omit_output_valid_check - .> confUnpack + let + omitCheck = + conf + & _conf_errorHandling + .> _econf_omit_output_valid_check + .> confUnpack (errs, ltext) <- if omitCheck then return $ pPrintModule moduleConf perItemConf anns parsedModule else lift @@ -405,13 +411,13 @@ parsePrintModuleTests conf filename input = do else let errStrs = errs <&> \case - ErrorInput str -> str + ErrorInput str -> str ErrorUnusedComment str -> str - LayoutWarning str -> str + LayoutWarning str -> str ErrorUnknownNode str _ -> str ErrorMacroConfig str _ -> "when parsing inline config: " ++ str - ErrorOutputCheck -> "Output is not syntactically valid." - in throwE $ "pretty printing error(s):\n" ++ List.unlines errStrs + ErrorOutputCheck -> "Output is not syntactically valid." + in throwE $ "pretty printing error(s):\n" ++ List.unlines errStrs isErrorUnusedComment :: BrittanyError -> Bool isErrorUnusedComment x = case x of @@ -464,27 +470,30 @@ ppModule lmod@(L _loc _m@(HsModule _ _name _exports _ decls _ _)) = do let annKey = ExactPrint.mkAnnKey lmod post <- ppPreamble lmod decls `forM_` \decl -> do - let declAnnKey = ExactPrint.mkAnnKey decl + let declAnnKey = ExactPrint.mkAnnKey decl let declBindingNames = getDeclBindingNames decl inlineConf <- mAsk let mDeclConf = Map.lookup declAnnKey $ _icd_perKey inlineConf - let mBindingConfs = - declBindingNames <&> \n -> Map.lookup n $ _icd_perBinding inlineConf - filteredAnns <- mAsk - <&> \annMap -> - Map.union (Map.findWithDefault Map.empty annKey annMap) $ - Map.findWithDefault Map.empty declAnnKey annMap + let + mBindingConfs = + declBindingNames <&> \n -> Map.lookup n $ _icd_perBinding inlineConf + filteredAnns <- mAsk <&> \annMap -> + Map.union (Map.findWithDefault Map.empty annKey annMap) + $ Map.findWithDefault Map.empty declAnnKey annMap - traceIfDumpConf "bridoc annotations filtered/transformed" - _dconf_dump_annotations + traceIfDumpConf + "bridoc annotations filtered/transformed" + _dconf_dump_annotations $ annsDoc filteredAnns config <- mAsk - let config' = cZipWith fromOptionIdentity config - $ mconcat (catMaybes (mBindingConfs ++ [mDeclConf])) + let + config' = cZipWith fromOptionIdentity config + $ mconcat (catMaybes (mBindingConfs ++ [mDeclConf])) - let exactprintOnly = config' & _conf_roundtrip_exactprint_only & confUnpack + let + exactprintOnly = config' & _conf_roundtrip_exactprint_only & confUnpack toLocal config' filteredAnns $ do bd <- if exactprintOnly then briDocMToPPM $ briDocByExactNoComment decl @@ -497,33 +506,34 @@ ppModule lmod@(L _loc _m@(HsModule _ _name _exports _ decls _ _)) = do else briDocMToPPM $ briDocByExactNoComment decl layoutBriDoc bd - let finalComments = filter - (fst .> \case - ExactPrint.AnnComment{} -> True - _ -> False - ) - post + let + finalComments = filter + (fst .> \case + ExactPrint.AnnComment{} -> True + _ -> False + ) + post post `forM_` \case (ExactPrint.AnnComment (ExactPrint.Comment cmStr _ _), l) -> do ppmMoveToExactLoc l mTell $ Text.Builder.fromString cmStr (ExactPrint.AnnEofPos, (ExactPrint.DP (eofZ, eofX))) -> - let folder (acc, _) (kw, ExactPrint.DP (y, x)) = case kw of - ExactPrint.AnnComment cm - | span <- ExactPrint.commentIdentifier cm - -> ( acc + y + GHC.srcSpanEndLine span - GHC.srcSpanStartLine span - , x + GHC.srcSpanEndCol span - GHC.srcSpanStartCol span - ) - _ -> (acc + y, x) - (cmY, cmX) = foldl' folder (0, 0) finalComments - in ppmMoveToExactLoc $ ExactPrint.DP (eofZ - cmY, eofX - cmX) + let + folder (acc, _) (kw, ExactPrint.DP (y, x)) = case kw of + ExactPrint.AnnComment cm | span <- ExactPrint.commentIdentifier cm -> + ( acc + y + GHC.srcSpanEndLine span - GHC.srcSpanStartLine span + , x + GHC.srcSpanEndCol span - GHC.srcSpanStartCol span + ) + _ -> (acc + y, x) + (cmY, cmX) = foldl' folder (0, 0) finalComments + in ppmMoveToExactLoc $ ExactPrint.DP (eofZ - cmY, eofX - cmX) _ -> return () getDeclBindingNames :: LHsDecl GhcPs -> [String] getDeclBindingNames (L _ decl) = case decl of SigD _ (TypeSig _ ns _) -> ns <&> \(L _ n) -> Text.unpack (rdrNameToText n) ValD _ (FunBind _ (L _ n) _ _) -> [Text.unpack $ rdrNameToText n] - _ -> [] + _ -> [] -- Prints the information associated with the module annotation @@ -540,8 +550,9 @@ ppPreamble lmod@(L loc m@HsModule{}) = do -- attached annotations that come after the module's where -- from the module node config <- mAsk - let shouldReformatPreamble = - config & _conf_layout & _lconfig_reformatModulePreamble & confUnpack + let + shouldReformatPreamble = + config & _conf_layout & _lconfig_reformatModulePreamble & confUnpack let (filteredAnns', post) = @@ -551,23 +562,23 @@ ppPreamble lmod@(L loc m@HsModule{}) = do let modAnnsDp = ExactPrint.annsDP mAnn isWhere (ExactPrint.G AnnWhere) = True - isWhere _ = False + isWhere _ = False isEof (ExactPrint.AnnEofPos) = True - isEof _ = False - whereInd = List.findIndex (isWhere . fst) modAnnsDp - eofInd = List.findIndex (isEof . fst) modAnnsDp + isEof _ = False + whereInd = List.findIndex (isWhere . fst) modAnnsDp + eofInd = List.findIndex (isEof . fst) modAnnsDp (pre, post') = case (whereInd, eofInd) of (Nothing, Nothing) -> ([], modAnnsDp) - (Just i , Nothing) -> List.splitAt (i + 1) modAnnsDp + (Just i, Nothing) -> List.splitAt (i + 1) modAnnsDp (Nothing, Just _i) -> ([], modAnnsDp) - (Just i , Just j ) -> List.splitAt (min (i + 1) j) modAnnsDp + (Just i, Just j) -> List.splitAt (min (i + 1) j) modAnnsDp mAnn' = mAnn { ExactPrint.annsDP = pre } filteredAnns'' = Map.insert (ExactPrint.mkAnnKey lmod) mAnn' filteredAnns - in - (filteredAnns'', post') - traceIfDumpConf "bridoc annotations filtered/transformed" - _dconf_dump_annotations + in (filteredAnns'', post') + traceIfDumpConf + "bridoc annotations filtered/transformed" + _dconf_dump_annotations $ annsDoc filteredAnns' if shouldReformatPreamble @@ -576,7 +587,7 @@ ppPreamble lmod@(L loc m@HsModule{}) = do layoutBriDoc briDoc else let emptyModule = L loc m { hsmodDecls = [] } - in MultiRWSS.withMultiReader filteredAnns' $ processDefault emptyModule + in MultiRWSS.withMultiReader filteredAnns' $ processDefault emptyModule return post _sigHead :: Sig GhcPs -> String @@ -589,7 +600,7 @@ _bindHead :: HsBind GhcPs -> String _bindHead = \case FunBind _ fId _ [] -> "FunBind " ++ (Text.unpack $ lrdrNameToText $ fId) PatBind _ _pat _ ([], []) -> "PatBind smth" - _ -> "unknown bind" + _ -> "unknown bind" @@ -607,63 +618,67 @@ layoutBriDoc briDoc = do transformAlts briDoc >>= mSet mGet >>= briDocToDoc - .> traceIfDumpConf "bridoc post-alt" _dconf_dump_bridoc_simpl_alt + .> traceIfDumpConf "bridoc post-alt" _dconf_dump_bridoc_simpl_alt -- bridoc transformation: float stuff in mGet >>= transformSimplifyFloating .> mSet mGet >>= briDocToDoc - .> traceIfDumpConf "bridoc post-floating" - _dconf_dump_bridoc_simpl_floating + .> traceIfDumpConf + "bridoc post-floating" + _dconf_dump_bridoc_simpl_floating -- bridoc transformation: par removal mGet >>= transformSimplifyPar .> mSet mGet >>= briDocToDoc - .> traceIfDumpConf "bridoc post-par" _dconf_dump_bridoc_simpl_par + .> traceIfDumpConf "bridoc post-par" _dconf_dump_bridoc_simpl_par -- bridoc transformation: float stuff in mGet >>= transformSimplifyColumns .> mSet mGet >>= briDocToDoc - .> traceIfDumpConf "bridoc post-columns" _dconf_dump_bridoc_simpl_columns + .> traceIfDumpConf "bridoc post-columns" _dconf_dump_bridoc_simpl_columns -- bridoc transformation: indent mGet >>= transformSimplifyIndent .> mSet mGet >>= briDocToDoc - .> traceIfDumpConf "bridoc post-indent" _dconf_dump_bridoc_simpl_indent + .> traceIfDumpConf "bridoc post-indent" _dconf_dump_bridoc_simpl_indent mGet >>= briDocToDoc - .> traceIfDumpConf "bridoc final" _dconf_dump_bridoc_final + .> traceIfDumpConf "bridoc final" _dconf_dump_bridoc_final -- -- convert to Simple type -- simpl <- mGet <&> transformToSimple -- return simpl anns :: ExactPrint.Anns <- mAsk - let state = LayoutState { _lstate_baseYs = [0] - , _lstate_curYOrAddNewline = Right 0 -- important that we dont use left - -- here because moveToAnn stuff - -- of the first node needs to do - -- its thing properly. - , _lstate_indLevels = [0] - , _lstate_indLevelLinger = 0 - , _lstate_comments = anns - , _lstate_commentCol = Nothing - , _lstate_addSepSpace = Nothing - , _lstate_commentNewlines = 0 - } + let + state = LayoutState + { _lstate_baseYs = [0] + , _lstate_curYOrAddNewline = Right 0 -- important that we dont use left + -- here because moveToAnn stuff + -- of the first node needs to do + -- its thing properly. + , _lstate_indLevels = [0] + , _lstate_indLevelLinger = 0 + , _lstate_comments = anns + , _lstate_commentCol = Nothing + , _lstate_addSepSpace = Nothing + , _lstate_commentNewlines = 0 + } state' <- MultiRWSS.withMultiStateS state $ layoutBriDocM briDoc' - let remainingComments = - [ c - | (ExactPrint.AnnKey _ con, elemAnns) <- Map.toList - (_lstate_comments state') - -- With the new import layouter, we manually process comments - -- without relying on the backend to consume the comments out of - -- the state/map. So they will end up here, and we need to ignore - -- them. - , ExactPrint.unConName con /= "ImportDecl" - , c <- extractAllComments elemAnns - ] + let + remainingComments = + [ c + | (ExactPrint.AnnKey _ con, elemAnns) <- Map.toList + (_lstate_comments state') + -- With the new import layouter, we manually process comments + -- without relying on the backend to consume the comments out of + -- the state/map. So they will end up here, and we need to ignore + -- them. + , ExactPrint.unConName con /= "ImportDecl" + , c <- extractAllComments elemAnns + ] remainingComments `forM_` (fst .> show .> ErrorUnusedComment .> (: []) .> mTell) diff --git a/source/library/Language/Haskell/Brittany/Internal/Backend.hs b/source/library/Language/Haskell/Brittany/Internal/Backend.hs index 142fe2f..0dfa6d6 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Backend.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Backend.hs @@ -6,10 +6,6 @@ module Language.Haskell.Brittany.Internal.Backend where - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Control.Monad.Trans.State.Strict as StateS import qualified Data.Either as Either import qualified Data.Foldable as Foldable @@ -21,32 +17,32 @@ import qualified Data.Semigroup as Semigroup import qualified Data.Sequence as Seq import qualified Data.Set as Set import qualified Data.Text as Text +import qualified Data.Text.Lazy.Builder as Text.Builder import qualified GHC.OldList as List - +import Language.Haskell.Brittany.Internal.BackendUtils +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.LayouterBasics +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.Utils import qualified Language.Haskell.GHC.ExactPrint as ExactPrint import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types -import Language.Haskell.Brittany.Internal.LayouterBasics -import Language.Haskell.Brittany.Internal.BackendUtils -import Language.Haskell.Brittany.Internal.Utils -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Types - - -import qualified Data.Text.Lazy.Builder as Text.Builder - - - -type ColIndex = Int +type ColIndex = Int data ColumnSpacing = ColumnSpacingLeaf Int | ColumnSpacingRef Int Int -type ColumnBlock a = [a] +type ColumnBlock a = [a] type ColumnBlocks a = Seq [a] -type ColMap1 = IntMapL.IntMap {- ColIndex -} (Bool, ColumnBlocks ColumnSpacing) -type ColMap2 = IntMapL.IntMap {- ColIndex -} (Float, ColumnBlock Int, ColumnBlocks Int) +type ColMap1 + = IntMapL.IntMap {- ColIndex -} + (Bool, ColumnBlocks ColumnSpacing) +type ColMap2 + = IntMapL.IntMap {- ColIndex -} + (Float, ColumnBlock Int, ColumnBlocks Int) -- (ratio of hasSpace, maximum, raw) data ColInfo @@ -56,20 +52,23 @@ data ColInfo instance Show ColInfo where show ColInfoStart = "ColInfoStart" - show (ColInfoNo bd) = "ColInfoNo " ++ show (take 30 (show (briDocToDoc bd)) ++ "..") - show (ColInfo ind sig list) = "ColInfo " ++ show ind ++ " " ++ show sig ++ " " ++ show list + show (ColInfoNo bd) = + "ColInfoNo " ++ show (take 30 (show (briDocToDoc bd)) ++ "..") + show (ColInfo ind sig list) = + "ColInfo " ++ show ind ++ " " ++ show sig ++ " " ++ show list data ColBuildState = ColBuildState { _cbs_map :: ColMap1 , _cbs_index :: ColIndex } -type LayoutConstraints m = ( MonadMultiReader Config m - , MonadMultiReader ExactPrint.Types.Anns m - , MonadMultiWriter Text.Builder.Builder m - , MonadMultiWriter (Seq String) m - , MonadMultiState LayoutState m - ) +type LayoutConstraints m + = ( MonadMultiReader Config m + , MonadMultiReader ExactPrint.Types.Anns m + , MonadMultiWriter Text.Builder.Builder m + , MonadMultiWriter (Seq String) m + , MonadMultiState LayoutState m + ) layoutBriDocM :: forall m . LayoutConstraints m => BriDoc -> m () layoutBriDocM = \case @@ -90,10 +89,11 @@ layoutBriDocM = \case BDSeparator -> do layoutAddSepSpace BDAddBaseY indent bd -> do - let indentF = case indent of - BrIndentNone -> id - BrIndentRegular -> layoutWithAddBaseCol - BrIndentSpecial i -> layoutWithAddBaseColN i + let + indentF = case indent of + BrIndentNone -> id + BrIndentRegular -> layoutWithAddBaseCol + BrIndentSpecial i -> layoutWithAddBaseColN i indentF $ layoutBriDocM bd BDBaseYPushCur bd -> do layoutBaseYPushCur @@ -108,36 +108,39 @@ layoutBriDocM = \case layoutBriDocM bd layoutIndentLevelPop BDEnsureIndent indent bd -> do - let indentF = case indent of - BrIndentNone -> id - BrIndentRegular -> layoutWithAddBaseCol - BrIndentSpecial i -> layoutWithAddBaseColN i + let + indentF = case indent of + BrIndentNone -> id + BrIndentRegular -> layoutWithAddBaseCol + BrIndentSpecial i -> layoutWithAddBaseColN i indentF $ do layoutWriteEnsureBlock layoutBriDocM bd BDPar indent sameLine indented -> do layoutBriDocM sameLine - let indentF = case indent of - BrIndentNone -> id - BrIndentRegular -> layoutWithAddBaseCol - BrIndentSpecial i -> layoutWithAddBaseColN i + let + indentF = case indent of + BrIndentNone -> id + BrIndentRegular -> layoutWithAddBaseCol + BrIndentSpecial i -> layoutWithAddBaseColN i indentF $ do layoutWriteNewlineBlock layoutBriDocM indented - BDLines lines -> alignColsLines lines - BDAlt [] -> error "empty BDAlt" - BDAlt (alt:_) -> layoutBriDocM alt - BDForceMultiline bd -> layoutBriDocM bd - BDForceSingleline bd -> layoutBriDocM bd - BDForwardLineMode bd -> layoutBriDocM bd + BDLines lines -> alignColsLines lines + BDAlt [] -> error "empty BDAlt" + BDAlt (alt : _) -> layoutBriDocM alt + BDForceMultiline bd -> layoutBriDocM bd + BDForceSingleline bd -> layoutBriDocM bd + BDForwardLineMode bd -> layoutBriDocM bd BDExternal annKey subKeys shouldAddComment t -> do - let tlines = Text.lines $ t <> Text.pack "\n" - tlineCount = length tlines + let + tlines = Text.lines $ t <> Text.pack "\n" + tlineCount = length tlines anns :: ExactPrint.Anns <- mAsk when shouldAddComment $ do layoutWriteAppend - $ Text.pack - $ "{-" + $ Text.pack + $ "{-" ++ show (annKey, Map.lookup annKey anns) ++ "-}" zip [1 ..] tlines `forM_` \(i, l) -> do @@ -154,9 +157,10 @@ layoutBriDocM = \case BDAnnotationPrior annKey bd -> do state <- mGet let m = _lstate_comments state - let moveToExactLocationAction = case _lstate_curYOrAddNewline state of - Left{} -> pure () - Right{} -> moveToExactAnn annKey + let + moveToExactLocationAction = case _lstate_curYOrAddNewline state of + Left{} -> pure () + Right{} -> moveToExactAnn annKey mAnn <- do let mAnn = ExactPrint.annPriorComments <$> Map.lookup annKey m mSet $ state @@ -167,8 +171,8 @@ layoutBriDocM = \case } return mAnn case mAnn of - Nothing -> moveToExactLocationAction - Just [] -> moveToExactLocationAction + Nothing -> moveToExactLocationAction + Just [] -> moveToExactLocationAction Just priors -> do -- layoutResetSepSpace priors @@ -176,9 +180,10 @@ layoutBriDocM = \case when (comment /= "(" && comment /= ")") $ do let commentLines = Text.lines $ Text.pack $ comment case comment of - ('#':_) -> layoutMoveToCommentPos y (-999) (length commentLines) + ('#' : _) -> + layoutMoveToCommentPos y (-999) (length commentLines) -- ^ evil hack for CPP - _ -> layoutMoveToCommentPos y x (length commentLines) + _ -> layoutMoveToCommentPos y x (length commentLines) -- fixedX <- fixMoveToLineByIsNewline x -- replicateM_ fixedX layoutWriteNewline -- layoutMoveToIndentCol y @@ -190,18 +195,20 @@ layoutBriDocM = \case layoutBriDocM bd mComments <- do state <- mGet - let m = _lstate_comments state + let m = _lstate_comments state let mAnn = ExactPrint.annsDP <$> Map.lookup annKey m - let mToSpan = case mAnn of - Just anns | Maybe.isNothing keyword -> Just anns - Just ((ExactPrint.Types.G kw1, _):annR) | keyword == Just kw1 -> Just - annR - _ -> Nothing + let + mToSpan = case mAnn of + Just anns | Maybe.isNothing keyword -> Just anns + Just ((ExactPrint.Types.G kw1, _) : annR) | keyword == Just kw1 -> + Just annR + _ -> Nothing case mToSpan of Just anns -> do - let (comments, rest) = flip spanMaybe anns $ \case - (ExactPrint.Types.AnnComment x, dp) -> Just (x, dp) - _ -> Nothing + let + (comments, rest) = flip spanMaybe anns $ \case + (ExactPrint.Types.AnnComment x, dp) -> Just (x, dp) + _ -> Nothing mSet $ state { _lstate_comments = Map.adjust (\ann -> ann { ExactPrint.annsDP = rest }) @@ -213,17 +220,19 @@ layoutBriDocM = \case case mComments of Nothing -> pure () Just comments -> do - comments `forM_` \(ExactPrint.Types.Comment comment _ _, ExactPrint.Types.DP (y, x)) -> - when (comment /= "(" && comment /= ")") $ do - let commentLines = Text.lines $ Text.pack $ comment - -- evil hack for CPP: - case comment of - ('#':_) -> layoutMoveToCommentPos y (-999) (length commentLines) - _ -> layoutMoveToCommentPos y x (length commentLines) - -- fixedX <- fixMoveToLineByIsNewline x - -- replicateM_ fixedX layoutWriteNewline - -- layoutMoveToIndentCol y - layoutWriteAppendMultiline commentLines + comments + `forM_` \(ExactPrint.Types.Comment comment _ _, ExactPrint.Types.DP (y, x)) -> + when (comment /= "(" && comment /= ")") $ do + let commentLines = Text.lines $ Text.pack $ comment + -- evil hack for CPP: + case comment of + ('#' : _) -> + layoutMoveToCommentPos y (-999) (length commentLines) + _ -> layoutMoveToCommentPos y x (length commentLines) + -- fixedX <- fixMoveToLineByIsNewline x + -- replicateM_ fixedX layoutWriteNewline + -- layoutMoveToIndentCol y + layoutWriteAppendMultiline commentLines -- mModify $ \s -> s { _lstate_curYOrAddNewline = Right 0 } BDAnnotationRest annKey bd -> do layoutBriDocM bd @@ -232,21 +241,26 @@ layoutBriDocM = \case let m = _lstate_comments state pure $ Map.lookup annKey m let mComments = nonEmpty . extractAllComments =<< annMay - let semiCount = length [ () - | Just ann <- [ annMay ] - , (ExactPrint.Types.AnnSemiSep, _) <- ExactPrint.Types.annsDP ann - ] - shouldAddSemicolonNewlines <- mAsk <&> - _conf_layout .> _lconfig_experimentalSemicolonNewlines .> confUnpack + let + semiCount = length + [ () + | Just ann <- [annMay] + , (ExactPrint.Types.AnnSemiSep, _) <- ExactPrint.Types.annsDP ann + ] + shouldAddSemicolonNewlines <- + mAsk + <&> _conf_layout + .> _lconfig_experimentalSemicolonNewlines + .> confUnpack mModify $ \state -> state { _lstate_comments = Map.adjust - ( \ann -> ann { ExactPrint.annFollowingComments = [] - , ExactPrint.annPriorComments = [] - , ExactPrint.annsDP = - flip filter (ExactPrint.annsDP ann) $ \case - (ExactPrint.Types.AnnComment{}, _) -> False - _ -> True - } + (\ann -> ann + { ExactPrint.annFollowingComments = [] + , ExactPrint.annPriorComments = [] + , ExactPrint.annsDP = flip filter (ExactPrint.annsDP ann) $ \case + (ExactPrint.Types.AnnComment{}, _) -> False + _ -> True + } ) annKey (_lstate_comments state) @@ -254,37 +268,40 @@ layoutBriDocM = \case case mComments of Nothing -> do when shouldAddSemicolonNewlines $ do - [1..semiCount] `forM_` const layoutWriteNewline + [1 .. semiCount] `forM_` const layoutWriteNewline Just comments -> do - comments `forM_` \(ExactPrint.Types.Comment comment _ _, ExactPrint.Types.DP (y, x)) -> - when (comment /= "(" && comment /= ")") $ do - let commentLines = Text.lines $ Text.pack comment - case comment of - ('#':_) -> layoutMoveToCommentPos y (-999) 1 - -- ^ evil hack for CPP - ")" -> pure () - -- ^ fixes the formatting of parens - -- on the lhs of type alias defs - _ -> layoutMoveToCommentPos y x (length commentLines) - -- fixedX <- fixMoveToLineByIsNewline x - -- replicateM_ fixedX layoutWriteNewline - -- layoutMoveToIndentCol y - layoutWriteAppendMultiline commentLines + comments + `forM_` \(ExactPrint.Types.Comment comment _ _, ExactPrint.Types.DP (y, x)) -> + when (comment /= "(" && comment /= ")") $ do + let commentLines = Text.lines $ Text.pack comment + case comment of + ('#' : _) -> layoutMoveToCommentPos y (-999) 1 + -- ^ evil hack for CPP + ")" -> pure () + -- ^ fixes the formatting of parens + -- on the lhs of type alias defs + _ -> layoutMoveToCommentPos y x (length commentLines) + -- fixedX <- fixMoveToLineByIsNewline x + -- replicateM_ fixedX layoutWriteNewline + -- layoutMoveToIndentCol y + layoutWriteAppendMultiline commentLines -- mModify $ \s -> s { _lstate_curYOrAddNewline = Right 0 } BDMoveToKWDP annKey keyword shouldRestoreIndent bd -> do mDP <- do state <- mGet - let m = _lstate_comments state + let m = _lstate_comments state let mAnn = ExactPrint.annsDP <$> Map.lookup annKey m - let relevant = [ dp - | Just ann <- [mAnn] - , (ExactPrint.Types.G kw1, dp) <- ann - , keyword == kw1 - ] + let + relevant = + [ dp + | Just ann <- [mAnn] + , (ExactPrint.Types.G kw1, dp) <- ann + , keyword == kw1 + ] -- mTell $ Seq.fromList [show keyword, "KWDP: " ++ show annKey ++ " " ++ show mAnn, show relevant] case relevant of [] -> pure Nothing - (ExactPrint.Types.DP (y, x):_) -> do + (ExactPrint.Types.DP (y, x) : _) -> do mSet state { _lstate_commentNewlines = 0 } pure $ Just (y - _lstate_commentNewlines state, x) case mDP of @@ -295,8 +312,8 @@ layoutBriDocM = \case layoutMoveToCommentPos y (if shouldRestoreIndent then x else 0) 1 layoutBriDocM bd BDNonBottomSpacing _ bd -> layoutBriDocM bd - BDSetParSpacing bd -> layoutBriDocM bd - BDForceParSpacing bd -> layoutBriDocM bd + BDSetParSpacing bd -> layoutBriDocM bd + BDForceParSpacing bd -> layoutBriDocM bd BDDebug s bd -> do mTell $ Text.Builder.fromText $ Text.pack $ "{-" ++ s ++ "-}" layoutBriDocM bd @@ -307,73 +324,73 @@ briDocLineLength briDoc = flip StateS.evalState False $ rec briDoc -- appended at the current position. where rec = \case - BDEmpty -> return $ 0 - BDLit t -> StateS.put False $> Text.length t - BDSeq bds -> sum <$> rec `mapM` bds - BDCols _ bds -> sum <$> rec `mapM` bds + BDEmpty -> return $ 0 + BDLit t -> StateS.put False $> Text.length t + BDSeq bds -> sum <$> rec `mapM` bds + BDCols _ bds -> sum <$> rec `mapM` bds BDSeparator -> StateS.get >>= \b -> StateS.put True $> if b then 0 else 1 - BDAddBaseY _ bd -> rec bd - BDBaseYPushCur bd -> rec bd - BDBaseYPop bd -> rec bd + BDAddBaseY _ bd -> rec bd + BDBaseYPushCur bd -> rec bd + BDBaseYPop bd -> rec bd BDIndentLevelPushCur bd -> rec bd - BDIndentLevelPop bd -> rec bd - BDPar _ line _ -> rec line - BDAlt{} -> error "briDocLineLength BDAlt" - BDForceMultiline bd -> rec bd - BDForceSingleline bd -> rec bd - BDForwardLineMode bd -> rec bd - BDExternal _ _ _ t -> return $ Text.length t - BDPlain t -> return $ Text.length t - BDAnnotationPrior _ bd -> rec bd - BDAnnotationKW _ _ bd -> rec bd - BDAnnotationRest _ bd -> rec bd - BDMoveToKWDP _ _ _ bd -> rec bd - BDLines ls@(_ : _) -> do + BDIndentLevelPop bd -> rec bd + BDPar _ line _ -> rec line + BDAlt{} -> error "briDocLineLength BDAlt" + BDForceMultiline bd -> rec bd + BDForceSingleline bd -> rec bd + BDForwardLineMode bd -> rec bd + BDExternal _ _ _ t -> return $ Text.length t + BDPlain t -> return $ Text.length t + BDAnnotationPrior _ bd -> rec bd + BDAnnotationKW _ _ bd -> rec bd + BDAnnotationRest _ bd -> rec bd + BDMoveToKWDP _ _ _ bd -> rec bd + BDLines ls@(_ : _) -> do x <- StateS.get return $ maximum $ ls <&> \l -> StateS.evalState (rec l) x - BDLines [] -> error "briDocLineLength BDLines []" - BDEnsureIndent _ bd -> rec bd - BDSetParSpacing bd -> rec bd - BDForceParSpacing bd -> rec bd + BDLines [] -> error "briDocLineLength BDLines []" + BDEnsureIndent _ bd -> rec bd + BDSetParSpacing bd -> rec bd + BDForceParSpacing bd -> rec bd BDNonBottomSpacing _ bd -> rec bd - BDDebug _ bd -> rec bd + BDDebug _ bd -> rec bd briDocIsMultiLine :: BriDoc -> Bool briDocIsMultiLine briDoc = rec briDoc where rec :: BriDoc -> Bool rec = \case - BDEmpty -> False - BDLit _ -> False - BDSeq bds -> any rec bds - BDCols _ bds -> any rec bds - BDSeparator -> False - BDAddBaseY _ bd -> rec bd - BDBaseYPushCur bd -> rec bd - BDBaseYPop bd -> rec bd - BDIndentLevelPushCur bd -> rec bd - BDIndentLevelPop bd -> rec bd - BDPar{} -> True - BDAlt{} -> error "briDocIsMultiLine BDAlt" - BDForceMultiline _ -> True - BDForceSingleline bd -> rec bd - BDForwardLineMode bd -> rec bd + BDEmpty -> False + BDLit _ -> False + BDSeq bds -> any rec bds + BDCols _ bds -> any rec bds + BDSeparator -> False + BDAddBaseY _ bd -> rec bd + BDBaseYPushCur bd -> rec bd + BDBaseYPop bd -> rec bd + BDIndentLevelPushCur bd -> rec bd + BDIndentLevelPop bd -> rec bd + BDPar{} -> True + BDAlt{} -> error "briDocIsMultiLine BDAlt" + BDForceMultiline _ -> True + BDForceSingleline bd -> rec bd + BDForwardLineMode bd -> rec bd BDExternal _ _ _ t | [_] <- Text.lines t -> False - BDExternal{} -> True - BDPlain t | [_] <- Text.lines t -> False - BDPlain _ -> True - BDAnnotationPrior _ bd -> rec bd - BDAnnotationKW _ _ bd -> rec bd - BDAnnotationRest _ bd -> rec bd - BDMoveToKWDP _ _ _ bd -> rec bd - BDLines (_ : _ : _) -> True - BDLines [_ ] -> False + BDExternal{} -> True + BDPlain t | [_] <- Text.lines t -> False + BDPlain _ -> True + BDAnnotationPrior _ bd -> rec bd + BDAnnotationKW _ _ bd -> rec bd + BDAnnotationRest _ bd -> rec bd + BDMoveToKWDP _ _ _ bd -> rec bd + BDLines (_ : _ : _) -> True + BDLines [_] -> False BDLines [] -> error "briDocIsMultiLine BDLines []" - BDEnsureIndent _ bd -> rec bd - BDSetParSpacing bd -> rec bd - BDForceParSpacing bd -> rec bd - BDNonBottomSpacing _ bd -> rec bd - BDDebug _ bd -> rec bd + BDEnsureIndent _ bd -> rec bd + BDSetParSpacing bd -> rec bd + BDForceParSpacing bd -> rec bd + BDNonBottomSpacing _ bd -> rec bd + BDDebug _ bd -> rec bd -- In theory -- ========= @@ -458,16 +475,16 @@ alignColsLines bridocs = do -- colInfos `forM_` \colInfo -> do return $ Either.fromLeft 0 (_lstate_curYOrAddNewline state) + fromMaybe 0 (_lstate_addSepSpace state) - colMax <- mAsk <&> _conf_layout .> _lconfig_cols .> confUnpack - alignMax <- mAsk <&> _conf_layout .> _lconfig_alignmentLimit .> confUnpack + colMax <- mAsk <&> _conf_layout .> _lconfig_cols .> confUnpack + alignMax <- mAsk <&> _conf_layout .> _lconfig_alignmentLimit .> confUnpack alignBreak <- mAsk <&> _conf_layout .> _lconfig_alignmentBreakOnMultiline .> confUnpack case () of _ -> do -- tellDebugMess ("processedMap: " ++ show processedMap) sequence_ - $ List.intersperse layoutWriteEnsureNewlineBlock - $ colInfos + $ List.intersperse layoutWriteEnsureNewlineBlock + $ colInfos <&> processInfo colMax processedMap where (colInfos, finalState) = @@ -484,40 +501,41 @@ alignColsLines bridocs = do -- colInfos `forM_` \colInfo -> do where alignMax' = max 0 alignMax processedMap :: ColMap2 - processedMap = - fix $ \result -> _cbs_map finalState <&> \(lastFlag, colSpacingss) -> + processedMap = fix $ \result -> + _cbs_map finalState <&> \(lastFlag, colSpacingss) -> let colss = colSpacingss <&> \spss -> case reverse spss of [] -> [] - (xN:xR) -> - reverse $ (if lastFlag then fLast else fInit) xN : fmap fInit xR + (xN : xR) -> + reverse + $ (if lastFlag then fLast else fInit) xN + : fmap fInit xR where - fLast (ColumnSpacingLeaf len ) = len + fLast (ColumnSpacingLeaf len) = len fLast (ColumnSpacingRef len _) = len fInit (ColumnSpacingLeaf len) = len - fInit (ColumnSpacingRef _ i ) = case IntMapL.lookup i result of - Nothing -> 0 + fInit (ColumnSpacingRef _ i) = case IntMapL.lookup i result of + Nothing -> 0 Just (_, maxs, _) -> sum maxs maxCols = {-Foldable.foldl1 maxZipper-} fmap colAggregation $ transpose $ Foldable.toList colss (_, posXs) = -- trace ("colss=" ++ show colss ++ ", maxCols=" ++ show maxCols ++ " for " ++ take 100 (show $ briDocToDoc $ head bridocs)) $ - mapAccumL (\acc x -> (acc + x, acc)) curX maxCols + mapAccumL (\acc x -> (acc + x, acc)) curX maxCols counter count l = if List.last posXs + List.last l <= colMax then count + 1 else count ratio = fromIntegral (foldl counter (0 :: Int) colss) / fromIntegral (length colss) - in - (ratio, maxCols, colss) + in (ratio, maxCols, colss) mergeBriDocs :: [BriDoc] -> StateS.State ColBuildState [ColInfo] mergeBriDocs bds = mergeBriDocsW ColInfoStart bds mergeBriDocsW :: ColInfo -> [BriDoc] -> StateS.State ColBuildState [ColInfo] - mergeBriDocsW _ [] = return [] - mergeBriDocsW lastInfo (bd:bdr) = do - info <- mergeInfoBriDoc True lastInfo bd + mergeBriDocsW _ [] = return [] + mergeBriDocsW lastInfo (bd : bdr) = do + info <- mergeInfoBriDoc True lastInfo bd infor <- mergeBriDocsW -- (if alignBreak && briDocIsMultiLine bd then ColInfoStart else info) (if shouldBreakAfter bd then ColInfoStart else info) @@ -545,28 +563,27 @@ alignColsLines bridocs = do -- colInfos `forM_` \colInfo -> do -- personal preference to not break alignment for those, even if -- multiline. Really, this should be configurable.. (TODO) shouldBreakAfter :: BriDoc -> Bool - shouldBreakAfter bd = alignBreak && - briDocIsMultiLine bd && case bd of - (BDCols ColTyOpPrefix _) -> False - (BDCols ColPatternsFuncPrefix _) -> True - (BDCols ColPatternsFuncInfix _) -> True - (BDCols ColPatterns _) -> True - (BDCols ColCasePattern _) -> True - (BDCols ColBindingLine{} _) -> True - (BDCols ColGuard _) -> True - (BDCols ColGuardedBody _) -> True - (BDCols ColBindStmt _) -> True - (BDCols ColDoLet _) -> True - (BDCols ColRec _) -> False - (BDCols ColRecUpdate _) -> False - (BDCols ColRecDecl _) -> False - (BDCols ColListComp _) -> False - (BDCols ColList _) -> False - (BDCols ColApp{} _) -> True - (BDCols ColTuple _) -> False - (BDCols ColTuples _) -> False - (BDCols ColOpPrefix _) -> False - _ -> True + shouldBreakAfter bd = alignBreak && briDocIsMultiLine bd && case bd of + (BDCols ColTyOpPrefix _) -> False + (BDCols ColPatternsFuncPrefix _) -> True + (BDCols ColPatternsFuncInfix _) -> True + (BDCols ColPatterns _) -> True + (BDCols ColCasePattern _) -> True + (BDCols ColBindingLine{} _) -> True + (BDCols ColGuard _) -> True + (BDCols ColGuardedBody _) -> True + (BDCols ColBindStmt _) -> True + (BDCols ColDoLet _) -> True + (BDCols ColRec _) -> False + (BDCols ColRecUpdate _) -> False + (BDCols ColRecDecl _) -> False + (BDCols ColListComp _) -> False + (BDCols ColList _) -> False + (BDCols ColApp{} _) -> True + (BDCols ColTuple _) -> False + (BDCols ColTuples _) -> False + (BDCols ColOpPrefix _) -> False + _ -> True mergeInfoBriDoc :: Bool @@ -574,23 +591,22 @@ alignColsLines bridocs = do -- colInfos `forM_` \colInfo -> do -> BriDoc -> StateS.StateT ColBuildState Identity ColInfo mergeInfoBriDoc lastFlag ColInfoStart = briDocToColInfo lastFlag - mergeInfoBriDoc lastFlag ColInfoNo{} = briDocToColInfo lastFlag + mergeInfoBriDoc lastFlag ColInfoNo{} = briDocToColInfo lastFlag mergeInfoBriDoc lastFlag (ColInfo infoInd infoSig subLengthsInfos) = \case brdc@(BDCols colSig subDocs) - | infoSig == colSig && length subLengthsInfos == length subDocs - -> do + | infoSig == colSig && length subLengthsInfos == length subDocs -> do let isLastList = if lastFlag - then (==length subDocs) <$> [1 ..] + then (== length subDocs) <$> [1 ..] else repeat False infos <- zip3 isLastList (snd <$> subLengthsInfos) subDocs `forM` \(lf, info, bd) -> mergeInfoBriDoc lf info bd - let curLengths = briDocLineLength <$> subDocs + let curLengths = briDocLineLength <$> subDocs let trueSpacings = getTrueSpacings (zip curLengths infos) do -- update map s <- StateS.get - let m = _cbs_map s + let m = _cbs_map s let (Just (_, spaces)) = IntMapS.lookup infoInd m StateS.put s { _cbs_map = IntMapS.insert @@ -599,17 +615,17 @@ alignColsLines bridocs = do -- colInfos `forM_` \colInfo -> do m } return $ ColInfo infoInd colSig (zip curLengths infos) - | otherwise - -> briDocToColInfo lastFlag brdc + | otherwise -> briDocToColInfo lastFlag brdc brdc -> return $ ColInfoNo brdc briDocToColInfo :: Bool -> BriDoc -> StateS.State ColBuildState ColInfo briDocToColInfo lastFlag = \case BDCols sig list -> withAlloc lastFlag $ \ind -> do - let isLastList = - if lastFlag then (==length list) <$> [1 ..] else repeat False + let + isLastList = + if lastFlag then (== length list) <$> [1 ..] else repeat False subInfos <- zip isLastList list `forM` uncurry briDocToColInfo - let lengthInfos = zip (briDocLineLength <$> list) subInfos + let lengthInfos = zip (briDocLineLength <$> list) subInfos let trueSpacings = getTrueSpacings lengthInfos return $ (Seq.singleton trueSpacings, ColInfo ind sig lengthInfos) bd -> return $ ColInfoNo bd @@ -617,11 +633,11 @@ briDocToColInfo lastFlag = \case getTrueSpacings :: [(Int, ColInfo)] -> [ColumnSpacing] getTrueSpacings lengthInfos = lengthInfos <&> \case (len, ColInfo i _ _) -> ColumnSpacingRef len i - (len, _ ) -> ColumnSpacingLeaf len + (len, _) -> ColumnSpacingLeaf len withAlloc :: Bool - -> ( ColIndex + -> ( ColIndex -> StateS.State ColBuildState (ColumnBlocks ColumnSpacing, ColInfo) ) -> StateS.State ColBuildState ColInfo @@ -636,13 +652,14 @@ withAlloc lastFlag f = do processInfo :: LayoutConstraints m => Int -> ColMap2 -> ColInfo -> m () processInfo maxSpace m = \case - ColInfoStart -> error "should not happen (TM)" - ColInfoNo doc -> layoutBriDocM doc + ColInfoStart -> error "should not happen (TM)" + ColInfoNo doc -> layoutBriDocM doc ColInfo ind _ list -> -- trace ("processInfo ind=" ++ show ind ++ ", list=" ++ show list ++ ", colmap=" ++ show m) $ do colMaxConf <- mAsk <&> _conf_layout .> _lconfig_cols .> confUnpack - alignMode <- mAsk <&> _conf_layout .> _lconfig_columnAlignMode .> confUnpack - curX <- do + alignMode <- + mAsk <&> _conf_layout .> _lconfig_columnAlignMode .> confUnpack + curX <- do state <- mGet -- tellDebugMess ("processInfo: " ++ show (_lstate_curYOrAddNewline state) ++ " - " ++ show ((_lstate_addSepSpace state))) let spaceAdd = fromMaybe 0 $ _lstate_addSepSpace state @@ -654,10 +671,11 @@ processInfo maxSpace m = \case let colMax = min colMaxConf (curX + maxSpace) -- tellDebugMess $ show curX let Just (ratio, maxCols1, _colss) = IntMapS.lookup ind m - let maxCols2 = list <&> \case - (_, ColInfo i _ _) -> - let Just (_, ms, _) = IntMapS.lookup i m in sum ms - (l, _) -> l + let + maxCols2 = list <&> \case + (_, ColInfo i _ _) -> + let Just (_, ms, _) = IntMapS.lookup i m in sum ms + (l, _) -> l let maxCols = zipWith max maxCols1 maxCols2 let (maxX, posXs) = mapAccumL (\acc x -> (acc + x, acc)) curX maxCols -- handle the cases that the vertical alignment leads to more than max @@ -668,46 +686,48 @@ processInfo maxSpace m = \case -- sizes in such a way that it works _if_ we have sizes (*factor) -- in each column. but in that line, in the last column, we will be -- forced to occupy the full vertical space, not reduced by any factor. - let fixedPosXs = case alignMode of - ColumnAlignModeAnimouslyScale i | maxX > colMax -> fixed <&> (+curX) - where - factor :: Float = - -- 0.0001 as an offering to the floating point gods. - min - 1.0001 - (fromIntegral (i + colMax - curX) / fromIntegral (maxX - curX)) - offsets = (subtract curX) <$> posXs - fixed = offsets <&> fromIntegral .> (*factor) .> truncate - _ -> posXs - let spacings = zipWith (-) - (List.tail fixedPosXs ++ [min maxX colMax]) - fixedPosXs + let + fixedPosXs = case alignMode of + ColumnAlignModeAnimouslyScale i | maxX > colMax -> fixed <&> (+ curX) + where + factor :: Float = + -- 0.0001 as an offering to the floating point gods. + min + 1.0001 + (fromIntegral (i + colMax - curX) / fromIntegral (maxX - curX)) + offsets = (subtract curX) <$> posXs + fixed = offsets <&> fromIntegral .> (* factor) .> truncate + _ -> posXs + let + spacings = + zipWith (-) (List.tail fixedPosXs ++ [min maxX colMax]) fixedPosXs -- tellDebugMess $ "ind = " ++ show ind -- tellDebugMess $ "maxCols = " ++ show maxCols -- tellDebugMess $ "fixedPosXs = " ++ show fixedPosXs -- tellDebugMess $ "list = " ++ show list -- tellDebugMess $ "maxSpace = " ++ show maxSpace - let alignAct = zip3 fixedPosXs spacings list `forM_` \(destX, s, x) -> do - layoutWriteEnsureAbsoluteN destX - processInfo s m (snd x) - noAlignAct = list `forM_` (snd .> processInfoIgnore) - animousAct = -- trace ("animousAct fixedPosXs=" ++ show fixedPosXs ++ ", list=" ++ show list ++ ", maxSpace=" ++ show maxSpace ++ ", colMax="++show colMax) $ - if List.last fixedPosXs + fst (List.last list) > colMax - -- per-item check if there is overflowing. - then noAlignAct - else alignAct + let + alignAct = zip3 fixedPosXs spacings list `forM_` \(destX, s, x) -> do + layoutWriteEnsureAbsoluteN destX + processInfo s m (snd x) + noAlignAct = list `forM_` (snd .> processInfoIgnore) + animousAct = -- trace ("animousAct fixedPosXs=" ++ show fixedPosXs ++ ", list=" ++ show list ++ ", maxSpace=" ++ show maxSpace ++ ", colMax="++show colMax) $ + if List.last fixedPosXs + fst (List.last list) > colMax + -- per-item check if there is overflowing. + then noAlignAct + else alignAct case alignMode of - ColumnAlignModeDisabled -> noAlignAct - ColumnAlignModeUnanimously | maxX <= colMax -> alignAct - ColumnAlignModeUnanimously -> noAlignAct + ColumnAlignModeDisabled -> noAlignAct + ColumnAlignModeUnanimously | maxX <= colMax -> alignAct + ColumnAlignModeUnanimously -> noAlignAct ColumnAlignModeMajority limit | ratio >= limit -> animousAct - ColumnAlignModeMajority{} -> noAlignAct - ColumnAlignModeAnimouslyScale{} -> animousAct - ColumnAlignModeAnimously -> animousAct - ColumnAlignModeAlways -> alignAct + ColumnAlignModeMajority{} -> noAlignAct + ColumnAlignModeAnimouslyScale{} -> animousAct + ColumnAlignModeAnimously -> animousAct + ColumnAlignModeAlways -> alignAct processInfoIgnore :: LayoutConstraints m => ColInfo -> m () processInfoIgnore = \case - ColInfoStart -> error "should not happen (TM)" - ColInfoNo doc -> layoutBriDocM doc + ColInfoStart -> error "should not happen (TM)" + ColInfoNo doc -> layoutBriDocM doc ColInfo _ _ list -> list `forM_` (snd .> processInfoIgnore) diff --git a/source/library/Language/Haskell/Brittany/Internal/BackendUtils.hs b/source/library/Language/Haskell/Brittany/Internal/BackendUtils.hs index 6c34ea9..e48da84 100644 --- a/source/library/Language/Haskell/Brittany/Internal/BackendUtils.hs +++ b/source/library/Language/Haskell/Brittany/Internal/BackendUtils.hs @@ -3,42 +3,29 @@ module Language.Haskell.Brittany.Internal.BackendUtils where - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Data.Data import qualified Data.Either import qualified Data.Map as Map import qualified Data.Maybe import qualified Data.Semigroup as Semigroup import qualified Data.Text as Text -import qualified GHC.OldList as List - -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.GHC.ExactPrint.Types ( AnnKey - , Annotation - ) - import qualified Data.Text.Lazy.Builder as Text.Builder +import GHC (Located) +import qualified GHC.OldList as List +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.Utils +import Language.Haskell.GHC.ExactPrint.Types (AnnKey, Annotation) import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint -import Language.Haskell.Brittany.Internal.Utils -import GHC ( Located ) - - - -traceLocal - :: (MonadMultiState LayoutState m) - => a - -> m () +traceLocal :: (MonadMultiState LayoutState m) => a -> m () traceLocal _ = return () layoutWriteAppend - :: ( MonadMultiWriter Text.Builder.Builder m - , MonadMultiState LayoutState m - ) + :: (MonadMultiWriter Text.Builder.Builder m, MonadMultiState LayoutState m) => Text -> m () layoutWriteAppend t = do @@ -54,15 +41,13 @@ layoutWriteAppend t = do mTell $ Text.Builder.fromText $ t mModify $ \s -> s { _lstate_curYOrAddNewline = Left $ case _lstate_curYOrAddNewline s of - Left c -> c + Text.length t + spaces - Right{} -> Text.length t + spaces + Left c -> c + Text.length t + spaces + Right{} -> Text.length t + spaces , _lstate_addSepSpace = Nothing } layoutWriteAppendSpaces - :: ( MonadMultiWriter Text.Builder.Builder m - , MonadMultiState LayoutState m - ) + :: (MonadMultiWriter Text.Builder.Builder m, MonadMultiState LayoutState m) => Int -> m () layoutWriteAppendSpaces i = do @@ -70,20 +55,18 @@ layoutWriteAppendSpaces i = do unless (i == 0) $ do state <- mGet mSet $ state - { _lstate_addSepSpace = Just $ maybe i (+i) $ _lstate_addSepSpace state + { _lstate_addSepSpace = Just $ maybe i (+ i) $ _lstate_addSepSpace state } layoutWriteAppendMultiline - :: ( MonadMultiWriter Text.Builder.Builder m - , MonadMultiState LayoutState m - ) + :: (MonadMultiWriter Text.Builder.Builder m, MonadMultiState LayoutState m) => [Text] -> m () layoutWriteAppendMultiline ts = do traceLocal ("layoutWriteAppendMultiline", ts) case ts of - [] -> layoutWriteAppend (Text.pack "") -- need to write empty, too. - (l:lr) -> do + [] -> layoutWriteAppend (Text.pack "") -- need to write empty, too. + (l : lr) -> do layoutWriteAppend l lr `forM_` \x -> do layoutWriteNewline @@ -91,16 +74,15 @@ layoutWriteAppendMultiline ts = do -- adds a newline and adds spaces to reach the base column. layoutWriteNewlineBlock - :: ( MonadMultiWriter Text.Builder.Builder m - , MonadMultiState LayoutState m - ) + :: (MonadMultiWriter Text.Builder.Builder m, MonadMultiState LayoutState m) => m () layoutWriteNewlineBlock = do traceLocal ("layoutWriteNewlineBlock") state <- mGet - mSet $ state { _lstate_curYOrAddNewline = Right 1 - , _lstate_addSepSpace = Just $ lstate_baseY state - } + mSet $ state + { _lstate_curYOrAddNewline = Right 1 + , _lstate_addSepSpace = Just $ lstate_baseY state + } -- layoutMoveToIndentCol :: ( MonadMultiState LayoutState m -- , MonadMultiWriter (Seq String) m) => Int -> m () @@ -116,13 +98,13 @@ layoutWriteNewlineBlock = do -- else _lstate_indLevelLinger state + i - _lstate_curY state -- } -layoutSetCommentCol - :: (MonadMultiState LayoutState m) => m () +layoutSetCommentCol :: (MonadMultiState LayoutState m) => m () layoutSetCommentCol = do state <- mGet - let col = case _lstate_curYOrAddNewline state of - Left i -> i + fromMaybe 0 (_lstate_addSepSpace state) - Right{} -> lstate_baseY state + let + col = case _lstate_curYOrAddNewline state of + Left i -> i + fromMaybe 0 (_lstate_addSepSpace state) + Right{} -> lstate_baseY state traceLocal ("layoutSetCommentCol", col) unless (Data.Maybe.isJust $ _lstate_commentCol state) $ mSet state { _lstate_commentCol = Just col } @@ -130,9 +112,7 @@ layoutSetCommentCol = do -- This is also used to move to non-comments in a couple of places. Seems -- to be harmless so far.. layoutMoveToCommentPos - :: ( MonadMultiWriter Text.Builder.Builder m - , MonadMultiState LayoutState m - ) + :: (MonadMultiWriter Text.Builder.Builder m, MonadMultiState LayoutState m) => Int -> Int -> Int @@ -142,38 +122,35 @@ layoutMoveToCommentPos y x commentLines = do state <- mGet mSet state { _lstate_curYOrAddNewline = case _lstate_curYOrAddNewline state of - Left i -> if y == 0 then Left i else Right y + Left i -> if y == 0 then Left i else Right y Right{} -> Right y - , _lstate_addSepSpace = + , _lstate_addSepSpace = Just $ if Data.Maybe.isJust (_lstate_commentCol state) then case _lstate_curYOrAddNewline state of - Left{} -> if y == 0 then x else _lstate_indLevelLinger state + x + Left{} -> if y == 0 then x else _lstate_indLevelLinger state + x Right{} -> _lstate_indLevelLinger state + x else if y == 0 then x else _lstate_indLevelLinger state + x - , _lstate_commentCol = - Just $ case _lstate_commentCol state of - Just existing -> existing - Nothing -> case _lstate_curYOrAddNewline state of - Left i -> i + fromMaybe 0 (_lstate_addSepSpace state) - Right{} -> lstate_baseY state + , _lstate_commentCol = Just $ case _lstate_commentCol state of + Just existing -> existing + Nothing -> case _lstate_curYOrAddNewline state of + Left i -> i + fromMaybe 0 (_lstate_addSepSpace state) + Right{} -> lstate_baseY state , _lstate_commentNewlines = - _lstate_commentNewlines state + y + commentLines - 1 + _lstate_commentNewlines state + y + commentLines - 1 } -- | does _not_ add spaces to again reach the current base column. layoutWriteNewline - :: ( MonadMultiWriter Text.Builder.Builder m - , MonadMultiState LayoutState m - ) + :: (MonadMultiWriter Text.Builder.Builder m, MonadMultiState LayoutState m) => m () layoutWriteNewline = do traceLocal ("layoutWriteNewline") state <- mGet mSet $ state { _lstate_curYOrAddNewline = case _lstate_curYOrAddNewline state of - Left{} -> Right 1 + Left{} -> Right 1 Right i -> Right (i + 1) - , _lstate_addSepSpace = Nothing + , _lstate_addSepSpace = Nothing } _layoutResetCommentNewlines :: MonadMultiState LayoutState m => m () @@ -181,77 +158,67 @@ _layoutResetCommentNewlines = do mModify $ \state -> state { _lstate_commentNewlines = 0 } layoutWriteEnsureNewlineBlock - :: ( MonadMultiWriter Text.Builder.Builder m - , MonadMultiState LayoutState m - ) + :: (MonadMultiWriter Text.Builder.Builder m, MonadMultiState LayoutState m) => m () layoutWriteEnsureNewlineBlock = do traceLocal ("layoutWriteEnsureNewlineBlock") state <- mGet mSet $ state { _lstate_curYOrAddNewline = case _lstate_curYOrAddNewline state of - Left{} -> Right 1 + Left{} -> Right 1 Right i -> Right $ max 1 i - , _lstate_addSepSpace = Just $ lstate_baseY state - , _lstate_commentCol = Nothing + , _lstate_addSepSpace = Just $ lstate_baseY state + , _lstate_commentCol = Nothing } layoutWriteEnsureAbsoluteN - :: ( MonadMultiWriter Text.Builder.Builder m - , MonadMultiState LayoutState m - ) + :: (MonadMultiWriter Text.Builder.Builder m, MonadMultiState LayoutState m) => Int -> m () layoutWriteEnsureAbsoluteN n = do state <- mGet - let diff = case (_lstate_commentCol state, _lstate_curYOrAddNewline state) of - (Just c , _ ) -> n - c - (Nothing, Left i ) -> n - i - (Nothing, Right{}) -> n + let + diff = case (_lstate_commentCol state, _lstate_curYOrAddNewline state) of + (Just c, _) -> n - c + (Nothing, Left i) -> n - i + (Nothing, Right{}) -> n traceLocal ("layoutWriteEnsureAbsoluteN", n, diff) when (diff > 0) $ do - mSet $ state { _lstate_addSepSpace = Just diff -- this always sets to + mSet $ state { _lstate_addSepSpace = Just diff } -- this always sets to -- at least (Just 1), so we won't -- overwrite any old value in any -- bad way. - } -layoutBaseYPushInternal - :: (MonadMultiState LayoutState m) - => Int - -> m () +layoutBaseYPushInternal :: (MonadMultiState LayoutState m) => Int -> m () layoutBaseYPushInternal i = do traceLocal ("layoutBaseYPushInternal", i) mModify $ \s -> s { _lstate_baseYs = i : _lstate_baseYs s } -layoutBaseYPopInternal - :: (MonadMultiState LayoutState m) => m () +layoutBaseYPopInternal :: (MonadMultiState LayoutState m) => m () layoutBaseYPopInternal = do traceLocal ("layoutBaseYPopInternal") mModify $ \s -> s { _lstate_baseYs = List.tail $ _lstate_baseYs s } layoutIndentLevelPushInternal - :: (MonadMultiState LayoutState m) - => Int - -> m () + :: (MonadMultiState LayoutState m) => Int -> m () layoutIndentLevelPushInternal i = do traceLocal ("layoutIndentLevelPushInternal", i) - mModify $ \s -> s { _lstate_indLevelLinger = lstate_indLevel s - , _lstate_indLevels = i : _lstate_indLevels s - } + mModify $ \s -> s + { _lstate_indLevelLinger = lstate_indLevel s + , _lstate_indLevels = i : _lstate_indLevels s + } -layoutIndentLevelPopInternal - :: (MonadMultiState LayoutState m) => m () +layoutIndentLevelPopInternal :: (MonadMultiState LayoutState m) => m () layoutIndentLevelPopInternal = do traceLocal ("layoutIndentLevelPopInternal") - mModify $ \s -> s { _lstate_indLevelLinger = lstate_indLevel s - , _lstate_indLevels = List.tail $ _lstate_indLevels s - } + mModify $ \s -> s + { _lstate_indLevelLinger = lstate_indLevel s + , _lstate_indLevels = List.tail $ _lstate_indLevels s + } -layoutRemoveIndentLevelLinger :: ( MonadMultiState LayoutState m) => m () +layoutRemoveIndentLevelLinger :: (MonadMultiState LayoutState m) => m () layoutRemoveIndentLevelLinger = do - mModify $ \s -> s { _lstate_indLevelLinger = lstate_indLevel s - } + mModify $ \s -> s { _lstate_indLevelLinger = lstate_indLevel s } layoutWithAddBaseCol :: ( MonadMultiWriter Text.Builder.Builder m @@ -283,9 +250,7 @@ layoutWithAddBaseColBlock m = do layoutBaseYPopInternal layoutWithAddBaseColNBlock - :: ( MonadMultiWriter Text.Builder.Builder m - , MonadMultiState LayoutState m - ) + :: (MonadMultiWriter Text.Builder.Builder m, MonadMultiState LayoutState m) => Int -> m () -> m () @@ -298,27 +263,23 @@ layoutWithAddBaseColNBlock amount m = do layoutBaseYPopInternal layoutWriteEnsureBlock - :: ( MonadMultiWriter Text.Builder.Builder m - , MonadMultiState LayoutState m - ) + :: (MonadMultiWriter Text.Builder.Builder m, MonadMultiState LayoutState m) => m () layoutWriteEnsureBlock = do traceLocal ("layoutWriteEnsureBlock") state <- mGet let diff = case (_lstate_addSepSpace state, _lstate_curYOrAddNewline state) of - (Nothing, Left i ) -> lstate_baseY state - i + (Nothing, Left i) -> lstate_baseY state - i (Nothing, Right{}) -> lstate_baseY state - (Just sp, Left i ) -> max sp (lstate_baseY state - i) + (Just sp, Left i) -> max sp (lstate_baseY state - i) (Just sp, Right{}) -> max sp (lstate_baseY state) -- when (diff>0) $ layoutWriteNewlineBlock when (diff > 0) $ do mSet $ state { _lstate_addSepSpace = Just $ diff } layoutWithAddBaseColN - :: ( MonadMultiWriter Text.Builder.Builder m - , MonadMultiState LayoutState m - ) + :: (MonadMultiWriter Text.Builder.Builder m, MonadMultiState LayoutState m) => Int -> m () -> m () @@ -328,39 +289,36 @@ layoutWithAddBaseColN amount m = do m layoutBaseYPopInternal -layoutBaseYPushCur - :: (MonadMultiState LayoutState m) => m () +layoutBaseYPushCur :: (MonadMultiState LayoutState m) => m () layoutBaseYPushCur = do traceLocal ("layoutBaseYPushCur") state <- mGet case _lstate_commentCol state of Nothing -> case (_lstate_curYOrAddNewline state, _lstate_addSepSpace state) of - (Left i , Just j ) -> layoutBaseYPushInternal (i + j) - (Left i , Nothing) -> layoutBaseYPushInternal i - (Right{}, _ ) -> layoutBaseYPushInternal $ lstate_baseY state + (Left i, Just j) -> layoutBaseYPushInternal (i + j) + (Left i, Nothing) -> layoutBaseYPushInternal i + (Right{}, _) -> layoutBaseYPushInternal $ lstate_baseY state Just cCol -> layoutBaseYPushInternal cCol -layoutBaseYPop - :: (MonadMultiState LayoutState m) => m () +layoutBaseYPop :: (MonadMultiState LayoutState m) => m () layoutBaseYPop = do traceLocal ("layoutBaseYPop") layoutBaseYPopInternal -layoutIndentLevelPushCur - :: (MonadMultiState LayoutState m) => m () +layoutIndentLevelPushCur :: (MonadMultiState LayoutState m) => m () layoutIndentLevelPushCur = do traceLocal ("layoutIndentLevelPushCur") state <- mGet - let y = case (_lstate_curYOrAddNewline state, _lstate_addSepSpace state) of - (Left i , Just j ) -> i + j - (Left i , Nothing) -> i - (Right{}, Just j ) -> j - (Right{}, Nothing) -> 0 + let + y = case (_lstate_curYOrAddNewline state, _lstate_addSepSpace state) of + (Left i, Just j) -> i + j + (Left i, Nothing) -> i + (Right{}, Just j) -> j + (Right{}, Nothing) -> 0 layoutIndentLevelPushInternal y -layoutIndentLevelPop - :: (MonadMultiState LayoutState m) => m () +layoutIndentLevelPop :: (MonadMultiState LayoutState m) => m () layoutIndentLevelPop = do traceLocal ("layoutIndentLevelPop") layoutIndentLevelPopInternal @@ -370,12 +328,12 @@ layoutIndentLevelPop = do -- make sense. layoutRemoveIndentLevelLinger -layoutAddSepSpace :: (MonadMultiState LayoutState m) - => m () +layoutAddSepSpace :: (MonadMultiState LayoutState m) => m () layoutAddSepSpace = do state <- mGet mSet $ state - { _lstate_addSepSpace = Just $ fromMaybe 1 $ _lstate_addSepSpace state } + { _lstate_addSepSpace = Just $ fromMaybe 1 $ _lstate_addSepSpace state + } -- TODO: when refactoring is complete, the other version of this method -- can probably be removed. @@ -390,7 +348,7 @@ moveToExactAnn annKey = do traceLocal ("moveToExactAnn", annKey) anns <- mAsk case Map.lookup annKey anns of - Nothing -> return () + Nothing -> return () Just ann -> do -- curY <- mGet <&> _lstate_curY let ExactPrint.DP (y, _x) = ExactPrint.annEntryDelta ann @@ -399,19 +357,19 @@ moveToExactAnn annKey = do moveToY :: MonadMultiState LayoutState m => Int -> m () moveToY y = mModify $ \state -> - let upd = case _lstate_curYOrAddNewline state of - Left i -> if y == 0 then Left i else Right y - Right i -> Right $ max y i - in state - { _lstate_curYOrAddNewline = upd - , _lstate_addSepSpace = if Data.Either.isRight upd - then - _lstate_commentCol state - <|> _lstate_addSepSpace state - <|> Just (lstate_baseY state) - else Nothing - , _lstate_commentCol = Nothing - } + let + upd = case _lstate_curYOrAddNewline state of + Left i -> if y == 0 then Left i else Right y + Right i -> Right $ max y i + in + state + { _lstate_curYOrAddNewline = upd + , _lstate_addSepSpace = if Data.Either.isRight upd + then _lstate_commentCol state <|> _lstate_addSepSpace state <|> Just + (lstate_baseY state) + else Nothing + , _lstate_commentCol = Nothing + } -- fixMoveToLineByIsNewline :: MonadMultiState -- LayoutState m => Int -> m Int -- fixMoveToLineByIsNewline x = do @@ -421,9 +379,7 @@ moveToY y = mModify $ \state -> -- else x ppmMoveToExactLoc - :: MonadMultiWriter Text.Builder.Builder m - => ExactPrint.DeltaPos - -> m () + :: MonadMultiWriter Text.Builder.Builder m => ExactPrint.DeltaPos -> m () ppmMoveToExactLoc (ExactPrint.DP (x, y)) = do replicateM_ x $ mTell $ Text.Builder.fromString "\n" replicateM_ y $ mTell $ Text.Builder.fromString " " @@ -439,75 +395,77 @@ layoutWritePriorComments layoutWritePriorComments ast = do mAnn <- do state <- mGet - let key = ExactPrint.mkAnnKey ast + let key = ExactPrint.mkAnnKey ast let anns = _lstate_comments state let mAnn = ExactPrint.annPriorComments <$> Map.lookup key anns mSet $ state - { _lstate_comments = - Map.adjust (\ann -> ann { ExactPrint.annPriorComments = [] }) key anns + { _lstate_comments = Map.adjust + (\ann -> ann { ExactPrint.annPriorComments = [] }) + key + anns } return mAnn case mAnn of Nothing -> return () Just priors -> do unless (null priors) $ layoutSetCommentCol - priors `forM_` \( ExactPrint.Comment comment _ _ - , ExactPrint.DP (x, y) - ) -> do - replicateM_ x layoutWriteNewline - layoutWriteAppendSpaces y - layoutWriteAppendMultiline $ Text.lines $ Text.pack comment + priors + `forM_` \(ExactPrint.Comment comment _ _, ExactPrint.DP (x, y)) -> do + replicateM_ x layoutWriteNewline + layoutWriteAppendSpaces y + layoutWriteAppendMultiline $ Text.lines $ Text.pack comment -- TODO: update and use, or clean up. Currently dead code. -- this currently only extracs from the `annsDP` field of Annotations. -- per documentation, this seems sufficient, as the -- "..`annFollowingComments` are only added by AST transformations ..". -layoutWritePostComments :: (Data.Data.Data ast, - MonadMultiWriter Text.Builder.Builder m, - MonadMultiState LayoutState m) - => Located ast -> m () +layoutWritePostComments + :: ( Data.Data.Data ast + , MonadMultiWriter Text.Builder.Builder m + , MonadMultiState LayoutState m + ) + => Located ast + -> m () layoutWritePostComments ast = do mAnn <- do state <- mGet - let key = ExactPrint.mkAnnKey ast + let key = ExactPrint.mkAnnKey ast let anns = _lstate_comments state let mAnn = ExactPrint.annFollowingComments <$> Map.lookup key anns mSet $ state - { _lstate_comments = - Map.adjust (\ann -> ann { ExactPrint.annFollowingComments = [] }) - key - anns + { _lstate_comments = Map.adjust + (\ann -> ann { ExactPrint.annFollowingComments = [] }) + key + anns } return mAnn case mAnn of Nothing -> return () Just posts -> do unless (null posts) $ layoutSetCommentCol - posts `forM_` \( ExactPrint.Comment comment _ _ - , ExactPrint.DP (x, y) - ) -> do - replicateM_ x layoutWriteNewline - layoutWriteAppend $ Text.pack $ replicate y ' ' - mModify $ \s -> s { _lstate_addSepSpace = Nothing } - layoutWriteAppendMultiline $ Text.lines $ Text.pack $ comment + posts `forM_` \(ExactPrint.Comment comment _ _, ExactPrint.DP (x, y)) -> + do + replicateM_ x layoutWriteNewline + layoutWriteAppend $ Text.pack $ replicate y ' ' + mModify $ \s -> s { _lstate_addSepSpace = Nothing } + layoutWriteAppendMultiline $ Text.lines $ Text.pack $ comment layoutIndentRestorePostComment - :: ( MonadMultiState LayoutState m - , MonadMultiWriter Text.Builder.Builder m - ) + :: (MonadMultiState LayoutState m, MonadMultiWriter Text.Builder.Builder m) => m () layoutIndentRestorePostComment = do state <- mGet let mCommentCol = _lstate_commentCol state - let eCurYAddNL = _lstate_curYOrAddNewline state - mModify $ \s -> s { _lstate_commentCol = Nothing - , _lstate_commentNewlines = 0 - } + let eCurYAddNL = _lstate_curYOrAddNewline state + mModify + $ \s -> s { _lstate_commentCol = Nothing, _lstate_commentNewlines = 0 } case (mCommentCol, eCurYAddNL) of (Just commentCol, Left{}) -> do layoutWriteEnsureNewlineBlock - layoutWriteEnsureAbsoluteN $ commentCol + fromMaybe 0 (_lstate_addSepSpace state) - _ -> return () + layoutWriteEnsureAbsoluteN $ commentCol + fromMaybe + 0 + (_lstate_addSepSpace state) + _ -> return () -- layoutWritePriorCommentsRestore :: (Data.Data.Data ast, -- MonadMultiWriter Text.Builder.Builder m, diff --git a/source/library/Language/Haskell/Brittany/Internal/Config.hs b/source/library/Language/Haskell/Brittany/Internal/Config.hs index 66d6d7f..b951db9 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Config.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Config.hs @@ -3,185 +3,174 @@ module Language.Haskell.Brittany.Internal.Config where - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Data.Bool as Bool import qualified Data.ByteString as ByteString import qualified Data.ByteString.Char8 +import Data.CZipWith +import Data.Coerce (coerce) +import qualified Data.List.NonEmpty as NonEmpty import qualified Data.Semigroup as Semigroup -import qualified GHC.OldList as List -import qualified System.Directory -import qualified System.IO - import qualified Data.Yaml -import Data.CZipWith +import qualified GHC.OldList as List +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Config.Types.Instances () +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Utils +import qualified System.Console.CmdArgs.Explicit as CmdArgs +import qualified System.Directory +import qualified System.Directory as Directory +import qualified System.FilePath.Posix as FilePath +import qualified System.IO +import UI.Butcher.Monadic -import UI.Butcher.Monadic - -import qualified System.Console.CmdArgs.Explicit - as CmdArgs - -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Config.Types.Instances () -import Language.Haskell.Brittany.Internal.Utils - -import Data.Coerce ( coerce - ) -import qualified Data.List.NonEmpty as NonEmpty - -import qualified System.Directory as Directory -import qualified System.FilePath.Posix as FilePath - --- brittany-next-binding { lconfig_indentPolicy: IndentPolicyLeft } staticDefaultConfig :: Config staticDefaultConfig = Config - { _conf_version = coerce (1 :: Int) - , _conf_debug = DebugConfig - { _dconf_dump_config = coerce False - , _dconf_dump_annotations = coerce False - , _dconf_dump_ast_unknown = coerce False - , _dconf_dump_ast_full = coerce False - , _dconf_dump_bridoc_raw = coerce False - , _dconf_dump_bridoc_simpl_alt = coerce False + { _conf_version = coerce (1 :: Int) + , _conf_debug = DebugConfig + { _dconf_dump_config = coerce False + , _dconf_dump_annotations = coerce False + , _dconf_dump_ast_unknown = coerce False + , _dconf_dump_ast_full = coerce False + , _dconf_dump_bridoc_raw = coerce False + , _dconf_dump_bridoc_simpl_alt = coerce False , _dconf_dump_bridoc_simpl_floating = coerce False - , _dconf_dump_bridoc_simpl_par = coerce False - , _dconf_dump_bridoc_simpl_columns = coerce False - , _dconf_dump_bridoc_simpl_indent = coerce False - , _dconf_dump_bridoc_final = coerce False - , _dconf_roundtrip_exactprint_only = coerce False + , _dconf_dump_bridoc_simpl_par = coerce False + , _dconf_dump_bridoc_simpl_columns = coerce False + , _dconf_dump_bridoc_simpl_indent = coerce False + , _dconf_dump_bridoc_final = coerce False + , _dconf_roundtrip_exactprint_only = coerce False } - , _conf_layout = LayoutConfig - { _lconfig_cols = coerce (80 :: Int) - , _lconfig_indentPolicy = coerce IndentPolicyFree - , _lconfig_indentAmount = coerce (2 :: Int) - , _lconfig_indentWhereSpecial = coerce True - , _lconfig_indentListSpecial = coerce True - , _lconfig_importColumn = coerce (50 :: Int) - , _lconfig_importAsColumn = coerce (50 :: Int) + , _conf_layout = LayoutConfig + { _lconfig_cols = coerce (80 :: Int) + , _lconfig_indentPolicy = coerce IndentPolicyFree + , _lconfig_indentAmount = coerce (2 :: Int) + , _lconfig_indentWhereSpecial = coerce True + , _lconfig_indentListSpecial = coerce True + , _lconfig_importColumn = coerce (50 :: Int) + , _lconfig_importAsColumn = coerce (50 :: Int) , _lconfig_altChooser = coerce (AltChooserBoundedSearch 3) , _lconfig_columnAlignMode = coerce (ColumnAlignModeMajority 0.7) - , _lconfig_alignmentLimit = coerce (30 :: Int) - , _lconfig_alignmentBreakOnMultiline = coerce True - , _lconfig_hangingTypeSignature = coerce False - , _lconfig_reformatModulePreamble = coerce True - , _lconfig_allowSingleLineExportList = coerce False - , _lconfig_allowHangingQuasiQuotes = coerce True + , _lconfig_alignmentLimit = coerce (30 :: Int) + , _lconfig_alignmentBreakOnMultiline = coerce True + , _lconfig_hangingTypeSignature = coerce False + , _lconfig_reformatModulePreamble = coerce True + , _lconfig_allowSingleLineExportList = coerce False + , _lconfig_allowHangingQuasiQuotes = coerce True , _lconfig_experimentalSemicolonNewlines = coerce False -- , _lconfig_allowSinglelineRecord = coerce False } - , _conf_errorHandling = ErrorHandlingConfig - { _econf_produceOutputOnErrors = coerce False - , _econf_Werror = coerce False - , _econf_ExactPrintFallback = coerce ExactPrintFallbackModeInline + , _conf_errorHandling = ErrorHandlingConfig + { _econf_produceOutputOnErrors = coerce False + , _econf_Werror = coerce False + , _econf_ExactPrintFallback = coerce ExactPrintFallbackModeInline , _econf_omit_output_valid_check = coerce False } - , _conf_preprocessor = PreProcessorConfig - { _ppconf_CPPMode = coerce CPPModeAbort + , _conf_preprocessor = PreProcessorConfig + { _ppconf_CPPMode = coerce CPPModeAbort , _ppconf_hackAroundIncludes = coerce False } , _conf_forward = ForwardOptions { _options_ghc = Identity [] } , _conf_roundtrip_exactprint_only = coerce False - , _conf_disable_formatting = coerce False - , _conf_obfuscate = coerce False + , _conf_disable_formatting = coerce False + , _conf_obfuscate = coerce False } forwardOptionsSyntaxExtsEnabled :: ForwardOptions forwardOptionsSyntaxExtsEnabled = ForwardOptions { _options_ghc = Identity - [ "-XLambdaCase" - , "-XMultiWayIf" - , "-XGADTs" - , "-XPatternGuards" - , "-XViewPatterns" - , "-XTupleSections" - , "-XExplicitForAll" - , "-XImplicitParams" - , "-XQuasiQuotes" - , "-XTemplateHaskell" - , "-XBangPatterns" - , "-XTypeApplications" - ] + [ "-XLambdaCase" + , "-XMultiWayIf" + , "-XGADTs" + , "-XPatternGuards" + , "-XViewPatterns" + , "-XTupleSections" + , "-XExplicitForAll" + , "-XImplicitParams" + , "-XQuasiQuotes" + , "-XTemplateHaskell" + , "-XBangPatterns" + , "-XTypeApplications" + ] } --- brittany-next-binding { lconfig_indentPolicy: IndentPolicyLeft, lconfig_cols: 200 } +-- brittany-next-binding --columns 200 cmdlineConfigParser :: CmdParser Identity out (CConfig Maybe) cmdlineConfigParser = do -- TODO: why does the default not trigger; ind never should be []!! - ind <- addFlagReadParams "" ["indent"] "AMOUNT" (flagHelpStr "spaces per indentation level") - 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") - importAsCol <- addFlagReadParams "" ["import-as-col"] "N" (flagHelpStr "column to qualified-as module names at") + ind <- addFlagReadParams "" ["indent"] "AMOUNT" (flagHelpStr "spaces per indentation level") + 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") + importAsCol <- addFlagReadParams "" ["import-as-col"] "N" (flagHelpStr "column to qualified-as module names at") - 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") - dumpBriDocRaw <- addSimpleBoolFlag "" ["dump-bridoc-raw"] (flagHelp $ parDoc "dump the pre-transformation bridoc") - dumpBriDocAlt <- addSimpleBoolFlag "" ["dump-bridoc-alt"] (flagHelp $ parDoc "dump the partially transformed bridoc: after transformation: alt") - dumpBriDocPar <- addSimpleBoolFlag "" ["dump-bridoc-par"] (flagHelp $ parDoc "dump the partially transformed bridoc: after transformation: par") + 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") + dumpBriDocRaw <- addSimpleBoolFlag "" ["dump-bridoc-raw"] (flagHelp $ parDoc "dump the pre-transformation bridoc") + dumpBriDocAlt <- addSimpleBoolFlag "" ["dump-bridoc-alt"] (flagHelp $ parDoc "dump the partially transformed bridoc: after transformation: alt") + dumpBriDocPar <- addSimpleBoolFlag "" ["dump-bridoc-par"] (flagHelp $ parDoc "dump the partially transformed bridoc: after transformation: par") dumpBriDocFloating <- addSimpleBoolFlag "" ["dump-bridoc-floating"] (flagHelp $ parDoc "dump the partially transformed bridoc: after transformation: floating") - dumpBriDocColumns <- addSimpleBoolFlag "" ["dump-bridoc-columns"] (flagHelp $ parDoc "dump the partially transformed bridoc: after transformation: columns") - 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") + dumpBriDocColumns <- addSimpleBoolFlag "" ["dump-bridoc-columns"] (flagHelp $ parDoc "dump the partially transformed bridoc: after transformation: columns") + 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)") - wError <- addSimpleBoolFlag "" ["werror"] (flagHelp $ parDoc "treat warnings as errors") - omitValidCheck <- addSimpleBoolFlag "" ["omit-output-check"] (flagHelp $ parDoc "omit checking if the output is syntactically valid (debugging)") + 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 (debugging)") - roundtripOnly <- addSimpleBoolFlag "" ["exactprint-only"] (flagHelp $ parDoc "do not reformat, but exclusively use exactprint to roundtrip (debugging)") + roundtripOnly <- addSimpleBoolFlag "" ["exactprint-only"] (flagHelp $ parDoc "do not reformat, but exclusively use exactprint to roundtrip (debugging)") - optionsGhc <- addFlagStringParams "" ["ghc-options"] "STRING" (flagHelp $ parDoc "allows to define default language extensions. The parameter is forwarded to ghc.") - disableFormatting <- addSimpleBoolFlag "" ["disable-formatting"] (flagHelp $ parDoc "parse, but don't transform the input at all. Useful for inline config for specific modules.") - obfuscate <- addSimpleBoolFlag "" ["obfuscate"] (flagHelp $ parDoc "apply obfuscator to the output.") + optionsGhc <- addFlagStringParams "" ["ghc-options"] "STRING" (flagHelp $ parDoc "allows to define default language extensions. The parameter is forwarded to ghc.") + disableFormatting <- addSimpleBoolFlag "" ["disable-formatting"] (flagHelp $ parDoc "parse, but don't transform the input at all. Useful for inline config for specific modules.") + obfuscate <- addSimpleBoolFlag "" ["obfuscate"] (flagHelp $ parDoc "apply obfuscator to the output.") return $ Config - { _conf_version = mempty - , _conf_debug = DebugConfig - { _dconf_dump_config = wrapLast $ falseToNothing dumpConfig - , _dconf_dump_annotations = wrapLast $ falseToNothing dumpAnnotations - , _dconf_dump_ast_unknown = wrapLast $ falseToNothing dumpUnknownAST - , _dconf_dump_ast_full = wrapLast $ falseToNothing dumpCompleteAST - , _dconf_dump_bridoc_raw = wrapLast $ falseToNothing dumpBriDocRaw - , _dconf_dump_bridoc_simpl_alt = wrapLast $ falseToNothing dumpBriDocAlt - , _dconf_dump_bridoc_simpl_par = wrapLast $ falseToNothing dumpBriDocPar + { _conf_version = mempty + , _conf_debug = DebugConfig + { _dconf_dump_config = wrapLast $ falseToNothing dumpConfig + , _dconf_dump_annotations = wrapLast $ falseToNothing dumpAnnotations + , _dconf_dump_ast_unknown = wrapLast $ falseToNothing dumpUnknownAST + , _dconf_dump_ast_full = wrapLast $ falseToNothing dumpCompleteAST + , _dconf_dump_bridoc_raw = wrapLast $ falseToNothing dumpBriDocRaw + , _dconf_dump_bridoc_simpl_alt = wrapLast $ falseToNothing dumpBriDocAlt + , _dconf_dump_bridoc_simpl_par = wrapLast $ falseToNothing dumpBriDocPar , _dconf_dump_bridoc_simpl_floating = wrapLast $ falseToNothing dumpBriDocFloating - , _dconf_dump_bridoc_simpl_columns = wrapLast $ falseToNothing dumpBriDocColumns - , _dconf_dump_bridoc_simpl_indent = wrapLast $ falseToNothing dumpBriDocIndent - , _dconf_dump_bridoc_final = wrapLast $ falseToNothing dumpBriDocFinal - , _dconf_roundtrip_exactprint_only = mempty + , _dconf_dump_bridoc_simpl_columns = wrapLast $ falseToNothing dumpBriDocColumns + , _dconf_dump_bridoc_simpl_indent = wrapLast $ falseToNothing dumpBriDocIndent + , _dconf_dump_bridoc_final = wrapLast $ falseToNothing dumpBriDocFinal + , _dconf_roundtrip_exactprint_only = mempty } - , _conf_layout = LayoutConfig - { _lconfig_cols = optionConcat cols - , _lconfig_indentPolicy = mempty - , _lconfig_indentAmount = optionConcat ind - , _lconfig_indentWhereSpecial = mempty -- falseToNothing _ - , _lconfig_indentListSpecial = mempty -- falseToNothing _ - , _lconfig_importColumn = optionConcat importCol - , _lconfig_importAsColumn = optionConcat importAsCol - , _lconfig_altChooser = mempty - , _lconfig_columnAlignMode = mempty - , _lconfig_alignmentLimit = mempty - , _lconfig_alignmentBreakOnMultiline = mempty - , _lconfig_hangingTypeSignature = mempty - , _lconfig_reformatModulePreamble = mempty - , _lconfig_allowSingleLineExportList = mempty - , _lconfig_allowHangingQuasiQuotes = mempty + , _conf_layout = LayoutConfig + { _lconfig_cols = optionConcat cols + , _lconfig_indentPolicy = mempty + , _lconfig_indentAmount = optionConcat ind + , _lconfig_indentWhereSpecial = mempty -- falseToNothing _ + , _lconfig_indentListSpecial = mempty -- falseToNothing _ + , _lconfig_importColumn = optionConcat importCol + , _lconfig_importAsColumn = optionConcat importAsCol + , _lconfig_altChooser = mempty + , _lconfig_columnAlignMode = mempty + , _lconfig_alignmentLimit = mempty + , _lconfig_alignmentBreakOnMultiline = mempty + , _lconfig_hangingTypeSignature = mempty + , _lconfig_reformatModulePreamble = mempty + , _lconfig_allowSingleLineExportList = mempty + , _lconfig_allowHangingQuasiQuotes = mempty , _lconfig_experimentalSemicolonNewlines = mempty -- , _lconfig_allowSinglelineRecord = mempty } - , _conf_errorHandling = ErrorHandlingConfig - { _econf_produceOutputOnErrors = wrapLast $ falseToNothing outputOnErrors - , _econf_Werror = wrapLast $ falseToNothing wError - , _econf_ExactPrintFallback = mempty + , _conf_errorHandling = ErrorHandlingConfig + { _econf_produceOutputOnErrors = wrapLast $ falseToNothing outputOnErrors + , _econf_Werror = wrapLast $ falseToNothing wError + , _econf_ExactPrintFallback = mempty , _econf_omit_output_valid_check = wrapLast $ falseToNothing omitValidCheck } - , _conf_preprocessor = PreProcessorConfig { _ppconf_CPPMode = mempty, _ppconf_hackAroundIncludes = mempty } - , _conf_forward = ForwardOptions { _options_ghc = [ optionsGhc & List.unwords & CmdArgs.splitArgs | not $ null optionsGhc ] } + , _conf_preprocessor = PreProcessorConfig { _ppconf_CPPMode = mempty, _ppconf_hackAroundIncludes = mempty } + , _conf_forward = ForwardOptions { _options_ghc = [ optionsGhc & List.unwords & CmdArgs.splitArgs | not $ null optionsGhc ] } , _conf_roundtrip_exactprint_only = wrapLast $ falseToNothing roundtripOnly - , _conf_disable_formatting = wrapLast $ falseToNothing disableFormatting - , _conf_obfuscate = wrapLast $ falseToNothing obfuscate + , _conf_disable_formatting = wrapLast $ falseToNothing disableFormatting + , _conf_obfuscate = wrapLast $ falseToNothing obfuscate } where falseToNothing = Bool.bool Nothing (Just True) @@ -228,8 +217,8 @@ readConfig path = do fileConf <- case Data.Yaml.decodeEither' contents of Left e -> do liftIO - $ putStrErrLn - $ "error reading in brittany config from " + $ putStrErrLn + $ "error reading in brittany config from " ++ path ++ ":" liftIO $ putStrErrLn (Data.Yaml.prettyPrintParseException e) @@ -243,11 +232,12 @@ readConfig path = do userConfigPath :: IO System.IO.FilePath userConfigPath = do userBritPathSimple <- Directory.getAppUserDataDirectory "brittany" - userBritPathXdg <- Directory.getXdgDirectory Directory.XdgConfig "brittany" + userBritPathXdg <- Directory.getXdgDirectory Directory.XdgConfig "brittany" let searchDirs = [userBritPathSimple, userBritPathXdg] - globalConfig <- Directory.findFileWith Directory.doesFileExist - searchDirs - "config.yaml" + globalConfig <- Directory.findFileWith + Directory.doesFileExist + searchDirs + "config.yaml" maybe (writeUserConfig userBritPathXdg) pure globalConfig where writeUserConfig dir = do @@ -259,7 +249,7 @@ userConfigPath = do -- | Searches for a local (per-project) brittany config starting from a given directory findLocalConfigPath :: System.IO.FilePath -> IO (Maybe System.IO.FilePath) findLocalConfigPath dir = do - let dirParts = FilePath.splitDirectories dir + let dirParts = FilePath.splitDirectories dir -- when provided dir is "a/b/c", searchDirs is ["a/b/c", "a/b", "a", "/"] let searchDirs = FilePath.joinPath <$> reverse (List.inits dirParts) Directory.findFileWith Directory.doesFileExist searchDirs "brittany.yaml" @@ -271,8 +261,9 @@ readConfigs -> MaybeT IO Config readConfigs cmdlineConfig configPaths = do configs <- readConfig `mapM` configPaths - let merged = Semigroup.sconcat - $ NonEmpty.reverse (cmdlineConfig :| catMaybes configs) + let + merged = + Semigroup.sconcat $ NonEmpty.reverse (cmdlineConfig :| catMaybes configs) return $ cZipWith fromOptionIdentity staticDefaultConfig merged -- | Reads provided configs diff --git a/source/library/Language/Haskell/Brittany/Internal/Config/Types.hs b/source/library/Language/Haskell/Brittany/Internal/Config/Types.hs index 929ac90..0b81ae6 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Config/Types.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Config/Types.hs @@ -7,63 +7,54 @@ module Language.Haskell.Brittany.Internal.Config.Types where - - +import Data.CZipWith +import Data.Coerce (Coercible, coerce) +import Data.Data (Data) +import qualified Data.Semigroup as Semigroup +import Data.Semigroup (Last) +import Data.Semigroup.Generic +import GHC.Generics import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils () -import qualified Data.Semigroup as Semigroup - -import GHC.Generics - -import Data.Data ( Data ) - -import Data.Coerce ( Coercible, coerce ) - -import Data.Semigroup.Generic -import Data.Semigroup ( Last ) - -import Data.CZipWith - - confUnpack :: Coercible a b => Identity a -> b confUnpack (Identity x) = coerce x data CDebugConfig f = DebugConfig - { _dconf_dump_config :: f (Semigroup.Last Bool) - , _dconf_dump_annotations :: f (Semigroup.Last Bool) - , _dconf_dump_ast_unknown :: f (Semigroup.Last Bool) - , _dconf_dump_ast_full :: f (Semigroup.Last Bool) - , _dconf_dump_bridoc_raw :: f (Semigroup.Last Bool) - , _dconf_dump_bridoc_simpl_alt :: f (Semigroup.Last Bool) + { _dconf_dump_config :: f (Semigroup.Last Bool) + , _dconf_dump_annotations :: f (Semigroup.Last Bool) + , _dconf_dump_ast_unknown :: f (Semigroup.Last Bool) + , _dconf_dump_ast_full :: f (Semigroup.Last Bool) + , _dconf_dump_bridoc_raw :: f (Semigroup.Last Bool) + , _dconf_dump_bridoc_simpl_alt :: f (Semigroup.Last Bool) , _dconf_dump_bridoc_simpl_floating :: f (Semigroup.Last Bool) - , _dconf_dump_bridoc_simpl_par :: f (Semigroup.Last Bool) - , _dconf_dump_bridoc_simpl_columns :: f (Semigroup.Last Bool) - , _dconf_dump_bridoc_simpl_indent :: f (Semigroup.Last Bool) - , _dconf_dump_bridoc_final :: f (Semigroup.Last Bool) - , _dconf_roundtrip_exactprint_only :: f (Semigroup.Last Bool) + , _dconf_dump_bridoc_simpl_par :: f (Semigroup.Last Bool) + , _dconf_dump_bridoc_simpl_columns :: f (Semigroup.Last Bool) + , _dconf_dump_bridoc_simpl_indent :: f (Semigroup.Last Bool) + , _dconf_dump_bridoc_final :: f (Semigroup.Last Bool) + , _dconf_roundtrip_exactprint_only :: f (Semigroup.Last Bool) } - deriving (Generic) + deriving Generic data CLayoutConfig f = LayoutConfig - { _lconfig_cols :: f (Last Int) -- the thing that has default 80. + { _lconfig_cols :: f (Last Int) -- the thing that has default 80. , _lconfig_indentPolicy :: f (Last IndentPolicy) , _lconfig_indentAmount :: f (Last Int) , _lconfig_indentWhereSpecial :: f (Last Bool) -- indent where only 1 sometimes (TODO). - , _lconfig_indentListSpecial :: f (Last Bool) -- use some special indentation for "," + , _lconfig_indentListSpecial :: f (Last Bool) -- use some special indentation for "," -- when creating zero-indentation -- multi-line list literals. - , _lconfig_importColumn :: f (Last Int) + , _lconfig_importColumn :: f (Last Int) -- ^ for import statement layouting, column at which to align the -- elements to be imported from a module. -- It is expected that importAsColumn >= importCol. - , _lconfig_importAsColumn :: f (Last Int) + , _lconfig_importAsColumn :: f (Last Int) -- ^ for import statement layouting, column at which put the module's -- "as" name (which also affects the positioning of the "as" keyword). -- It is expected that importAsColumn >= importCol. - , _lconfig_altChooser :: f (Last AltChooser) + , _lconfig_altChooser :: f (Last AltChooser) , _lconfig_columnAlignMode :: f (Last ColumnAlignMode) - , _lconfig_alignmentLimit :: f (Last Int) + , _lconfig_alignmentLimit :: f (Last Int) -- roughly speaking, this sets an upper bound to the number of spaces -- inserted to create horizontal alignment. -- More specifically, if 'xs' are the widths of the columns in some @@ -148,17 +139,17 @@ data CLayoutConfig f = LayoutConfig -- -- > , y :: Double -- -- > } } - deriving (Generic) + deriving Generic data CForwardOptions f = ForwardOptions { _options_ghc :: f [String] } - deriving (Generic) + deriving Generic data CErrorHandlingConfig f = ErrorHandlingConfig - { _econf_produceOutputOnErrors :: f (Semigroup.Last Bool) - , _econf_Werror :: f (Semigroup.Last Bool) - , _econf_ExactPrintFallback :: f (Semigroup.Last ExactPrintFallbackMode) + { _econf_produceOutputOnErrors :: f (Semigroup.Last Bool) + , _econf_Werror :: f (Semigroup.Last Bool) + , _econf_ExactPrintFallback :: f (Semigroup.Last ExactPrintFallbackMode) -- ^ Determines when to fall back on the exactprint'ed output when -- syntactical constructs are encountered which are not yet handled by -- brittany. @@ -168,21 +159,21 @@ data CErrorHandlingConfig f = ErrorHandlingConfig -- has different semantics than the code pre-transformation. , _econf_omit_output_valid_check :: f (Semigroup.Last Bool) } - deriving (Generic) + deriving Generic data CPreProcessorConfig f = PreProcessorConfig { _ppconf_CPPMode :: f (Semigroup.Last CPPMode) , _ppconf_hackAroundIncludes :: f (Semigroup.Last Bool) } - deriving (Generic) + deriving Generic data CConfig f = Config - { _conf_version :: f (Semigroup.Last Int) - , _conf_debug :: CDebugConfig f - , _conf_layout :: CLayoutConfig f + { _conf_version :: f (Semigroup.Last Int) + , _conf_debug :: CDebugConfig f + , _conf_layout :: CLayoutConfig f , _conf_errorHandling :: CErrorHandlingConfig f - , _conf_forward :: CForwardOptions f - , _conf_preprocessor :: CPreProcessorConfig f + , _conf_forward :: CForwardOptions f + , _conf_preprocessor :: CPreProcessorConfig f , _conf_roundtrip_exactprint_only :: f (Semigroup.Last Bool) -- ^ this field is somewhat of a duplicate of the one in DebugConfig. -- It is used for per-declaration disabling by the inline config @@ -193,10 +184,9 @@ data CConfig f = Config -- module. Useful for wildcard application -- (`find -name "*.hs" | xargs brittany --write-mode inplace` or something -- in that direction). - , _conf_obfuscate :: f (Semigroup.Last Bool) - + , _conf_obfuscate :: f (Semigroup.Last Bool) } - deriving (Generic) + deriving Generic type DebugConfig = CDebugConfig Identity type LayoutConfig = CLayoutConfig Identity diff --git a/source/library/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs b/source/library/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs index 2c0c78f..be7a0bb 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs @@ -18,22 +18,16 @@ module Language.Haskell.Brittany.Internal.Config.Types.Instances where - - -import Language.Haskell.Brittany.Internal.Prelude - -import Data.Yaml import qualified Data.Aeson.Key as Key import qualified Data.Aeson.Types as Aeson - +import Data.Yaml import Language.Haskell.Brittany.Internal.Config.Types - - +import Language.Haskell.Brittany.Internal.Prelude aesonDecodeOptionsBrittany :: Aeson.Options aesonDecodeOptionsBrittany = Aeson.defaultOptions { Aeson.omitNothingFields = True - , Aeson.fieldLabelModifier = dropWhile (=='_') + , Aeson.fieldLabelModifier = dropWhile (== '_') } instance FromJSON (CDebugConfig Maybe) where @@ -108,17 +102,18 @@ instance ToJSON (CConfig Maybe) where -- leafs, but for nodes of the config as well. This way e.g. "{}" is valid -- config file content. instance FromJSON (CConfig Maybe) where - parseJSON (Object v) = Config - <$> v .:? Key.fromString "conf_version" - <*> v .:?= Key.fromString "conf_debug" - <*> v .:?= Key.fromString "conf_layout" - <*> v .:?= Key.fromString "conf_errorHandling" - <*> v .:?= Key.fromString "conf_forward" - <*> v .:?= Key.fromString "conf_preprocessor" - <*> v .:? Key.fromString "conf_roundtrip_exactprint_only" - <*> v .:? Key.fromString "conf_disable_formatting" - <*> v .:? Key.fromString "conf_obfuscate" - parseJSON invalid = Aeson.typeMismatch "Config" invalid + parseJSON (Object v) = + Config + <$> (v .:? Key.fromString "conf_version") + <*> (v .:?= Key.fromString "conf_debug") + <*> (v .:?= Key.fromString "conf_layout") + <*> (v .:?= Key.fromString "conf_errorHandling") + <*> (v .:?= Key.fromString "conf_forward") + <*> (v .:?= Key.fromString "conf_preprocessor") + <*> (v .:? Key.fromString "conf_roundtrip_exactprint_only") + <*> (v .:? Key.fromString "conf_disable_formatting") + <*> (v .:? Key.fromString "conf_obfuscate") + parseJSON invalid = Aeson.typeMismatch "Config" invalid -- Pretends that the value is {} when the key is not present. (.:?=) :: FromJSON a => Object -> Key.Key -> Parser a diff --git a/source/library/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs b/source/library/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs index 46e1b6a..5020745 100644 --- a/source/library/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs +++ b/source/library/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs @@ -7,47 +7,34 @@ module Language.Haskell.Brittany.Internal.ExactPrintUtils where - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils +import Control.Exception import qualified Control.Monad.State.Class as State.Class import qualified Control.Monad.Trans.Except as ExceptT import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import Data.Data import qualified Data.Foldable as Foldable +import qualified Data.Generics as SYB +import Data.HList.HList import qualified Data.Map as Map import qualified Data.Maybe import qualified Data.Sequence as Seq import qualified Data.Set as Set -import qualified System.IO - -import Language.Haskell.Brittany.Internal.Config.Types -import Data.Data -import Data.HList.HList - -import GHC ( GenLocated(L) ) -import qualified GHC.Driver.Session as GHC +import GHC (GenLocated(L)) import qualified GHC hiding (parseModule) -import qualified GHC.Types.SrcLoc as GHC +import GHC.Data.Bag import qualified GHC.Driver.CmdLine as GHC - -import GHC.Hs -import GHC.Data.Bag - -import GHC.Types.SrcLoc ( SrcSpan, Located ) - - -import qualified Language.Haskell.GHC.ExactPrint as ExactPrint -import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint -import qualified Language.Haskell.GHC.ExactPrint.Parsers as ExactPrint -import qualified Language.Haskell.GHC.ExactPrint.Delta as ExactPrint - -import qualified Data.Generics as SYB - -import Control.Exception --- import Data.Generics.Schemes - - +import qualified GHC.Driver.Session as GHC +import GHC.Hs +import qualified GHC.Types.SrcLoc as GHC +import GHC.Types.SrcLoc (Located, SrcSpan) +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Language.Haskell.GHC.ExactPrint as ExactPrint +import qualified Language.Haskell.GHC.ExactPrint.Delta as ExactPrint +import qualified Language.Haskell.GHC.ExactPrint.Parsers as ExactPrint +import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint +import qualified System.IO parseModule :: [String] @@ -67,7 +54,7 @@ parseModuleWithCpp -> IO (Either String (ExactPrint.Anns, GHC.ParsedSource, a)) parseModuleWithCpp cpp opts args fp dynCheck = ExactPrint.ghcWrapper $ ExceptT.runExceptT $ do - dflags0 <- lift $ GHC.getSessionDynFlags + dflags0 <- lift $ GHC.getSessionDynFlags (dflags1, leftover, warnings) <- lift $ GHC.parseDynamicFlagsCmdLine dflags0 (GHC.noLoc <$> ("-hide-all-packages" : args)) @@ -79,17 +66,20 @@ parseModuleWithCpp cpp opts args fp dynCheck = void $ lift $ GHC.setSessionDynFlags dflags1 dflags2 <- lift $ ExactPrint.initDynFlags fp unless (null leftover) - $ ExceptT.throwE - $ "when parsing ghc flags: leftover flags: " + $ ExceptT.throwE + $ "when parsing ghc flags: leftover flags: " ++ show (leftover <&> \(L _ s) -> s) unless (null warnings) - $ ExceptT.throwE - $ "when parsing ghc flags: encountered warnings: " + $ ExceptT.throwE + $ "when parsing ghc flags: encountered warnings: " ++ show (warnings <&> warnExtractorCompat) - x <- ExceptT.ExceptT $ liftIO $ dynCheck dflags2 + x <- ExceptT.ExceptT $ liftIO $ dynCheck dflags2 res <- lift $ ExactPrint.parseModuleApiAnnsWithCppInternal cpp dflags2 fp - either (\err -> ExceptT.throwE $ "transform error: " ++ show (bagToList (show <$> err))) - (\(a, m) -> pure (a, m, x)) + either + (\err -> ExceptT.throwE $ "transform error: " ++ show + (bagToList (show <$> err)) + ) + (\(a, m) -> pure (a, m, x)) $ ExactPrint.postParseTransform res opts parseModuleFromString @@ -107,46 +97,51 @@ parseModuleFromString args fp dynCheck str = -- bridoc transformation stuff. -- (reminder to update note on `parsePrintModule` if this changes.) mask_ $ ExactPrint.ghcWrapper $ ExceptT.runExceptT $ do - dflags0 <- lift $ ExactPrint.initDynFlagsPure fp str + dflags0 <- lift $ ExactPrint.initDynFlagsPure fp str (dflags1, leftover, warnings) <- lift $ GHC.parseDynamicFlagsCmdLine dflags0 (GHC.noLoc <$> args) unless (null leftover) - $ ExceptT.throwE - $ "when parsing ghc flags: leftover flags: " + $ ExceptT.throwE + $ "when parsing ghc flags: leftover flags: " ++ show (leftover <&> \(L _ s) -> s) unless (null warnings) - $ ExceptT.throwE - $ "when parsing ghc flags: encountered warnings: " + $ ExceptT.throwE + $ "when parsing ghc flags: encountered warnings: " ++ show (warnings <&> warnExtractorCompat) dynCheckRes <- ExceptT.ExceptT $ liftIO $ dynCheck dflags1 let res = ExactPrint.parseModuleFromStringInternal dflags1 fp str case res of - Left err -> ExceptT.throwE $ "parse error: " ++ show (bagToList (show <$> err)) - Right (a , m ) -> pure (a, m, dynCheckRes) + Left err -> + ExceptT.throwE $ "parse error: " ++ show (bagToList (show <$> err)) + Right (a, m) -> pure (a, m, dynCheckRes) commentAnnFixTransformGlob :: SYB.Data ast => ast -> ExactPrint.Transform () commentAnnFixTransformGlob ast = do - let extract :: forall a . SYB.Data a => a -> Seq (SrcSpan, ExactPrint.AnnKey) - extract = -- traceFunctionWith "extract" (show . SYB.typeOf) show $ - const Seq.empty - `SYB.ext1Q` - (\l@(L span _) -> Seq.singleton (span, ExactPrint.mkAnnKey l)) + let + extract :: forall a . SYB.Data a => a -> Seq (SrcSpan, ExactPrint.AnnKey) + extract = -- traceFunctionWith "extract" (show . SYB.typeOf) show $ + const Seq.empty + `SYB.ext1Q` (\l@(L span _) -> + Seq.singleton (span, ExactPrint.mkAnnKey l) + ) let nodes = SYB.everything (<>) extract ast - let annsMap :: Map GHC.RealSrcLoc ExactPrint.AnnKey - annsMap = Map.fromListWith - (const id) - [ (GHC.realSrcSpanEnd span, annKey) - | (GHC.RealSrcSpan span _, annKey) <- Foldable.toList nodes - ] + let + annsMap :: Map GHC.RealSrcLoc ExactPrint.AnnKey + annsMap = Map.fromListWith + (const id) + [ (GHC.realSrcSpanEnd span, annKey) + | (GHC.RealSrcSpan span _, annKey) <- Foldable.toList nodes + ] nodes `forM_` (snd .> processComs annsMap) where processComs annsMap annKey1 = do mAnn <- State.Class.gets fst <&> Map.lookup annKey1 mAnn `forM_` \ann1 -> do - let priors = ExactPrint.annPriorComments ann1 - follows = ExactPrint.annFollowingComments ann1 - assocs = ExactPrint.annsDP ann1 + let + priors = ExactPrint.annPriorComments ann1 + follows = ExactPrint.annFollowingComments ann1 + assocs = ExactPrint.annsDP ann1 let processCom :: (ExactPrint.Comment, ExactPrint.DeltaPos) @@ -158,31 +153,32 @@ commentAnnFixTransformGlob ast = do (ExactPrint.CN "RecordCon", ExactPrint.CN "HsRecField") -> move $> False (x, y) | x == y -> move $> False - _ -> return True + _ -> return True where ExactPrint.AnnKey annKeyLoc1 con1 = annKey1 ExactPrint.AnnKey annKeyLoc2 con2 = annKey2 - loc1 = GHC.realSrcSpanStart annKeyLoc1 - loc2 = GHC.realSrcSpanStart annKeyLoc2 + loc1 = GHC.realSrcSpanStart annKeyLoc1 + loc2 = GHC.realSrcSpanStart annKeyLoc2 move = ExactPrint.modifyAnnsT $ \anns -> let - ann2 = Data.Maybe.fromJust $ Map.lookup annKey2 anns + ann2 = Data.Maybe.fromJust $ Map.lookup annKey2 anns ann2' = ann2 { ExactPrint.annFollowingComments = - ExactPrint.annFollowingComments ann2 ++ [comPair] + ExactPrint.annFollowingComments ann2 ++ [comPair] } - in - Map.insert annKey2 ann2' anns + in Map.insert annKey2 ann2' anns _ -> return True -- retain comment at current node. - priors' <- filterM processCom priors + priors' <- filterM processCom priors follows' <- filterM processCom follows - assocs' <- flip filterM assocs $ \case + assocs' <- flip filterM assocs $ \case (ExactPrint.AnnComment com, dp) -> processCom (com, dp) - _ -> return True - let ann1' = ann1 { ExactPrint.annPriorComments = priors' - , ExactPrint.annFollowingComments = follows' - , ExactPrint.annsDP = assocs' - } + _ -> return True + let + ann1' = ann1 + { ExactPrint.annPriorComments = priors' + , ExactPrint.annFollowingComments = follows' + , ExactPrint.annsDP = assocs' + } ExactPrint.modifyAnnsT $ \anns -> Map.insert annKey1 ann1' anns @@ -270,29 +266,30 @@ extractToplevelAnns lmod anns = output | (k, ExactPrint.Ann _ _ _ _ _ (Just captured)) <- Map.toList anns ] declMap = declMap1 `Map.union` declMap2 - modKey = ExactPrint.mkAnnKey lmod - output = groupMap (\k _ -> Map.findWithDefault modKey k declMap) anns + modKey = ExactPrint.mkAnnKey lmod + output = groupMap (\k _ -> Map.findWithDefault modKey k declMap) anns groupMap :: (Ord k, Ord l) => (k -> a -> l) -> Map k a -> Map l (Map k a) -groupMap f = Map.foldlWithKey' (\m k a -> Map.alter (insert k a) (f k a) m) - Map.empty +groupMap f = Map.foldlWithKey' + (\m k a -> Map.alter (insert k a) (f k a) m) + Map.empty where - insert k a Nothing = Just (Map.singleton k a) + insert k a Nothing = Just (Map.singleton k a) insert k a (Just m) = Just (Map.insert k a m) foldedAnnKeys :: Data.Data.Data ast => ast -> Set ExactPrint.AnnKey foldedAnnKeys ast = SYB.everything Set.union - ( \x -> maybe + (\x -> maybe Set.empty Set.singleton [ SYB.gmapQi 1 (ExactPrint.mkAnnKey . L l) x | locTyCon == SYB.typeRepTyCon (SYB.typeOf x) , l :: SrcSpan <- SYB.gmapQi 0 SYB.cast x + ] -- for some reason, ghc-8.8 has forgotten how to infer the type of l, -- even though it is passed to mkAnnKey above, which only accepts -- SrcSpan. - ] ) ast where locTyCon = SYB.typeRepTyCon (SYB.typeOf (L () ())) @@ -301,8 +298,8 @@ foldedAnnKeys ast = SYB.everything withTransformedAnns :: Data ast => ast - -> MultiRWSS.MultiRWS '[Config, ExactPrint.Anns] w s a - -> MultiRWSS.MultiRWS '[Config, ExactPrint.Anns] w s a + -> MultiRWSS.MultiRWS '[Config , ExactPrint.Anns] w s a + -> MultiRWSS.MultiRWS '[Config , ExactPrint.Anns] w s a withTransformedAnns ast m = MultiRWSS.mGetRawR >>= \case readers@(conf :+: anns :+: HNil) -> do -- TODO: implement `local` for MultiReader/MultiRWS @@ -312,9 +309,10 @@ withTransformedAnns ast m = MultiRWSS.mGetRawR >>= \case pure x where f anns = - let ((), (annsBalanced, _), _) = - ExactPrint.runTransform anns (commentAnnFixTransformGlob ast) - in annsBalanced + let + ((), (annsBalanced, _), _) = + ExactPrint.runTransform anns (commentAnnFixTransformGlob ast) + in annsBalanced warnExtractorCompat :: GHC.Warn -> String diff --git a/source/library/Language/Haskell/Brittany/Internal/LayouterBasics.hs b/source/library/Language/Haskell/Brittany/Internal/LayouterBasics.hs index 422c7be..8f861d4 100644 --- a/source/library/Language/Haskell/Brittany/Internal/LayouterBasics.hs +++ b/source/library/Language/Haskell/Brittany/Internal/LayouterBasics.hs @@ -6,50 +6,37 @@ module Language.Haskell.Brittany.Internal.LayouterBasics where - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Writer.Strict as Writer +import qualified Data.Char as Char +import Data.Data import qualified Data.Map as Map import qualified Data.Semigroup as Semigroup import qualified Data.Sequence as Seq import qualified Data.Set as Set import qualified Data.Text as Text +import qualified Data.Text.Lazy.Builder as Text.Builder +import DataTreePrint +import GHC (GenLocated(L), Located, moduleName, moduleNameString) import qualified GHC.OldList as List - -import qualified Control.Monad.Writer.Strict as Writer - +import GHC.Parser.Annotation (AnnKeywordId(..)) +import GHC.Types.Name (getOccString) +import GHC.Types.Name.Occurrence (occNameString) +import GHC.Types.Name.Reader (RdrName(..)) +import qualified GHC.Types.SrcLoc as GHC +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.ExactPrintUtils +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.Utils import qualified Language.Haskell.GHC.ExactPrint as ExactPrint import qualified Language.Haskell.GHC.ExactPrint.Annotate as ExactPrint.Annotate import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint +import Language.Haskell.GHC.ExactPrint.Types (AnnKey, Annotation) import qualified Language.Haskell.GHC.ExactPrint.Utils as ExactPrint.Utils -import Language.Haskell.GHC.ExactPrint.Types ( AnnKey, Annotation ) - -import qualified Data.Text.Lazy.Builder as Text.Builder - -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.Utils -import Language.Haskell.Brittany.Internal.ExactPrintUtils - -import GHC.Types.Name.Reader ( RdrName(..) ) -import GHC ( Located, GenLocated(L), moduleName, moduleNameString ) -import qualified GHC.Types.SrcLoc as GHC -import GHC.Types.Name.Occurrence ( occNameString ) -import GHC.Types.Name ( getOccString ) -import GHC.Parser.Annotation ( AnnKeywordId(..) ) - -import Data.Data - -import qualified Data.Char as Char - -import DataTreePrint - - - processDefault :: ( ExactPrint.Annotate.Annotate ast , MonadMultiWriter Text.Builder.Builder m @@ -67,7 +54,7 @@ processDefault x = do -- the module (header). This would remove the need for this hack! case str of "\n" -> return () - _ -> mTell $ Text.Builder.fromString str + _ -> mTell $ Text.Builder.fromString str -- | Use ExactPrint's output for this node; add a newly generated inline comment -- at insertion position (meant to point out to the user that this node is @@ -79,9 +66,10 @@ briDocByExact -> ToBriDocM BriDocNumbered briDocByExact ast = do anns <- mAsk - traceIfDumpConf "ast" - _dconf_dump_ast_unknown - (printTreeWithCustom 100 (customLayouterF anns) ast) + traceIfDumpConf + "ast" + _dconf_dump_ast_unknown + (printTreeWithCustom 100 (customLayouterF anns) ast) docExt ast anns True -- | Use ExactPrint's output for this node. @@ -95,9 +83,10 @@ briDocByExactNoComment -> ToBriDocM BriDocNumbered briDocByExactNoComment ast = do anns <- mAsk - traceIfDumpConf "ast" - _dconf_dump_ast_unknown - (printTreeWithCustom 100 (customLayouterF anns) ast) + traceIfDumpConf + "ast" + _dconf_dump_ast_unknown + (printTreeWithCustom 100 (customLayouterF anns) ast) docExt ast anns False -- | Use ExactPrint's output for this node, presuming that this output does @@ -110,24 +99,26 @@ briDocByExactInlineOnly -> ToBriDocM BriDocNumbered briDocByExactInlineOnly infoStr ast = do anns <- mAsk - traceIfDumpConf "ast" - _dconf_dump_ast_unknown - (printTreeWithCustom 100 (customLayouterF anns) ast) + traceIfDumpConf + "ast" + _dconf_dump_ast_unknown + (printTreeWithCustom 100 (customLayouterF anns) ast) let exactPrinted = Text.pack $ ExactPrint.exactPrint ast anns fallbackMode <- mAsk <&> _conf_errorHandling .> _econf_ExactPrintFallback .> confUnpack - let exactPrintNode t = allocateNode $ BDFExternal - (ExactPrint.Types.mkAnnKey ast) - (foldedAnnKeys ast) - False - t - let errorAction = do - mTell [ErrorUnknownNode infoStr ast] - docLit - $ Text.pack "{- BRITTANY ERROR UNHANDLED SYNTACTICAL CONSTRUCT -}" + let + exactPrintNode t = allocateNode $ BDFExternal + (ExactPrint.Types.mkAnnKey ast) + (foldedAnnKeys ast) + False + t + let + errorAction = do + mTell [ErrorUnknownNode infoStr ast] + docLit $ Text.pack "{- BRITTANY ERROR UNHANDLED SYNTACTICAL CONSTRUCT -}" case (fallbackMode, Text.lines exactPrinted) of - (ExactPrintFallbackModeNever, _ ) -> errorAction - (_ , [t]) -> exactPrintNode + (ExactPrintFallbackModeNever, _) -> errorAction + (_, [t]) -> exactPrintNode (Text.dropWhile Char.isSpace . Text.dropWhileEnd Char.isSpace $ t) (ExactPrintFallbackModeRisky, _) -> exactPrintNode exactPrinted _ -> errorAction @@ -152,20 +143,21 @@ lrdrNameToTextAnnGen lrdrNameToTextAnnGen f ast@(L _ n) = do anns <- mAsk let t = f $ rdrNameToText n - let hasUni x (ExactPrint.Types.G y, _) = x == y - hasUni _ _ = False + let + hasUni x (ExactPrint.Types.G y, _) = x == y + hasUni _ _ = False -- TODO: in general: we should _always_ process all annotaiton stuff here. -- whatever we don't probably should have had some effect on the -- output. in such cases, resorting to byExact is probably the safe -- choice. return $ case Map.lookup (ExactPrint.Types.mkAnnKey ast) anns of - Nothing -> t + Nothing -> t Just (ExactPrint.Types.Ann _ _ _ aks _ _) -> case n of - Exact{} | t == Text.pack "()" -> t - _ | any (hasUni AnnBackquote) aks -> Text.pack "`" <> t <> Text.pack "`" + Exact{} | t == Text.pack "()" -> t + _ | any (hasUni AnnBackquote) aks -> Text.pack "`" <> t <> Text.pack "`" _ | any (hasUni AnnCommaTuple) aks -> t - _ | any (hasUni AnnOpenP) aks -> Text.pack "(" <> t <> Text.pack ")" - _ | otherwise -> t + _ | any (hasUni AnnOpenP) aks -> Text.pack "(" <> t <> Text.pack ")" + _ | otherwise -> t lrdrNameToTextAnn :: (MonadMultiReader Config m, MonadMultiReader (Map AnnKey Annotation) m) @@ -178,9 +170,10 @@ lrdrNameToTextAnnTypeEqualityIsSpecial => Located RdrName -> m Text lrdrNameToTextAnnTypeEqualityIsSpecial ast = do - let f x = if x == Text.pack "Data.Type.Equality~" - then Text.pack "~" -- rraaaahhh special casing rraaahhhhhh - else x + let + f x = if x == Text.pack "Data.Type.Equality~" + then Text.pack "~" -- rraaaahhh special casing rraaahhhhhh + else x lrdrNameToTextAnnGen f ast -- | Same as lrdrNameToTextAnnTypeEqualityIsSpecial, but also inspects @@ -198,10 +191,11 @@ lrdrNameToTextAnnTypeEqualityIsSpecialAndRespectTick -> m Text lrdrNameToTextAnnTypeEqualityIsSpecialAndRespectTick ast1 ast2 = do hasQuote <- hasAnnKeyword ast1 AnnSimpleQuote - x <- lrdrNameToTextAnn ast2 - let lit = if x == Text.pack "Data.Type.Equality~" - then Text.pack "~" -- rraaaahhh special casing rraaahhhhhh - else x + x <- lrdrNameToTextAnn ast2 + let + lit = if x == Text.pack "Data.Type.Equality~" + then Text.pack "~" -- rraaaahhh special casing rraaahhhhhh + else x return $ if hasQuote then Text.cons '\'' lit else lit askIndent :: (MonadMultiReader Config m) => m Int @@ -219,12 +213,11 @@ extractRestComments ann = ExactPrint.annFollowingComments ann ++ (ExactPrint.annsDP ann >>= \case (ExactPrint.AnnComment com, dp) -> [(com, dp)] - _ -> [] + _ -> [] ) filterAnns :: Data.Data.Data ast => ast -> ExactPrint.Anns -> ExactPrint.Anns -filterAnns ast = - Map.filterWithKey (\k _ -> k `Set.member` foldedAnnKeys ast) +filterAnns ast = Map.filterWithKey (\k _ -> k `Set.member` foldedAnnKeys ast) -- | True if there are any comments that are -- a) connected to any node below (in AST sense) the given node AND @@ -242,15 +235,16 @@ hasCommentsBetween -> ToBriDocM Bool hasCommentsBetween ast leftKey rightKey = do mAnn <- astAnn ast - let go1 [] = False - go1 ((ExactPrint.G kw, _dp) : rest) | kw == leftKey = go2 rest - go1 (_ : rest) = go1 rest - go2 [] = False - go2 ((ExactPrint.AnnComment _, _dp) : _rest) = True - go2 ((ExactPrint.G kw, _dp) : _rest) | kw == rightKey = False - go2 (_ : rest) = go2 rest + let + go1 [] = False + go1 ((ExactPrint.G kw, _dp) : rest) | kw == leftKey = go2 rest + go1 (_ : rest) = go1 rest + go2 [] = False + go2 ((ExactPrint.AnnComment _, _dp) : _rest) = True + go2 ((ExactPrint.G kw, _dp) : _rest) | kw == rightKey = False + go2 (_ : rest) = go2 rest case mAnn of - Nothing -> pure False + Nothing -> pure False Just ann -> pure $ go1 $ ExactPrint.annsDP ann -- | True if there are any comments that are connected to any node below (in AST @@ -260,7 +254,8 @@ hasAnyCommentsConnected ast = not . null <$> astConnectedComments ast -- | True if there are any regular comments connected to any node below (in AST -- sense) the given node -hasAnyRegularCommentsConnected :: Data ast => GHC.Located ast -> ToBriDocM Bool +hasAnyRegularCommentsConnected + :: Data ast => GHC.Located ast -> ToBriDocM Bool hasAnyRegularCommentsConnected ast = any isRegularComment <$> astConnectedComments ast @@ -297,7 +292,7 @@ hasAnyRegularCommentsRest ast = astAnn ast <&> \case hasAnnKeywordComment :: Data ast => GHC.Located ast -> AnnKeywordId -> ToBriDocM Bool hasAnnKeywordComment ast annKeyword = astAnn ast <&> \case - Nothing -> False + Nothing -> False Just ann -> any hasK (extractAllComments ann) where hasK = (== Just annKeyword) . ExactPrint.Types.commentOrigin . fst @@ -311,7 +306,7 @@ hasAnnKeyword ast annKeyword = astAnn ast <&> \case Just (ExactPrint.Types.Ann _ _ _ aks _ _) -> any hasK aks where hasK (ExactPrint.Types.G x, _) = x == annKeyword - hasK _ = False + hasK _ = False astAnn :: (Data ast, MonadMultiReader (Map AnnKey Annotation) m) @@ -460,12 +455,10 @@ newtype CollectAltM a = CollectAltM (Writer.Writer [ToBriDocM BriDocNumbered] a) deriving (Functor, Applicative, Monad) addAlternativeCond :: Bool -> ToBriDocM BriDocNumbered -> CollectAltM () -addAlternativeCond cond doc = - when cond (addAlternative doc) +addAlternativeCond cond doc = when cond (addAlternative doc) addAlternative :: ToBriDocM BriDocNumbered -> CollectAltM () -addAlternative = - CollectAltM . Writer.tell . (: []) +addAlternative = CollectAltM . Writer.tell . (: []) runFilteredAlternative :: CollectAltM () -> ToBriDocM BriDocNumbered runFilteredAlternative (CollectAltM action) = @@ -482,7 +475,8 @@ docLines l = allocateNode . BDFLines =<< sequence l docCols :: ColSig -> [ToBriDocM BriDocNumbered] -> ToBriDocM BriDocNumbered docCols sig l = allocateNode . BDFCols sig =<< sequence l -docAddBaseY :: BrIndent -> ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered +docAddBaseY + :: BrIndent -> ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered docAddBaseY ind bdm = allocateNode . BDFAddBaseY ind =<< bdm docSetBaseY :: ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered @@ -517,7 +511,8 @@ docAnnotationKW -> Maybe AnnKeywordId -> ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered -docAnnotationKW annKey kw bdm = allocateNode . BDFAnnotationKW annKey kw =<< bdm +docAnnotationKW annKey kw bdm = + allocateNode . BDFAnnotationKW annKey kw =<< bdm docMoveToKWDP :: AnnKey @@ -569,7 +564,7 @@ docParenR :: ToBriDocM BriDocNumbered docParenR = docLit $ Text.pack ")" docParenHashLSep :: ToBriDocM BriDocNumbered -docParenHashLSep = docSeq [docLit $ Text.pack "(#", docSeparator] +docParenHashLSep = docSeq [docLit $ Text.pack "(#", docSeparator] docParenHashRSep :: ToBriDocM BriDocNumbered docParenHashRSep = docSeq [docSeparator, docLit $ Text.pack "#)"] @@ -631,32 +626,26 @@ instance DocWrapable (ToBriDocM BriDocNumbered) where docWrapNodePrior ast bdm = do bd <- bdm i1 <- allocNodeIndex - return - $ (,) i1 - $ BDFAnnotationPrior (ExactPrint.Types.mkAnnKey ast) - $ bd + return $ (,) i1 $ BDFAnnotationPrior (ExactPrint.Types.mkAnnKey ast) $ bd docWrapNodeRest ast bdm = do bd <- bdm i2 <- allocNodeIndex - return - $ (,) i2 - $ BDFAnnotationRest (ExactPrint.Types.mkAnnKey ast) - $ bd + return $ (,) i2 $ BDFAnnotationRest (ExactPrint.Types.mkAnnKey ast) $ bd instance DocWrapable (ToBriDocM a) => DocWrapable [ToBriDocM a] where docWrapNode ast bdms = case bdms of [] -> [] [bd] -> [docWrapNode ast bd] - (bd1:bdR) | (bdN:bdM) <- reverse bdR -> + (bd1 : bdR) | (bdN : bdM) <- reverse bdR -> [docWrapNodePrior ast bd1] ++ reverse bdM ++ [docWrapNodeRest ast bdN] _ -> error "cannot happen (TM)" docWrapNodePrior ast bdms = case bdms of [] -> [] [bd] -> [docWrapNodePrior ast bd] - (bd1:bdR) -> docWrapNodePrior ast bd1 : bdR + (bd1 : bdR) -> docWrapNodePrior ast bd1 : bdR docWrapNodeRest ast bdms = case reverse bdms of - [] -> [] - (bdN:bdR) -> reverse $ docWrapNodeRest ast bdN : bdR + [] -> [] + (bdN : bdR) -> reverse $ docWrapNodeRest ast bdN : bdR instance DocWrapable (ToBriDocM a) => DocWrapable (ToBriDocM [a]) where docWrapNode ast bdsm = do @@ -666,25 +655,25 @@ instance DocWrapable (ToBriDocM a) => DocWrapable (ToBriDocM [a]) where [bd] -> do bd' <- docWrapNode ast (return bd) return [bd'] - (bd1:bdR) | (bdN:bdM) <- reverse bdR -> do + (bd1 : bdR) | (bdN : bdM) <- reverse bdR -> do bd1' <- docWrapNodePrior ast (return bd1) - bdN' <- docWrapNodeRest ast (return bdN) + bdN' <- docWrapNodeRest ast (return bdN) return $ [bd1'] ++ reverse bdM ++ [bdN'] _ -> error "cannot happen (TM)" docWrapNodePrior ast bdsm = do bds <- bdsm case bds of [] -> return [] - (bd1:bdR) -> do + (bd1 : bdR) -> do bd1' <- docWrapNodePrior ast (return bd1) - return (bd1':bdR) + return (bd1' : bdR) docWrapNodeRest ast bdsm = do bds <- bdsm case reverse bds of [] -> return [] - (bdN:bdR) -> do + (bdN : bdR) -> do bdN' <- docWrapNodeRest ast (return bdN) - return $ reverse (bdN':bdR) + return $ reverse (bdN' : bdR) instance DocWrapable (ToBriDocM a) => DocWrapable (ToBriDocM (Seq a)) where docWrapNode ast bdsm = do @@ -697,7 +686,7 @@ instance DocWrapable (ToBriDocM a) => DocWrapable (ToBriDocM (Seq a)) where return $ Seq.singleton bd1' bdM Seq.:> bdN -> do bd1' <- docWrapNodePrior ast (return bd1) - bdN' <- docWrapNodeRest ast (return bdN) + bdN' <- docWrapNodeRest ast (return bdN) return $ (bd1' Seq.<| bdM) Seq.|> bdN' docWrapNodePrior ast bdsm = do bds <- bdsm @@ -741,7 +730,7 @@ docPar -> ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered docPar lineM indentedM = do - line <- lineM + line <- lineM indented <- indentedM allocateNode $ BDFPar BrIndentNone line indented @@ -778,14 +767,15 @@ briDocMToPPM m = do briDocMToPPMInner :: ToBriDocM a -> PPMLocal (a, [BrittanyError], Seq String) briDocMToPPMInner m = do readers <- MultiRWSS.mGetRawR - let ((x, errs), debugs) = - runIdentity - $ MultiRWSS.runMultiRWSTNil - $ MultiRWSS.withMultiStateA (NodeAllocIndex 1) - $ MultiRWSS.withMultiReaders readers - $ MultiRWSS.withMultiWriterAW - $ MultiRWSS.withMultiWriterAW - $ m + let + ((x, errs), debugs) = + runIdentity + $ MultiRWSS.runMultiRWSTNil + $ MultiRWSS.withMultiStateA (NodeAllocIndex 1) + $ MultiRWSS.withMultiReaders readers + $ MultiRWSS.withMultiWriterAW + $ MultiRWSS.withMultiWriterAW + $ m pure (x, errs, debugs) docSharedWrapper :: Monad m => (x -> m y) -> x -> m (m y) diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs index acbe186..3bafd56 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs @@ -3,26 +3,19 @@ module Language.Haskell.Brittany.Internal.Layouters.DataDecl where - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Data.Data import qualified Data.Semigroup as Semigroup import qualified Data.Text as Text -import qualified GHC.OldList as List - -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.LayouterBasics -import Language.Haskell.Brittany.Internal.Config.Types - -import GHC ( Located, GenLocated(L) ) +import GHC (GenLocated(L), Located) import qualified GHC -import GHC.Hs - -import Language.Haskell.Brittany.Internal.Layouters.Type - - +import GHC.Hs +import qualified GHC.OldList as List +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.LayouterBasics +import Language.Haskell.Brittany.Internal.Layouters.Type +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Types layoutDataDecl :: Located (TyClDecl GhcPs) @@ -32,28 +25,29 @@ layoutDataDecl -> ToBriDocM BriDocNumbered layoutDataDecl ltycl name (HsQTvs _ bndrs) defn = case defn of -- newtype MyType a b = MyType .. - HsDataDefn _ext NewType (L _ []) _ctype Nothing [cons] mDerivs -> case cons of - (L _ (ConDeclH98 _ext consName (L _ False) _qvars (Just (L _ [])) details _conDoc)) -> - docWrapNode ltycl $ do - nameStr <- lrdrNameToTextAnn name - consNameStr <- lrdrNameToTextAnn consName - tyVarLine <- return <$> createBndrDoc bndrs - -- headDoc <- fmap return $ docSeq - -- [ appSep $ docLitS "newtype") - -- , appSep $ docLit nameStr - -- , appSep tyVarLine - -- ] - rhsDoc <- return <$> createDetailsDoc consNameStr details - createDerivingPar mDerivs $ docSeq - [ appSep $ docLitS "newtype" - , appSep $ docLit nameStr - , appSep tyVarLine - , docSeparator - , docLitS "=" - , docSeparator - , rhsDoc - ] - _ -> briDocByExactNoComment ltycl + HsDataDefn _ext NewType (L _ []) _ctype Nothing [cons] mDerivs -> + case cons of + (L _ (ConDeclH98 _ext consName (L _ False) _qvars (Just (L _ [])) details _conDoc)) + -> docWrapNode ltycl $ do + nameStr <- lrdrNameToTextAnn name + consNameStr <- lrdrNameToTextAnn consName + tyVarLine <- return <$> createBndrDoc bndrs + -- headDoc <- fmap return $ docSeq + -- [ appSep $ docLitS "newtype") + -- , appSep $ docLit nameStr + -- , appSep tyVarLine + -- ] + rhsDoc <- return <$> createDetailsDoc consNameStr details + createDerivingPar mDerivs $ docSeq + [ appSep $ docLitS "newtype" + , appSep $ docLit nameStr + , appSep tyVarLine + , docSeparator + , docLitS "=" + , docSeparator + , rhsDoc + ] + _ -> briDocByExactNoComment ltycl -- data MyData a b @@ -61,8 +55,8 @@ layoutDataDecl ltycl name (HsQTvs _ bndrs) defn = case defn of HsDataDefn _ext DataType (L _ lhsContext) _ctype Nothing [] mDerivs -> docWrapNode ltycl $ do lhsContextDoc <- docSharedWrapper createContextDoc lhsContext - nameStr <- lrdrNameToTextAnn name - tyVarLine <- return <$> createBndrDoc bndrs + nameStr <- lrdrNameToTextAnn name + tyVarLine <- return <$> createBndrDoc bndrs createDerivingPar mDerivs $ docSeq [ appSep $ docLitS "data" , lhsContextDoc @@ -74,32 +68,36 @@ layoutDataDecl ltycl name (HsQTvs _ bndrs) defn = case defn of -- data MyData = MyData { .. } HsDataDefn _ext DataType (L _ lhsContext) _ctype Nothing [cons] mDerivs -> case cons of - (L _ (ConDeclH98 _ext consName (L _ _hasExt) qvars mRhsContext details _conDoc)) -> - docWrapNode ltycl $ do + (L _ (ConDeclH98 _ext consName (L _ _hasExt) qvars mRhsContext details _conDoc)) + -> docWrapNode ltycl $ do lhsContextDoc <- docSharedWrapper createContextDoc lhsContext - nameStr <- lrdrNameToTextAnn name - consNameStr <- lrdrNameToTextAnn consName - tyVarLine <- return <$> createBndrDoc bndrs - forallDocMay <- case createForallDoc qvars of + nameStr <- lrdrNameToTextAnn name + consNameStr <- lrdrNameToTextAnn consName + tyVarLine <- return <$> createBndrDoc bndrs + forallDocMay <- case createForallDoc qvars of Nothing -> pure Nothing Just x -> Just . pure <$> x rhsContextDocMay <- case mRhsContext of - Nothing -> pure Nothing + Nothing -> pure Nothing Just (L _ ctxt) -> Just . pure <$> createContextDoc ctxt - rhsDoc <- return <$> createDetailsDoc consNameStr details - consDoc <- fmap pure + rhsDoc <- return <$> createDetailsDoc consNameStr details + consDoc <- + fmap pure $ docNonBottomSpacing $ case (forallDocMay, rhsContextDocMay) of (Just forallDoc, Just rhsContextDoc) -> docLines - [ docSeq [docLitS "=", docSeparator, docForceSingleline forallDoc] + [ docSeq + [docLitS "=", docSeparator, docForceSingleline forallDoc] , docSeq [ docLitS "." , docSeparator - , docSetBaseY $ docLines [rhsContextDoc, docSetBaseY rhsDoc] + , docSetBaseY + $ docLines [rhsContextDoc, docSetBaseY rhsDoc] ] ] (Just forallDoc, Nothing) -> docLines - [ docSeq [docLitS "=", docSeparator, docForceSingleline forallDoc] + [ docSeq + [docLitS "=", docSeparator, docForceSingleline forallDoc] , docSeq [docLitS ".", docSeparator, rhsDoc] ] (Nothing, Just rhsContextDoc) -> docSeq @@ -107,12 +105,12 @@ layoutDataDecl ltycl name (HsQTvs _ bndrs) defn = case defn of , docSeparator , docSetBaseY $ docLines [rhsContextDoc, docSetBaseY rhsDoc] ] - (Nothing, Nothing) -> docSeq [docLitS "=", docSeparator, rhsDoc] + (Nothing, Nothing) -> + docSeq [docLitS "=", docSeparator, rhsDoc] createDerivingPar mDerivs $ docAlt [ -- data D = forall a . Show a => D a docSeq - [ docNodeAnnKW ltycl (Just GHC.AnnData) - $ docSeq + [ docNodeAnnKW ltycl (Just GHC.AnnData) $ docSeq [ appSep $ docLitS "data" , docForceSingleline $ lhsContextDoc , appSep $ docLit nameStr @@ -124,12 +122,13 @@ layoutDataDecl ltycl name (HsQTvs _ bndrs) defn = case defn of , docSetIndentLevel $ docSeq [ case forallDocMay of Nothing -> docEmpty - Just forallDoc -> docSeq - [ docForceSingleline forallDoc - , docSeparator - , docLitS "." - , docSeparator - ] + Just forallDoc -> + docSeq + [ docForceSingleline forallDoc + , docSeparator + , docLitS "." + , docSeparator + ] , maybe docEmpty docForceSingleline rhsContextDocMay , rhsDoc ] @@ -137,26 +136,26 @@ layoutDataDecl ltycl name (HsQTvs _ bndrs) defn = case defn of , -- data D -- = forall a . Show a => D a docAddBaseY BrIndentRegular $ docPar - ( docNodeAnnKW ltycl (Just GHC.AnnData) - $ docSeq + (docNodeAnnKW ltycl (Just GHC.AnnData) $ docSeq [ appSep $ docLitS "data" , docForceSingleline lhsContextDoc , appSep $ docLit nameStr , tyVarLine ] ) - ( docSeq + (docSeq [ docLitS "=" , docSeparator , docSetIndentLevel $ docSeq [ case forallDocMay of Nothing -> docEmpty - Just forallDoc -> docSeq - [ docForceSingleline forallDoc - , docSeparator - , docLitS "." - , docSeparator - ] + Just forallDoc -> + docSeq + [ docForceSingleline forallDoc + , docSeparator + , docLitS "." + , docSeparator + ] , maybe docEmpty docForceSingleline rhsContextDocMay , rhsDoc ] @@ -167,8 +166,7 @@ layoutDataDecl ltycl name (HsQTvs _ bndrs) defn = case defn of -- . Show a => -- D a docAddBaseY BrIndentRegular $ docPar - ( docNodeAnnKW ltycl (Just GHC.AnnData) - $ docSeq + (docNodeAnnKW ltycl (Just GHC.AnnData) $ docSeq [ appSep $ docLitS "data" , docForceSingleline lhsContextDoc , appSep $ docLit nameStr @@ -189,13 +187,10 @@ layoutDataDecl ltycl name (HsQTvs _ bndrs) defn = case defn of -- hurt. docAddBaseY BrIndentRegular $ docPar (docLitS "data") - ( docLines + (docLines [ lhsContextDoc , docNodeAnnKW ltycl (Just GHC.AnnData) - $ docSeq - [ appSep $ docLit nameStr - , tyVarLine - ] + $ docSeq [appSep $ docLit nameStr, tyVarLine] , consDoc ] ) @@ -209,20 +204,20 @@ createContextDoc [] = docEmpty createContextDoc [t] = docSeq [layoutType t, docSeparator, docLitS "=>", docSeparator] createContextDoc (t1 : tR) = do - t1Doc <- docSharedWrapper layoutType t1 + t1Doc <- docSharedWrapper layoutType t1 tRDocs <- tR `forM` docSharedWrapper layoutType docAlt [ docSeq [ docLitS "(" - , docForceSingleline $ docSeq $ List.intersperse docCommaSep - (t1Doc : tRDocs) + , docForceSingleline $ docSeq $ List.intersperse + docCommaSep + (t1Doc : tRDocs) , docLitS ") =>" , docSeparator ] , docLines $ join [ [docSeq [docLitS "(", docSeparator, t1Doc]] - , tRDocs - <&> \tRDoc -> docSeq [docLitS ",", docSeparator, tRDoc] + , tRDocs <&> \tRDoc -> docSeq [docLitS ",", docSeparator, tRDoc] , [docLitS ") =>", docSeparator] ] ] @@ -234,20 +229,18 @@ createBndrDoc bs = do (L _ (KindedTyVar _ _ext lrdrName kind)) -> do d <- docSharedWrapper layoutType kind return $ (lrdrNameToText lrdrName, Just $ d) - docSeq - $ List.intersperse docSeparator - $ tyVarDocs - <&> \(vname, mKind) -> case mKind of - Nothing -> docLit vname - Just kind -> docSeq - [ docLitS "(" - , docLit vname - , docSeparator - , docLitS "::" - , docSeparator - , kind - , docLitS ")" - ] + docSeq $ List.intersperse docSeparator $ tyVarDocs <&> \(vname, mKind) -> + case mKind of + Nothing -> docLit vname + Just kind -> docSeq + [ docLitS "(" + , docLit vname + , docSeparator + , docLitS "::" + , docSeparator + , kind + , docLitS ")" + ] createDerivingPar :: HsDeriving GhcPs -> ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered @@ -256,48 +249,47 @@ createDerivingPar derivs mainDoc = do (L _ []) -> mainDoc (L _ types) -> docPar mainDoc - $ docEnsureIndent BrIndentRegular - $ docLines - $ docWrapNode derivs - $ derivingClauseDoc + $ docEnsureIndent BrIndentRegular + $ docLines + $ docWrapNode derivs + $ derivingClauseDoc <$> types derivingClauseDoc :: LHsDerivingClause GhcPs -> ToBriDocM BriDocNumbered -derivingClauseDoc (L _ (HsDerivingClause _ext mStrategy types)) = case types of - (L _ []) -> docSeq [] - (L _ ts) -> - let - tsLength = length ts - whenMoreThan1Type val = - if tsLength > 1 then docLitS val else docLitS "" - (lhsStrategy, rhsStrategy) = maybe (docEmpty, docEmpty) strategyLeftRight mStrategy - in - docSeq +derivingClauseDoc (L _ (HsDerivingClause _ext mStrategy types)) = + case types of + (L _ []) -> docSeq [] + (L _ ts) -> + let + tsLength = length ts + whenMoreThan1Type val = + if tsLength > 1 then docLitS val else docLitS "" + (lhsStrategy, rhsStrategy) = + maybe (docEmpty, docEmpty) strategyLeftRight mStrategy + in docSeq [ docDeriving , docWrapNodePrior types $ lhsStrategy , docSeparator , whenMoreThan1Type "(" , docWrapNodeRest types - $ docSeq - $ List.intersperse docCommaSep - $ ts <&> \case - HsIB _ t -> layoutType t + $ docSeq + $ List.intersperse docCommaSep + $ ts + <&> \case + HsIB _ t -> layoutType t , whenMoreThan1Type ")" , rhsStrategy ] where strategyLeftRight = \case - (L _ StockStrategy ) -> (docLitS " stock", docEmpty) - (L _ AnyclassStrategy ) -> (docLitS " anyclass", docEmpty) - (L _ NewtypeStrategy ) -> (docLitS " newtype", docEmpty) - lVia@(L _ (ViaStrategy viaTypes) ) -> + (L _ StockStrategy) -> (docLitS " stock", docEmpty) + (L _ AnyclassStrategy) -> (docLitS " anyclass", docEmpty) + (L _ NewtypeStrategy) -> (docLitS " newtype", docEmpty) + lVia@(L _ (ViaStrategy viaTypes)) -> ( docEmpty , case viaTypes of - HsIB _ext t -> docSeq - [ docWrapNode lVia $ docLitS " via" - , docSeparator - , layoutType t - ] + HsIB _ext t -> docSeq + [docWrapNode lVia $ docLitS " via", docSeparator, layoutType t] ) docDeriving :: ToBriDocM BriDocNumbered @@ -307,21 +299,25 @@ createDetailsDoc :: Text -> HsConDeclDetails GhcPs -> (ToBriDocM BriDocNumbered) createDetailsDoc consNameStr details = case details of PrefixCon args -> do - indentPolicy <- mAsk <&> _conf_layout .> _lconfig_indentPolicy .> confUnpack + indentPolicy <- + mAsk <&> _conf_layout .> _lconfig_indentPolicy .> confUnpack let singleLine = docSeq [ docLit consNameStr , docSeparator , docForceSingleline - $ docSeq - $ List.intersperse docSeparator - $ fmap hsScaledThing args <&> layoutType + $ docSeq + $ List.intersperse docSeparator + $ fmap hsScaledThing args + <&> layoutType ] - leftIndented = docSetParSpacing - . docAddBaseY BrIndentRegular - . docPar (docLit consNameStr) - . docLines - $ layoutType <$> fmap hsScaledThing args + leftIndented = + docSetParSpacing + . docAddBaseY BrIndentRegular + . docPar (docLit consNameStr) + . docLines + $ layoutType + <$> fmap hsScaledThing args multiAppended = docSeq [ docLit consNameStr , docSeparator @@ -331,79 +327,80 @@ createDetailsDoc consNameStr details = case details of (docLit consNameStr) (docLines $ layoutType <$> fmap hsScaledThing args) case indentPolicy of - IndentPolicyLeft -> docAlt [singleLine, leftIndented] + IndentPolicyLeft -> docAlt [singleLine, leftIndented] IndentPolicyMultiple -> docAlt [singleLine, multiAppended, leftIndented] IndentPolicyFree -> docAlt [singleLine, multiAppended, multiIndented, leftIndented] - RecCon (L _ []) -> docSeq [docLit consNameStr, docSeparator, docLit $ Text.pack "{}"] - RecCon lRec@(L _ fields@(_:_)) -> do + RecCon (L _ []) -> + docSeq [docLit consNameStr, docSeparator, docLit $ Text.pack "{}"] + RecCon lRec@(L _ fields@(_ : _)) -> do let ((fName1, fType1) : fDocR) = mkFieldDocs fields -- allowSingleline <- mAsk <&> _conf_layout .> _lconfig_allowSinglelineRecord .> confUnpack let allowSingleline = False - docAddBaseY BrIndentRegular - $ runFilteredAlternative - $ do + docAddBaseY BrIndentRegular $ runFilteredAlternative $ do -- single-line: { i :: Int, b :: Bool } - addAlternativeCond allowSingleline $ docSeq - [ docLit consNameStr - , docSeparator - , docWrapNodePrior lRec $ docLitS "{" - , docSeparator - , docWrapNodeRest lRec - $ docForceSingleline - $ docSeq - $ join - $ [fName1, docSeparator, docLitS "::", docSeparator, fType1] - : [ [ docLitS "," - , docSeparator - , fName - , docSeparator - , docLitS "::" - , docSeparator - , fType - ] - | (fName, fType) <- fDocR - ] - , docSeparator - , docLitS "}" + addAlternativeCond allowSingleline $ docSeq + [ docLit consNameStr + , docSeparator + , docWrapNodePrior lRec $ docLitS "{" + , docSeparator + , docWrapNodeRest lRec + $ docForceSingleline + $ docSeq + $ join + $ [fName1, docSeparator, docLitS "::", docSeparator, fType1] + : [ [ docLitS "," + , docSeparator + , fName + , docSeparator + , docLitS "::" + , docSeparator + , fType + ] + | (fName, fType) <- fDocR ] - addAlternative $ docPar - (docLit consNameStr) - (docWrapNodePrior lRec $ docNonBottomSpacingS $ docLines - [ docAlt - [ docCols ColRecDecl - [ appSep (docLitS "{") - , appSep $ docForceSingleline fName1 + , docSeparator + , docLitS "}" + ] + addAlternative $ docPar + (docLit consNameStr) + (docWrapNodePrior lRec $ docNonBottomSpacingS $ docLines + [ docAlt + [ docCols + ColRecDecl + [ appSep (docLitS "{") + , appSep $ docForceSingleline fName1 + , docSeq [docLitS "::", docSeparator] + , docForceSingleline $ fType1 + ] + , docSeq + [ docLitS "{" + , docSeparator + , docSetBaseY $ docAddBaseY BrIndentRegular $ docPar + fName1 + (docSeq [docLitS "::", docSeparator, fType1]) + ] + ] + , docWrapNodeRest lRec $ docLines $ fDocR <&> \(fName, fType) -> + docAlt + [ docCols + ColRecDecl + [ docCommaSep + , appSep $ docForceSingleline fName , docSeq [docLitS "::", docSeparator] - , docForceSingleline $ fType1 + , docForceSingleline fType ] , docSeq - [ docLitS "{" + [ docLitS "," , docSeparator , docSetBaseY $ docAddBaseY BrIndentRegular $ docPar - fName1 - (docSeq [docLitS "::", docSeparator, fType1]) + fName + (docSeq [docLitS "::", docSeparator, fType]) ] ] - , docWrapNodeRest lRec $ docLines $ fDocR <&> \(fName, fType) -> - docAlt - [ docCols ColRecDecl - [ docCommaSep - , appSep $ docForceSingleline fName - , docSeq [docLitS "::", docSeparator] - , docForceSingleline fType - ] - , docSeq - [ docLitS "," - , docSeparator - , docSetBaseY $ docAddBaseY BrIndentRegular $ docPar - fName - (docSeq [docLitS "::", docSeparator, fType]) - ] - ] - , docLitS "}" - ] - ) + , docLitS "}" + ] + ) InfixCon arg1 arg2 -> docSeq [ layoutType $ hsScaledThing arg1 , docSeparator @@ -418,10 +415,11 @@ createDetailsDoc consNameStr details = case details of mkFieldDocs = fmap $ \lField -> case lField of L _ (ConDeclField _ext names t _) -> createNamesAndTypeDoc lField names t -createForallDoc :: [LHsTyVarBndr flag GhcPs] -> Maybe (ToBriDocM BriDocNumbered) -createForallDoc [] = Nothing -createForallDoc lhsTyVarBndrs = Just $ docSeq - [docLitS "forall ", createBndrDoc lhsTyVarBndrs] +createForallDoc + :: [LHsTyVarBndr flag GhcPs] -> Maybe (ToBriDocM BriDocNumbered) +createForallDoc [] = Nothing +createForallDoc lhsTyVarBndrs = + Just $ docSeq [docLitS "forall ", createBndrDoc lhsTyVarBndrs] createNamesAndTypeDoc :: Data.Data.Data ast @@ -431,12 +429,8 @@ createNamesAndTypeDoc -> (ToBriDocM BriDocNumbered, ToBriDocM BriDocNumbered) createNamesAndTypeDoc lField names t = ( docNodeAnnKW lField Nothing $ docWrapNodePrior lField $ docSeq - [ docSeq - $ List.intersperse docCommaSep - $ names - <&> \case - L _ (FieldOcc _ fieldName) -> - docLit =<< lrdrNameToTextAnn fieldName + [ docSeq $ List.intersperse docCommaSep $ names <&> \case + L _ (FieldOcc _ fieldName) -> docLit =<< lrdrNameToTextAnn fieldName ] , docWrapNodeRest lField $ layoutType t ) diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/Decl.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/Decl.hs index a96ae47..c2ff209 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/Decl.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/Decl.hs @@ -5,56 +5,46 @@ module Language.Haskell.Brittany.Internal.Layouters.Decl where - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Data.Data import qualified Data.Foldable import qualified Data.Maybe import qualified Data.Semigroup as Semigroup import qualified Data.Text as Text -import qualified GHC.OldList as List - -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.LayouterBasics -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Layouters.Type - -import qualified Language.Haskell.GHC.ExactPrint as ExactPrint -import qualified Language.Haskell.GHC.ExactPrint.Utils as ExactPrint -import Language.Haskell.Brittany.Internal.ExactPrintUtils - -import GHC ( GenLocated(L) - , AnnKeywordId(..) - ) -import GHC.Types.SrcLoc ( SrcSpan, Located , getLoc, unLoc ) +import GHC (AnnKeywordId(..), GenLocated(L)) +import GHC.Data.Bag (bagToList, emptyBag) import qualified GHC.Data.FastString as FastString -import GHC.Hs -import GHC.Types.Basic ( InlinePragma(..) - , Activation(..) - , InlineSpec(..) - , RuleMatchInfo(..) - , LexicalFixity(..) - ) -import Language.Haskell.GHC.ExactPrint.Types ( mkAnnKey ) - +import GHC.Hs +import qualified GHC.OldList as List +import GHC.Types.Basic + ( Activation(..) + , InlinePragma(..) + , InlineSpec(..) + , LexicalFixity(..) + , RuleMatchInfo(..) + ) +import GHC.Types.SrcLoc (Located, SrcSpan, getLoc, unLoc) +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.ExactPrintUtils +import Language.Haskell.Brittany.Internal.LayouterBasics +import Language.Haskell.Brittany.Internal.Layouters.DataDecl import {-# SOURCE #-} Language.Haskell.Brittany.Internal.Layouters.Expr +import Language.Haskell.Brittany.Internal.Layouters.Pattern import {-# SOURCE #-} Language.Haskell.Brittany.Internal.Layouters.Stmt -import Language.Haskell.Brittany.Internal.Layouters.Pattern -import Language.Haskell.Brittany.Internal.Layouters.DataDecl - -import GHC.Data.Bag ( bagToList, emptyBag ) - - +import Language.Haskell.Brittany.Internal.Layouters.Type +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Types +import qualified Language.Haskell.GHC.ExactPrint as ExactPrint +import Language.Haskell.GHC.ExactPrint.Types (mkAnnKey) +import qualified Language.Haskell.GHC.ExactPrint.Utils as ExactPrint layoutDecl :: ToBriDoc HsDecl layoutDecl d@(L loc decl) = case decl of - SigD _ sig -> withTransformedAnns d $ layoutSig (L loc sig) + SigD _ sig -> withTransformedAnns d $ layoutSig (L loc sig) ValD _ bind -> withTransformedAnns d $ layoutBind (L loc bind) >>= \case - Left ns -> docLines $ return <$> ns - Right n -> return n - TyClD _ tycl -> withTransformedAnns d $ layoutTyCl (L loc tycl) + Left ns -> docLines $ return <$> ns + Right n -> return n + TyClD _ tycl -> withTransformedAnns d $ layoutTyCl (L loc tycl) InstD _ (TyFamInstD _ tfid) -> withTransformedAnns d $ layoutTyFamInstDecl False d tfid InstD _ (ClsInstD _ inst) -> @@ -67,52 +57,61 @@ layoutDecl d@(L loc decl) = case decl of layoutSig :: ToBriDoc Sig layoutSig lsig@(L _loc sig) = case sig of - TypeSig _ names (HsWC _ (HsIB _ typ)) -> layoutNamesAndType Nothing names typ + TypeSig _ names (HsWC _ (HsIB _ typ)) -> + layoutNamesAndType Nothing names typ InlineSig _ name (InlinePragma _ spec _arity phaseAct conlike) -> docWrapNode lsig $ do nameStr <- lrdrNameToTextAnn name specStr <- specStringCompat lsig spec - let phaseStr = case phaseAct of - NeverActive -> "" -- not [] - for NOINLINE NeverActive is - -- in fact the default - AlwaysActive -> "" - ActiveBefore _ i -> "[~" ++ show i ++ "] " - ActiveAfter _ i -> "[" ++ show i ++ "] " - FinalActive -> error "brittany internal error: FinalActive" - let conlikeStr = case conlike of - FunLike -> "" - ConLike -> "CONLIKE " + let + phaseStr = case phaseAct of + NeverActive -> "" -- not [] - for NOINLINE NeverActive is + -- in fact the default + AlwaysActive -> "" + ActiveBefore _ i -> "[~" ++ show i ++ "] " + ActiveAfter _ i -> "[" ++ show i ++ "] " + FinalActive -> error "brittany internal error: FinalActive" + let + conlikeStr = case conlike of + FunLike -> "" + ConLike -> "CONLIKE " docLit - $ Text.pack ("{-# " ++ specStr ++ conlikeStr ++ phaseStr) + $ Text.pack ("{-# " ++ specStr ++ conlikeStr ++ phaseStr) <> nameStr <> Text.pack " #-}" - ClassOpSig _ False names (HsIB _ typ) -> layoutNamesAndType Nothing names typ - PatSynSig _ names (HsIB _ typ) -> layoutNamesAndType (Just "pattern") names typ + ClassOpSig _ False names (HsIB _ typ) -> + layoutNamesAndType Nothing names typ + PatSynSig _ names (HsIB _ typ) -> + layoutNamesAndType (Just "pattern") names typ _ -> briDocByExactNoComment lsig -- TODO where layoutNamesAndType mKeyword names typ = docWrapNode lsig $ do - let keyDoc = case mKeyword of - Just key -> [appSep . docLit $ Text.pack key] - Nothing -> [] + let + keyDoc = case mKeyword of + Just key -> [appSep . docLit $ Text.pack key] + Nothing -> [] nameStrs <- names `forM` lrdrNameToTextAnn let nameStr = Text.intercalate (Text.pack ", ") $ nameStrs - typeDoc <- docSharedWrapper layoutType typ + typeDoc <- docSharedWrapper layoutType typ hasComments <- hasAnyCommentsBelow lsig - shouldBeHanging <- mAsk - <&> _conf_layout - .> _lconfig_hangingTypeSignature - .> confUnpack + shouldBeHanging <- + mAsk <&> _conf_layout .> _lconfig_hangingTypeSignature .> confUnpack if shouldBeHanging - then docSeq $ - [ appSep $ docWrapNodeRest lsig $ docSeq $ keyDoc <> [docLit nameStr] - , docSetBaseY $ docLines - [ docCols - ColTyOpPrefix - [ docLit $ Text.pack ":: " - , docAddBaseY (BrIndentSpecial 3) $ typeDoc + then + docSeq + $ [ appSep + $ docWrapNodeRest lsig + $ docSeq + $ keyDoc + <> [docLit nameStr] + , docSetBaseY $ docLines + [ docCols + ColTyOpPrefix + [ docLit $ Text.pack ":: " + , docAddBaseY (BrIndentSpecial 3) $ typeDoc + ] + ] ] - ] - ] else layoutLhsAndType hasComments (appSep . docWrapNodeRest lsig . docSeq $ keyDoc <> [docLit nameStr]) @@ -122,22 +121,23 @@ layoutSig lsig@(L _loc sig) = case sig of specStringCompat :: MonadMultiWriter [BrittanyError] m => LSig GhcPs -> InlineSpec -> m String specStringCompat ast = \case - NoUserInline -> mTell [ErrorUnknownNode "NoUserInline" ast] $> "" - Inline -> pure "INLINE " - Inlinable -> pure "INLINABLE " - NoInline -> pure "NOINLINE " + NoUserInline -> mTell [ErrorUnknownNode "NoUserInline" ast] $> "" + Inline -> pure "INLINE " + Inlinable -> pure "INLINABLE " + NoInline -> pure "NOINLINE " layoutGuardLStmt :: ToBriDoc' (Stmt GhcPs (LHsExpr GhcPs)) layoutGuardLStmt lgstmt@(L _ stmtLR) = docWrapNode lgstmt $ case stmtLR of - BodyStmt _ body _ _ -> layoutExpr body + BodyStmt _ body _ _ -> layoutExpr body BindStmt _ lPat expr -> do patDoc <- docSharedWrapper layoutPat lPat expDoc <- docSharedWrapper layoutExpr expr - docCols ColBindStmt - [ appSep $ colsWrapPat =<< patDoc - , docSeq [appSep $ docLit $ Text.pack "<-", expDoc] - ] - _ -> unknownNodeError "" lgstmt -- TODO + docCols + ColBindStmt + [ appSep $ colsWrapPat =<< patDoc + , docSeq [appSep $ docLit $ Text.pack "<-", expDoc] + ] + _ -> unknownNodeError "" lgstmt -- TODO -------------------------------------------------------------------------------- @@ -145,37 +145,33 @@ layoutGuardLStmt lgstmt@(L _ stmtLR) = docWrapNode lgstmt $ case stmtLR of -------------------------------------------------------------------------------- layoutBind - :: ToBriDocC - (HsBindLR GhcPs GhcPs) - (Either [BriDocNumbered] BriDocNumbered) + :: ToBriDocC (HsBindLR GhcPs GhcPs) (Either [BriDocNumbered] BriDocNumbered) layoutBind lbind@(L _ bind) = case bind of FunBind _ fId (MG _ lmatches@(L _ matches) _) [] -> do - idStr <- lrdrNameToTextAnn fId - binderDoc <- docLit $ Text.pack "=" + idStr <- lrdrNameToTextAnn fId + binderDoc <- docLit $ Text.pack "=" funcPatDocs <- docWrapNode lbind - $ docWrapNode lmatches - $ layoutPatternBind (Just idStr) binderDoc - `mapM` matches + $ docWrapNode lmatches + $ layoutPatternBind (Just idStr) binderDoc + `mapM` matches return $ Left $ funcPatDocs PatBind _ pat (GRHSs _ grhss whereBinds) ([], []) -> do - patDocs <- colsWrapPat =<< layoutPat pat + patDocs <- colsWrapPat =<< layoutPat pat clauseDocs <- layoutGrhs `mapM` grhss mWhereDocs <- layoutLocalBinds whereBinds let mWhereArg = mWhereDocs <&> (,) (mkAnnKey lbind) -- TODO: is this the right AnnKey? - binderDoc <- docLit $ Text.pack "=" + binderDoc <- docLit $ Text.pack "=" hasComments <- hasAnyCommentsBelow lbind - fmap Right $ docWrapNode lbind $ layoutPatternBindFinal Nothing - binderDoc - (Just patDocs) - clauseDocs - mWhereArg - hasComments + fmap Right $ docWrapNode lbind $ layoutPatternBindFinal + Nothing + binderDoc + (Just patDocs) + clauseDocs + mWhereArg + hasComments PatSynBind _ (PSB _ patID lpat rpat dir) -> do - fmap Right $ docWrapNode lbind $ layoutPatSynBind patID - lpat - dir - rpat + fmap Right $ docWrapNode lbind $ layoutPatSynBind patID lpat dir rpat _ -> Right <$> unknownNodeError "" lbind layoutIPBind :: ToBriDoc IPBind layoutIPBind lipbind@(L _ bind) = case bind of @@ -185,7 +181,13 @@ layoutIPBind lipbind@(L _ bind) = case bind of binderDoc <- docLit $ Text.pack "=" exprDoc <- layoutExpr expr hasComments <- hasAnyCommentsBelow lipbind - layoutPatternBindFinal Nothing binderDoc (Just ipName) [([], exprDoc, expr)] Nothing hasComments + layoutPatternBindFinal + Nothing + binderDoc + (Just ipName) + [([], exprDoc, expr)] + Nothing + hasComments data BagBindOrSig = BagBind (LHsBindLR GhcPs GhcPs) @@ -193,7 +195,7 @@ data BagBindOrSig = BagBind (LHsBindLR GhcPs GhcPs) bindOrSigtoSrcSpan :: BagBindOrSig -> SrcSpan bindOrSigtoSrcSpan (BagBind (L l _)) = l -bindOrSigtoSrcSpan (BagSig (L l _)) = l +bindOrSigtoSrcSpan (BagSig (L l _)) = l layoutLocalBinds :: ToBriDocC (HsLocalBindsLR GhcPs GhcPs) (Maybe [BriDocNumbered]) @@ -203,18 +205,18 @@ layoutLocalBinds lbinds@(L _ binds) = case binds of -- x@(HsValBinds (ValBindsIn{})) -> -- Just . (:[]) <$> unknownNodeError "HsValBinds (ValBindsIn _ (_:_))" x HsValBinds _ (ValBinds _ bindlrs sigs) -> do - let unordered = - [ BagBind b | b <- Data.Foldable.toList bindlrs ] - ++ [ BagSig s | s <- sigs ] - ordered = List.sortOn (ExactPrint.rs . bindOrSigtoSrcSpan) unordered + let + unordered = + [ BagBind b | b <- Data.Foldable.toList bindlrs ] + ++ [ BagSig s | s <- sigs ] + ordered = List.sortOn (ExactPrint.rs . bindOrSigtoSrcSpan) unordered docs <- docWrapNode lbinds $ join <$> ordered `forM` \case BagBind b -> either id return <$> layoutBind b - BagSig s -> return <$> layoutSig s + BagSig s -> return <$> layoutSig s return $ Just $ docs -- x@(HsValBinds (ValBindsOut _binds _lsigs)) -> HsValBinds _ (XValBindsLR{}) -> error "brittany internal error: XValBindsLR" - HsIPBinds _ (IPBinds _ bb) -> - Just <$> mapM layoutIPBind bb + HsIPBinds _ (IPBinds _ bb) -> Just <$> mapM layoutIPBind bb EmptyLocalBinds{} -> return $ Nothing -- TODO: we don't need the `LHsExpr GhcPs` anymore, now that there is @@ -224,7 +226,7 @@ layoutGrhs -> ToBriDocM ([BriDocNumbered], BriDocNumbered, LHsExpr GhcPs) layoutGrhs lgrhs@(L _ (GRHS _ guards body)) = do guardDocs <- docWrapNode lgrhs $ layoutStmt `mapM` guards - bodyDoc <- layoutExpr body + bodyDoc <- layoutExpr body return (guardDocs, bodyDoc, body) layoutPatternBind @@ -233,7 +235,7 @@ layoutPatternBind -> LMatch GhcPs (LHsExpr GhcPs) -> ToBriDocM BriDocNumbered layoutPatternBind funId binderDoc lmatch@(L _ match) = do - let pats = m_pats match + let pats = m_pats match let (GRHSs _ grhss whereBinds) = m_grhss match patDocs <- pats `forM` \p -> fmap return $ colsWrapPat =<< layoutPat p let isInfix = isInfixMatch match @@ -242,25 +244,26 @@ layoutPatternBind funId binderDoc lmatch@(L _ match) = do _ -> pure Nothing let mIdStr' = fixPatternBindIdentifier match <$> mIdStr patDoc <- docWrapNodePrior lmatch $ case (mIdStr', patDocs) of - (Just idStr, p1:p2:pr) | isInfix -> if null pr - then - docCols ColPatternsFuncInfix - [ appSep $ docForceSingleline p1 - , appSep $ docLit $ idStr - , docForceSingleline p2 - ] - else - docCols ColPatternsFuncInfix - ( [docCols ColPatterns - [ docParenL - , appSep $ docForceSingleline p1 - , appSep $ docLit $ idStr - , docForceSingleline p2 - , appSep $ docParenR - ] + (Just idStr, p1 : p2 : pr) | isInfix -> if null pr + then docCols + ColPatternsFuncInfix + [ appSep $ docForceSingleline p1 + , appSep $ docLit $ idStr + , docForceSingleline p2 + ] + else docCols + ColPatternsFuncInfix + ([ docCols + ColPatterns + [ docParenL + , appSep $ docForceSingleline p1 + , appSep $ docLit $ idStr + , docForceSingleline p2 + , appSep $ docParenR ] - ++ (spacifyDocs $ docForceSingleline <$> pr) - ) + ] + ++ (spacifyDocs $ docForceSingleline <$> pr) + ) (Just idStr, []) -> docLit idStr (Just idStr, ps) -> docCols ColPatternsFuncPrefix @@ -274,30 +277,30 @@ layoutPatternBind funId binderDoc lmatch@(L _ match) = do let mWhereArg = mWhereDocs <&> (,) (mkAnnKey lmatch) let alignmentToken = if null pats then Nothing else funId hasComments <- hasAnyCommentsBelow lmatch - layoutPatternBindFinal alignmentToken - binderDoc - (Just patDoc) - clauseDocs - mWhereArg - hasComments + layoutPatternBindFinal + alignmentToken + binderDoc + (Just patDoc) + clauseDocs + mWhereArg + hasComments -fixPatternBindIdentifier - :: Match GhcPs (LHsExpr GhcPs) -> Text -> Text +fixPatternBindIdentifier :: Match GhcPs (LHsExpr GhcPs) -> Text -> Text fixPatternBindIdentifier match idStr = go $ m_ctxt match where go = \case - (FunRhs _ _ SrcLazy ) -> Text.cons '~' idStr - (FunRhs _ _ SrcStrict ) -> Text.cons '!' idStr + (FunRhs _ _ SrcLazy) -> Text.cons '~' idStr + (FunRhs _ _ SrcStrict) -> Text.cons '!' idStr (FunRhs _ _ NoSrcStrict) -> idStr - (StmtCtxt ctx1 ) -> goInner ctx1 - _ -> idStr + (StmtCtxt ctx1) -> goInner ctx1 + _ -> idStr -- I have really no idea if this path ever occurs, but better safe than -- risking another "drop bangpatterns" bugs. goInner = \case - (PatGuard ctx1) -> go ctx1 - (ParStmtCtxt ctx1) -> goInner ctx1 + (PatGuard ctx1) -> go ctx1 + (ParStmtCtxt ctx1) -> goInner ctx1 (TransStmtCtxt ctx1) -> goInner ctx1 - _ -> idStr + _ -> idStr layoutPatternBindFinal :: Maybe Text @@ -308,304 +311,304 @@ layoutPatternBindFinal -- ^ AnnKey for the node that contains the AnnWhere position annotation -> Bool -> ToBriDocM BriDocNumbered -layoutPatternBindFinal alignmentToken binderDoc mPatDoc clauseDocs mWhereDocs hasComments = do - let patPartInline = case mPatDoc of - Nothing -> [] +layoutPatternBindFinal alignmentToken binderDoc mPatDoc clauseDocs mWhereDocs hasComments + = do + let + patPartInline = case mPatDoc of + Nothing -> [] Just patDoc -> [appSep $ docForceSingleline $ return patDoc] patPartParWrap = case mPatDoc of - Nothing -> id + Nothing -> id Just patDoc -> docPar (return patDoc) - whereIndent <- do - shouldSpecial <- mAsk - <&> _conf_layout - .> _lconfig_indentWhereSpecial - .> confUnpack - regularIndentAmount <- mAsk - <&> _conf_layout - .> _lconfig_indentAmount - .> confUnpack - pure $ if shouldSpecial - then BrIndentSpecial (max 1 (regularIndentAmount `div` 2)) - else BrIndentRegular - -- TODO: apart from this, there probably are more nodes below which could - -- be shared between alternatives. - wherePartMultiLine :: [ToBriDocM BriDocNumbered] <- case mWhereDocs of - Nothing -> return $ [] - Just (annKeyWhere, [w]) -> pure . pure <$> docAlt - [ docEnsureIndent BrIndentRegular - $ docSeq - [ docLit $ Text.pack "where" - , docSeparator - , docForceSingleline $ return w - ] - , docMoveToKWDP annKeyWhere AnnWhere False + whereIndent <- do + shouldSpecial <- + mAsk <&> _conf_layout .> _lconfig_indentWhereSpecial .> confUnpack + regularIndentAmount <- + mAsk <&> _conf_layout .> _lconfig_indentAmount .> confUnpack + pure $ if shouldSpecial + then BrIndentSpecial (max 1 (regularIndentAmount `div` 2)) + else BrIndentRegular + -- TODO: apart from this, there probably are more nodes below which could + -- be shared between alternatives. + wherePartMultiLine :: [ToBriDocM BriDocNumbered] <- case mWhereDocs of + Nothing -> return $ [] + Just (annKeyWhere, [w]) -> pure . pure <$> docAlt + [ docEnsureIndent BrIndentRegular $ docSeq + [ docLit $ Text.pack "where" + , docSeparator + , docForceSingleline $ return w + ] + , docMoveToKWDP annKeyWhere AnnWhere False $ docEnsureIndent whereIndent $ docLines - [ docLit $ Text.pack "where" - , docEnsureIndent whereIndent + [ docLit $ Text.pack "where" + , docEnsureIndent whereIndent $ docSetIndentLevel $ docNonBottomSpacing $ return w - ] - ] - Just (annKeyWhere, ws) -> - fmap (pure . pure) - $ docMoveToKWDP annKeyWhere AnnWhere False - $ docEnsureIndent whereIndent - $ docLines - [ docLit $ Text.pack "where" - , docEnsureIndent whereIndent - $ docSetIndentLevel - $ docNonBottomSpacing - $ docLines - $ return - <$> ws - ] - let singleLineGuardsDoc guards = appSep $ case guards of - [] -> docEmpty + ] + ] + Just (annKeyWhere, ws) -> + fmap (pure . pure) + $ docMoveToKWDP annKeyWhere AnnWhere False + $ docEnsureIndent whereIndent + $ docLines + [ docLit $ Text.pack "where" + , docEnsureIndent whereIndent + $ docSetIndentLevel + $ docNonBottomSpacing + $ docLines + $ return + <$> ws + ] + let + singleLineGuardsDoc guards = appSep $ case guards of + [] -> docEmpty [g] -> docSeq - [appSep $ docLit $ Text.pack "|", docForceSingleline $ return g] - gs -> docSeq - $ [appSep $ docLit $ Text.pack "|"] - ++ (List.intersperse docCommaSep - (docForceSingleline . return <$> gs) + [appSep $ docLit $ Text.pack "|", docForceSingleline $ return g] + gs -> + docSeq + $ [appSep $ docLit $ Text.pack "|"] + ++ (List.intersperse + docCommaSep + (docForceSingleline . return <$> gs) ) wherePart = case mWhereDocs of - Nothing -> Just docEmpty + Nothing -> Just docEmpty Just (_, [w]) -> Just $ docSeq [ docSeparator , appSep $ docLit $ Text.pack "where" , docSetIndentLevel $ docForceSingleline $ return w ] - _ -> Nothing + _ -> Nothing - indentPolicy <- mAsk - <&> _conf_layout - .> _lconfig_indentPolicy - .> confUnpack + indentPolicy <- + mAsk <&> _conf_layout .> _lconfig_indentPolicy .> confUnpack - runFilteredAlternative $ do + runFilteredAlternative $ do - case clauseDocs of - [(guards, body, _bodyRaw)] -> do - let guardPart = singleLineGuardsDoc guards - forM_ wherePart $ \wherePart' -> - -- one-line solution - addAlternativeCond (not hasComments) $ docCols - (ColBindingLine alignmentToken) - [ docSeq (patPartInline ++ [guardPart]) - , docSeq - [ appSep $ return binderDoc - , docForceSingleline $ return body - , wherePart' + case clauseDocs of + [(guards, body, _bodyRaw)] -> do + let guardPart = singleLineGuardsDoc guards + forM_ wherePart $ \wherePart' -> + -- one-line solution + addAlternativeCond (not hasComments) $ docCols + (ColBindingLine alignmentToken) + [ docSeq (patPartInline ++ [guardPart]) + , docSeq + [ appSep $ return binderDoc + , docForceSingleline $ return body + , wherePart' + ] ] - ] - -- one-line solution + where in next line(s) - addAlternativeCond (Data.Maybe.isJust mWhereDocs) - $ docLines - $ [ docCols - (ColBindingLine alignmentToken) - [ docSeq (patPartInline ++ [guardPart]) - , docSeq - [ appSep $ return binderDoc - , docForceParSpacing $ docAddBaseY BrIndentRegular $ return body - ] - ] - ] - ++ wherePartMultiLine - -- two-line solution + where in next line(s) - addAlternative - $ docLines - $ [ docForceSingleline - $ docSeq (patPartInline ++ [guardPart, return binderDoc]) - , docEnsureIndent BrIndentRegular $ docForceSingleline $ return body - ] - ++ wherePartMultiLine - -- pattern and exactly one clause in single line, body as par; - -- where in following lines - addAlternative - $ docLines - $ [ docCols - (ColBindingLine alignmentToken) - [ docSeq (patPartInline ++ [guardPart]) - , docSeq - [ appSep $ return binderDoc - , docForceParSpacing $ docAddBaseY BrIndentRegular $ return body - ] - ] - ] - -- , lineMod $ docAlt - -- [ docSetBaseY $ return body - -- , docAddBaseY BrIndentRegular $ return body - -- ] - ++ wherePartMultiLine - -- pattern and exactly one clause in single line, body in new line. - addAlternative - $ docLines - $ [ docSeq (patPartInline ++ [guardPart, return binderDoc]) - , docNonBottomSpacing - $ docEnsureIndent BrIndentRegular - $ docAddBaseY BrIndentRegular - $ return body - ] - ++ wherePartMultiLine + -- one-line solution + where in next line(s) + addAlternativeCond (Data.Maybe.isJust mWhereDocs) + $ docLines + $ [ docCols + (ColBindingLine alignmentToken) + [ docSeq (patPartInline ++ [guardPart]) + , docSeq + [ appSep $ return binderDoc + , docForceParSpacing $ docAddBaseY BrIndentRegular $ return + body + ] + ] + ] + ++ wherePartMultiLine + -- two-line solution + where in next line(s) + addAlternative + $ docLines + $ [ docForceSingleline + $ docSeq (patPartInline ++ [guardPart, return binderDoc]) + , docEnsureIndent BrIndentRegular $ docForceSingleline $ return + body + ] + ++ wherePartMultiLine + -- pattern and exactly one clause in single line, body as par; + -- where in following lines + addAlternative + $ docLines + $ [ docCols + (ColBindingLine alignmentToken) + [ docSeq (patPartInline ++ [guardPart]) + , docSeq + [ appSep $ return binderDoc + , docForceParSpacing $ docAddBaseY BrIndentRegular $ return + body + ] + ] + ] + -- , lineMod $ docAlt + -- [ docSetBaseY $ return body + -- , docAddBaseY BrIndentRegular $ return body + -- ] + ++ wherePartMultiLine + -- pattern and exactly one clause in single line, body in new line. + addAlternative + $ docLines + $ [ docSeq (patPartInline ++ [guardPart, return binderDoc]) + , docNonBottomSpacing + $ docEnsureIndent BrIndentRegular + $ docAddBaseY BrIndentRegular + $ return body + ] + ++ wherePartMultiLine - _ -> return () -- no alternatives exclusively when `length clauseDocs /= 1` + _ -> return () -- no alternatives exclusively when `length clauseDocs /= 1` - case mPatDoc of - Nothing -> return () - Just patDoc -> - -- multiple clauses added in-paragraph, each in a single line - -- example: foo | bar = baz - -- | lll = asd - addAlternativeCond (indentPolicy == IndentPolicyFree) - $ docLines - $ [ docSeq - [ appSep $ docForceSingleline $ return patDoc - , docSetBaseY - $ docLines - $ clauseDocs - <&> \(guardDocs, bodyDoc, _) -> do - let guardPart = singleLineGuardsDoc guardDocs - -- the docForceSingleline might seems superflous, but it - -- helps the alternative resolving impl. - docForceSingleline $ docCols - ColGuardedBody - [ guardPart - , docSeq - [ appSep $ return binderDoc - , docForceSingleline $ return bodyDoc - -- i am not sure if there is a benefit to using - -- docForceParSpacing additionally here: - -- , docAddBaseY BrIndentRegular $ return bodyDoc - ] - ] - ] - ] - ++ wherePartMultiLine - -- multiple clauses, each in a separate, single line - addAlternative - $ docLines - $ [ docAddBaseY BrIndentRegular - $ patPartParWrap - $ docLines - $ map docSetBaseY - $ clauseDocs - <&> \(guardDocs, bodyDoc, _) -> do - let guardPart = singleLineGuardsDoc guardDocs - -- the docForceSingleline might seems superflous, but it - -- helps the alternative resolving impl. - docForceSingleline $ docCols - ColGuardedBody - [ guardPart - , docSeq - [ appSep $ return binderDoc - , docForceSingleline $ return bodyDoc - -- i am not sure if there is a benefit to using - -- docForceParSpacing additionally here: - -- , docAddBaseY BrIndentRegular $ return bodyDoc - ] - ] - ] - ++ wherePartMultiLine - -- multiple clauses, each with the guard(s) in a single line, body - -- as a paragraph - addAlternative - $ docLines - $ [ docAddBaseY BrIndentRegular - $ patPartParWrap - $ docLines - $ map docSetBaseY - $ clauseDocs - <&> \(guardDocs, bodyDoc, _) -> - docSeq - $ ( case guardDocs of - [] -> [] - [g] -> - [ docForceSingleline - $ docSeq [appSep $ docLit $ Text.pack "|", return g] - ] - gs -> - [ docForceSingleline - $ docSeq - $ [appSep $ docLit $ Text.pack "|"] - ++ List.intersperse docCommaSep (return <$> gs) - ] - ) - ++ [ docSeparator - , docCols - ColOpPrefix - [ appSep $ return binderDoc - , docAddBaseY BrIndentRegular - $ docForceParSpacing - $ return bodyDoc - ] - ] - ] - ++ wherePartMultiLine - -- multiple clauses, each with the guard(s) in a single line, body - -- in a new line as a paragraph - addAlternative - $ docLines - $ [ docAddBaseY BrIndentRegular - $ patPartParWrap - $ docLines - $ map docSetBaseY - $ clauseDocs - >>= \(guardDocs, bodyDoc, _) -> - ( case guardDocs of - [] -> [] - [g] -> - [ docForceSingleline - $ docSeq [appSep $ docLit $ Text.pack "|", return g] - ] - gs -> - [ docForceSingleline - $ docSeq - $ [appSep $ docLit $ Text.pack "|"] - ++ List.intersperse docCommaSep (return <$> gs) - ] - ) - ++ [ docCols - ColOpPrefix + case mPatDoc of + Nothing -> return () + Just patDoc -> + -- multiple clauses added in-paragraph, each in a single line + -- example: foo | bar = baz + -- | lll = asd + addAlternativeCond (indentPolicy == IndentPolicyFree) + $ docLines + $ [ docSeq + [ appSep $ docForceSingleline $ return patDoc + , docSetBaseY + $ docLines + $ clauseDocs + <&> \(guardDocs, bodyDoc, _) -> do + let guardPart = singleLineGuardsDoc guardDocs + -- the docForceSingleline might seems superflous, but it + -- helps the alternative resolving impl. + docForceSingleline $ docCols + ColGuardedBody + [ guardPart + , docSeq + [ appSep $ return binderDoc + , docForceSingleline $ return bodyDoc + -- i am not sure if there is a benefit to using + -- docForceParSpacing additionally here: + -- , docAddBaseY BrIndentRegular $ return bodyDoc + ] + ] + ] + ] + ++ wherePartMultiLine + -- multiple clauses, each in a separate, single line + addAlternative + $ docLines + $ [ docAddBaseY BrIndentRegular + $ patPartParWrap + $ docLines + $ map docSetBaseY + $ clauseDocs + <&> \(guardDocs, bodyDoc, _) -> do + let guardPart = singleLineGuardsDoc guardDocs + -- the docForceSingleline might seems superflous, but it + -- helps the alternative resolving impl. + docForceSingleline $ docCols + ColGuardedBody + [ guardPart + , docSeq [ appSep $ return binderDoc - , docAddBaseY BrIndentRegular - $ docForceParSpacing - $ return bodyDoc + , docForceSingleline $ return bodyDoc + -- i am not sure if there is a benefit to using + -- docForceParSpacing additionally here: + -- , docAddBaseY BrIndentRegular $ return bodyDoc ] ] - ] - ++ wherePartMultiLine - -- conservative approach: everything starts on the left. - addAlternative - $ docLines - $ [ docAddBaseY BrIndentRegular - $ patPartParWrap - $ docLines - $ map docSetBaseY - $ clauseDocs - >>= \(guardDocs, bodyDoc, _) -> - ( case guardDocs of - [] -> [] - [g] -> - [docSeq [appSep $ docLit $ Text.pack "|", return g]] - (g1:gr) -> - ( docSeq [appSep $ docLit $ Text.pack "|", return g1] - : ( gr - <&> \g -> - docSeq - [appSep $ docLit $ Text.pack ",", return g] - ) - ) - ) - ++ [ docCols - ColOpPrefix - [ appSep $ return binderDoc - , docAddBaseY BrIndentRegular $ return bodyDoc + ] + ++ wherePartMultiLine + -- multiple clauses, each with the guard(s) in a single line, body + -- as a paragraph + addAlternative + $ docLines + $ [ docAddBaseY BrIndentRegular + $ patPartParWrap + $ docLines + $ map docSetBaseY + $ clauseDocs + <&> \(guardDocs, bodyDoc, _) -> + docSeq + $ (case guardDocs of + [] -> [] + [g] -> + [ docForceSingleline $ docSeq + [appSep $ docLit $ Text.pack "|", return g] + ] + gs -> + [ docForceSingleline + $ docSeq + $ [appSep $ docLit $ Text.pack "|"] + ++ List.intersperse docCommaSep (return <$> gs) + ] + ) + ++ [ docSeparator + , docCols + ColOpPrefix + [ appSep $ return binderDoc + , docAddBaseY BrIndentRegular + $ docForceParSpacing + $ return bodyDoc + ] + ] + ] + ++ wherePartMultiLine + -- multiple clauses, each with the guard(s) in a single line, body + -- in a new line as a paragraph + addAlternative + $ docLines + $ [ docAddBaseY BrIndentRegular + $ patPartParWrap + $ docLines + $ map docSetBaseY + $ clauseDocs + >>= \(guardDocs, bodyDoc, _) -> + (case guardDocs of + [] -> [] + [g] -> + [ docForceSingleline $ docSeq + [appSep $ docLit $ Text.pack "|", return g] ] - ] - ] - ++ wherePartMultiLine + gs -> + [ docForceSingleline + $ docSeq + $ [appSep $ docLit $ Text.pack "|"] + ++ List.intersperse docCommaSep (return <$> gs) + ] + ) + ++ [ docCols + ColOpPrefix + [ appSep $ return binderDoc + , docAddBaseY BrIndentRegular + $ docForceParSpacing + $ return bodyDoc + ] + ] + ] + ++ wherePartMultiLine + -- conservative approach: everything starts on the left. + addAlternative + $ docLines + $ [ docAddBaseY BrIndentRegular + $ patPartParWrap + $ docLines + $ map docSetBaseY + $ clauseDocs + >>= \(guardDocs, bodyDoc, _) -> + (case guardDocs of + [] -> [] + [g] -> + [docSeq [appSep $ docLit $ Text.pack "|", return g]] + (g1 : gr) -> + (docSeq [appSep $ docLit $ Text.pack "|", return g1] + : (gr + <&> \g -> docSeq + [appSep $ docLit $ Text.pack ",", return g] + ) + ) + ) + ++ [ docCols + ColOpPrefix + [ appSep $ return binderDoc + , docAddBaseY BrIndentRegular $ return bodyDoc + ] + ] + ] + ++ wherePartMultiLine -- | Layout a pattern synonym binding layoutPatSynBind @@ -615,44 +618,51 @@ layoutPatSynBind -> LPat GhcPs -> ToBriDocM BriDocNumbered layoutPatSynBind name patSynDetails patDir rpat = do - let patDoc = docLit $ Text.pack "pattern" - binderDoc = case patDir of - ImplicitBidirectional -> docLit $ Text.pack "=" - _ -> docLit $ Text.pack "<-" - body = colsWrapPat =<< layoutPat rpat - whereDoc = docLit $ Text.pack "where" + let + patDoc = docLit $ Text.pack "pattern" + binderDoc = case patDir of + ImplicitBidirectional -> docLit $ Text.pack "=" + _ -> docLit $ Text.pack "<-" + body = colsWrapPat =<< layoutPat rpat + whereDoc = docLit $ Text.pack "where" mWhereDocs <- layoutPatSynWhere patDir - headDoc <- fmap pure $ docSeq $ - [ patDoc - , docSeparator - , layoutLPatSyn name patSynDetails - , docSeparator - , binderDoc - ] + headDoc <- + fmap pure + $ docSeq + $ [ patDoc + , docSeparator + , layoutLPatSyn name patSynDetails + , docSeparator + , binderDoc + ] runFilteredAlternative $ do - addAlternative $ + addAlternative + $ -- pattern .. where -- .. -- .. - docAddBaseY BrIndentRegular $ docSeq - ( [headDoc, docSeparator, body] - ++ case mWhereDocs of + docAddBaseY BrIndentRegular + $ docSeq + ([headDoc, docSeparator, body] ++ case mWhereDocs of Just ds -> [docSeparator, docPar whereDoc (docLines ds)] Nothing -> [] - ) - addAlternative $ + ) + addAlternative + $ -- pattern .. = -- .. -- pattern .. <- -- .. where -- .. -- .. - docAddBaseY BrIndentRegular $ docPar - headDoc - (case mWhereDocs of - Nothing -> body - Just ds -> docLines ([ docSeq [body, docSeparator, whereDoc] ] ++ ds) - ) + docAddBaseY BrIndentRegular + $ docPar + headDoc + (case mWhereDocs of + Nothing -> body + Just ds -> + docLines ([docSeq [body, docSeparator, whereDoc]] ++ ds) + ) -- | Helper method for the left hand side of a pattern synonym layoutLPatSyn @@ -671,18 +681,21 @@ layoutLPatSyn name (InfixCon left right) = do layoutLPatSyn name (RecCon recArgs) = do docName <- lrdrNameToTextAnn name args <- mapM (lrdrNameToTextAnn . recordPatSynSelectorId) recArgs - docSeq . fmap docLit - $ [docName, Text.pack " { " ] + docSeq + . fmap docLit + $ [docName, Text.pack " { "] <> intersperse (Text.pack ", ") args <> [Text.pack " }"] -- | Helper method to get the where clause from of explicitly bidirectional -- pattern synonyms -layoutPatSynWhere :: HsPatSynDir GhcPs -> ToBriDocM (Maybe [ToBriDocM BriDocNumbered]) +layoutPatSynWhere + :: HsPatSynDir GhcPs -> ToBriDocM (Maybe [ToBriDocM BriDocNumbered]) layoutPatSynWhere hs = case hs of ExplicitBidirectional (MG _ (L _ lbinds) _) -> do binderDoc <- docLit $ Text.pack "=" - Just <$> mapM (docSharedWrapper $ layoutPatternBind Nothing binderDoc) lbinds + Just + <$> mapM (docSharedWrapper $ layoutPatternBind Nothing binderDoc) lbinds _ -> pure Nothing -------------------------------------------------------------------------------- @@ -692,9 +705,10 @@ layoutPatSynWhere hs = case hs of layoutTyCl :: ToBriDoc TyClDecl layoutTyCl ltycl@(L _loc tycl) = case tycl of SynDecl _ name vars fixity typ -> do - let isInfix = case fixity of - Prefix -> False - Infix -> True + let + isInfix = case fixity of + Prefix -> False + Infix -> True -- hasTrailingParen <- hasAnnKeywordComment ltycl AnnCloseP -- let parenWrapper = if hasTrailingParen -- then appSep . docWrapNodeRest ltycl @@ -723,9 +737,7 @@ layoutSynDecl isInfix wrapNodeRest name vars typ = do -- This isn't quite right, but does give syntactically valid results let needsParens = not (null rest) || hasOwnParens docSeq - $ [ docLit $ Text.pack "type" - , docSeparator - ] + $ [docLit $ Text.pack "type", docSeparator] ++ [ docParenL | needsParens ] ++ [ layoutTyVarBndr False a , docSeparator @@ -737,13 +749,13 @@ layoutSynDecl isInfix wrapNodeRest name vars typ = do ++ fmap (layoutTyVarBndr True) rest else docSeq - $ [ docLit $ Text.pack "type" - , docSeparator - , docWrapNode name $ docLit nameStr - ] + $ [ docLit $ Text.pack "type" + , docSeparator + , docWrapNode name $ docLit nameStr + ] ++ fmap (layoutTyVarBndr True) vars - sharedLhs <- docSharedWrapper id lhs - typeDoc <- docSharedWrapper layoutType typ + sharedLhs <- docSharedWrapper id lhs + typeDoc <- docSharedWrapper layoutType typ hasComments <- hasAnyCommentsConnected typ layoutLhsAndType hasComments sharedLhs "=" typeDoc @@ -752,11 +764,11 @@ layoutTyVarBndr needsSep lbndr@(L _ bndr) = do docWrapNodePrior lbndr $ case bndr of UserTyVar _ _ name -> do nameStr <- lrdrNameToTextAnn name - docSeq $ [docSeparator | needsSep] ++ [docLit nameStr] + docSeq $ [ docSeparator | needsSep ] ++ [docLit nameStr] KindedTyVar _ _ name kind -> do nameStr <- lrdrNameToTextAnn name docSeq - $ [ docSeparator | needsSep ] + $ [ docSeparator | needsSep ] ++ [ docLit $ Text.pack "(" , appSep $ docLit nameStr , appSep . docLit $ Text.pack "::" @@ -784,7 +796,7 @@ layoutTyFamInstDecl inClass outerNode tfid = do -- type instance forall a . MyType (Maybe a) = Either () a innerNode = outerNode docWrapNodePrior outerNode $ do - nameStr <- lrdrNameToTextAnn name + nameStr <- lrdrNameToTextAnn name needsParens <- hasAnnKeyword outerNode AnnOpenP let instanceDoc = if inClass @@ -795,33 +807,35 @@ layoutTyFamInstDecl inClass outerNode tfid = do makeForallDoc bndrs = do bndrDocs <- layoutTyVarBndrs bndrs docSeq - ( [docLit (Text.pack "forall")] + ([docLit (Text.pack "forall")] ++ processTyVarBndrsSingleline bndrDocs ) lhs = docWrapNode innerNode - . docSeq - $ [appSep instanceDoc] + . docSeq + $ [appSep instanceDoc] ++ [ makeForallDoc foralls | Just foralls <- [bndrsMay] ] ++ [ docParenL | needsParens ] ++ [appSep $ docWrapNode name $ docLit nameStr] ++ intersperse docSeparator (layoutHsTyPats pats) ++ [ docParenR | needsParens ] - hasComments <- (||) + hasComments <- + (||) <$> hasAnyRegularCommentsConnected outerNode <*> hasAnyRegularCommentsRest innerNode typeDoc <- docSharedWrapper layoutType typ layoutLhsAndType hasComments lhs "=" typeDoc -layoutHsTyPats :: [HsArg (LHsType GhcPs) (LHsKind GhcPs)] -> [ToBriDocM BriDocNumbered] +layoutHsTyPats + :: [HsArg (LHsType GhcPs) (LHsKind GhcPs)] -> [ToBriDocM BriDocNumbered] layoutHsTyPats pats = pats <&> \case - HsValArg tm -> layoutType tm + HsValArg tm -> layoutType tm HsTypeArg _l ty -> docSeq [docLit $ Text.pack "@", layoutType ty] -- we ignore the SourceLoc here.. this LPat not being (L _ Pat{}) change -- is a bit strange. Hopefully this does not ignore any important -- annotations. - HsArgPar _l -> error "brittany internal error: HsArgPar{}" + HsArgPar _l -> error "brittany internal error: HsArgPar{}" -------------------------------------------------------------------------------- -- ClsInstDecl @@ -836,27 +850,27 @@ layoutClsInst :: ToBriDoc ClsInstDecl layoutClsInst lcid@(L _ cid) = docLines [ layoutInstanceHead , docEnsureIndent BrIndentRegular - $ docSetIndentLevel - $ docSortedLines - $ fmap layoutAndLocateSig (cid_sigs cid) - ++ fmap layoutAndLocateBind (bagToList $ cid_binds cid) - ++ fmap layoutAndLocateTyFamInsts (cid_tyfam_insts cid) + $ docSetIndentLevel + $ docSortedLines + $ fmap layoutAndLocateSig (cid_sigs cid) + ++ fmap layoutAndLocateBind (bagToList $ cid_binds cid) + ++ fmap layoutAndLocateTyFamInsts (cid_tyfam_insts cid) ++ fmap layoutAndLocateDataFamInsts (cid_datafam_insts cid) ] where layoutInstanceHead :: ToBriDocM BriDocNumbered layoutInstanceHead = briDocByExactNoComment - $ InstD NoExtField - . ClsInstD NoExtField - . removeChildren + $ InstD NoExtField + . ClsInstD NoExtField + . removeChildren <$> lcid removeChildren :: ClsInstDecl GhcPs -> ClsInstDecl GhcPs removeChildren c = c - { cid_binds = emptyBag - , cid_sigs = [] - , cid_tyfam_insts = [] + { cid_binds = emptyBag + , cid_sigs = [] + , cid_tyfam_insts = [] , cid_datafam_insts = [] } @@ -864,7 +878,11 @@ layoutClsInst lcid@(L _ cid) = docLines docSortedLines :: [ToBriDocM (Located BriDocNumbered)] -> ToBriDocM BriDocNumbered docSortedLines l = - allocateNode . BDFLines . fmap unLoc . List.sortOn (ExactPrint.rs . getLoc) =<< sequence l + allocateNode + . BDFLines + . fmap unLoc + . List.sortOn (ExactPrint.rs . getLoc) + =<< sequence l layoutAndLocateSig :: ToBriDocC (Sig GhcPs) (Located BriDocNumbered) layoutAndLocateSig lsig@(L loc _) = L loc <$> layoutSig lsig @@ -876,8 +894,8 @@ layoutClsInst lcid@(L _ cid) = docLines joinBinds :: Either [BriDocNumbered] BriDocNumbered -> ToBriDocM BriDocNumbered joinBinds = \case - Left ns -> docLines $ return <$> ns - Right n -> return n + Left ns -> docLines $ return <$> ns + Right n -> return n layoutAndLocateTyFamInsts :: ToBriDocC (TyFamInstDecl GhcPs) (Located BriDocNumbered) @@ -943,10 +961,11 @@ layoutClsInst lcid@(L _ cid) = docLines stripWhitespace' t = Text.intercalate (Text.pack "\n") $ go $ List.drop 1 $ Text.lines t where - go [] = [] + go [] = [] go (line1 : lineR) = case Text.stripStart line1 of - st | isTypeOrData st -> st : lineR - | otherwise -> st : go lineR + st + | isTypeOrData st -> st : lineR + | otherwise -> st : go lineR isTypeOrData t' = (Text.pack "type" `Text.isPrefixOf` t') || (Text.pack "newtype" `Text.isPrefixOf` t') @@ -969,7 +988,12 @@ layoutLhsAndType hasComments lhs sep typeDoc = do -- lhs = type -- lhs :: type addAlternativeCond (not hasComments) $ docSeq - [lhs, docSeparator, docLitS sep, docSeparator, docForceSingleline typeDoc] + [ lhs + , docSeparator + , docLitS sep + , docSeparator + , docForceSingleline typeDoc + ] -- lhs -- :: typeA -- -> typeB diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/Expr.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/Expr.hs index 344454c..3bc4c67 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/Expr.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/Expr.hs @@ -4,149 +4,150 @@ module Language.Haskell.Brittany.Internal.Layouters.Expr where - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Data.Data import qualified Data.Semigroup as Semigroup import qualified Data.Sequence as Seq import qualified Data.Text as Text -import qualified GHC.OldList as List - -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.LayouterBasics -import Language.Haskell.Brittany.Internal.Config.Types - -import GHC ( GenLocated(L), SrcSpan, AnnKeywordId(..), RdrName(..) ) -import GHC.Hs -import GHC.Types.Name +import GHC (AnnKeywordId(..), GenLocated(L), RdrName(..), SrcSpan) import qualified GHC.Data.FastString as FastString -import GHC.Types.Basic - -import Language.Haskell.Brittany.Internal.Utils -import Language.Haskell.Brittany.Internal.Layouters.Pattern -import Language.Haskell.Brittany.Internal.Layouters.Decl -import Language.Haskell.Brittany.Internal.Layouters.Stmt -import Language.Haskell.Brittany.Internal.Layouters.Type - - +import GHC.Hs +import qualified GHC.OldList as List +import GHC.Types.Basic +import GHC.Types.Name +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.LayouterBasics +import Language.Haskell.Brittany.Internal.Layouters.Decl +import Language.Haskell.Brittany.Internal.Layouters.Pattern +import Language.Haskell.Brittany.Internal.Layouters.Stmt +import Language.Haskell.Brittany.Internal.Layouters.Type +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.Utils layoutExpr :: ToBriDoc HsExpr layoutExpr lexpr@(L _ expr) = do - indentPolicy <- mAsk - <&> _conf_layout - .> _lconfig_indentPolicy - .> confUnpack + indentPolicy <- mAsk <&> _conf_layout .> _lconfig_indentPolicy .> confUnpack let allowFreeIndent = indentPolicy == IndentPolicyFree docWrapNode lexpr $ case expr of HsVar _ vname -> do docLit =<< lrdrNameToTextAnn vname - HsUnboundVar _ oname -> - docLit $ Text.pack $ occNameString oname + HsUnboundVar _ oname -> docLit $ Text.pack $ occNameString oname HsRecFld{} -> do -- TODO briDocByExactInlineOnly "HsRecFld" lexpr HsOverLabel _ext _reboundFromLabel name -> - let label = FastString.unpackFS name - in docLit . Text.pack $ '#' : label + let label = FastString.unpackFS name in docLit . Text.pack $ '#' : label HsIPVar _ext (HsIPName name) -> - let label = FastString.unpackFS name - in docLit . Text.pack $ '?' : label + let label = FastString.unpackFS name in docLit . Text.pack $ '?' : label HsOverLit _ olit -> do allocateNode $ overLitValBriDoc $ ol_val olit HsLit _ lit -> do allocateNode $ litBriDoc lit HsLam _ (MG _ (L _ [lmatch@(L _ match)]) _) - | pats <- m_pats match - , GRHSs _ [lgrhs] llocals <- m_grhss match - , L _ EmptyLocalBinds {} <- llocals - , L _ (GRHS _ [] body) <- lgrhs + | pats <- m_pats match + , GRHSs _ [lgrhs] llocals <- m_grhss match + , L _ EmptyLocalBinds{} <- llocals + , L _ (GRHS _ [] body) <- lgrhs -> do - patDocs <- zip (True : repeat False) pats `forM` \(isFirst, p) -> - fmap return $ do - -- this code could be as simple as `colsWrapPat =<< layoutPat p` - -- if it was not for the following two cases: - -- \ !x -> x - -- \ ~x -> x - -- These make it necessary to special-case an additional separator. - -- (TODO: we create a BDCols here, but then make it ineffective - -- by wrapping it in docSeq below. We _could_ add alignments for - -- stuff like lists-of-lambdas. Nothing terribly important..) - let shouldPrefixSeparator = case p of + patDocs <- zip (True : repeat False) pats `forM` \(isFirst, p) -> + fmap return $ do + -- this code could be as simple as `colsWrapPat =<< layoutPat p` + -- if it was not for the following two cases: + -- \ !x -> x + -- \ ~x -> x + -- These make it necessary to special-case an additional separator. + -- (TODO: we create a BDCols here, but then make it ineffective + -- by wrapping it in docSeq below. We _could_ add alignments for + -- stuff like lists-of-lambdas. Nothing terribly important..) + let + shouldPrefixSeparator = case p of L _ LazyPat{} -> isFirst L _ BangPat{} -> isFirst - _ -> False - patDocSeq <- layoutPat p - fixed <- case Seq.viewl patDocSeq of - p1 Seq.:< pr | shouldPrefixSeparator -> do - p1' <- docSeq [docSeparator, pure p1] - pure (p1' Seq.<| pr) - _ -> pure patDocSeq - colsWrapPat fixed - bodyDoc <- docAddBaseY BrIndentRegular <$> docSharedWrapper layoutExpr body - let funcPatternPartLine = - docCols ColCasePattern - (patDocs <&> (\p -> docSeq [docForceSingleline p, docSeparator])) - docAlt - [ -- single line - docSeq - [ docLit $ Text.pack "\\" - , docWrapNode lmatch $ docForceSingleline funcPatternPartLine - , appSep $ docLit $ Text.pack "->" - , docWrapNode lgrhs $ docForceSingleline bodyDoc - ] - -- double line - , docSetParSpacing - $ docAddBaseY BrIndentRegular - $ docPar - (docSeq + _ -> False + patDocSeq <- layoutPat p + fixed <- case Seq.viewl patDocSeq of + p1 Seq.:< pr | shouldPrefixSeparator -> do + p1' <- docSeq [docSeparator, pure p1] + pure (p1' Seq.<| pr) + _ -> pure patDocSeq + colsWrapPat fixed + bodyDoc <- + docAddBaseY BrIndentRegular <$> docSharedWrapper layoutExpr body + let + funcPatternPartLine = docCols + ColCasePattern + (patDocs <&> (\p -> docSeq [docForceSingleline p, docSeparator])) + docAlt + [ -- single line + docSeq [ docLit $ Text.pack "\\" - , docWrapNode lmatch $ appSep $ docForceSingleline funcPatternPartLine - , docLit $ Text.pack "->" - ]) - (docWrapNode lgrhs $ docForceSingleline bodyDoc) - -- wrapped par spacing - , docSetParSpacing - $ docSeq - [ docLit $ Text.pack "\\" - , docWrapNode lmatch $ docForceSingleline funcPatternPartLine - , appSep $ docLit $ Text.pack "->" - , docWrapNode lgrhs $ docForceParSpacing bodyDoc - ] - -- conservative - , docSetParSpacing - $ docAddBaseY BrIndentRegular - $ docPar - (docSeq + , docWrapNode lmatch $ docForceSingleline funcPatternPartLine + , appSep $ docLit $ Text.pack "->" + , docWrapNode lgrhs $ docForceSingleline bodyDoc + ] + -- double line + , docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar + (docSeq + [ docLit $ Text.pack "\\" + , docWrapNode lmatch $ appSep $ docForceSingleline + funcPatternPartLine + , docLit $ Text.pack "->" + ] + ) + (docWrapNode lgrhs $ docForceSingleline bodyDoc) + -- wrapped par spacing + , docSetParSpacing $ docSeq [ docLit $ Text.pack "\\" - , docWrapNode lmatch $ appSep $ docForceSingleline funcPatternPartLine - , docLit $ Text.pack "->" - ]) - (docWrapNode lgrhs $ docNonBottomSpacing bodyDoc) - ] - HsLam{} -> - unknownNodeError "HsLam too complex" lexpr + , docWrapNode lmatch $ docForceSingleline funcPatternPartLine + , appSep $ docLit $ Text.pack "->" + , docWrapNode lgrhs $ docForceParSpacing bodyDoc + ] + -- conservative + , docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar + (docSeq + [ docLit $ Text.pack "\\" + , docWrapNode lmatch $ appSep $ docForceSingleline + funcPatternPartLine + , docLit $ Text.pack "->" + ] + ) + (docWrapNode lgrhs $ docNonBottomSpacing bodyDoc) + ] + HsLam{} -> unknownNodeError "HsLam too complex" lexpr HsLamCase _ (MG _ (L _ []) _) -> do - docSetParSpacing $ docAddBaseY BrIndentRegular $ - (docLit $ Text.pack "\\case {}") + docSetParSpacing + $ docAddBaseY BrIndentRegular + $ (docLit $ Text.pack "\\case {}") HsLamCase _ (MG _ lmatches@(L _ matches) _) -> do - binderDoc <- docLit $ Text.pack "->" - funcPatDocs <- docWrapNode lmatches - $ layoutPatternBind Nothing binderDoc `mapM` matches + binderDoc <- docLit $ Text.pack "->" + funcPatDocs <- + docWrapNode lmatches + $ layoutPatternBind Nothing binderDoc + `mapM` matches docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar (docLit $ Text.pack "\\case") - (docSetBaseAndIndent $ docNonBottomSpacing $ docLines $ return <$> funcPatDocs) + (docSetBaseAndIndent + $ docNonBottomSpacing + $ docLines + $ return + <$> funcPatDocs + ) HsApp _ exp1@(L _ HsApp{}) exp2 -> do - let gather :: [LHsExpr GhcPs] -> LHsExpr GhcPs -> (LHsExpr GhcPs, [LHsExpr GhcPs]) - gather list = \case - L _ (HsApp _ l r) -> gather (r:list) l - x -> (x, list) + let + gather + :: [LHsExpr GhcPs] + -> LHsExpr GhcPs + -> (LHsExpr GhcPs, [LHsExpr GhcPs]) + gather list = \case + L _ (HsApp _ l r) -> gather (r : list) l + x -> (x, list) let (headE, paramEs) = gather [exp2] exp1 - let colsOrSequence = case headE of - L _ (HsVar _ (L _ (Unqual occname))) -> - docCols (ColApp $ Text.pack $ occNameString occname) - _ -> docSeq + let + colsOrSequence = case headE of + L _ (HsVar _ (L _ (Unqual occname))) -> + docCols (ColApp $ Text.pack $ occNameString occname) + _ -> docSeq headDoc <- docSharedWrapper layoutExpr headE paramDocs <- docSharedWrapper layoutExpr `mapM` paramEs hasComments <- hasAnyCommentsConnected exp2 @@ -158,13 +159,13 @@ layoutExpr lexpr@(L _ expr) = do : spacifyDocs (docForceSingleline <$> paramDocs) -- foo x -- y - addAlternativeCond allowFreeIndent - $ docSeq + addAlternativeCond allowFreeIndent $ docSeq [ appSep (docForceSingleline headDoc) , docSetBaseY $ docAddBaseY BrIndentRegular $ docLines - $ docForceSingleline <$> paramDocs + $ docForceSingleline + <$> paramDocs ] -- foo -- x @@ -173,30 +174,25 @@ layoutExpr lexpr@(L _ expr) = do $ docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar - (docForceSingleline headDoc) - ( docNonBottomSpacing - $ docLines paramDocs - ) + (docForceSingleline headDoc) + (docNonBottomSpacing $ docLines paramDocs) -- ( multi -- line -- function -- ) -- x -- y - addAlternative - $ docAddBaseY BrIndentRegular - $ docPar - headDoc - ( docNonBottomSpacing - $ docLines paramDocs - ) + addAlternative $ docAddBaseY BrIndentRegular $ docPar + headDoc + (docNonBottomSpacing $ docLines paramDocs) HsApp _ exp1 exp2 -> do -- TODO: if expDoc1 is some literal, we may want to create a docCols here. expDoc1 <- docSharedWrapper layoutExpr exp1 expDoc2 <- docSharedWrapper layoutExpr exp2 docAlt [ -- func arg - docSeq [appSep $ docForceSingleline expDoc1, docForceSingleline expDoc2] + docSeq + [appSep $ docForceSingleline expDoc1, docForceSingleline expDoc2] , -- func argline1 -- arglines -- e.g. @@ -209,77 +205,70 @@ layoutExpr lexpr@(L _ expr) = do -- anyways, so it is _always_ par-spaced. $ docAddBaseY BrIndentRegular $ docSeq - [ appSep $ docForceSingleline expDoc1 - , docForceParSpacing expDoc2 - ] + [appSep $ docForceSingleline expDoc1, docForceParSpacing expDoc2] , -- func -- arg - docSetParSpacing - $ docAddBaseY BrIndentRegular - $ docPar + docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar (docForceSingleline expDoc1) (docNonBottomSpacing expDoc2) , -- fu -- nc -- ar -- gument - docAddBaseY BrIndentRegular - $ docPar - expDoc1 - expDoc2 + docAddBaseY BrIndentRegular $ docPar expDoc1 expDoc2 ] HsAppType _ exp1 (HsWC _ ty1) -> do t <- docSharedWrapper layoutType ty1 e <- docSharedWrapper layoutExpr exp1 docAlt [ docSeq - [ docForceSingleline e - , docSeparator - , docLit $ Text.pack "@" - , docForceSingleline t - ] - , docPar - e - (docSeq [docLit $ Text.pack "@", t ]) + [ docForceSingleline e + , docSeparator + , docLit $ Text.pack "@" + , docForceSingleline t + ] + , docPar e (docSeq [docLit $ Text.pack "@", t]) ] OpApp _ expLeft@(L _ OpApp{}) expOp expRight -> do - let gather :: [(LHsExpr GhcPs, LHsExpr GhcPs)] -> LHsExpr GhcPs -> (LHsExpr GhcPs, [(LHsExpr GhcPs, LHsExpr GhcPs)]) - gather opExprList = \case - (L _ (OpApp _ l1 op1 r1)) -> gather ((op1, r1): opExprList) l1 - final -> (final, opExprList) - (leftOperand, appList) = gather [] expLeft + let + gather + :: [(LHsExpr GhcPs, LHsExpr GhcPs)] + -> LHsExpr GhcPs + -> (LHsExpr GhcPs, [(LHsExpr GhcPs, LHsExpr GhcPs)]) + gather opExprList = \case + (L _ (OpApp _ l1 op1 r1)) -> gather ((op1, r1) : opExprList) l1 + final -> (final, opExprList) + (leftOperand, appList) = gather [] expLeft leftOperandDoc <- docSharedWrapper layoutExpr leftOperand - appListDocs <- appList `forM` \(x,y) -> [ (xD, yD) - | xD <- docSharedWrapper layoutExpr x - , yD <- docSharedWrapper layoutExpr y - ] - opLastDoc <- docSharedWrapper layoutExpr expOp - expLastDoc <- docSharedWrapper layoutExpr expRight + appListDocs <- appList `forM` \(x, y) -> + [ (xD, yD) + | xD <- docSharedWrapper layoutExpr x + , yD <- docSharedWrapper layoutExpr y + ] + opLastDoc <- docSharedWrapper layoutExpr expOp + expLastDoc <- docSharedWrapper layoutExpr expRight allowSinglelinePar <- do hasComLeft <- hasAnyCommentsConnected expLeft - hasComOp <- hasAnyCommentsConnected expOp + hasComOp <- hasAnyCommentsConnected expOp pure $ not hasComLeft && not hasComOp - let allowPar = case (expOp, expRight) of - (L _ (HsVar _ (L _ (Unqual occname))), _) - | occNameString occname == "$" -> True - (_, L _ (HsApp _ _ (L _ HsVar{}))) -> False - _ -> True + let + allowPar = case (expOp, expRight) of + (L _ (HsVar _ (L _ (Unqual occname))), _) + | occNameString occname == "$" -> True + (_, L _ (HsApp _ _ (L _ HsVar{}))) -> False + _ -> True runFilteredAlternative $ do -- > one + two + three -- or -- > one + two + case x of -- > _ -> three - addAlternativeCond allowSinglelinePar - $ docSeq + addAlternativeCond allowSinglelinePar $ docSeq [ appSep $ docForceSingleline leftOperandDoc - , docSeq - $ appListDocs <&> \(od, ed) -> docSeq - [ appSep $ docForceSingleline od - , appSep $ docForceSingleline ed - ] + , docSeq $ appListDocs <&> \(od, ed) -> docSeq + [appSep $ docForceSingleline od, appSep $ docForceSingleline ed] , appSep $ docForceSingleline opLastDoc , (if allowPar then docForceParSpacing else docForceSingleline) - expLastDoc + expLastDoc ] -- this case rather leads to some unfortunate layouting than to anything -- useful; disabling for now. (it interfers with cols stuff.) @@ -294,29 +283,31 @@ layoutExpr lexpr@(L _ expr) = do -- > one -- > + two -- > + three - addAlternative $ - docPar - leftOperandDoc - ( docLines - $ (appListDocs <&> \(od, ed) -> docCols ColOpPrefix [appSep od, docSetBaseY ed]) - ++ [docCols ColOpPrefix [appSep opLastDoc, docSetBaseY expLastDoc]] + addAlternative $ docPar + leftOperandDoc + (docLines + $ (appListDocs <&> \(od, ed) -> + docCols ColOpPrefix [appSep od, docSetBaseY ed] ) + ++ [docCols ColOpPrefix [appSep opLastDoc, docSetBaseY expLastDoc]] + ) OpApp _ expLeft expOp expRight -> do - expDocLeft <- docSharedWrapper layoutExpr expLeft - expDocOp <- docSharedWrapper layoutExpr expOp + expDocLeft <- docSharedWrapper layoutExpr expLeft + expDocOp <- docSharedWrapper layoutExpr expOp expDocRight <- docSharedWrapper layoutExpr expRight - let allowPar = case (expOp, expRight) of - (L _ (HsVar _ (L _ (Unqual occname))), _) - | occNameString occname == "$" -> True - (_, L _ (HsApp _ _ (L _ HsVar{}))) -> False - _ -> True - let leftIsDoBlock = case expLeft of - L _ HsDo{} -> True - _ -> False + let + allowPar = case (expOp, expRight) of + (L _ (HsVar _ (L _ (Unqual occname))), _) + | occNameString occname == "$" -> True + (_, L _ (HsApp _ _ (L _ HsVar{}))) -> False + _ -> True + let + leftIsDoBlock = case expLeft of + L _ HsDo{} -> True + _ -> False runFilteredAlternative $ do -- one-line - addAlternative - $ docSeq + addAlternative $ docSeq [ appSep $ docForceSingleline expDocLeft , appSep $ docForceSingleline expDocOp , docForceSingleline expDocRight @@ -331,35 +322,35 @@ layoutExpr lexpr@(L _ expr) = do -- two-line addAlternative $ do let - expDocOpAndRight = docForceSingleline - $ docCols ColOpPrefix [appSep $ expDocOp, docSetBaseY expDocRight] + expDocOpAndRight = docForceSingleline $ docCols + ColOpPrefix + [appSep $ expDocOp, docSetBaseY expDocRight] if leftIsDoBlock then docLines [expDocLeft, expDocOpAndRight] - else docAddBaseY BrIndentRegular $ docPar expDocLeft expDocOpAndRight + else docAddBaseY BrIndentRegular + $ docPar expDocLeft expDocOpAndRight -- TODO: in both cases, we don't force expDocLeft to be -- single-line, which has certain.. interesting consequences. -- At least, the "two-line" label is not entirely -- accurate. -- one-line + par - addAlternativeCond allowPar - $ docSeq + addAlternativeCond allowPar $ docSeq [ appSep $ docForceSingleline expDocLeft , appSep $ docForceSingleline expDocOp , docForceParSpacing expDocRight ] -- more lines addAlternative $ do - let expDocOpAndRight = - docCols ColOpPrefix [appSep expDocOp, docSetBaseY expDocRight] + let + expDocOpAndRight = + docCols ColOpPrefix [appSep expDocOp, docSetBaseY expDocRight] if leftIsDoBlock then docLines [expDocLeft, expDocOpAndRight] else docAddBaseY BrIndentRegular - $ docPar expDocLeft expDocOpAndRight + $ docPar expDocLeft expDocOpAndRight NegApp _ op _ -> do opDoc <- docSharedWrapper layoutExpr op - docSeq [ docLit $ Text.pack "-" - , opDoc - ] + docSeq [docLit $ Text.pack "-", opDoc] HsPar _ innerExp -> do innerExpDoc <- docSharedWrapper (docWrapNode lexpr . layoutExpr) innerExp docAlt @@ -369,7 +360,8 @@ layoutExpr lexpr@(L _ expr) = do , docLit $ Text.pack ")" ] , docSetBaseY $ docLines - [ docCols ColOpPrefix + [ docCols + ColOpPrefix [ docLit $ Text.pack "(" , docAddBaseY (BrIndentSpecial 2) innerExpDoc ] @@ -378,33 +370,33 @@ layoutExpr lexpr@(L _ expr) = do ] SectionL _ left op -> do -- TODO: add to testsuite leftDoc <- docSharedWrapper layoutExpr left - opDoc <- docSharedWrapper layoutExpr op + opDoc <- docSharedWrapper layoutExpr op docSeq [leftDoc, docSeparator, opDoc] SectionR _ op right -> do -- TODO: add to testsuite - opDoc <- docSharedWrapper layoutExpr op + opDoc <- docSharedWrapper layoutExpr op rightDoc <- docSharedWrapper layoutExpr right docSeq [opDoc, docSeparator, rightDoc] ExplicitTuple _ args boxity -> do - let argExprs = args <&> \arg -> case arg of - (L _ (Present _ e)) -> (arg, Just e); - (L _ (Missing NoExtField)) -> (arg, Nothing) - argDocs <- forM argExprs - $ docSharedWrapper - $ \(arg, exprM) -> docWrapNode arg $ maybe docEmpty layoutExpr exprM + let + argExprs = args <&> \arg -> case arg of + (L _ (Present _ e)) -> (arg, Just e) + (L _ (Missing NoExtField)) -> (arg, Nothing) + argDocs <- forM argExprs $ docSharedWrapper $ \(arg, exprM) -> + docWrapNode arg $ maybe docEmpty layoutExpr exprM hasComments <- orM - ( hasCommentsBetween lexpr AnnOpenP AnnCloseP + (hasCommentsBetween lexpr AnnOpenP AnnCloseP : map hasAnyCommentsBelow args ) - let (openLit, closeLit) = case boxity of - Boxed -> (docLit $ Text.pack "(", docLit $ Text.pack ")") - Unboxed -> (docParenHashLSep, docParenHashRSep) + let + (openLit, closeLit) = case boxity of + Boxed -> (docLit $ Text.pack "(", docLit $ Text.pack ")") + Unboxed -> (docParenHashLSep, docParenHashRSep) case splitFirstLast argDocs of - FirstLastEmpty -> docSeq - [ openLit - , docNodeAnnKW lexpr (Just AnnOpenP) closeLit - ] + FirstLastEmpty -> + docSeq [openLit, docNodeAnnKW lexpr (Just AnnOpenP) closeLit] FirstLastSingleton e -> docAlt - [ docCols ColTuple + [ docCols + ColTuple [ openLit , docNodeAnnKW lexpr (Just AnnOpenP) $ docForceSingleline e , closeLit @@ -419,74 +411,88 @@ layoutExpr lexpr@(L _ expr) = do ] FirstLast e1 ems eN -> runFilteredAlternative $ do addAlternativeCond (not hasComments) - $ docCols ColTuple - $ [docSeq [openLit, docForceSingleline e1]] + $ docCols ColTuple + $ [docSeq [openLit, docForceSingleline e1]] ++ (ems <&> \e -> docSeq [docCommaSep, docForceSingleline e]) - ++ [docSeq [docCommaSep, docNodeAnnKW lexpr (Just AnnOpenP) (docForceSingleline eN), closeLit]] - addAlternative $ - let - start = docCols ColTuples - [appSep openLit, e1] - linesM = ems <&> \d -> - docCols ColTuples [docCommaSep, d] - lineN = docCols ColTuples [docCommaSep, docNodeAnnKW lexpr (Just AnnOpenP) eN] - end = closeLit - in docSetBaseY $ docLines $ [start] ++ linesM ++ [lineN, end] + ++ [ docSeq + [ docCommaSep + , docNodeAnnKW lexpr (Just AnnOpenP) (docForceSingleline eN) + , closeLit + ] + ] + addAlternative + $ let + start = docCols ColTuples [appSep openLit, e1] + linesM = ems <&> \d -> docCols ColTuples [docCommaSep, d] + lineN = docCols + ColTuples + [docCommaSep, docNodeAnnKW lexpr (Just AnnOpenP) eN] + end = closeLit + in docSetBaseY $ docLines $ [start] ++ linesM ++ [lineN, end] HsCase _ cExp (MG _ (L _ []) _) -> do cExpDoc <- docSharedWrapper layoutExpr cExp docAlt - [ docAddBaseY BrIndentRegular - $ docSeq - [ appSep $ docLit $ Text.pack "case" - , appSep $ docForceSingleline cExpDoc - , docLit $ Text.pack "of {}" - ] + [ docAddBaseY BrIndentRegular $ docSeq + [ appSep $ docLit $ Text.pack "case" + , appSep $ docForceSingleline cExpDoc + , docLit $ Text.pack "of {}" + ] , docPar - ( docAddBaseY BrIndentRegular - $ docPar (docLit $ Text.pack "case") cExpDoc - ) - (docLit $ Text.pack "of {}") + (docAddBaseY BrIndentRegular + $ docPar (docLit $ Text.pack "case") cExpDoc + ) + (docLit $ Text.pack "of {}") ] HsCase _ cExp (MG _ lmatches@(L _ matches) _) -> do cExpDoc <- docSharedWrapper layoutExpr cExp binderDoc <- docLit $ Text.pack "->" - funcPatDocs <- docWrapNode lmatches - $ layoutPatternBind Nothing binderDoc `mapM` matches + funcPatDocs <- + docWrapNode lmatches + $ layoutPatternBind Nothing binderDoc + `mapM` matches docAlt - [ docSetParSpacing - $ docAddBaseY BrIndentRegular - $ docPar - ( docSeq + [ docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar + (docSeq [ appSep $ docLit $ Text.pack "case" , appSep $ docForceSingleline cExpDoc , docLit $ Text.pack "of" - ]) - (docSetBaseAndIndent $ docNonBottomSpacing $ docLines $ return <$> funcPatDocs) + ] + ) + (docSetBaseAndIndent + $ docNonBottomSpacing + $ docLines + $ return + <$> funcPatDocs + ) , docPar - ( docAddBaseY BrIndentRegular - $ docPar (docLit $ Text.pack "case") cExpDoc - ) - ( docAddBaseY BrIndentRegular - $ docPar (docLit $ Text.pack "of") - (docSetBaseAndIndent $ docNonBottomSpacing $ docLines $ return <$> funcPatDocs) + (docAddBaseY BrIndentRegular + $ docPar (docLit $ Text.pack "case") cExpDoc + ) + (docAddBaseY BrIndentRegular $ docPar + (docLit $ Text.pack "of") + (docSetBaseAndIndent + $ docNonBottomSpacing + $ docLines + $ return + <$> funcPatDocs ) + ) ] HsIf _ ifExpr thenExpr elseExpr -> do - ifExprDoc <- docSharedWrapper layoutExpr ifExpr + ifExprDoc <- docSharedWrapper layoutExpr ifExpr thenExprDoc <- docSharedWrapper layoutExpr thenExpr elseExprDoc <- docSharedWrapper layoutExpr elseExpr hasComments <- hasAnyCommentsBelow lexpr - let maySpecialIndent = - case indentPolicy of - IndentPolicyLeft -> BrIndentRegular - IndentPolicyMultiple -> BrIndentRegular - IndentPolicyFree -> BrIndentSpecial 3 + let + maySpecialIndent = case indentPolicy of + IndentPolicyLeft -> BrIndentRegular + IndentPolicyMultiple -> BrIndentRegular + IndentPolicyFree -> BrIndentSpecial 3 -- TODO: some of the alternatives (especially last and last-but-one) -- overlap. docSetIndentLevel $ runFilteredAlternative $ do -- if _ then _ else _ - addAlternativeCond (not hasComments) - $ docSeq + addAlternativeCond (not hasComments) $ docSeq [ appSep $ docLit $ Text.pack "if" , appSep $ docForceSingleline ifExprDoc , appSep $ docLit $ Text.pack "then" @@ -511,25 +517,34 @@ layoutExpr lexpr@(L _ expr) = do $ docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar - ( docSeq + (docSeq [ docNodeAnnKW lexpr Nothing $ appSep $ docLit $ Text.pack "if" - , docNodeAnnKW lexpr (Just AnnIf) $ docForceSingleline ifExprDoc - ]) + , docNodeAnnKW lexpr (Just AnnIf) + $ docForceSingleline ifExprDoc + ] + ) (docLines [ docAddBaseY BrIndentRegular $ docNodeAnnKW lexpr (Just AnnThen) - $ docNonBottomSpacing $ docAlt - [ docSeq [appSep $ docLit $ Text.pack "then", docForceParSpacing thenExprDoc] + $ docNonBottomSpacing + $ docAlt + [ docSeq + [ appSep $ docLit $ Text.pack "then" + , docForceParSpacing thenExprDoc + ] + , docAddBaseY BrIndentRegular + $ docPar (docLit $ Text.pack "then") thenExprDoc + ] + , docAddBaseY BrIndentRegular $ docNonBottomSpacing $ docAlt + [ docSeq + [ appSep $ docLit $ Text.pack "else" + , docForceParSpacing elseExprDoc + ] , docAddBaseY BrIndentRegular - $ docPar (docLit $ Text.pack "then") thenExprDoc + $ docPar (docLit $ Text.pack "else") elseExprDoc ] - , docAddBaseY BrIndentRegular - $ docNonBottomSpacing $ docAlt - [ docSeq [appSep $ docLit $ Text.pack "else", docForceParSpacing elseExprDoc] - , docAddBaseY BrIndentRegular - $ docPar (docLit $ Text.pack "else") elseExprDoc - ] - ]) + ] + ) -- either -- if multi -- line @@ -547,62 +562,69 @@ layoutExpr lexpr@(L _ expr) = do -- else -- stuff -- note that this does _not_ have par-spacing - addAlternative - $ docAddBaseY BrIndentRegular - $ docPar - ( docAddBaseY maySpecialIndent - $ docSeq - [ docNodeAnnKW lexpr Nothing $ appSep $ docLit $ Text.pack "if" - , docNodeAnnKW lexpr (Just AnnIf) $ ifExprDoc - ]) - (docLines - [ docAddBaseY BrIndentRegular - $ docNodeAnnKW lexpr (Just AnnThen) - $ docAlt - [ docSeq [appSep $ docLit $ Text.pack "then", docForceParSpacing thenExprDoc] - , docAddBaseY BrIndentRegular - $ docPar (docLit $ Text.pack "then") thenExprDoc + addAlternative $ docAddBaseY BrIndentRegular $ docPar + (docAddBaseY maySpecialIndent $ docSeq + [ docNodeAnnKW lexpr Nothing $ appSep $ docLit $ Text.pack "if" + , docNodeAnnKW lexpr (Just AnnIf) $ ifExprDoc + ] + ) + (docLines + [ docAddBaseY BrIndentRegular + $ docNodeAnnKW lexpr (Just AnnThen) + $ docAlt + [ docSeq + [ appSep $ docLit $ Text.pack "then" + , docForceParSpacing thenExprDoc ] , docAddBaseY BrIndentRegular - $ docAlt - [ docSeq [appSep $ docLit $ Text.pack "else", docForceParSpacing elseExprDoc] - , docAddBaseY BrIndentRegular - $ docPar (docLit $ Text.pack "else") elseExprDoc - ] - ]) - addAlternative - $ docSetBaseY - $ docLines - [ docAddBaseY maySpecialIndent - $ docSeq - [ docNodeAnnKW lexpr Nothing $ appSep $ docLit $ Text.pack "if" - , docNodeAnnKW lexpr (Just AnnIf) $ ifExprDoc + $ docPar (docLit $ Text.pack "then") thenExprDoc + ] + , docAddBaseY BrIndentRegular $ docAlt + [ docSeq + [ appSep $ docLit $ Text.pack "else" + , docForceParSpacing elseExprDoc + ] + , docAddBaseY BrIndentRegular + $ docPar (docLit $ Text.pack "else") elseExprDoc ] - , docNodeAnnKW lexpr (Just AnnThen) - $ docAddBaseY BrIndentRegular - $ docPar (docLit $ Text.pack "then") thenExprDoc - , docAddBaseY BrIndentRegular - $ docPar (docLit $ Text.pack "else") elseExprDoc ] + ) + addAlternative $ docSetBaseY $ docLines + [ docAddBaseY maySpecialIndent $ docSeq + [ docNodeAnnKW lexpr Nothing $ appSep $ docLit $ Text.pack "if" + , docNodeAnnKW lexpr (Just AnnIf) $ ifExprDoc + ] + , docNodeAnnKW lexpr (Just AnnThen) + $ docAddBaseY BrIndentRegular + $ docPar (docLit $ Text.pack "then") thenExprDoc + , docAddBaseY BrIndentRegular + $ docPar (docLit $ Text.pack "else") elseExprDoc + ] HsMultiIf _ cases -> do - clauseDocs <- cases `forM` layoutGrhs - binderDoc <- docLit $ Text.pack "->" + clauseDocs <- cases `forM` layoutGrhs + binderDoc <- docLit $ Text.pack "->" hasComments <- hasAnyCommentsBelow lexpr docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar (docLit $ Text.pack "if") - (layoutPatternBindFinal Nothing binderDoc Nothing clauseDocs Nothing hasComments) + (layoutPatternBindFinal + Nothing + binderDoc + Nothing + clauseDocs + Nothing + hasComments + ) HsLet _ binds exp1 -> do - expDoc1 <- docSharedWrapper layoutExpr exp1 + expDoc1 <- docSharedWrapper layoutExpr exp1 -- We jump through some ugly hoops here to ensure proper sharing. hasComments <- hasAnyCommentsBelow lexpr - mBindDocs <- fmap (fmap pure) <$> layoutLocalBinds binds + mBindDocs <- fmap (fmap pure) <$> layoutLocalBinds binds let ifIndentFreeElse :: a -> a -> a - ifIndentFreeElse x y = - case indentPolicy of - IndentPolicyLeft -> y - IndentPolicyMultiple -> y - IndentPolicyFree -> x + ifIndentFreeElse x y = case indentPolicy of + IndentPolicyLeft -> y + IndentPolicyMultiple -> y + IndentPolicyFree -> x -- this `docSetBaseAndIndent` might seem out of place (especially the -- Indent part; setBase is necessary due to the use of docLines below), -- but is here due to ghc-exactprint's DP handling of "let" in @@ -615,36 +637,35 @@ layoutExpr lexpr@(L _ expr) = do Just [bindDoc] -> runFilteredAlternative $ do addAlternativeCond (not hasComments) $ docSeq [ appSep $ docLit $ Text.pack "let" - , docNodeAnnKW lexpr (Just AnnLet) - $ appSep $ docForceSingleline bindDoc + , docNodeAnnKW lexpr (Just AnnLet) $ appSep $ docForceSingleline + bindDoc , appSep $ docLit $ Text.pack "in" , docForceSingleline expDoc1 ] addAlternative $ docLines - [ docNodeAnnKW lexpr (Just AnnLet) - $ docAlt - [ docSeq - [ appSep $ docLit $ Text.pack "let" - , ifIndentFreeElse docSetBaseAndIndent docForceSingleline - $ bindDoc - ] - , docAddBaseY BrIndentRegular - $ docPar - (docLit $ Text.pack "let") - (docSetBaseAndIndent bindDoc) + [ docNodeAnnKW lexpr (Just AnnLet) $ docAlt + [ docSeq + [ appSep $ docLit $ Text.pack "let" + , ifIndentFreeElse docSetBaseAndIndent docForceSingleline + $ bindDoc ] + , docAddBaseY BrIndentRegular $ docPar + (docLit $ Text.pack "let") + (docSetBaseAndIndent bindDoc) + ] , docAlt - [ docSeq - [ appSep $ docLit $ Text.pack $ ifIndentFreeElse "in " "in" - , ifIndentFreeElse docSetBaseAndIndent docForceSingleline expDoc1 - ] - , docAddBaseY BrIndentRegular - $ docPar - (docLit $ Text.pack "in") - (docSetBaseY expDoc1) + [ docSeq + [ appSep $ docLit $ Text.pack $ ifIndentFreeElse "in " "in" + , ifIndentFreeElse + docSetBaseAndIndent + docForceSingleline + expDoc1 ] + , docAddBaseY BrIndentRegular + $ docPar (docLit $ Text.pack "in") (docSetBaseY expDoc1) + ] ] - Just bindDocs@(_:_) -> runFilteredAlternative $ do + Just bindDocs@(_ : _) -> runFilteredAlternative $ do --either -- let -- a = b @@ -658,102 +679,91 @@ layoutExpr lexpr@(L _ expr) = do -- c = d -- in -- fooooooooooooooooooo - let noHangingBinds = - [ docNonBottomSpacing $ docAddBaseY BrIndentRegular - $ docPar - (docLit $ Text.pack "let") - (docSetBaseAndIndent $ docLines bindDocs) - , docSeq - [ docLit $ Text.pack "in " - , docAddBaseY BrIndentRegular - $ docForceParSpacing expDoc1 - ] + let + noHangingBinds = + [ docNonBottomSpacing $ docAddBaseY BrIndentRegular $ docPar + (docLit $ Text.pack "let") + (docSetBaseAndIndent $ docLines bindDocs) + , docSeq + [ docLit $ Text.pack "in " + , docAddBaseY BrIndentRegular $ docForceParSpacing expDoc1 ] + ] addAlternative $ case indentPolicy of - IndentPolicyLeft -> docLines noHangingBinds + IndentPolicyLeft -> docLines noHangingBinds IndentPolicyMultiple -> docLines noHangingBinds - IndentPolicyFree -> docLines - [ docNodeAnnKW lexpr (Just AnnLet) - $ docSeq + IndentPolicyFree -> docLines + [ docNodeAnnKW lexpr (Just AnnLet) $ docSeq [ appSep $ docLit $ Text.pack "let" , docSetBaseAndIndent $ docLines bindDocs ] - , docSeq - [ appSep $ docLit $ Text.pack "in " - , docSetBaseY expDoc1 - ] + , docSeq [appSep $ docLit $ Text.pack "in ", docSetBaseY expDoc1] ] - addAlternative - $ docLines + addAlternative $ docLines [ docNodeAnnKW lexpr (Just AnnLet) $ docAddBaseY BrIndentRegular $ docPar - (docLit $ Text.pack "let") - (docSetBaseAndIndent $ docLines $ bindDocs) + (docLit $ Text.pack "let") + (docSetBaseAndIndent $ docLines $ bindDocs) , docAddBaseY BrIndentRegular - $ docPar - (docLit $ Text.pack "in") - (docSetBaseY $ expDoc1) + $ docPar (docLit $ Text.pack "in") (docSetBaseY $ expDoc1) ] _ -> docSeq [appSep $ docLit $ Text.pack "let in", expDoc1] -- docSeq [appSep $ docLit "let in", expDoc1] HsDo _ stmtCtx (L _ stmts) -> case stmtCtx of DoExpr _ -> do stmtDocs <- docSharedWrapper layoutStmt `mapM` stmts - docSetParSpacing - $ docAddBaseY BrIndentRegular - $ docPar - (docLit $ Text.pack "do") - (docSetBaseAndIndent $ docNonBottomSpacing $ docLines stmtDocs) + docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar + (docLit $ Text.pack "do") + (docSetBaseAndIndent $ docNonBottomSpacing $ docLines stmtDocs) MDoExpr _ -> do stmtDocs <- docSharedWrapper layoutStmt `mapM` stmts - docSetParSpacing - $ docAddBaseY BrIndentRegular - $ docPar - (docLit $ Text.pack "mdo") - (docSetBaseAndIndent $ docNonBottomSpacing $ docLines stmtDocs) - x | case x of { ListComp -> True - ; MonadComp -> True - ; _ -> False } -> do - stmtDocs <- docSharedWrapper layoutStmt `mapM` stmts - hasComments <- hasAnyCommentsBelow lexpr - runFilteredAlternative $ do - addAlternativeCond (not hasComments) - $ docSeq - [ docNodeAnnKW lexpr Nothing - $ appSep - $ docLit - $ Text.pack "[" - , docNodeAnnKW lexpr (Just AnnOpenS) - $ appSep - $ docForceSingleline - $ List.last stmtDocs - , appSep $ docLit $ Text.pack "|" - , docSeq $ List.intersperse docCommaSep - $ docForceSingleline <$> List.init stmtDocs - , docLit $ Text.pack " ]" - ] - addAlternative $ - let - start = docCols ColListComp - [ docNodeAnnKW lexpr Nothing - $ appSep $ docLit $ Text.pack "[" - , docSetBaseY - $ docNodeAnnKW lexpr (Just AnnOpenS) - $ List.last stmtDocs - ] - (s1:sM) = List.init stmtDocs - line1 = docCols ColListComp - [appSep $ docLit $ Text.pack "|", s1] - lineM = sM <&> \d -> - docCols ColListComp [docCommaSep, d] - end = docLit $ Text.pack "]" - in docSetBaseY $ docLines $ [start, line1] ++ lineM ++ [end] + docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar + (docLit $ Text.pack "mdo") + (docSetBaseAndIndent $ docNonBottomSpacing $ docLines stmtDocs) + x + | case x of + ListComp -> True + MonadComp -> True + _ -> False + -> do + stmtDocs <- docSharedWrapper layoutStmt `mapM` stmts + hasComments <- hasAnyCommentsBelow lexpr + runFilteredAlternative $ do + addAlternativeCond (not hasComments) $ docSeq + [ docNodeAnnKW lexpr Nothing $ appSep $ docLit $ Text.pack "[" + , docNodeAnnKW lexpr (Just AnnOpenS) + $ appSep + $ docForceSingleline + $ List.last stmtDocs + , appSep $ docLit $ Text.pack "|" + , docSeq + $ List.intersperse docCommaSep + $ docForceSingleline + <$> List.init stmtDocs + , docLit $ Text.pack " ]" + ] + addAlternative + $ let + start = docCols + ColListComp + [ docNodeAnnKW lexpr Nothing $ appSep $ docLit $ Text.pack + "[" + , docSetBaseY + $ docNodeAnnKW lexpr (Just AnnOpenS) + $ List.last stmtDocs + ] + (s1 : sM) = List.init stmtDocs + line1 = + docCols ColListComp [appSep $ docLit $ Text.pack "|", s1] + lineM = sM <&> \d -> docCols ColListComp [docCommaSep, d] + end = docLit $ Text.pack "]" + in docSetBaseY $ docLines $ [start, line1] ++ lineM ++ [end] _ -> do -- TODO unknownNodeError "HsDo{} unknown stmtCtx" lexpr - ExplicitList _ _ elems@(_:_) -> do - elemDocs <- elems `forM` docSharedWrapper layoutExpr + ExplicitList _ _ elems@(_ : _) -> do + elemDocs <- elems `forM` docSharedWrapper layoutExpr hasComments <- hasAnyCommentsBelow lexpr case splitFirstLast elemDocs of FirstLastEmpty -> docSeq @@ -777,109 +787,106 @@ layoutExpr lexpr@(L _ expr) = do ] FirstLast e1 ems eN -> runFilteredAlternative $ do addAlternativeCond (not hasComments) - $ docSeq - $ [docLit $ Text.pack "["] - ++ List.intersperse docCommaSep (docForceSingleline <$> (e1:ems ++ [docNodeAnnKW lexpr (Just AnnOpenS) eN])) + $ docSeq + $ [docLit $ Text.pack "["] + ++ List.intersperse + docCommaSep + (docForceSingleline + <$> (e1 : ems ++ [docNodeAnnKW lexpr (Just AnnOpenS) eN]) + ) ++ [docLit $ Text.pack "]"] - addAlternative $ - let - start = docCols ColList - [appSep $ docLit $ Text.pack "[", e1] - linesM = ems <&> \d -> - docCols ColList [docCommaSep, d] - lineN = docCols ColList [docCommaSep, docNodeAnnKW lexpr (Just AnnOpenS) eN] - end = docLit $ Text.pack "]" - in docSetBaseY $ docLines $ [start] ++ linesM ++ [lineN] ++ [end] - ExplicitList _ _ [] -> - docLit $ Text.pack "[]" - RecordCon _ lname fields -> - case fields of - HsRecFields fs Nothing -> do - let nameDoc = docWrapNode lname $ docLit $ lrdrNameToText lname - rFs <- fs - `forM` \lfield@(L _ (HsRecField (L _ fieldOcc) rFExpr pun)) -> do - let FieldOcc _ lnameF = fieldOcc - rFExpDoc <- if pun - then return Nothing - else Just <$> docSharedWrapper layoutExpr rFExpr - return $ (lfield, lrdrNameToText lnameF, rFExpDoc) - recordExpression False indentPolicy lexpr nameDoc rFs - HsRecFields [] (Just (L _ 0)) -> do - let t = lrdrNameToText lname - docWrapNode lname $ docLit $ t <> Text.pack " { .. }" - HsRecFields fs@(_:_) (Just (L _ dotdoti)) | dotdoti == length fs -> do - let nameDoc = docWrapNode lname $ docLit $ lrdrNameToText lname - fieldDocs <- fs `forM` \fieldl@(L _ (HsRecField (L _ fieldOcc) fExpr pun)) -> do + addAlternative + $ let + start = docCols ColList [appSep $ docLit $ Text.pack "[", e1] + linesM = ems <&> \d -> docCols ColList [docCommaSep, d] + lineN = docCols + ColList + [docCommaSep, docNodeAnnKW lexpr (Just AnnOpenS) eN] + end = docLit $ Text.pack "]" + in docSetBaseY $ docLines $ [start] ++ linesM ++ [lineN] ++ [end] + ExplicitList _ _ [] -> docLit $ Text.pack "[]" + RecordCon _ lname fields -> case fields of + HsRecFields fs Nothing -> do + let nameDoc = docWrapNode lname $ docLit $ lrdrNameToText lname + rFs <- + fs `forM` \lfield@(L _ (HsRecField (L _ fieldOcc) rFExpr pun)) -> do + let FieldOcc _ lnameF = fieldOcc + rFExpDoc <- if pun + then return Nothing + else Just <$> docSharedWrapper layoutExpr rFExpr + return $ (lfield, lrdrNameToText lnameF, rFExpDoc) + recordExpression False indentPolicy lexpr nameDoc rFs + HsRecFields [] (Just (L _ 0)) -> do + let t = lrdrNameToText lname + docWrapNode lname $ docLit $ t <> Text.pack " { .. }" + HsRecFields fs@(_ : _) (Just (L _ dotdoti)) | dotdoti == length fs -> do + let nameDoc = docWrapNode lname $ docLit $ lrdrNameToText lname + fieldDocs <- + fs `forM` \fieldl@(L _ (HsRecField (L _ fieldOcc) fExpr pun)) -> do let FieldOcc _ lnameF = fieldOcc fExpDoc <- if pun then return Nothing else Just <$> docSharedWrapper layoutExpr fExpr return (fieldl, lrdrNameToText lnameF, fExpDoc) - recordExpression True indentPolicy lexpr nameDoc fieldDocs - _ -> unknownNodeError "RecordCon with puns" lexpr + recordExpression True indentPolicy lexpr nameDoc fieldDocs + _ -> unknownNodeError "RecordCon with puns" lexpr RecordUpd _ rExpr fields -> do rExprDoc <- docSharedWrapper layoutExpr rExpr - rFs <- fields - `forM` \lfield@(L _ (HsRecField (L _ ambName) rFExpr pun)) -> do + rFs <- + fields `forM` \lfield@(L _ (HsRecField (L _ ambName) rFExpr pun)) -> do rFExpDoc <- if pun then return Nothing else Just <$> docSharedWrapper layoutExpr rFExpr return $ case ambName of Unambiguous _ n -> (lfield, lrdrNameToText n, rFExpDoc) - Ambiguous _ n -> (lfield, lrdrNameToText n, rFExpDoc) + Ambiguous _ n -> (lfield, lrdrNameToText n, rFExpDoc) recordExpression False indentPolicy lexpr rExprDoc rFs ExprWithTySig _ exp1 (HsWC _ (HsIB _ typ1)) -> do expDoc <- docSharedWrapper layoutExpr exp1 typDoc <- docSharedWrapper layoutType typ1 - docSeq - [ appSep expDoc - , appSep $ docLit $ Text.pack "::" - , typDoc - ] - ArithSeq _ Nothing info -> - case info of - From e1 -> do - e1Doc <- docSharedWrapper layoutExpr e1 - docSeq - [ docLit $ Text.pack "[" - , appSep $ docForceSingleline e1Doc - , docLit $ Text.pack "..]" - ] - FromThen e1 e2 -> do - e1Doc <- docSharedWrapper layoutExpr e1 - e2Doc <- docSharedWrapper layoutExpr e2 - docSeq - [ docLit $ Text.pack "[" - , docForceSingleline e1Doc - , appSep $ docLit $ Text.pack "," - , appSep $ docForceSingleline e2Doc - , docLit $ Text.pack "..]" - ] - FromTo e1 eN -> do - e1Doc <- docSharedWrapper layoutExpr e1 - eNDoc <- docSharedWrapper layoutExpr eN - docSeq - [ docLit $ Text.pack "[" - , appSep $ docForceSingleline e1Doc - , appSep $ docLit $ Text.pack ".." - , docForceSingleline eNDoc - , docLit $ Text.pack "]" - ] - FromThenTo e1 e2 eN -> do - e1Doc <- docSharedWrapper layoutExpr e1 - e2Doc <- docSharedWrapper layoutExpr e2 - eNDoc <- docSharedWrapper layoutExpr eN - docSeq - [ docLit $ Text.pack "[" - , docForceSingleline e1Doc - , appSep $ docLit $ Text.pack "," - , appSep $ docForceSingleline e2Doc - , appSep $ docLit $ Text.pack ".." - , docForceSingleline eNDoc - , docLit $ Text.pack "]" - ] - ArithSeq{} -> - briDocByExactInlineOnly "ArithSeq" lexpr + docSeq [appSep expDoc, appSep $ docLit $ Text.pack "::", typDoc] + ArithSeq _ Nothing info -> case info of + From e1 -> do + e1Doc <- docSharedWrapper layoutExpr e1 + docSeq + [ docLit $ Text.pack "[" + , appSep $ docForceSingleline e1Doc + , docLit $ Text.pack "..]" + ] + FromThen e1 e2 -> do + e1Doc <- docSharedWrapper layoutExpr e1 + e2Doc <- docSharedWrapper layoutExpr e2 + docSeq + [ docLit $ Text.pack "[" + , docForceSingleline e1Doc + , appSep $ docLit $ Text.pack "," + , appSep $ docForceSingleline e2Doc + , docLit $ Text.pack "..]" + ] + FromTo e1 eN -> do + e1Doc <- docSharedWrapper layoutExpr e1 + eNDoc <- docSharedWrapper layoutExpr eN + docSeq + [ docLit $ Text.pack "[" + , appSep $ docForceSingleline e1Doc + , appSep $ docLit $ Text.pack ".." + , docForceSingleline eNDoc + , docLit $ Text.pack "]" + ] + FromThenTo e1 e2 eN -> do + e1Doc <- docSharedWrapper layoutExpr e1 + e2Doc <- docSharedWrapper layoutExpr e2 + eNDoc <- docSharedWrapper layoutExpr eN + docSeq + [ docLit $ Text.pack "[" + , docForceSingleline e1Doc + , appSep $ docLit $ Text.pack "," + , appSep $ docForceSingleline e2Doc + , appSep $ docLit $ Text.pack ".." + , docForceSingleline eNDoc + , docLit $ Text.pack "]" + ] + ArithSeq{} -> briDocByExactInlineOnly "ArithSeq" lexpr HsBracket{} -> do -- TODO briDocByExactInlineOnly "HsBracket{}" lexpr @@ -892,11 +899,12 @@ layoutExpr lexpr@(L _ expr) = do HsSpliceE _ (HsQuasiQuote _ _ quoter _loc content) -> do allocateNode $ BDFPlain (Text.pack - $ "[" - ++ showOutputable quoter - ++ "|" - ++ showOutputable content - ++ "|]") + $ "[" + ++ showOutputable quoter + ++ "|" + ++ showOutputable content + ++ "|]" + ) HsSpliceE{} -> do -- TODO briDocByExactInlineOnly "HsSpliceE{}" lexpr @@ -928,78 +936,79 @@ recordExpression -> IndentPolicy -> GenLocated SrcSpan lExpr -> ToBriDocM BriDocNumbered - -> [(GenLocated SrcSpan name, Text, Maybe (ToBriDocM BriDocNumbered))] + -> [ ( GenLocated SrcSpan name + , Text + , Maybe (ToBriDocM BriDocNumbered) + ) + ] -> ToBriDocM BriDocNumbered -recordExpression False _ lexpr nameDoc [] = - docSeq - [ docNodeAnnKW lexpr (Just AnnOpenC) $ docSeq [nameDoc, docLit $ Text.pack "{"] - , docLit $ Text.pack "}" - ] -recordExpression True _ lexpr nameDoc [] = - docSeq -- this case might still be incomplete, and is probably not used +recordExpression False _ lexpr nameDoc [] = docSeq + [ docNodeAnnKW lexpr (Just AnnOpenC) + $ docSeq [nameDoc, docLit $ Text.pack "{"] + , docLit $ Text.pack "}" + ] +recordExpression True _ lexpr nameDoc [] = docSeq -- this case might still be incomplete, and is probably not used -- atm anyway. - [ docNodeAnnKW lexpr (Just AnnOpenC) $ docSeq [nameDoc, docLit $ Text.pack "{"] - , docLit $ Text.pack " .. }" - ] -recordExpression dotdot indentPolicy lexpr nameDoc rFs@(rF1:rFr) = do + [ docNodeAnnKW lexpr (Just AnnOpenC) + $ docSeq [nameDoc, docLit $ Text.pack "{"] + , docLit $ Text.pack " .. }" + ] +recordExpression dotdot indentPolicy lexpr nameDoc rFs@(rF1 : rFr) = do let (rF1f, rF1n, rF1e) = rF1 runFilteredAlternative $ do -- container { fieldA = blub, fieldB = blub } - addAlternative - $ docSeq + addAlternative $ docSeq [ docNodeAnnKW lexpr Nothing $ appSep $ docForceSingleline nameDoc , appSep $ docLit $ Text.pack "{" - , docSeq $ List.intersperse docCommaSep - $ rFs <&> \case - (lfield, fieldStr, Just fieldDoc) -> - docWrapNode lfield $ docSeq - [ appSep $ docLit fieldStr - , appSep $ docLit $ Text.pack "=" - , docForceSingleline fieldDoc - ] - (lfield, fieldStr, Nothing) -> - docWrapNode lfield $ docLit fieldStr + , docSeq $ List.intersperse docCommaSep $ rFs <&> \case + (lfield, fieldStr, Just fieldDoc) -> docWrapNode lfield $ docSeq + [ appSep $ docLit fieldStr + , appSep $ docLit $ Text.pack "=" + , docForceSingleline fieldDoc + ] + (lfield, fieldStr, Nothing) -> docWrapNode lfield $ docLit fieldStr , if dotdot - then docSeq [ docCommaSep, docLit $ Text.pack "..", docSeparator] - else docSeparator + then docSeq [docCommaSep, docLit $ Text.pack "..", docSeparator] + else docSeparator , docLit $ Text.pack "}" ] -- hanging single-line fields -- container { fieldA = blub -- , fieldB = blub -- } - addAlternativeCond (indentPolicy == IndentPolicyFree) - $ docSeq + addAlternativeCond (indentPolicy == IndentPolicyFree) $ docSeq [ docNodeAnnKW lexpr Nothing $ docForceSingleline $ appSep nameDoc - , docSetBaseY $ docLines $ let - line1 = docCols ColRec + , docSetBaseY + $ docLines + $ let + line1 = docCols + ColRec [ appSep $ docLit $ Text.pack "{" , docWrapNodePrior rF1f $ appSep $ docLit rF1n , case rF1e of - Just x -> docWrapNodeRest rF1f $ docSeq - [ appSep $ docLit $ Text.pack "=" - , docForceSingleline x - ] - Nothing -> docEmpty + Just x -> docWrapNodeRest rF1f $ docSeq + [appSep $ docLit $ Text.pack "=", docForceSingleline x] + Nothing -> docEmpty ] - lineR = rFr <&> \(lfield, fText, fDoc) -> docWrapNode lfield $ docCols ColRec - [ docCommaSep - , appSep $ docLit fText - , case fDoc of - Just x -> docSeq [ appSep $ docLit $ Text.pack "=" - , docForceSingleline x - ] + lineR = rFr <&> \(lfield, fText, fDoc) -> + docWrapNode lfield $ docCols + ColRec + [ docCommaSep + , appSep $ docLit fText + , case fDoc of + Just x -> docSeq + [appSep $ docLit $ Text.pack "=", docForceSingleline x] Nothing -> docEmpty - ] + ] dotdotLine = if dotdot - then docCols ColRec - [ docNodeAnnKW lexpr (Just AnnOpenC) docCommaSep - , docNodeAnnKW lexpr (Just AnnDotdot) - $ docLit $ Text.pack ".." - ] + then docCols + ColRec + [ docNodeAnnKW lexpr (Just AnnOpenC) docCommaSep + , docNodeAnnKW lexpr (Just AnnDotdot) $ docLit $ Text.pack ".." + ] else docNodeAnnKW lexpr (Just AnnOpenC) docEmpty lineN = docLit $ Text.pack "}" - in [line1] ++ lineR ++ [dotdotLine, lineN] + in [line1] ++ lineR ++ [dotdotLine, lineN] ] -- non-hanging with expressions placed to the right of the names -- container @@ -1007,77 +1016,75 @@ recordExpression dotdot indentPolicy lexpr nameDoc rFs@(rF1:rFr) = do -- , fieldB = potentially -- multiline -- } - addAlternative - $ docSetParSpacing - $ docAddBaseY BrIndentRegular - $ docPar - (docNodeAnnKW lexpr Nothing nameDoc) - (docNonBottomSpacing $ docLines $ let - line1 = docCols ColRec - [ appSep $ docLit $ Text.pack "{" - , docWrapNodePrior rF1f $ appSep $ docLit rF1n - , docWrapNodeRest rF1f $ case rF1e of - Just x -> runFilteredAlternative $ do - addAlternativeCond (indentPolicy == IndentPolicyFree) $ do - docSeq - [appSep $ docLit $ Text.pack "=", docSetBaseY x] - addAlternative $ do - docSeq - [appSep $ docLit $ Text.pack "=", docForceParSpacing x] - addAlternative $ do - docAddBaseY BrIndentRegular - $ docPar (docLit $ Text.pack "=") x - Nothing -> docEmpty - ] - lineR = rFr <&> \(lfield, fText, fDoc) -> docWrapNode lfield - $ docCols ColRec + addAlternative $ docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar + (docNodeAnnKW lexpr Nothing nameDoc) + (docNonBottomSpacing + $ docLines + $ let + line1 = docCols + ColRec + [ appSep $ docLit $ Text.pack "{" + , docWrapNodePrior rF1f $ appSep $ docLit rF1n + , docWrapNodeRest rF1f $ case rF1e of + Just x -> runFilteredAlternative $ do + addAlternativeCond (indentPolicy == IndentPolicyFree) $ do + docSeq [appSep $ docLit $ Text.pack "=", docSetBaseY x] + addAlternative $ do + docSeq + [appSep $ docLit $ Text.pack "=", docForceParSpacing x] + addAlternative $ do + docAddBaseY BrIndentRegular + $ docPar (docLit $ Text.pack "=") x + Nothing -> docEmpty + ] + lineR = rFr <&> \(lfield, fText, fDoc) -> + docWrapNode lfield $ docCols + ColRec [ docCommaSep , appSep $ docLit fText , case fDoc of - Just x -> runFilteredAlternative $ do - addAlternativeCond (indentPolicy == IndentPolicyFree) $ do - docSeq - [appSep $ docLit $ Text.pack "=", docSetBaseY x] - addAlternative $ do - docSeq [ appSep $ docLit $ Text.pack "=" - , docForceParSpacing x - ] - addAlternative $ do - docAddBaseY BrIndentRegular - $ docPar (docLit $ Text.pack "=") x - Nothing -> docEmpty + Just x -> runFilteredAlternative $ do + addAlternativeCond (indentPolicy == IndentPolicyFree) $ do + docSeq [appSep $ docLit $ Text.pack "=", docSetBaseY x] + addAlternative $ do + docSeq + [appSep $ docLit $ Text.pack "=", docForceParSpacing x] + addAlternative $ do + docAddBaseY BrIndentRegular + $ docPar (docLit $ Text.pack "=") x + Nothing -> docEmpty ] - dotdotLine = if dotdot - then docCols ColRec - [ docNodeAnnKW lexpr (Just AnnOpenC) docCommaSep - , docNodeAnnKW lexpr (Just AnnDotdot) - $ docLit $ Text.pack ".." - ] - else docNodeAnnKW lexpr (Just AnnOpenC) docEmpty - lineN = docLit $ Text.pack "}" - in [line1] ++ lineR ++ [dotdotLine, lineN] - ) + dotdotLine = if dotdot + then docCols + ColRec + [ docNodeAnnKW lexpr (Just AnnOpenC) docCommaSep + , docNodeAnnKW lexpr (Just AnnDotdot) $ docLit $ Text.pack ".." + ] + else docNodeAnnKW lexpr (Just AnnOpenC) docEmpty + lineN = docLit $ Text.pack "}" + in [line1] ++ lineR ++ [dotdotLine, lineN] + ) litBriDoc :: HsLit GhcPs -> BriDocFInt litBriDoc = \case - HsChar (SourceText t) _c -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ ['\'', c, '\''] - HsCharPrim (SourceText t) _c -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ ['\'', c, '\''] - HsString (SourceText t) _fastString -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ FastString.unpackFS fastString - HsStringPrim (SourceText t) _byteString -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ Data.ByteString.Char8.unpack byteString - HsInt _ (IL (SourceText t) _ _) -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i - HsIntPrim (SourceText t) _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i - HsWordPrim (SourceText t) _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i - HsInt64Prim (SourceText t) _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i - HsWord64Prim (SourceText t) _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i - HsInteger (SourceText t) _i _type -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i - HsRat _ (FL (SourceText t) _ _) _type -> BDFLit $ Text.pack t - HsFloatPrim _ (FL (SourceText t) _ _) -> BDFLit $ Text.pack t - HsDoublePrim _ (FL (SourceText t) _ _) -> BDFLit $ Text.pack t + HsChar (SourceText t) _c -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ ['\'', c, '\''] + HsCharPrim (SourceText t) _c -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ ['\'', c, '\''] + HsString (SourceText t) _fastString -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ FastString.unpackFS fastString + HsStringPrim (SourceText t) _byteString -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ Data.ByteString.Char8.unpack byteString + HsInt _ (IL (SourceText t) _ _) -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i + HsIntPrim (SourceText t) _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i + HsWordPrim (SourceText t) _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i + HsInt64Prim (SourceText t) _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i + HsWord64Prim (SourceText t) _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i + HsInteger (SourceText t) _i _type -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i + HsRat _ (FL (SourceText t) _ _) _type -> BDFLit $ Text.pack t + HsFloatPrim _ (FL (SourceText t) _ _) -> BDFLit $ Text.pack t + HsDoublePrim _ (FL (SourceText t) _ _) -> BDFLit $ Text.pack t _ -> error "litBriDoc: literal with no SourceText" overLitValBriDoc :: OverLitVal -> BriDocFInt overLitValBriDoc = \case - HsIntegral (IL (SourceText t) _ _) -> BDFLit $ Text.pack t + HsIntegral (IL (SourceText t) _ _) -> BDFLit $ Text.pack t HsFractional (FL (SourceText t) _ _) -> BDFLit $ Text.pack t HsIsString (SourceText t) _ -> BDFLit $ Text.pack t _ -> error "overLitValBriDoc: literal with no SourceText" diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot b/source/library/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot index 8fb094b..27256ef 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot @@ -2,20 +2,11 @@ module Language.Haskell.Brittany.Internal.Layouters.Expr where - - -import Language.Haskell.Brittany.Internal.Prelude - -import Language.Haskell.Brittany.Internal.Types - -import GHC.Hs - - +import GHC.Hs +import Language.Haskell.Brittany.Internal.Types layoutExpr :: ToBriDoc HsExpr --- layoutStmt :: ToBriDoc' (StmtLR GhcPs GhcPs (LHsExpr GhcPs)) - litBriDoc :: HsLit GhcPs -> BriDocFInt overLitValBriDoc :: OverLitVal -> BriDocFInt diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/IE.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/IE.hs index 39b7a49..dc1fafe 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/IE.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/IE.hs @@ -4,26 +4,22 @@ module Language.Haskell.Brittany.Internal.Layouters.IE where -import Language.Haskell.Brittany.Internal.Prelude import qualified Data.List.Extra import qualified Data.Text as Text +import GHC + ( AnnKeywordId(..) + , GenLocated(L) + , Located + , ModuleName + , moduleNameString + , unLoc + ) +import GHC.Hs import qualified GHC.OldList as List - -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.LayouterBasics - -import GHC ( unLoc - , GenLocated(L) - , moduleNameString - , AnnKeywordId(..) - , Located - , ModuleName - ) -import GHC.Hs - -import Language.Haskell.Brittany.Internal.Utils - - +import Language.Haskell.Brittany.Internal.LayouterBasics +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.Utils prepareName :: LIEWrappedName name -> Located name prepareName = ieLWrappedName @@ -37,36 +33,41 @@ layoutIE lie@(L _ ie) = docWrapNode lie $ case ie of docSeq [layoutWrapped lie x, docLit $ Text.pack "(..)"] IEThingWith _ x _ ns _ -> do hasComments <- orM - ( hasCommentsBetween lie AnnOpenP AnnCloseP + (hasCommentsBetween lie AnnOpenP AnnCloseP : hasAnyCommentsBelow x : map hasAnyCommentsBelow ns ) let sortedNs = List.sortOn wrappedNameToText ns runFilteredAlternative $ do addAlternativeCond (not hasComments) - $ docSeq - $ [layoutWrapped lie x, docLit $ Text.pack "("] + $ docSeq + $ [layoutWrapped lie x, docLit $ Text.pack "("] ++ intersperse docCommaSep (map nameDoc sortedNs) ++ [docParenR] addAlternative $ docWrapNodeRest lie $ docAddBaseY BrIndentRegular - $ docPar - (layoutWrapped lie x) - (layoutItems (splitFirstLast sortedNs)) + $ docPar (layoutWrapped lie x) (layoutItems (splitFirstLast sortedNs)) where nameDoc = docLit <=< lrdrNameToTextAnn . prepareName layoutItem n = docSeq [docCommaSep, docWrapNode n $ nameDoc n] layoutItems FirstLastEmpty = docSetBaseY $ docLines - [docSeq [docParenLSep, docNodeAnnKW lie (Just AnnOpenP) docEmpty], docParenR] + [ docSeq [docParenLSep, docNodeAnnKW lie (Just AnnOpenP) docEmpty] + , docParenR + ] layoutItems (FirstLastSingleton n) = docSetBaseY $ docLines - [docSeq [docParenLSep, docNodeAnnKW lie (Just AnnOpenP) $ nameDoc n], docParenR] + [ docSeq [docParenLSep, docNodeAnnKW lie (Just AnnOpenP) $ nameDoc n] + , docParenR + ] layoutItems (FirstLast n1 nMs nN) = docSetBaseY - $ docLines - $ [docSeq [docParenLSep, docWrapNode n1 $ nameDoc n1]] + $ docLines + $ [docSeq [docParenLSep, docWrapNode n1 $ nameDoc n1]] ++ map layoutItem nMs - ++ [docSeq [docCommaSep, docNodeAnnKW lie (Just AnnOpenP) $ nameDoc nN], docParenR] + ++ [ docSeq + [docCommaSep, docNodeAnnKW lie (Just AnnOpenP) $ nameDoc nN] + , docParenR + ] IEModuleContents _ n -> docSeq [ docLit $ Text.pack "module" , docSeparator @@ -75,7 +76,7 @@ layoutIE lie@(L _ ie) = docWrapNode lie $ case ie of _ -> docEmpty where layoutWrapped _ = \case - L _ (IEName n) -> docLit =<< lrdrNameToTextAnn n + L _ (IEName n) -> docLit =<< lrdrNameToTextAnn n L _ (IEPattern n) -> do name <- lrdrNameToTextAnn n docLit $ Text.pack "pattern " <> name @@ -92,33 +93,36 @@ data SortItemsFlag = ShouldSortItems | KeepItemsUnsorted -- handling of the resulting list. Adding parens is -- left to the caller since that is context sensitive layoutAnnAndSepLLIEs - :: SortItemsFlag -> Located [LIE GhcPs] -> ToBriDocM [ToBriDocM BriDocNumbered] + :: SortItemsFlag + -> Located [LIE GhcPs] + -> ToBriDocM [ToBriDocM BriDocNumbered] layoutAnnAndSepLLIEs shouldSort llies@(L _ lies) = do let makeIENode ie = docSeq [docCommaSep, ie] - let sortedLies = - [ items - | group <- Data.List.Extra.groupOn lieToText - $ List.sortOn lieToText lies - , items <- mergeGroup group - ] - let ieDocs = fmap layoutIE $ case shouldSort of - ShouldSortItems -> sortedLies - KeepItemsUnsorted -> lies + let + sortedLies = + [ items + | group <- Data.List.Extra.groupOn lieToText $ List.sortOn lieToText lies + , items <- mergeGroup group + ] + let + ieDocs = fmap layoutIE $ case shouldSort of + ShouldSortItems -> sortedLies + KeepItemsUnsorted -> lies ieCommaDocs <- docWrapNodeRest llies $ sequence $ case splitFirstLast ieDocs of - FirstLastEmpty -> [] + FirstLastEmpty -> [] FirstLastSingleton ie -> [ie] FirstLast ie1 ieMs ieN -> [ie1] ++ map makeIENode ieMs ++ [makeIENode ieN] pure $ fmap pure ieCommaDocs -- returned shared nodes where mergeGroup :: [LIE GhcPs] -> [LIE GhcPs] - mergeGroup [] = [] + mergeGroup [] = [] mergeGroup items@[_] = items - mergeGroup items = if + mergeGroup items = if | all isProperIEThing items -> [List.foldl1' thingFolder items] - | all isIEVar items -> [List.foldl1' thingFolder items] - | otherwise -> items + | all isIEVar items -> [List.foldl1' thingFolder items] + | otherwise -> items -- proper means that if it is a ThingWith, it does not contain a wildcard -- (because I don't know what a wildcard means if it is not already a -- IEThingAll). @@ -131,21 +135,22 @@ layoutAnnAndSepLLIEs shouldSort llies@(L _ lies) = do isIEVar :: LIE GhcPs -> Bool isIEVar = \case L _ IEVar{} -> True - _ -> False + _ -> False thingFolder :: LIE GhcPs -> LIE GhcPs -> LIE GhcPs - thingFolder l1@(L _ IEVar{} ) _ = l1 - thingFolder l1@(L _ IEThingAll{}) _ = l1 - thingFolder _ l2@(L _ IEThingAll{}) = l2 - thingFolder l1 ( L _ IEThingAbs{}) = l1 - thingFolder (L _ IEThingAbs{}) l2 = l2 + thingFolder l1@(L _ IEVar{}) _ = l1 + thingFolder l1@(L _ IEThingAll{}) _ = l1 + thingFolder _ l2@(L _ IEThingAll{}) = l2 + thingFolder l1 (L _ IEThingAbs{}) = l1 + thingFolder (L _ IEThingAbs{}) l2 = l2 thingFolder (L l (IEThingWith x wn _ consItems1 fieldLbls1)) (L _ (IEThingWith _ _ _ consItems2 fieldLbls2)) = L l - (IEThingWith x - wn - NoIEWildcard - (consItems1 ++ consItems2) - (fieldLbls1 ++ fieldLbls2) + (IEThingWith + x + wn + NoIEWildcard + (consItems1 ++ consItems2) + (fieldLbls1 ++ fieldLbls2) ) thingFolder _ _ = error "thingFolder should be exhaustive because we have a guard above" @@ -164,9 +169,10 @@ layoutAnnAndSepLLIEs shouldSort llies@(L _ lies) = do -- () -- no comments -- ( -- a comment -- ) -layoutLLIEs :: Bool -> SortItemsFlag -> Located [LIE GhcPs] -> ToBriDocM BriDocNumbered +layoutLLIEs + :: Bool -> SortItemsFlag -> Located [LIE GhcPs] -> ToBriDocM BriDocNumbered layoutLLIEs enableSingleline shouldSort llies = do - ieDs <- layoutAnnAndSepLLIEs shouldSort llies + ieDs <- layoutAnnAndSepLLIEs shouldSort llies hasComments <- hasAnyCommentsBelow llies runFilteredAlternative $ case ieDs of [] -> do @@ -176,14 +182,14 @@ layoutLLIEs enableSingleline shouldSort llies = do docParenR (ieDsH : ieDsT) -> do addAlternativeCond (not hasComments && enableSingleline) - $ docSeq - $ [docLit (Text.pack "(")] + $ docSeq + $ [docLit (Text.pack "(")] ++ (docForceSingleline <$> ieDs) ++ [docParenR] addAlternative - $ docPar (docSetBaseY $ docSeq [docParenLSep, ieDsH]) - $ docLines - $ ieDsT + $ docPar (docSetBaseY $ docSeq [docParenLSep, ieDsH]) + $ docLines + $ ieDsT ++ [docParenR] -- | Returns a "fingerprint string", not a full text representation, nor even @@ -191,26 +197,27 @@ layoutLLIEs enableSingleline shouldSort llies = do -- Used for sorting, not for printing the formatter's output source code. wrappedNameToText :: LIEWrappedName RdrName -> Text wrappedNameToText = \case - L _ (IEName n) -> lrdrNameToText n + L _ (IEName n) -> lrdrNameToText n L _ (IEPattern n) -> lrdrNameToText n - L _ (IEType n) -> lrdrNameToText n + L _ (IEType n) -> lrdrNameToText n -- | Returns a "fingerprint string", not a full text representation, nor even -- a source code representation of this syntax node. -- Used for sorting, not for printing the formatter's output source code. lieToText :: LIE GhcPs -> Text lieToText = \case - L _ (IEVar _ wn ) -> wrappedNameToText wn - L _ (IEThingAbs _ wn ) -> wrappedNameToText wn - L _ (IEThingAll _ wn ) -> wrappedNameToText wn + L _ (IEVar _ wn) -> wrappedNameToText wn + L _ (IEThingAbs _ wn) -> wrappedNameToText wn + L _ (IEThingAll _ wn) -> wrappedNameToText wn L _ (IEThingWith _ wn _ _ _) -> wrappedNameToText wn -- TODO: These _may_ appear in exports! -- Need to check, and either put them at the top (for module) or do some -- other clever thing. L _ (IEModuleContents _ n) -> moduleNameToText n - L _ IEGroup{} -> Text.pack "@IEGroup" - L _ IEDoc{} -> Text.pack "@IEDoc" - L _ IEDocNamed{} -> Text.pack "@IEDocNamed" + L _ IEGroup{} -> Text.pack "@IEGroup" + L _ IEDoc{} -> Text.pack "@IEDoc" + L _ IEDocNamed{} -> Text.pack "@IEDocNamed" where moduleNameToText :: Located ModuleName -> Text - moduleNameToText (L _ name) = Text.pack ("@IEModuleContents" ++ moduleNameString name) + moduleNameToText (L _ name) = + Text.pack ("@IEModuleContents" ++ moduleNameString name) diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/Import.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/Import.hs index 1b19145..df9d00f 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/Import.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/Import.hs @@ -2,26 +2,18 @@ module Language.Haskell.Brittany.Internal.Layouters.Import where -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Data.Semigroup as Semigroup import qualified Data.Text as Text - -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.LayouterBasics -import Language.Haskell.Brittany.Internal.Layouters.IE -import Language.Haskell.Brittany.Internal.Config.Types - -import GHC ( unLoc - , GenLocated(L) - , moduleNameString - , Located - ) -import GHC.Hs -import GHC.Types.Basic +import GHC (GenLocated(L), Located, moduleNameString, unLoc) +import GHC.Hs +import GHC.Types.Basic import GHC.Unit.Types (IsBootInterface(..)) - - +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.LayouterBasics +import Language.Haskell.Brittany.Internal.Layouters.IE +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Types prepPkg :: SourceText -> String prepPkg rawN = case rawN of @@ -36,111 +28,132 @@ layoutImport :: ImportDecl GhcPs -> ToBriDocM BriDocNumbered layoutImport importD = case importD of ImportDecl _ _ (L _ modName) pkg src safe q False mas mllies -> do importCol <- mAsk <&> _conf_layout .> _lconfig_importColumn .> confUnpack - importAsCol <- mAsk <&> _conf_layout .> _lconfig_importAsColumn .> confUnpack - indentPolicy <- mAsk <&> _conf_layout .> _lconfig_indentPolicy .> confUnpack + importAsCol <- + mAsk <&> _conf_layout .> _lconfig_importAsColumn .> confUnpack + indentPolicy <- + mAsk <&> _conf_layout .> _lconfig_indentPolicy .> confUnpack let - compact = indentPolicy /= IndentPolicyFree + compact = indentPolicy /= IndentPolicyFree modNameT = Text.pack $ moduleNameString modName pkgNameT = Text.pack . prepPkg . sl_st <$> pkg - masT = Text.pack . moduleNameString . prepModName <$> mas - hiding = maybe False fst mllies + masT = Text.pack . moduleNameString . prepModName <$> mas + hiding = maybe False fst mllies minQLength = length "import qualified " qLengthReal = - let qualifiedPart = if q /= NotQualified then length "qualified " else 0 - safePart = if safe then length "safe " else 0 - pkgPart = maybe 0 ((+ 1) . Text.length) pkgNameT - srcPart = case src of { IsBoot -> length "{-# SOURCE #-} "; NotBoot -> 0 } - in length "import " + srcPart + safePart + qualifiedPart + pkgPart - qLength = max minQLength qLengthReal + let + qualifiedPart = if q /= NotQualified then length "qualified " else 0 + safePart = if safe then length "safe " else 0 + pkgPart = maybe 0 ((+ 1) . Text.length) pkgNameT + srcPart = case src of + IsBoot -> length "{-# SOURCE #-} " + NotBoot -> 0 + in length "import " + srcPart + safePart + qualifiedPart + pkgPart + qLength = max minQLength qLengthReal -- Cost in columns of importColumn - asCost = length "as " - hidingParenCost = if hiding then length "hiding ( " else length "( " - nameCost = Text.length modNameT + qLength + asCost = length "as " + hidingParenCost = if hiding then length "hiding ( " else length "( " + nameCost = Text.length modNameT + qLength importQualifiers = docSeq [ appSep $ docLit $ Text.pack "import" - , case src of { IsBoot -> appSep $ docLit $ Text.pack "{-# SOURCE #-}"; NotBoot -> docEmpty } + , case src of + IsBoot -> appSep $ docLit $ Text.pack "{-# SOURCE #-}" + NotBoot -> docEmpty , if safe then appSep $ docLit $ Text.pack "safe" else docEmpty - , if q /= NotQualified then appSep $ docLit $ Text.pack "qualified" else docEmpty + , if q /= NotQualified + then appSep $ docLit $ Text.pack "qualified" + else docEmpty , maybe docEmpty (appSep . docLit) pkgNameT ] indentName = if compact then id else docEnsureIndent (BrIndentSpecial qLength) - modNameD = - indentName $ appSep $ docLit modNameT - hidDocCol = if hiding then importCol - hidingParenCost else importCol - 2 + modNameD = indentName $ appSep $ docLit modNameT + hidDocCol = + if hiding then importCol - hidingParenCost else importCol - 2 hidDocColDiff = importCol - 2 - hidDocCol - hidDoc = if hiding - then appSep $ docLit $ Text.pack "hiding" - else docEmpty + hidDoc = + if hiding then appSep $ docLit $ Text.pack "hiding" else docEmpty importHead = docSeq [importQualifiers, modNameD] - bindingsD = case mllies of + bindingsD = case mllies of Nothing -> docEmpty Just (_, llies) -> do hasComments <- hasAnyCommentsBelow llies if compact - then docAlt - [ docSeq [hidDoc, docForceSingleline $ layoutLLIEs True ShouldSortItems llies] - , let makeParIfHiding = if hiding + then docAlt + [ docSeq + [ hidDoc + , docForceSingleline $ layoutLLIEs True ShouldSortItems llies + ] + , let + makeParIfHiding = if hiding then docAddBaseY BrIndentRegular . docPar hidDoc else id - in makeParIfHiding (layoutLLIEs True ShouldSortItems llies) - ] - else do - ieDs <- layoutAnnAndSepLLIEs ShouldSortItems llies - docWrapNodeRest llies - $ docEnsureIndent (BrIndentSpecial hidDocCol) - $ case ieDs of - -- ..[hiding].( ) - [] -> if hasComments - then docPar - (docSeq [hidDoc, docParenLSep, docWrapNode llies docEmpty]) - (docEnsureIndent (BrIndentSpecial hidDocColDiff) docParenR) - else docSeq [hidDoc, docParenLSep, docSeparator, docParenR] - -- ..[hiding].( b ) - [ieD] -> runFilteredAlternative $ do - addAlternativeCond (not hasComments) - $ docSeq - [ hidDoc - , docParenLSep - , docForceSingleline ieD - , docSeparator - , docParenR - ] - addAlternative $ docPar - (docSeq [hidDoc, docParenLSep, docNonBottomSpacing ieD]) - (docEnsureIndent (BrIndentSpecial hidDocColDiff) docParenR) - -- ..[hiding].( b - -- , b' - -- ) - (ieD:ieDs') -> - docPar - (docSeq [hidDoc, docSetBaseY $ docSeq [docParenLSep, ieD]]) - ( docEnsureIndent (BrIndentSpecial hidDocColDiff) - $ docLines - $ ieDs' - ++ [docParenR] - ) + in makeParIfHiding (layoutLLIEs True ShouldSortItems llies) + ] + else do + ieDs <- layoutAnnAndSepLLIEs ShouldSortItems llies + docWrapNodeRest llies + $ docEnsureIndent (BrIndentSpecial hidDocCol) + $ case ieDs of + -- ..[hiding].( ) + [] -> if hasComments + then docPar + (docSeq + [hidDoc, docParenLSep, docWrapNode llies docEmpty] + ) + (docEnsureIndent + (BrIndentSpecial hidDocColDiff) + docParenR + ) + else docSeq + [hidDoc, docParenLSep, docSeparator, docParenR] + -- ..[hiding].( b ) + [ieD] -> runFilteredAlternative $ do + addAlternativeCond (not hasComments) + $ docSeq + [ hidDoc + , docParenLSep + , docForceSingleline ieD + , docSeparator + , docParenR + ] + addAlternative $ docPar + (docSeq [hidDoc, docParenLSep, docNonBottomSpacing ieD] + ) + (docEnsureIndent + (BrIndentSpecial hidDocColDiff) + docParenR + ) + -- ..[hiding].( b + -- , b' + -- ) + (ieD : ieDs') -> docPar + (docSeq + [hidDoc, docSetBaseY $ docSeq [docParenLSep, ieD]] + ) + (docEnsureIndent (BrIndentSpecial hidDocColDiff) + $ docLines + $ ieDs' + ++ [docParenR] + ) makeAsDoc asT = docSeq [appSep $ docLit $ Text.pack "as", appSep $ docLit asT] if compact - then - let asDoc = maybe docEmpty makeAsDoc masT - in docAlt - [ docForceSingleline $ docSeq [importHead, asDoc, bindingsD] - , docAddBaseY BrIndentRegular $ - docPar (docSeq [importHead, asDoc]) bindingsD - ] - else - case masT of + then + let asDoc = maybe docEmpty makeAsDoc masT + in + docAlt + [ docForceSingleline $ docSeq [importHead, asDoc, bindingsD] + , docAddBaseY BrIndentRegular + $ docPar (docSeq [importHead, asDoc]) bindingsD + ] + else case masT of Just n -> if enoughRoom - then docLines - [ docSeq [importHead, asDoc], bindingsD] + then docLines [docSeq [importHead, asDoc], bindingsD] else docLines [importHead, asDoc, bindingsD] where enoughRoom = nameCost < importAsCol - asCost - asDoc = - docEnsureIndent (BrIndentSpecial (importAsCol - asCost)) - $ makeAsDoc n + asDoc = docEnsureIndent (BrIndentSpecial (importAsCol - asCost)) + $ makeAsDoc n Nothing -> if enoughRoom then docSeq [importHead, bindingsD] else docLines [importHead, bindingsD] diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/Module.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/Module.hs index 52c2cd1..efae541 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/Module.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/Module.hs @@ -3,34 +3,27 @@ module Language.Haskell.Brittany.Internal.Layouters.Module where -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Data.Maybe import qualified Data.Semigroup as Semigroup import qualified Data.Text as Text +import GHC (AnnKeywordId(..), GenLocated(L), moduleNameString, unLoc) +import GHC.Hs import qualified GHC.OldList as List - -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.LayouterBasics -import Language.Haskell.Brittany.Internal.Layouters.IE -import Language.Haskell.Brittany.Internal.Layouters.Import -import Language.Haskell.Brittany.Internal.Config.Types - -import GHC (unLoc, GenLocated(L), moduleNameString, AnnKeywordId(..)) -import GHC.Hs -import Language.Haskell.GHC.ExactPrint as ExactPrint -import Language.Haskell.GHC.ExactPrint.Types - ( DeltaPos(..) - , deltaRow - , commentContents - ) - - +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.LayouterBasics +import Language.Haskell.Brittany.Internal.Layouters.IE +import Language.Haskell.Brittany.Internal.Layouters.Import +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.GHC.ExactPrint as ExactPrint +import Language.Haskell.GHC.ExactPrint.Types + (DeltaPos(..), commentContents, deltaRow) layoutModule :: ToBriDoc' HsModule layoutModule lmod@(L _ mod') = case mod' of -- Implicit module Main - HsModule _ Nothing _ imports _ _ _ -> do + HsModule _ Nothing _ imports _ _ _ -> do commentedImports <- transformToCommentedImport imports -- groupify commentedImports `forM_` tellDebugMessShow docLines (commentedImportsToDoc <$> sortCommentedImports commentedImports) @@ -41,43 +34,38 @@ layoutModule lmod@(L _ mod') = case mod' of -- groupify commentedImports `forM_` tellDebugMessShow -- sortedImports <- sortImports imports let tn = Text.pack $ moduleNameString $ unLoc n - allowSingleLineExportList <- mAsk - <&> _conf_layout - .> _lconfig_allowSingleLineExportList - .> confUnpack + allowSingleLineExportList <- + mAsk <&> _conf_layout .> _lconfig_allowSingleLineExportList .> confUnpack -- the config should not prevent single-line layout when there is no -- export list - let allowSingleLine = allowSingleLineExportList || Data.Maybe.isNothing les + let + allowSingleLine = allowSingleLineExportList || Data.Maybe.isNothing les docLines $ docSeq [ docNodeAnnKW lmod Nothing docEmpty -- A pseudo node that serves merely to force documentation -- before the node , docNodeMoveToKWDP lmod AnnModule True $ runFilteredAlternative $ do - addAlternativeCond allowSingleLine $ - docForceSingleline - $ docSeq - [ appSep $ docLit $ Text.pack "module" - , appSep $ docLit tn - , docWrapNode lmod $ appSep $ case les of - Nothing -> docEmpty - Just x -> layoutLLIEs True KeepItemsUnsorted x - , docSeparator - , docLit $ Text.pack "where" - ] - addAlternative - $ docLines + addAlternativeCond allowSingleLine $ docForceSingleline $ docSeq + [ appSep $ docLit $ Text.pack "module" + , appSep $ docLit tn + , docWrapNode lmod $ appSep $ case les of + Nothing -> docEmpty + Just x -> layoutLLIEs True KeepItemsUnsorted x + , docSeparator + , docLit $ Text.pack "where" + ] + addAlternative $ docLines [ docAddBaseY BrIndentRegular $ docPar - (docSeq [appSep $ docLit $ Text.pack "module", docLit tn] - ) - (docSeq [ - docWrapNode lmod $ case les of - Nothing -> docEmpty - Just x -> layoutLLIEs False KeepItemsUnsorted x - , docSeparator - , docLit $ Text.pack "where" - ] - ) + (docSeq [appSep $ docLit $ Text.pack "module", docLit tn]) + (docSeq + [ docWrapNode lmod $ case les of + Nothing -> docEmpty + Just x -> layoutLLIEs False KeepItemsUnsorted x + , docSeparator + , docLit $ Text.pack "where" + ] + ) ] ] : (commentedImportsToDoc <$> sortCommentedImports commentedImports) -- [layoutImport y i | (y, i) <- sortedImports] @@ -89,7 +77,7 @@ data CommentedImport instance Show CommentedImport where show = \case - EmptyLine -> "EmptyLine" + EmptyLine -> "EmptyLine" IndependentComment _ -> "IndependentComment" ImportStatement r -> "ImportStatement " ++ show (length $ commentsBefore r) ++ " " ++ show @@ -102,8 +90,9 @@ data ImportStatementRecord = ImportStatementRecord } instance Show ImportStatementRecord where - show r = "ImportStatement " ++ show (length $ commentsBefore r) ++ " " ++ show - (length $ commentsAfter r) + show r = + "ImportStatement " ++ show (length $ commentsBefore r) ++ " " ++ show + (length $ commentsAfter r) transformToCommentedImport :: [LImportDecl GhcPs] -> ToBriDocM [CommentedImport] @@ -121,10 +110,11 @@ transformToCommentedImport is = do accumF accConnectedComm (annMay, decl) = case annMay of Nothing -> ( [] - , [ ImportStatement ImportStatementRecord { commentsBefore = [] - , commentsAfter = [] - , importStatement = decl - } + , [ ImportStatement ImportStatementRecord + { commentsBefore = [] + , commentsAfter = [] + , importStatement = decl + } ] ) Just ann -> @@ -136,7 +126,7 @@ transformToCommentedImport is = do :: [(Comment, DeltaPos)] -> [(Comment, DeltaPos)] -> ([CommentedImport], [(Comment, DeltaPos)], Int) - go acc [] = ([], acc, 0) + go acc [] = ([], acc, 0) go acc [c1@(_, DP (y, _))] = ([], c1 : acc, y - 1) go acc (c1@(_, DP (1, _)) : xs) = go (c1 : acc) xs go acc ((c1, DP (y, x)) : xs) = @@ -153,8 +143,8 @@ transformToCommentedImport is = do , convertedIndependentComments ++ replicate (blanksBeforeImportDecl + initialBlanks) EmptyLine ++ [ ImportStatement ImportStatementRecord - { commentsBefore = beforeComments - , commentsAfter = accConnectedComm + { commentsBefore = beforeComments + , commentsAfter = accConnectedComm , importStatement = decl } ] @@ -168,14 +158,14 @@ sortCommentedImports = where unpackImports :: [CommentedImport] -> [CommentedImport] unpackImports xs = xs >>= \case - l@EmptyLine -> [l] + l@EmptyLine -> [l] l@IndependentComment{} -> [l] ImportStatement r -> map IndependentComment (commentsBefore r) ++ [ImportStatement r] mergeGroups :: [Either CommentedImport [ImportStatementRecord]] -> [CommentedImport] mergeGroups xs = xs >>= \case - Left x -> [x] + Left x -> [x] Right y -> ImportStatement <$> y sortGroups :: [ImportStatementRecord] -> [ImportStatementRecord] sortGroups = @@ -185,25 +175,23 @@ sortCommentedImports = groupify cs = go [] cs where go [] = \case - (l@EmptyLine : rest) -> Left l : go [] rest + (l@EmptyLine : rest) -> Left l : go [] rest (l@IndependentComment{} : rest) -> Left l : go [] rest - (ImportStatement r : rest) -> go [r] rest - [] -> [] + (ImportStatement r : rest) -> go [r] rest + [] -> [] go acc = \case (l@EmptyLine : rest) -> Right (reverse acc) : Left l : go [] rest (l@IndependentComment{} : rest) -> Left l : Right (reverse acc) : go [] rest (ImportStatement r : rest) -> go (r : acc) rest - [] -> [Right (reverse acc)] + [] -> [Right (reverse acc)] commentedImportsToDoc :: CommentedImport -> ToBriDocM BriDocNumbered commentedImportsToDoc = \case EmptyLine -> docLitS "" IndependentComment c -> commentToDoc c - ImportStatement r -> - docSeq - ( layoutImport (importStatement r) - : map commentToDoc (commentsAfter r) - ) + ImportStatement r -> docSeq + (layoutImport (importStatement r) : map commentToDoc (commentsAfter r)) where - commentToDoc (c, DP (_y, x)) = docLitS (replicate x ' ' ++ commentContents c) + commentToDoc (c, DP (_y, x)) = + docLitS (replicate x ' ' ++ commentContents c) diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs index 4b99bca..88a10e4 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs @@ -3,28 +3,19 @@ module Language.Haskell.Brittany.Internal.Layouters.Pattern where - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Data.Foldable as Foldable import qualified Data.Sequence as Seq import qualified Data.Text as Text +import GHC (GenLocated(L), ol_val) +import GHC.Hs import qualified GHC.OldList as List - -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.LayouterBasics - -import GHC ( GenLocated(L) - , ol_val - ) -import GHC.Hs -import GHC.Types.Basic - +import GHC.Types.Basic +import Language.Haskell.Brittany.Internal.LayouterBasics import {-# SOURCE #-} Language.Haskell.Brittany.Internal.Layouters.Expr -import Language.Haskell.Brittany.Internal.Layouters.Type - - +import Language.Haskell.Brittany.Internal.Layouters.Type +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Types -- | layouts patterns (inside function bindings, case alternatives, let -- bindings or do notation). E.g. for input @@ -38,17 +29,15 @@ import Language.Haskell.Brittany.Internal.Layouters.Type -- the different cases below. layoutPat :: LPat GhcPs -> ToBriDocM (Seq BriDocNumbered) layoutPat lpat@(L _ pat) = docWrapNode lpat $ case pat of - WildPat _ -> fmap Seq.singleton $ docLit $ Text.pack "_" + WildPat _ -> fmap Seq.singleton $ docLit $ Text.pack "_" -- _ -> expr - VarPat _ n -> - fmap Seq.singleton $ docLit $ lrdrNameToText n + VarPat _ n -> fmap Seq.singleton $ docLit $ lrdrNameToText n -- abc -> expr - LitPat _ lit -> - fmap Seq.singleton $ allocateNode $ litBriDoc lit + LitPat _ lit -> fmap Seq.singleton $ allocateNode $ litBriDoc lit -- 0 -> expr ParPat _ inner -> do -- (nestedpat) -> expr - left <- docLit $ Text.pack "(" + left <- docLit $ Text.pack "(" right <- docLit $ Text.pack ")" innerDocs <- colsWrapPat =<< layoutPat inner return $ Seq.empty Seq.|> left Seq.|> innerDocs Seq.|> right @@ -74,10 +63,9 @@ layoutPat lpat@(L _ pat) = docWrapNode lpat $ case pat of then return <$> docLit nameDoc else do x1 <- appSep (docLit nameDoc) - xR <- fmap Seq.fromList - $ sequence - $ spacifyDocs - $ fmap colsWrapPat argDocs + xR <- fmap Seq.fromList $ sequence $ spacifyDocs $ fmap + colsWrapPat + argDocs return $ x1 Seq.<| xR ConPat _ lname (InfixCon left right) -> do -- a :< b -> expr @@ -90,7 +78,7 @@ layoutPat lpat@(L _ pat) = docWrapNode lpat $ case pat of -- Abc{} -> expr let t = lrdrNameToText lname fmap Seq.singleton $ docLit $ t <> Text.pack "{}" - ConPat _ lname (RecCon (HsRecFields fs@(_:_) Nothing)) -> do + ConPat _ lname (RecCon (HsRecFields fs@(_ : _) Nothing)) -> do -- Abc { a = locA, b = locB, c = locC } -> expr1 -- Abc { a, b, c } -> expr2 let t = lrdrNameToText lname @@ -103,37 +91,34 @@ layoutPat lpat@(L _ pat) = docWrapNode lpat $ case pat of Seq.singleton <$> docSeq [ appSep $ docLit t , appSep $ docLit $ Text.pack "{" - , docSeq $ List.intersperse docCommaSep - $ fds <&> \case - (fieldName, Just fieldDoc) -> docSeq - [ appSep $ docLit fieldName - , appSep $ docLit $ Text.pack "=" - , fieldDoc >>= colsWrapPat - ] - (fieldName, Nothing) -> docLit fieldName + , docSeq $ List.intersperse docCommaSep $ fds <&> \case + (fieldName, Just fieldDoc) -> docSeq + [ appSep $ docLit fieldName + , appSep $ docLit $ Text.pack "=" + , fieldDoc >>= colsWrapPat + ] + (fieldName, Nothing) -> docLit fieldName , docSeparator , docLit $ Text.pack "}" ] ConPat _ lname (RecCon (HsRecFields [] (Just (L _ 0)))) -> do -- Abc { .. } -> expr let t = lrdrNameToText lname - Seq.singleton <$> docSeq - [ appSep $ docLit t - , docLit $ Text.pack "{..}" - ] - ConPat _ lname (RecCon (HsRecFields fs@(_:_) (Just (L _ dotdoti)))) | dotdoti == length fs -> do + Seq.singleton <$> docSeq [appSep $ docLit t, docLit $ Text.pack "{..}"] + ConPat _ lname (RecCon (HsRecFields fs@(_ : _) (Just (L _ dotdoti)))) + | dotdoti == length fs -> do -- Abc { a = locA, .. } - let t = lrdrNameToText lname - fds <- fs `forM` \(L _ (HsRecField (L _ fieldOcc) fPat pun)) -> do - let FieldOcc _ lnameF = fieldOcc - fExpDoc <- if pun - then return Nothing - else Just <$> docSharedWrapper layoutPat fPat - return (lrdrNameToText lnameF, fExpDoc) - Seq.singleton <$> docSeq - [ appSep $ docLit t - , appSep $ docLit $ Text.pack "{" - , docSeq $ fds >>= \case + let t = lrdrNameToText lname + fds <- fs `forM` \(L _ (HsRecField (L _ fieldOcc) fPat pun)) -> do + let FieldOcc _ lnameF = fieldOcc + fExpDoc <- if pun + then return Nothing + else Just <$> docSharedWrapper layoutPat fPat + return (lrdrNameToText lnameF, fExpDoc) + Seq.singleton <$> docSeq + [ appSep $ docLit t + , appSep $ docLit $ Text.pack "{" + , docSeq $ fds >>= \case (fieldName, Just fieldDoc) -> [ appSep $ docLit fieldName , appSep $ docLit $ Text.pack "=" @@ -141,13 +126,13 @@ layoutPat lpat@(L _ pat) = docWrapNode lpat $ case pat of , docCommaSep ] (fieldName, Nothing) -> [docLit fieldName, docCommaSep] - , docLit $ Text.pack "..}" - ] + , docLit $ Text.pack "..}" + ] TuplePat _ args boxity -> do -- (nestedpat1, nestedpat2, nestedpat3) -> expr -- (#nestedpat1, nestedpat2, nestedpat3#) -> expr case boxity of - Boxed -> wrapPatListy args "()" docParenL docParenR + Boxed -> wrapPatListy args "()" docParenL docParenR Unboxed -> wrapPatListy args "(##)" docParenHashLSep docParenHashRSep AsPat _ asName asPat -> do -- bind@nestedpat -> expr @@ -184,10 +169,11 @@ layoutPat lpat@(L _ pat) = docWrapNode lpat $ case pat of wrapPatPrepend pat1 (docLit $ Text.pack "~") NPat _ llit@(L _ ol) mNegative _ -> do -- -13 -> expr - litDoc <- docWrapNode llit $ allocateNode $ overLitValBriDoc $ GHC.ol_val ol + litDoc <- docWrapNode llit $ allocateNode $ overLitValBriDoc $ GHC.ol_val + ol negDoc <- docLit $ Text.pack "-" pure $ case mNegative of - Just{} -> Seq.fromList [negDoc, litDoc] + Just{} -> Seq.fromList [negDoc, litDoc] Nothing -> Seq.singleton litDoc _ -> return <$> briDocByExactInlineOnly "some unknown pattern" lpat @@ -196,9 +182,7 @@ colsWrapPat :: Seq BriDocNumbered -> ToBriDocM BriDocNumbered colsWrapPat = docCols ColPatterns . fmap return . Foldable.toList wrapPatPrepend - :: LPat GhcPs - -> ToBriDocM BriDocNumbered - -> ToBriDocM (Seq BriDocNumbered) + :: LPat GhcPs -> ToBriDocM BriDocNumbered -> ToBriDocM (Seq BriDocNumbered) wrapPatPrepend pat prepElem = do patDocs <- layoutPat pat case Seq.viewl patDocs of @@ -220,8 +204,5 @@ wrapPatListy elems both start end = do x1 Seq.:< rest -> do sDoc <- start eDoc <- end - rest' <- rest `forM` \bd -> docSeq - [ docCommaSep - , return bd - ] + rest' <- rest `forM` \bd -> docSeq [docCommaSep, return bd] return $ (sDoc Seq.<| x1 Seq.<| rest') Seq.|> eDoc diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs index 95f7273..528853a 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs @@ -4,26 +4,19 @@ module Language.Haskell.Brittany.Internal.Layouters.Stmt where - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Data.Semigroup as Semigroup import qualified Data.Text as Text +import GHC (GenLocated(L)) +import GHC.Hs +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.LayouterBasics +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.LayouterBasics -import Language.Haskell.Brittany.Internal.Config.Types - -import GHC ( GenLocated(L) - ) -import GHC.Hs - -import Language.Haskell.Brittany.Internal.Layouters.Pattern -import Language.Haskell.Brittany.Internal.Layouters.Decl +import Language.Haskell.Brittany.Internal.Layouters.Decl import {-# SOURCE #-} Language.Haskell.Brittany.Internal.Layouters.Expr - - +import Language.Haskell.Brittany.Internal.Layouters.Pattern layoutStmt :: ToBriDoc' (StmtLR GhcPs GhcPs (LHsExpr GhcPs)) layoutStmt lstmt@(L _ stmt) = do @@ -53,12 +46,12 @@ layoutStmt lstmt@(L _ stmt) = do ] ] LetStmt _ binds -> do - let isFree = indentPolicy == IndentPolicyFree + let isFree = indentPolicy == IndentPolicyFree let indentFourPlus = indentAmount >= 4 layoutLocalBinds binds >>= \case - Nothing -> docLit $ Text.pack "let" + Nothing -> docLit $ Text.pack "let" -- i just tested the above, and it is indeed allowed. heh. - Just [] -> docLit $ Text.pack "let" -- this probably never happens + Just [] -> docLit $ Text.pack "let" -- this probably never happens Just [bindDoc] -> docAlt [ -- let bind = expr docCols @@ -68,9 +61,10 @@ layoutStmt lstmt@(L _ stmt) = do f = case indentPolicy of IndentPolicyFree -> docSetBaseAndIndent IndentPolicyLeft -> docForceSingleline - IndentPolicyMultiple | indentFourPlus -> docSetBaseAndIndent - | otherwise -> docForceSingleline - in f $ return bindDoc + IndentPolicyMultiple + | indentFourPlus -> docSetBaseAndIndent + | otherwise -> docForceSingleline + in f $ return bindDoc ] , -- let -- bind = expr @@ -84,10 +78,11 @@ layoutStmt lstmt@(L _ stmt) = do -- ccc = exprc addAlternativeCond (isFree || indentFourPlus) $ docSeq [ appSep $ docLit $ Text.pack "let" - , let f = if indentFourPlus - then docEnsureIndent BrIndentRegular - else docSetBaseAndIndent - in f $ docLines $ return <$> bindDocs + , let + f = if indentFourPlus + then docEnsureIndent BrIndentRegular + else docSetBaseAndIndent + in f $ docLines $ return <$> bindDocs ] -- let -- aaa = expra @@ -95,8 +90,9 @@ layoutStmt lstmt@(L _ stmt) = do -- ccc = exprc addAlternativeCond (not indentFourPlus) $ docAddBaseY BrIndentRegular - $ docPar (docLit $ Text.pack "let") - (docSetBaseAndIndent $ docLines $ return <$> bindDocs) + $ docPar + (docLit $ Text.pack "let") + (docSetBaseAndIndent $ docLines $ return <$> bindDocs) RecStmt _ stmts _ _ _ _ _ -> runFilteredAlternative $ do -- rec stmt1 -- stmt2 diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot b/source/library/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot index 02b388c..fbba444 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot @@ -2,14 +2,7 @@ module Language.Haskell.Brittany.Internal.Layouters.Stmt where - - -import Language.Haskell.Brittany.Internal.Prelude - -import Language.Haskell.Brittany.Internal.Types - -import GHC.Hs - - +import GHC.Hs +import Language.Haskell.Brittany.Internal.Types layoutStmt :: ToBriDoc' (StmtLR GhcPs GhcPs (LHsExpr GhcPs)) diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/Type.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/Type.hs index ed0dd26..7ccb461 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/Type.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/Type.hs @@ -3,28 +3,18 @@ module Language.Haskell.Brittany.Internal.Layouters.Type where - - +import qualified Data.Text as Text +import GHC (AnnKeywordId(..), GenLocated(L)) +import GHC.Hs +import qualified GHC.OldList as List +import GHC.Types.Basic +import GHC.Utils.Outputable (ftext, showSDocUnsafe) +import Language.Haskell.Brittany.Internal.LayouterBasics import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Data.Text as Text -import qualified GHC.OldList as List - -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.LayouterBasics -import Language.Haskell.Brittany.Internal.Utils - ( splitFirstLast - , FirstLastView(..) - ) - -import GHC ( GenLocated(L) - , AnnKeywordId (..) - ) -import GHC.Hs -import GHC.Utils.Outputable ( ftext, showSDocUnsafe ) -import GHC.Types.Basic - - +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.Utils + (FirstLastView(..), splitFirstLast) layoutType :: ToBriDoc HsType layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of @@ -32,76 +22,66 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of HsTyVar _ promoted name -> do t <- lrdrNameToTextAnnTypeEqualityIsSpecial name case promoted of - IsPromoted -> docSeq - [ docSeparator - , docTick - , docWrapNode name $ docLit t - ] + IsPromoted -> + docSeq [docSeparator, docTick, docWrapNode name $ docLit t] NotPromoted -> docWrapNode name $ docLit t HsForAllTy _ hsf (L _ (HsQualTy _ (L _ cntxts) typ2)) -> do let bndrs = getBinders hsf typeDoc <- docSharedWrapper layoutType typ2 tyVarDocs <- layoutTyVarBndrs bndrs cntxtDocs <- cntxts `forM` docSharedWrapper layoutType - let maybeForceML = case typ2 of - (L _ HsFunTy{}) -> docForceMultiline - _ -> id + let + maybeForceML = case typ2 of + (L _ HsFunTy{}) -> docForceMultiline + _ -> id let tyVarDocLineList = processTyVarBndrsSingleline tyVarDocs forallDoc = docAlt - [ let - open = docLit $ Text.pack "forall" - in docSeq ([open]++tyVarDocLineList) + [ let open = docLit $ Text.pack "forall" + in docSeq ([open] ++ tyVarDocLineList) , docPar - (docLit (Text.pack "forall")) - (docLines - $ tyVarDocs <&> \case - (tname, Nothing) -> docEnsureIndent BrIndentRegular $ docLit tname - (tname, Just doc) -> docEnsureIndent BrIndentRegular - $ docLines - [ docCols ColTyOpPrefix - [ docParenLSep - , docLit tname - ] - , docCols ColTyOpPrefix - [ docLit $ Text.pack ":: " - , doc - ] - , docLit $ Text.pack ")" - ]) + (docLit (Text.pack "forall")) + (docLines $ tyVarDocs <&> \case + (tname, Nothing) -> docEnsureIndent BrIndentRegular $ docLit tname + (tname, Just doc) -> docEnsureIndent BrIndentRegular $ docLines + [ docCols ColTyOpPrefix [docParenLSep, docLit tname] + , docCols ColTyOpPrefix [docLit $ Text.pack ":: ", doc] + , docLit $ Text.pack ")" + ] + ) ] contextDoc = case cntxtDocs of [] -> docLit $ Text.pack "()" [x] -> x _ -> docAlt [ let - open = docLit $ Text.pack "(" + open = docLit $ Text.pack "(" close = docLit $ Text.pack ")" - list = List.intersperse docCommaSep - $ docForceSingleline <$> cntxtDocs - in docSeq ([open]++list++[close]) + list = + List.intersperse docCommaSep $ docForceSingleline <$> cntxtDocs + in docSeq ([open] ++ list ++ [close]) , let - open = docCols ColTyOpPrefix - [ docParenLSep - , docAddBaseY (BrIndentSpecial 2) $ head cntxtDocs - ] + open = docCols + ColTyOpPrefix + [ docParenLSep + , docAddBaseY (BrIndentSpecial 2) $ head cntxtDocs + ] close = docLit $ Text.pack ")" - list = List.tail cntxtDocs <&> \cntxtDoc -> - docCols ColTyOpPrefix - [ docCommaSep - , docAddBaseY (BrIndentSpecial 2) cntxtDoc - ] + list = List.tail cntxtDocs <&> \cntxtDoc -> docCols + ColTyOpPrefix + [docCommaSep, docAddBaseY (BrIndentSpecial 2) cntxtDoc] in docPar open $ docLines $ list ++ [close] ] docAlt -- :: forall a b c . (Foo a b c) => a b -> c [ docSeq [ if null bndrs - then docEmpty - else let + then docEmpty + else + let open = docLit $ Text.pack "forall" close = docLit $ Text.pack " . " - in docSeq ([open, docSeparator]++tyVarDocLineList++[close]) + in docSeq ([open, docSeparator] ++ tyVarDocLineList ++ [close]) , docForceSingleline contextDoc , docLit $ Text.pack " => " , docForceSingleline typeDoc @@ -111,75 +91,74 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of -- => a b -- -> c , docPar - forallDoc - ( docLines - [ docCols ColTyOpPrefix - [ docWrapNodeRest ltype $ docLit $ Text.pack " . " - , docAddBaseY (BrIndentSpecial 3) - $ contextDoc - ] - , docCols ColTyOpPrefix - [ docLit $ Text.pack "=> " - , docAddBaseY (BrIndentSpecial 3) $ maybeForceML $ typeDoc - ] + forallDoc + (docLines + [ docCols + ColTyOpPrefix + [ docWrapNodeRest ltype $ docLit $ Text.pack " . " + , docAddBaseY (BrIndentSpecial 3) $ contextDoc ] - ) + , docCols + ColTyOpPrefix + [ docLit $ Text.pack "=> " + , docAddBaseY (BrIndentSpecial 3) $ maybeForceML $ typeDoc + ] + ] + ) ] HsForAllTy _ hsf typ2 -> do let bndrs = getBinders hsf typeDoc <- layoutType typ2 tyVarDocs <- layoutTyVarBndrs bndrs - let maybeForceML = case typ2 of - (L _ HsFunTy{}) -> docForceMultiline - _ -> id + let + maybeForceML = case typ2 of + (L _ HsFunTy{}) -> docForceMultiline + _ -> id let tyVarDocLineList = processTyVarBndrsSingleline tyVarDocs docAlt -- forall x . x [ docSeq [ if null bndrs - then docEmpty - else let + then docEmpty + else + let open = docLit $ Text.pack "forall" close = docLit $ Text.pack " . " - in docSeq ([open]++tyVarDocLineList++[close]) + in docSeq ([open] ++ tyVarDocLineList ++ [close]) , docForceSingleline $ return $ typeDoc ] -- :: forall x -- . x , docPar - (docSeq $ docLit (Text.pack "forall") : tyVarDocLineList) - ( docCols ColTyOpPrefix - [ docWrapNodeRest ltype $ docLit $ Text.pack " . " - , maybeForceML $ return typeDoc - ] - ) + (docSeq $ docLit (Text.pack "forall") : tyVarDocLineList) + (docCols + ColTyOpPrefix + [ docWrapNodeRest ltype $ docLit $ Text.pack " . " + , maybeForceML $ return typeDoc + ] + ) -- :: forall -- (x :: *) -- . x , docPar - (docLit (Text.pack "forall")) - (docLines - $ (tyVarDocs <&> \case - (tname, Nothing) -> docEnsureIndent BrIndentRegular $ docLit tname - (tname, Just doc) -> docEnsureIndent BrIndentRegular - $ docLines - [ docCols ColTyOpPrefix - [ docParenLSep - , docLit tname - ] - , docCols ColTyOpPrefix - [ docLit $ Text.pack ":: " - , doc - ] - , docLit $ Text.pack ")" - ] - ) - ++[ docCols ColTyOpPrefix - [ docWrapNodeRest ltype $ docLit $ Text.pack " . " - , maybeForceML $ return typeDoc + (docLit (Text.pack "forall")) + (docLines + $ (tyVarDocs <&> \case + (tname, Nothing) -> + docEnsureIndent BrIndentRegular $ docLit tname + (tname, Just doc) -> docEnsureIndent BrIndentRegular $ docLines + [ docCols ColTyOpPrefix [docParenLSep, docLit tname] + , docCols ColTyOpPrefix [docLit $ Text.pack ":: ", doc] + , docLit $ Text.pack ")" ] - ] ) + ++ [ docCols + ColTyOpPrefix + [ docWrapNodeRest ltype $ docLit $ Text.pack " . " + , maybeForceML $ return typeDoc + ] + ] + ) ] HsQualTy _ lcntxts@(L _ cntxts) typ1 -> do typeDoc <- docSharedWrapper layoutType typ1 @@ -190,29 +169,27 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of [x] -> x _ -> docAlt [ let - open = docLit $ Text.pack "(" + open = docLit $ Text.pack "(" close = docLit $ Text.pack ")" - list = List.intersperse docCommaSep - $ docForceSingleline <$> cntxtDocs - in docSeq ([open]++list++[close]) + list = + List.intersperse docCommaSep $ docForceSingleline <$> cntxtDocs + in docSeq ([open] ++ list ++ [close]) , let - open = docCols ColTyOpPrefix - [ docParenLSep - , docAddBaseY (BrIndentSpecial 2) - $ head cntxtDocs - ] + open = docCols + ColTyOpPrefix + [ docParenLSep + , docAddBaseY (BrIndentSpecial 2) $ head cntxtDocs + ] close = docLit $ Text.pack ")" - list = List.tail cntxtDocs <&> \cntxtDoc -> - docCols ColTyOpPrefix - [ docCommaSep - , docAddBaseY (BrIndentSpecial 2) - $ cntxtDoc - ] + list = List.tail cntxtDocs <&> \cntxtDoc -> docCols + ColTyOpPrefix + [docCommaSep, docAddBaseY (BrIndentSpecial 2) $ cntxtDoc] in docPar open $ docLines $ list ++ [close] ] - let maybeForceML = case typ1 of - (L _ HsFunTy{}) -> docForceMultiline - _ -> id + let + maybeForceML = case typ1 of + (L _ HsFunTy{}) -> docForceMultiline + _ -> id docAlt -- (Foo a b c) => a b -> c [ docSeq @@ -224,37 +201,39 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of -- => a b -- -> c , docPar - (docForceSingleline contextDoc) - ( docCols ColTyOpPrefix - [ docLit $ Text.pack "=> " - , docAddBaseY (BrIndentSpecial 3) $ maybeForceML typeDoc - ] - ) + (docForceSingleline contextDoc) + (docCols + ColTyOpPrefix + [ docLit $ Text.pack "=> " + , docAddBaseY (BrIndentSpecial 3) $ maybeForceML typeDoc + ] + ) ] HsFunTy _ _ typ1 typ2 -> do typeDoc1 <- docSharedWrapper layoutType typ1 typeDoc2 <- docSharedWrapper layoutType typ2 - let maybeForceML = case typ2 of - (L _ HsFunTy{}) -> docForceMultiline - _ -> id + let + maybeForceML = case typ2 of + (L _ HsFunTy{}) -> docForceMultiline + _ -> id hasComments <- hasAnyCommentsBelow ltype - docAlt $ - [ docSeq - [ appSep $ docForceSingleline typeDoc1 - , appSep $ docLit $ Text.pack "->" - , docForceSingleline typeDoc2 + docAlt + $ [ docSeq + [ appSep $ docForceSingleline typeDoc1 + , appSep $ docLit $ Text.pack "->" + , docForceSingleline typeDoc2 + ] + | not hasComments ] - | not hasComments - ] ++ - [ docPar - (docNodeAnnKW ltype Nothing typeDoc1) - ( docCols ColTyOpPrefix - [ docWrapNodeRest ltype $ appSep $ docLit $ Text.pack "->" - , docAddBaseY (BrIndentSpecial 3) - $ maybeForceML typeDoc2 - ] - ) - ] + ++ [ docPar + (docNodeAnnKW ltype Nothing typeDoc1) + (docCols + ColTyOpPrefix + [ docWrapNodeRest ltype $ appSep $ docLit $ Text.pack "->" + , docAddBaseY (BrIndentSpecial 3) $ maybeForceML typeDoc2 + ] + ) + ] HsParTy _ typ1 -> do typeDoc1 <- docSharedWrapper layoutType typ1 docAlt @@ -264,24 +243,28 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of , docLit $ Text.pack ")" ] , docPar - ( docCols ColTyOpPrefix - [ docWrapNodeRest ltype $ docParenLSep - , docAddBaseY (BrIndentSpecial 2) $ typeDoc1 - ]) - (docLit $ Text.pack ")") + (docCols + ColTyOpPrefix + [ docWrapNodeRest ltype $ docParenLSep + , docAddBaseY (BrIndentSpecial 2) $ typeDoc1 + ] + ) + (docLit $ Text.pack ")") ] HsAppTy _ typ1@(L _ HsAppTy{}) typ2 -> do - let gather :: [LHsType GhcPs] -> LHsType GhcPs -> (LHsType GhcPs, [LHsType GhcPs]) - gather list = \case - L _ (HsAppTy _ ty1 ty2) -> gather (ty2:list) ty1 - final -> (final, list) + let + gather + :: [LHsType GhcPs] -> LHsType GhcPs -> (LHsType GhcPs, [LHsType GhcPs]) + gather list = \case + L _ (HsAppTy _ ty1 ty2) -> gather (ty2 : list) ty1 + final -> (final, list) let (typHead, typRest) = gather [typ2] typ1 docHead <- docSharedWrapper layoutType typHead docRest <- docSharedWrapper layoutType `mapM` typRest docAlt [ docSeq - $ docForceSingleline docHead : (docRest >>= \d -> - [ docSeparator, docForceSingleline d ]) + $ docForceSingleline docHead + : (docRest >>= \d -> [docSeparator, docForceSingleline d]) , docPar docHead (docLines $ docEnsureIndent BrIndentRegular <$> docRest) ] HsAppTy _ typ1 typ2 -> do @@ -293,9 +276,7 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of , docSeparator , docForceSingleline typeDoc2 ] - , docPar - typeDoc1 - (docEnsureIndent BrIndentRegular typeDoc2) + , docPar typeDoc1 (docEnsureIndent BrIndentRegular typeDoc2) ] HsListTy _ typ1 -> do typeDoc1 <- docSharedWrapper layoutType typ1 @@ -306,51 +287,61 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of , docLit $ Text.pack "]" ] , docPar - ( docCols ColTyOpPrefix - [ docWrapNodeRest ltype $ docLit $ Text.pack "[ " - , docAddBaseY (BrIndentSpecial 2) $ typeDoc1 - ]) - (docLit $ Text.pack "]") + (docCols + ColTyOpPrefix + [ docWrapNodeRest ltype $ docLit $ Text.pack "[ " + , docAddBaseY (BrIndentSpecial 2) $ typeDoc1 + ] + ) + (docLit $ Text.pack "]") ] HsTupleTy _ tupleSort typs -> case tupleSort of - HsUnboxedTuple -> unboxed - HsBoxedTuple -> simple - HsConstraintTuple -> simple + HsUnboxedTuple -> unboxed + HsBoxedTuple -> simple + HsConstraintTuple -> simple HsBoxedOrConstraintTuple -> simple where - unboxed = if null typs then error "brittany internal error: unboxed unit" - else unboxedL + unboxed = if null typs + then error "brittany internal error: unboxed unit" + else unboxedL simple = if null typs then unitL else simpleL unitL = docLit $ Text.pack "()" simpleL = do docs <- docSharedWrapper layoutType `mapM` typs - let end = docLit $ Text.pack ")" - lines = List.tail docs <&> \d -> - docAddBaseY (BrIndentSpecial 2) - $ docCols ColTyOpPrefix [docCommaSep, d] - commaDocs = List.intersperse docCommaSep (docForceSingleline <$> docs) + let + end = docLit $ Text.pack ")" + lines = + List.tail docs + <&> \d -> docAddBaseY (BrIndentSpecial 2) + $ docCols ColTyOpPrefix [docCommaSep, d] + commaDocs = List.intersperse docCommaSep (docForceSingleline <$> docs) docAlt - [ docSeq $ [docLit $ Text.pack "("] - ++ docWrapNodeRest ltype commaDocs - ++ [end] + [ docSeq + $ [docLit $ Text.pack "("] + ++ docWrapNodeRest ltype commaDocs + ++ [end] , let line1 = docCols ColTyOpPrefix [docParenLSep, head docs] - in docPar - (docAddBaseY (BrIndentSpecial 2) $ line1) - (docLines $ docWrapNodeRest ltype lines ++ [end]) + in + docPar + (docAddBaseY (BrIndentSpecial 2) $ line1) + (docLines $ docWrapNodeRest ltype lines ++ [end]) ] unboxedL = do docs <- docSharedWrapper layoutType `mapM` typs - let start = docParenHashLSep - end = docParenHashRSep + let + start = docParenHashLSep + end = docParenHashRSep docAlt - [ docSeq $ [start] - ++ docWrapNodeRest ltype (List.intersperse docCommaSep docs) - ++ [end] + [ docSeq + $ [start] + ++ docWrapNodeRest ltype (List.intersperse docCommaSep docs) + ++ [end] , let line1 = docCols ColTyOpPrefix [start, head docs] - lines = List.tail docs <&> \d -> - docAddBaseY (BrIndentSpecial 2) - $ docCols ColTyOpPrefix [docCommaSep, d] + lines = + List.tail docs + <&> \d -> docAddBaseY (BrIndentSpecial 2) + $ docCols ColTyOpPrefix [docCommaSep, d] in docPar (docAddBaseY (BrIndentSpecial 2) line1) (docLines $ lines ++ [end]) @@ -419,20 +410,18 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of typeDoc1 <- docSharedWrapper layoutType typ1 docAlt [ docSeq - [ docWrapNodeRest ltype - $ docLit - $ Text.pack ("?" ++ showSDocUnsafe (ftext ipName) ++ "::") + [ docWrapNodeRest ltype $ docLit $ Text.pack + ("?" ++ showSDocUnsafe (ftext ipName) ++ "::") , docForceSingleline typeDoc1 ] , docPar - ( docLit - $ Text.pack ("?" ++ showSDocUnsafe (ftext ipName)) - ) - (docCols ColTyOpPrefix - [ docWrapNodeRest ltype - $ docLit $ Text.pack ":: " - , docAddBaseY (BrIndentSpecial 2) typeDoc1 - ]) + (docLit $ Text.pack ("?" ++ showSDocUnsafe (ftext ipName))) + (docCols + ColTyOpPrefix + [ docWrapNodeRest ltype $ docLit $ Text.pack ":: " + , docAddBaseY (BrIndentSpecial 2) typeDoc1 + ] + ) ] -- TODO: test KindSig HsKindSig _ typ1 kind1 -> do @@ -473,7 +462,7 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of ] else docPar typeDoc1 - ( docCols + (docCols ColTyOpPrefix [ docWrapNodeRest ltype $ docLit $ Text.pack ":: " , docAddBaseY (BrIndentSpecial 3) kindDoc1 @@ -544,7 +533,7 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of let specialCommaSep = appSep $ docLit $ Text.pack " ," docAlt [ docSeq - $ [docLit $ Text.pack "'["] + $ [docLit $ Text.pack "'["] ++ List.intersperse specialCommaSep (docForceSingleline <$> typDocs) ++ [docLit $ Text.pack "]"] , case splitFirstLast typDocs of @@ -569,19 +558,23 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of ] FirstLast e1 ems eN -> runFilteredAlternative $ do addAlternativeCond (not hasComments) - $ docSeq - $ [docLit $ Text.pack "'["] - ++ List.intersperse specialCommaSep (docForceSingleline <$> (e1:ems ++ [docNodeAnnKW ltype (Just AnnOpenS) eN])) + $ docSeq + $ [docLit $ Text.pack "'["] + ++ List.intersperse + specialCommaSep + (docForceSingleline + <$> (e1 : ems ++ [docNodeAnnKW ltype (Just AnnOpenS) eN]) + ) ++ [docLit $ Text.pack " ]"] - addAlternative $ - let - start = docCols ColList - [appSep $ docLit $ Text.pack "'[", e1] - linesM = ems <&> \d -> - docCols ColList [specialCommaSep, d] - lineN = docCols ColList [specialCommaSep, docNodeAnnKW ltype (Just AnnOpenS) eN] - end = docLit $ Text.pack " ]" - in docSetBaseY $ docLines $ [start] ++ linesM ++ [lineN] ++ [end] + addAlternative + $ let + start = docCols ColList [appSep $ docLit $ Text.pack "'[", e1] + linesM = ems <&> \d -> docCols ColList [specialCommaSep, d] + lineN = docCols + ColList + [specialCommaSep, docNodeAnnKW ltype (Just AnnOpenS) eN] + end = docLit $ Text.pack " ]" + in docSetBaseY $ docLines $ [start] ++ linesM ++ [lineN] ++ [end] ] HsExplicitTupleTy{} -> -- TODO briDocByExactInlineOnly "HsExplicitTupleTy{}" ltype @@ -592,8 +585,7 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of HsStrTy (SourceText srctext) _ -> docLit $ Text.pack srctext HsStrTy NoSourceText _ -> error "overLitValBriDoc: literal with no SourceText" - HsWildCardTy _ -> - docLit $ Text.pack "_" + HsWildCardTy _ -> docLit $ Text.pack "_" HsSumTy{} -> -- TODO briDocByExactInlineOnly "HsSumTy{}" ltype HsStarTy _ isUnicode -> do @@ -606,14 +598,12 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of k <- docSharedWrapper layoutType kind docAlt [ docSeq - [ docForceSingleline t - , docSeparator - , docLit $ Text.pack "@" - , docForceSingleline k - ] - , docPar - t - (docSeq [docLit $ Text.pack "@", k ]) + [ docForceSingleline t + , docSeparator + , docLit $ Text.pack "@" + , docForceSingleline k + ] + , docPar t (docSeq [docLit $ Text.pack "@", k]) ] layoutTyVarBndrs diff --git a/source/library/Language/Haskell/Brittany/Internal/Obfuscation.hs b/source/library/Language/Haskell/Brittany/Internal/Obfuscation.hs index 29dc13c..b4785a5 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Obfuscation.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Obfuscation.hs @@ -2,28 +2,24 @@ module Language.Haskell.Brittany.Internal.Obfuscation where - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils +import Data.Char import qualified Data.Map as Map import qualified Data.Set as Set import qualified Data.Text as Text import qualified GHC.OldList as List - -import Data.Char -import System.Random - - +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import System.Random obfuscate :: Text -> IO Text obfuscate input = do let predi x = isAlphaNum x || x `elem` "_'" let groups = List.groupBy (\a b -> predi a && predi b) (Text.unpack input) let idents = Set.toList $ Set.fromList $ filter (all predi) groups - let exceptionFilter x | x `elem` keywords = False - exceptionFilter x | x `elem` extraKWs = False - exceptionFilter x = not $ null $ drop 1 x + let + exceptionFilter x | x `elem` keywords = False + exceptionFilter x | x `elem` extraKWs = False + exceptionFilter x = not $ null $ drop 1 x let filtered = filter exceptionFilter idents mappings <- fmap Map.fromList $ filtered `forM` \x -> do r <- createAlias x @@ -75,14 +71,14 @@ extraKWs = ["return", "pure", "Int", "True", "False", "otherwise"] createAlias :: String -> IO String createAlias xs = go NoHint xs where - go _hint "" = pure "" - go hint (c : cr) = do + go _hint "" = pure "" + go hint (c : cr) = do c' <- case hint of VocalHint | isUpper c -> randomFrom $ "AAAEEEOOOIIIUUU" ++ ['A' .. 'Z'] - _ | isUpper c -> randomFrom ['A' .. 'Z'] + _ | isUpper c -> randomFrom ['A' .. 'Z'] VocalHint | isLower c -> randomFrom $ "aaaeeeoooiiiuuu" ++ ['a' .. 'z'] - _ | isLower c -> randomFrom ['a' .. 'z'] - _ -> pure c + _ | isLower c -> randomFrom ['a' .. 'z'] + _ -> pure c cr' <- go (if c' `elem` "aeuioAEUIO" then NoVocalHint else VocalHint) cr pure (c' : cr') diff --git a/source/library/Language/Haskell/Brittany/Internal/Prelude.hs b/source/library/Language/Haskell/Brittany/Internal/Prelude.hs index 87a0c0a..0790989 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Prelude.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Prelude.hs @@ -1,346 +1,195 @@ -module Language.Haskell.Brittany.Internal.Prelude ( module E ) where +module Language.Haskell.Brittany.Internal.Prelude + ( module E + ) where +import GHC.Hs.Extension as E (GhcPs) +import GHC.Types.Name.Reader as E (RdrName) - --- rather project-specific stuff: ---------------------------------- -import GHC.Hs.Extension as E ( GhcPs ) - -import GHC.Types.Name.Reader as E ( RdrName ) - - --- more general: ----------------- - -import Data.Functor.Identity as E ( Identity(..) ) -import Control.Concurrent.Chan as E ( Chan ) -import Control.Concurrent.MVar as E ( MVar - , newEmptyMVar - , newMVar - , putMVar - , readMVar - , takeMVar - , swapMVar - ) -import Data.Int as E ( Int ) -import Data.Word as E ( Word - , Word32 - ) -import Prelude as E ( Integer - , Float - , Double - , undefined - , Eq (..) - , Ord (..) - , Enum (..) - , Bounded (..) - , (<$>) - , (.) - , ($) - , ($!) - , Num (..) - , Integral (..) - , Fractional (..) - , Floating (..) - , RealFrac (..) - , RealFloat (..) - , fromIntegral - , error - , foldr - , foldl - , foldr1 - , id - , map - , subtract - , putStrLn - , putStr - , Show (..) - , print - , fst - , snd - , (++) - , not - , (&&) - , (||) - , curry - , uncurry - , flip - , const - , seq - , reverse - , otherwise - , traverse - , realToFrac - , or - , and - , head - , any - , (^) - , Foldable - , Traversable - ) -import Control.Monad.ST as E ( ST ) -import Data.Bool as E ( Bool(..) ) -import Data.Char as E ( Char - , ord - , chr - ) -import Data.Either as E ( Either(..) - , either - ) -import Data.IORef as E ( IORef ) -import Data.Maybe as E ( Maybe(..) - , fromMaybe - , maybe - , listToMaybe - , maybeToList - , catMaybes - ) -import Data.Monoid as E ( Endo(..) - , All(..) - , Any(..) - , Sum(..) - , Product(..) - , Alt(..) - , mconcat - , Monoid (..) - ) -import Data.Ord as E ( Ordering(..) - , Down(..) - , comparing - ) -import Data.Ratio as E ( Ratio - , Rational - , (%) - , numerator - , denominator - ) -import Data.String as E ( String ) -import Data.Void as E ( Void ) -import System.IO as E ( IO - , hFlush - , stdout - ) -import Data.Proxy as E ( Proxy(..) ) -import Data.Sequence as E ( Seq ) - -import Data.Map as E ( Map ) -import Data.Set as E ( Set ) - -import Data.Text as E ( Text ) - -import Data.Function as E ( fix - , (&) - ) - -import Data.Foldable as E ( foldl' - , foldr' - , fold - , asum - ) - -import Data.List as E ( partition - , null - , elem - , notElem - , minimum - , maximum - , length - , all - , take - , drop - , find - , sum - , zip - , zip3 - , zipWith - , repeat - , replicate - , iterate - , nub - , filter - , intersperse - , intercalate - , isSuffixOf - , isPrefixOf - , dropWhile - , takeWhile - , unzip - , break - , transpose - , sortBy - , mapAccumL - , mapAccumR - , uncons - ) - -import Data.List.NonEmpty as E ( NonEmpty(..) - , nonEmpty - ) - -import Data.Tuple as E ( swap - ) - -import Text.Read as E ( readMaybe - ) - -import Control.Monad as E ( Functor (..) - , Monad (..) - , MonadPlus (..) - , mapM - , mapM_ - , forM - , forM_ - , sequence - , sequence_ - , (=<<) - , (>=>) - , (<=<) - , forever - , void - , join - , replicateM - , replicateM_ - , guard - , when - , unless - , liftM - , liftM2 - , liftM3 - , liftM4 - , liftM5 - , filterM - , (<$!>) - ) - -import Control.Applicative as E ( Applicative (..) - , Alternative (..) - ) - -import Foreign.Storable as E ( Storable ) -import GHC.Exts as E ( Constraint ) - -import Control.Concurrent as E ( threadDelay - , forkIO - , forkOS - ) - -import Control.Exception as E ( evaluate - , bracket - , assert - ) - -import Debug.Trace as E ( trace - , traceId - , traceShowId - , traceShow - , traceStack - , traceShowId - , traceIO - , traceM - , traceShowM - ) - -import Foreign.ForeignPtr as E ( ForeignPtr - ) - -import Data.Bifunctor as E ( bimap ) -import Data.Functor as E ( ($>) ) -import Data.Semigroup as E ( (<>) - , Semigroup(..) - ) - -import Data.Typeable as E ( Typeable - ) - -import Control.Arrow as E ( first - , second - , (***) - , (&&&) - , (>>>) - , (<<<) - ) - -import Data.Version as E ( showVersion - ) - -import Data.List.Extra as E ( nubOrd - , stripSuffix - ) -import Control.Monad.Extra as E ( whenM - , unlessM - , ifM - , notM - , orM - , andM - , anyM - , allM - ) - -import Data.Tree as E ( Tree(..) - ) - -import Control.Monad.Trans.MultiRWS as E ( -- MultiRWST (..) - -- , MultiRWSTNull - -- , MultiRWS - -- , - MonadMultiReader(..) - , MonadMultiWriter(..) - , MonadMultiState(..) - , mGet - -- , runMultiRWST - -- , runMultiRWSTASW - -- , runMultiRWSTW - -- , runMultiRWSTAW - -- , runMultiRWSTSW - -- , runMultiRWSTNil - -- , runMultiRWSTNil_ - -- , withMultiReader - -- , withMultiReader_ - -- , withMultiReaders - -- , withMultiReaders_ - -- , withMultiWriter - -- , withMultiWriterAW - -- , withMultiWriterWA - -- , withMultiWriterW - -- , withMultiWriters - -- , withMultiWritersAW - -- , withMultiWritersWA - -- , withMultiWritersW - -- , withMultiState - -- , withMultiStateAS - -- , withMultiStateSA - -- , withMultiStateA - -- , withMultiStateS - -- , withMultiState_ - -- , withMultiStates - -- , withMultiStatesAS - -- , withMultiStatesSA - -- , withMultiStatesA - -- , withMultiStatesS - -- , withMultiStates_ - -- , inflateReader - -- , inflateMultiReader - -- , inflateWriter - -- , inflateMultiWriter - -- , inflateState - -- , inflateMultiState - -- , mapMultiRWST - -- , mGetRawR - -- , mGetRawW - -- , mGetRawS - -- , mPutRawR - -- , mPutRawW - -- , mPutRawS - ) - -import Control.Monad.IO.Class as E ( MonadIO (..) - ) - -import Control.Monad.Trans.Class as E ( lift - ) -import Control.Monad.Trans.Maybe as E ( MaybeT (..) - ) - -import Data.Data as E ( toConstr - ) +import Control.Applicative as E (Alternative(..), Applicative(..)) +import Control.Arrow as E ((&&&), (***), (<<<), (>>>), first, second) +import Control.Concurrent as E (forkIO, forkOS, threadDelay) +import Control.Concurrent.Chan as E (Chan) +import Control.Concurrent.MVar as E + (MVar, newEmptyMVar, newMVar, putMVar, readMVar, swapMVar, takeMVar) +import Control.Exception as E (assert, bracket, evaluate) +import Control.Monad as E + ( (<$!>) + , (<=<) + , (=<<) + , (>=>) + , Functor(..) + , Monad(..) + , MonadPlus(..) + , filterM + , forM + , forM_ + , forever + , guard + , join + , liftM + , liftM2 + , liftM3 + , liftM4 + , liftM5 + , mapM + , mapM_ + , replicateM + , replicateM_ + , sequence + , sequence_ + , unless + , void + , when + ) +import Control.Monad.Extra as E + (allM, andM, anyM, ifM, notM, orM, unlessM, whenM) +import Control.Monad.IO.Class as E (MonadIO(..)) +import Control.Monad.ST as E (ST) +import Control.Monad.Trans.Class as E (lift) +import Control.Monad.Trans.Maybe as E (MaybeT(..)) +import Control.Monad.Trans.MultiRWS as E + (MonadMultiReader(..), MonadMultiState(..), MonadMultiWriter(..), mGet) +import Data.Bifunctor as E (bimap) +import Data.Bool as E (Bool(..)) +import Data.Char as E (Char, chr, ord) +import Data.Data as E (toConstr) +import Data.Either as E (Either(..), either) +import Data.Foldable as E (asum, fold, foldl', foldr') +import Data.Function as E ((&), fix) +import Data.Functor as E (($>)) +import Data.Functor.Identity as E (Identity(..)) +import Data.IORef as E (IORef) +import Data.Int as E (Int) +import Data.List as E + ( all + , break + , drop + , dropWhile + , elem + , filter + , find + , intercalate + , intersperse + , isPrefixOf + , isSuffixOf + , iterate + , length + , mapAccumL + , mapAccumR + , maximum + , minimum + , notElem + , nub + , null + , partition + , repeat + , replicate + , sortBy + , sum + , take + , takeWhile + , transpose + , uncons + , unzip + , zip + , zip3 + , zipWith + ) +import Data.List.Extra as E (nubOrd, stripSuffix) +import Data.List.NonEmpty as E (NonEmpty(..), nonEmpty) +import Data.Map as E (Map) +import Data.Maybe as E + (Maybe(..), catMaybes, fromMaybe, listToMaybe, maybe, maybeToList) +import Data.Monoid as E + ( All(..) + , Alt(..) + , Any(..) + , Endo(..) + , Monoid(..) + , Product(..) + , Sum(..) + , mconcat + ) +import Data.Ord as E (Down(..), Ordering(..), comparing) +import Data.Proxy as E (Proxy(..)) +import Data.Ratio as E ((%), Ratio, Rational, denominator, numerator) +import Data.Semigroup as E ((<>), Semigroup(..)) +import Data.Sequence as E (Seq) +import Data.Set as E (Set) +import Data.String as E (String) +import Data.Text as E (Text) +import Data.Tree as E (Tree(..)) +import Data.Tuple as E (swap) +import Data.Typeable as E (Typeable) +import Data.Version as E (showVersion) +import Data.Void as E (Void) +import Data.Word as E (Word, Word32) +import Debug.Trace as E + ( trace + , traceIO + , traceId + , traceM + , traceShow + , traceShowId + , traceShowM + , traceStack + ) +import Foreign.ForeignPtr as E (ForeignPtr) +import Foreign.Storable as E (Storable) +import GHC.Exts as E (Constraint) +import Prelude as E + ( ($) + , ($!) + , (&&) + , (++) + , (.) + , (<$>) + , Bounded(..) + , Double + , Enum(..) + , Eq(..) + , Float + , Floating(..) + , Foldable + , Fractional(..) + , Integer + , Integral(..) + , Num(..) + , Ord(..) + , RealFloat(..) + , RealFrac(..) + , Show(..) + , Traversable + , (^) + , and + , any + , const + , curry + , error + , flip + , foldl + , foldr + , foldr1 + , fromIntegral + , fst + , head + , id + , map + , not + , or + , otherwise + , print + , putStr + , putStrLn + , realToFrac + , reverse + , seq + , snd + , subtract + , traverse + , uncurry + , undefined + , (||) + ) +import System.IO as E (IO, hFlush, stdout) +import Text.Read as E (readMaybe) diff --git a/source/library/Language/Haskell/Brittany/Internal/PreludeUtils.hs b/source/library/Language/Haskell/Brittany/Internal/PreludeUtils.hs index cfaed43..fcfe303 100644 --- a/source/library/Language/Haskell/Brittany/Internal/PreludeUtils.hs +++ b/source/library/Language/Haskell/Brittany/Internal/PreludeUtils.hs @@ -1,21 +1,15 @@ {-# OPTIONS_GHC -fno-warn-orphans #-} module Language.Haskell.Brittany.Internal.PreludeUtils where - - -import Prelude +import Control.Applicative +import Control.DeepSeq (NFData, force) +import Control.Exception.Base (evaluate) +import Control.Monad import qualified Data.Strict.Maybe as Strict import Debug.Trace -import Control.Monad +import Prelude import System.IO -import Control.DeepSeq ( NFData, force ) -import Control.Exception.Base ( evaluate ) - -import Control.Applicative - - - instance Applicative Strict.Maybe where pure = Strict.Just Strict.Just f <*> Strict.Just x = Strict.Just (f x) @@ -30,12 +24,12 @@ instance Alternative Strict.Maybe where x <|> Strict.Nothing = x _ <|> x = x -traceFunctionWith :: String -> (a -> String) -> (b -> String) -> (a -> b) -> (a -> b) +traceFunctionWith + :: String -> (a -> String) -> (b -> String) -> (a -> b) -> (a -> b) traceFunctionWith name s1 s2 f x = trace traceStr y where y = f x - traceStr = - name ++ "\nBEFORE:\n" ++ s1 x ++ "\nAFTER:\n" ++ s2 y + traceStr = name ++ "\nBEFORE:\n" ++ s1 x ++ "\nAFTER:\n" ++ s2 y (<&!>) :: Monad m => m a -> (a -> b) -> m b (<&!>) = flip (<$!>) @@ -51,10 +45,10 @@ printErr = putStrErrLn . show errorIf :: Bool -> a -> a errorIf False = id -errorIf True = error "errorIf" +errorIf True = error "errorIf" errorIfNote :: Maybe String -> a -> a -errorIfNote Nothing = id +errorIfNote Nothing = id errorIfNote (Just x) = error x (<&>) :: Functor f => f a -> (a -> b) -> f b diff --git a/source/library/Language/Haskell/Brittany/Internal/Transformations/Alt.hs b/source/library/Language/Haskell/Brittany/Internal/Transformations/Alt.hs index ca79995..1fd3eb7 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Transformations/Alt.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Transformations/Alt.hs @@ -9,25 +9,18 @@ module Language.Haskell.Brittany.Internal.Transformations.Alt where - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Memo as Memo import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import Data.HList.ContainsType import qualified Data.List.Extra import qualified Data.Semigroup as Semigroup import qualified Data.Text as Text import qualified GHC.OldList as List - -import Data.HList.ContainsType - -import Language.Haskell.Brittany.Internal.Utils -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Types - -import qualified Control.Monad.Memo as Memo - - +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.Utils data AltCurPos = AltCurPos { _acp_line :: Int -- chars in the current line @@ -35,7 +28,7 @@ data AltCurPos = AltCurPos , _acp_indentPrep :: Int -- indentChange affecting the next Par , _acp_forceMLFlag :: AltLineModeState } - deriving (Show) + deriving Show data AltLineModeState = AltLineModeStateNone @@ -46,17 +39,19 @@ data AltLineModeState deriving (Show) altLineModeRefresh :: AltLineModeState -> AltLineModeState -altLineModeRefresh AltLineModeStateNone = AltLineModeStateNone -altLineModeRefresh AltLineModeStateForceML{} = AltLineModeStateForceML False -altLineModeRefresh AltLineModeStateForceSL = AltLineModeStateForceSL -altLineModeRefresh AltLineModeStateContradiction = AltLineModeStateContradiction +altLineModeRefresh AltLineModeStateNone = AltLineModeStateNone +altLineModeRefresh AltLineModeStateForceML{} = AltLineModeStateForceML False +altLineModeRefresh AltLineModeStateForceSL = AltLineModeStateForceSL +altLineModeRefresh AltLineModeStateContradiction = + AltLineModeStateContradiction altLineModeDecay :: AltLineModeState -> AltLineModeState -altLineModeDecay AltLineModeStateNone = AltLineModeStateNone -altLineModeDecay (AltLineModeStateForceML False) = AltLineModeStateForceML True -altLineModeDecay (AltLineModeStateForceML True ) = AltLineModeStateNone -altLineModeDecay AltLineModeStateForceSL = AltLineModeStateForceSL -altLineModeDecay AltLineModeStateContradiction = AltLineModeStateContradiction +altLineModeDecay AltLineModeStateNone = AltLineModeStateNone +altLineModeDecay (AltLineModeStateForceML False) = + AltLineModeStateForceML True +altLineModeDecay (AltLineModeStateForceML True) = AltLineModeStateNone +altLineModeDecay AltLineModeStateForceSL = AltLineModeStateForceSL +altLineModeDecay AltLineModeStateContradiction = AltLineModeStateContradiction mergeLineMode :: AltCurPos -> AltLineModeState -> AltCurPos mergeLineMode acp s = case (_acp_forceMLFlag acp, s) of @@ -81,7 +76,7 @@ transformAlts = . Memo.startEvalMemoT . fmap unwrapBriDocNumbered . rec - where + where -- this function is exponential by nature and cannot be improved in any -- way i can think of, and i've tried. (stupid StableNames.) -- transWrap :: BriDoc -> BriDocNumbered @@ -119,224 +114,246 @@ transformAlts = - rec :: BriDocNumbered -> Memo.MemoT Int [VerticalSpacing] (MultiRWSS.MultiRWS r w (AltCurPos ': s)) BriDocNumbered - rec bdX@(brDcId, brDc) = do - let reWrap = (,) brDcId - -- debugAcp :: AltCurPos <- mGet - case brDc of - -- BDWrapAnnKey annKey bd -> do - -- acp <- mGet - -- mSet $ acp { _acp_forceMLFlag = altLineModeDecay $ _acp_forceMLFlag acp } - -- BDWrapAnnKey annKey <$> rec bd - BDFEmpty{} -> processSpacingSimple bdX $> bdX - BDFLit{} -> processSpacingSimple bdX $> bdX - BDFSeq list -> - reWrap . BDFSeq <$> list `forM` rec - BDFCols sig list -> - reWrap . BDFCols sig <$> list `forM` rec - BDFSeparator -> processSpacingSimple bdX $> bdX - BDFAddBaseY indent bd -> do - acp <- mGet - indAdd <- fixIndentationForMultiple acp indent - mSet $ acp { _acp_indentPrep = max (_acp_indentPrep acp) indAdd } - r <- rec bd - acp' <- mGet - mSet $ acp' { _acp_indent = _acp_indent acp } - return $ case indent of - BrIndentNone -> r - BrIndentRegular -> reWrap $ BDFAddBaseY (BrIndentSpecial indAdd) r - BrIndentSpecial i -> reWrap $ BDFAddBaseY (BrIndentSpecial i) r - BDFBaseYPushCur bd -> do - acp <- mGet - mSet $ acp { _acp_indent = _acp_line acp } - r <- rec bd - return $ reWrap $ BDFBaseYPushCur r - BDFBaseYPop bd -> do - acp <- mGet - r <- rec bd - acp' <- mGet - mSet $ acp' { _acp_indent = _acp_indentPrep acp } - return $ reWrap $ BDFBaseYPop r - BDFIndentLevelPushCur bd -> do - reWrap . BDFIndentLevelPushCur <$> rec bd - BDFIndentLevelPop bd -> do - reWrap . BDFIndentLevelPop <$> rec bd - BDFPar indent sameLine indented -> do - indAmount <- mAsk <&> _conf_layout .> _lconfig_indentAmount .> confUnpack - let indAdd = case indent of - BrIndentNone -> 0 - BrIndentRegular -> indAmount - BrIndentSpecial i -> i - acp <- mGet - let ind = _acp_indent acp + _acp_indentPrep acp + indAdd - mSet $ acp - { _acp_indent = ind - , _acp_indentPrep = 0 - } - sameLine' <- rec sameLine - mModify $ \acp' -> acp' - { _acp_line = ind - , _acp_indent = ind - } - indented' <- rec indented - return $ reWrap $ BDFPar indent sameLine' indented' - BDFAlt [] -> error "empty BDAlt" -- returning BDEmpty instead is a - -- possibility, but i will prefer a - -- fail-early approach; BDEmpty does not - -- make sense semantically for Alt[]. - BDFAlt alts -> do - altChooser <- mAsk <&> _conf_layout .> _lconfig_altChooser .> confUnpack - case altChooser of - AltChooserSimpleQuick -> do - rec $ head alts - AltChooserShallowBest -> do - spacings <- alts `forM` getSpacing - acp <- mGet - let lineCheck LineModeInvalid = False - lineCheck (LineModeValid (VerticalSpacing _ p _)) = - case _acp_forceMLFlag acp of - AltLineModeStateNone -> True - AltLineModeStateForceSL{} -> p == VerticalSpacingParNone - AltLineModeStateForceML{} -> p /= VerticalSpacingParNone - AltLineModeStateContradiction -> False - -- TODO: use COMPLETE pragma instead? - lineCheck _ = error "ghc exhaustive check is insufficient" - lconf <- _conf_layout <$> mAsk - let options = -- trace ("considering options:" ++ show (length alts, acp)) $ - (zip spacings alts - <&> \(vs, bd) -> -- trace ("spacing=" ++ show vs ++ ",hasSpace=" ++ show (hasSpace lconf acp vs) ++ ",lineCheck=" ++ show (lineCheck vs)) - ( hasSpace1 lconf acp vs && lineCheck vs, bd)) - rec - $ fromMaybe (-- trace ("choosing last") $ - List.last alts) - $ Data.List.Extra.firstJust (\(_i::Int, (b,x)) -> - [ -- traceShow ("choosing option " ++ show i) $ - x - | b - ]) - $ zip [1..] options - AltChooserBoundedSearch limit -> do - spacings <- alts `forM` getSpacings limit - acp <- mGet - let lineCheck (VerticalSpacing _ p _) = - case _acp_forceMLFlag acp of - AltLineModeStateNone -> True - AltLineModeStateForceSL{} -> p == VerticalSpacingParNone - AltLineModeStateForceML{} -> p /= VerticalSpacingParNone - AltLineModeStateContradiction -> False - lconf <- _conf_layout <$> mAsk - let options = -- trace ("considering options:" ++ show (length alts, acp)) $ - (zip spacings alts - <&> \(vs, bd) -> -- trace ("spacing=" ++ show vs ++ ",hasSpace=" ++ show (hasSpace lconf acp vs) ++ ",lineCheck=" ++ show (lineCheck vs)) - ( any (hasSpace2 lconf acp) vs - && any lineCheck vs, bd)) - let checkedOptions :: [Maybe (Int, BriDocNumbered)] = - zip [1..] options <&> (\(i, (b,x)) -> [ (i, x) | b ]) - rec - $ fromMaybe (-- trace ("choosing last") $ - List.last alts) - $ Data.List.Extra.firstJust (fmap snd) checkedOptions - BDFForceMultiline bd -> do - acp <- mGet - x <- do - mSet $ mergeLineMode acp (AltLineModeStateForceML False) - rec bd - acp' <- mGet - mSet $ acp' { _acp_forceMLFlag = _acp_forceMLFlag acp } - return $ x - BDFForceSingleline bd -> do - acp <- mGet - x <- do - mSet $ mergeLineMode acp AltLineModeStateForceSL - rec bd - acp' <- mGet - mSet $ acp' { _acp_forceMLFlag = _acp_forceMLFlag acp } - return $ x - BDFForwardLineMode bd -> do - acp <- mGet - x <- do - mSet $ acp { _acp_forceMLFlag = altLineModeRefresh $ _acp_forceMLFlag acp } - rec bd - acp' <- mGet - mSet $ acp' { _acp_forceMLFlag = _acp_forceMLFlag acp } - return $ x - BDFExternal{} -> processSpacingSimple bdX $> bdX - BDFPlain{} -> processSpacingSimple bdX $> bdX - BDFAnnotationPrior annKey bd -> do - acp <- mGet - mSet $ acp { _acp_forceMLFlag = altLineModeDecay $ _acp_forceMLFlag acp } - bd' <- rec bd - return $ reWrap $ BDFAnnotationPrior annKey bd' - BDFAnnotationRest annKey bd -> - reWrap . BDFAnnotationRest annKey <$> rec bd - BDFAnnotationKW annKey kw bd -> - reWrap . BDFAnnotationKW annKey kw <$> rec bd - BDFMoveToKWDP annKey kw b bd -> - reWrap . BDFMoveToKWDP annKey kw b <$> rec bd - BDFLines [] -> return $ reWrap BDFEmpty -- evil transformation. or harmless. - BDFLines (l:lr) -> do - ind <- _acp_indent <$> mGet - l' <- rec l - lr' <- lr `forM` \x -> do - mModify $ \acp -> acp - { _acp_line = ind - , _acp_indent = ind - } - rec x - return $ reWrap $ BDFLines (l':lr') - BDFEnsureIndent indent bd -> do - acp <- mGet - indAdd <- fixIndentationForMultiple acp indent - mSet $ acp - { _acp_indentPrep = 0 - -- TODO: i am not sure this is valid, in general. - , _acp_indent = _acp_indent acp + indAdd - , _acp_line = max (_acp_line acp) (_acp_indent acp + indAdd) - -- we cannot use just _acp_line acp + indAdd because of the case - -- where there are multiple BDFEnsureIndents in the same line. - -- Then, the actual indentation is relative to the current - -- indentation, not the current cursor position. - } - r <- rec bd - acp' <- mGet - mSet $ acp' { _acp_indent = _acp_indent acp } - return $ case indent of - BrIndentNone -> r - BrIndentRegular -> reWrap $ BDFEnsureIndent (BrIndentSpecial indAdd) r - BrIndentSpecial i -> reWrap $ BDFEnsureIndent (BrIndentSpecial i) r - BDFNonBottomSpacing _ bd -> rec bd - BDFSetParSpacing bd -> rec bd - BDFForceParSpacing bd -> rec bd - BDFDebug s bd -> do - acp :: AltCurPos <- mGet - tellDebugMess $ "transformAlts: BDFDEBUG " ++ s ++ " (node-id=" ++ show brDcId ++ "): acp=" ++ show acp - reWrap . BDFDebug s <$> rec bd - processSpacingSimple - :: ( MonadMultiReader Config m - , MonadMultiState AltCurPos m - , MonadMultiWriter (Seq String) m - ) - => BriDocNumbered - -> m () - processSpacingSimple bd = getSpacing bd >>= \case - LineModeInvalid -> error "processSpacingSimple inv" - LineModeValid (VerticalSpacing i VerticalSpacingParNone _) -> do + rec + :: BriDocNumbered + -> Memo.MemoT + Int + [VerticalSpacing] + (MultiRWSS.MultiRWS r w (AltCurPos ': s)) + BriDocNumbered + rec bdX@(brDcId, brDc) = do + let reWrap = (,) brDcId + -- debugAcp :: AltCurPos <- mGet + case brDc of + -- BDWrapAnnKey annKey bd -> do + -- acp <- mGet + -- mSet $ acp { _acp_forceMLFlag = altLineModeDecay $ _acp_forceMLFlag acp } + -- BDWrapAnnKey annKey <$> rec bd + BDFEmpty{} -> processSpacingSimple bdX $> bdX + BDFLit{} -> processSpacingSimple bdX $> bdX + BDFSeq list -> reWrap . BDFSeq <$> list `forM` rec + BDFCols sig list -> reWrap . BDFCols sig <$> list `forM` rec + BDFSeparator -> processSpacingSimple bdX $> bdX + BDFAddBaseY indent bd -> do acp <- mGet - mSet $ acp { _acp_line = _acp_line acp + i } - LineModeValid VerticalSpacing{} -> error "processSpacingSimple par" - _ -> error "ghc exhaustive check is insufficient" - hasSpace1 :: LayoutConfig -> AltCurPos -> LineModeValidity VerticalSpacing -> Bool - hasSpace1 _ _ LineModeInvalid = False - hasSpace1 lconf acp (LineModeValid vs) = hasSpace2 lconf acp vs - hasSpace1 _ _ _ = error "ghc exhaustive check is insufficient" - hasSpace2 :: LayoutConfig -> AltCurPos -> VerticalSpacing -> Bool - hasSpace2 lconf (AltCurPos line _indent _ _) (VerticalSpacing sameLine VerticalSpacingParNone _) - = line + sameLine <= confUnpack (_lconfig_cols lconf) - hasSpace2 lconf (AltCurPos line indent indentPrep _) (VerticalSpacing sameLine (VerticalSpacingParSome par) _) - = line + sameLine <= confUnpack (_lconfig_cols lconf) - && indent + indentPrep + par <= confUnpack (_lconfig_cols lconf) - hasSpace2 lconf (AltCurPos line _indent _ _) (VerticalSpacing sameLine VerticalSpacingParAlways{} _) - = line + sameLine <= confUnpack (_lconfig_cols lconf) + indAdd <- fixIndentationForMultiple acp indent + mSet $ acp { _acp_indentPrep = max (_acp_indentPrep acp) indAdd } + r <- rec bd + acp' <- mGet + mSet $ acp' { _acp_indent = _acp_indent acp } + return $ case indent of + BrIndentNone -> r + BrIndentRegular -> reWrap $ BDFAddBaseY (BrIndentSpecial indAdd) r + BrIndentSpecial i -> reWrap $ BDFAddBaseY (BrIndentSpecial i) r + BDFBaseYPushCur bd -> do + acp <- mGet + mSet $ acp { _acp_indent = _acp_line acp } + r <- rec bd + return $ reWrap $ BDFBaseYPushCur r + BDFBaseYPop bd -> do + acp <- mGet + r <- rec bd + acp' <- mGet + mSet $ acp' { _acp_indent = _acp_indentPrep acp } + return $ reWrap $ BDFBaseYPop r + BDFIndentLevelPushCur bd -> do + reWrap . BDFIndentLevelPushCur <$> rec bd + BDFIndentLevelPop bd -> do + reWrap . BDFIndentLevelPop <$> rec bd + BDFPar indent sameLine indented -> do + indAmount <- + mAsk <&> _conf_layout .> _lconfig_indentAmount .> confUnpack + let + indAdd = case indent of + BrIndentNone -> 0 + BrIndentRegular -> indAmount + BrIndentSpecial i -> i + acp <- mGet + let ind = _acp_indent acp + _acp_indentPrep acp + indAdd + mSet $ acp { _acp_indent = ind, _acp_indentPrep = 0 } + sameLine' <- rec sameLine + mModify $ \acp' -> acp' { _acp_line = ind, _acp_indent = ind } + indented' <- rec indented + return $ reWrap $ BDFPar indent sameLine' indented' + BDFAlt [] -> error "empty BDAlt" -- returning BDEmpty instead is a + -- possibility, but i will prefer a + -- fail-early approach; BDEmpty does not + -- make sense semantically for Alt[]. + BDFAlt alts -> do + altChooser <- + mAsk <&> _conf_layout .> _lconfig_altChooser .> confUnpack + case altChooser of + AltChooserSimpleQuick -> do + rec $ head alts + AltChooserShallowBest -> do + spacings <- alts `forM` getSpacing + acp <- mGet + let + lineCheck LineModeInvalid = False + lineCheck (LineModeValid (VerticalSpacing _ p _)) = + case _acp_forceMLFlag acp of + AltLineModeStateNone -> True + AltLineModeStateForceSL{} -> p == VerticalSpacingParNone + AltLineModeStateForceML{} -> p /= VerticalSpacingParNone + AltLineModeStateContradiction -> False + -- TODO: use COMPLETE pragma instead? + lineCheck _ = error "ghc exhaustive check is insufficient" + lconf <- _conf_layout <$> mAsk + let + options = -- trace ("considering options:" ++ show (length alts, acp)) $ + (zip spacings alts + <&> \(vs, bd) -> -- trace ("spacing=" ++ show vs ++ ",hasSpace=" ++ show (hasSpace lconf acp vs) ++ ",lineCheck=" ++ show (lineCheck vs)) + (hasSpace1 lconf acp vs && lineCheck vs, bd) + ) + rec + $ fromMaybe (-- trace ("choosing last") $ + List.last alts) + $ Data.List.Extra.firstJust + (\(_i :: Int, (b, x)) -> + [ -- traceShow ("choosing option " ++ show i) $ + x + | b + ] + ) + $ zip [1 ..] options + AltChooserBoundedSearch limit -> do + spacings <- alts `forM` getSpacings limit + acp <- mGet + let + lineCheck (VerticalSpacing _ p _) = case _acp_forceMLFlag acp of + AltLineModeStateNone -> True + AltLineModeStateForceSL{} -> p == VerticalSpacingParNone + AltLineModeStateForceML{} -> p /= VerticalSpacingParNone + AltLineModeStateContradiction -> False + lconf <- _conf_layout <$> mAsk + let + options = -- trace ("considering options:" ++ show (length alts, acp)) $ + (zip spacings alts + <&> \(vs, bd) -> -- trace ("spacing=" ++ show vs ++ ",hasSpace=" ++ show (hasSpace lconf acp vs) ++ ",lineCheck=" ++ show (lineCheck vs)) + (any (hasSpace2 lconf acp) vs && any lineCheck vs, bd) + ) + let + checkedOptions :: [Maybe (Int, BriDocNumbered)] = + zip [1 ..] options <&> (\(i, (b, x)) -> [ (i, x) | b ]) + rec + $ fromMaybe (-- trace ("choosing last") $ + List.last alts) + $ Data.List.Extra.firstJust (fmap snd) checkedOptions + BDFForceMultiline bd -> do + acp <- mGet + x <- do + mSet $ mergeLineMode acp (AltLineModeStateForceML False) + rec bd + acp' <- mGet + mSet $ acp' { _acp_forceMLFlag = _acp_forceMLFlag acp } + return $ x + BDFForceSingleline bd -> do + acp <- mGet + x <- do + mSet $ mergeLineMode acp AltLineModeStateForceSL + rec bd + acp' <- mGet + mSet $ acp' { _acp_forceMLFlag = _acp_forceMLFlag acp } + return $ x + BDFForwardLineMode bd -> do + acp <- mGet + x <- do + mSet $ acp + { _acp_forceMLFlag = altLineModeRefresh $ _acp_forceMLFlag acp + } + rec bd + acp' <- mGet + mSet $ acp' { _acp_forceMLFlag = _acp_forceMLFlag acp } + return $ x + BDFExternal{} -> processSpacingSimple bdX $> bdX + BDFPlain{} -> processSpacingSimple bdX $> bdX + BDFAnnotationPrior annKey bd -> do + acp <- mGet + mSet $ acp + { _acp_forceMLFlag = altLineModeDecay $ _acp_forceMLFlag acp + } + bd' <- rec bd + return $ reWrap $ BDFAnnotationPrior annKey bd' + BDFAnnotationRest annKey bd -> + reWrap . BDFAnnotationRest annKey <$> rec bd + BDFAnnotationKW annKey kw bd -> + reWrap . BDFAnnotationKW annKey kw <$> rec bd + BDFMoveToKWDP annKey kw b bd -> + reWrap . BDFMoveToKWDP annKey kw b <$> rec bd + BDFLines [] -> return $ reWrap BDFEmpty -- evil transformation. or harmless. + BDFLines (l : lr) -> do + ind <- _acp_indent <$> mGet + l' <- rec l + lr' <- lr `forM` \x -> do + mModify $ \acp -> acp { _acp_line = ind, _acp_indent = ind } + rec x + return $ reWrap $ BDFLines (l' : lr') + BDFEnsureIndent indent bd -> do + acp <- mGet + indAdd <- fixIndentationForMultiple acp indent + mSet $ acp + { _acp_indentPrep = 0 + -- TODO: i am not sure this is valid, in general. + , _acp_indent = _acp_indent acp + indAdd + , _acp_line = max (_acp_line acp) (_acp_indent acp + indAdd) + -- we cannot use just _acp_line acp + indAdd because of the case + -- where there are multiple BDFEnsureIndents in the same line. + -- Then, the actual indentation is relative to the current + -- indentation, not the current cursor position. + } + r <- rec bd + acp' <- mGet + mSet $ acp' { _acp_indent = _acp_indent acp } + return $ case indent of + BrIndentNone -> r + BrIndentRegular -> + reWrap $ BDFEnsureIndent (BrIndentSpecial indAdd) r + BrIndentSpecial i -> reWrap $ BDFEnsureIndent (BrIndentSpecial i) r + BDFNonBottomSpacing _ bd -> rec bd + BDFSetParSpacing bd -> rec bd + BDFForceParSpacing bd -> rec bd + BDFDebug s bd -> do + acp :: AltCurPos <- mGet + tellDebugMess + $ "transformAlts: BDFDEBUG " + ++ s + ++ " (node-id=" + ++ show brDcId + ++ "): acp=" + ++ show acp + reWrap . BDFDebug s <$> rec bd + processSpacingSimple + :: ( MonadMultiReader Config m + , MonadMultiState AltCurPos m + , MonadMultiWriter (Seq String) m + ) + => BriDocNumbered + -> m () + processSpacingSimple bd = getSpacing bd >>= \case + LineModeInvalid -> error "processSpacingSimple inv" + LineModeValid (VerticalSpacing i VerticalSpacingParNone _) -> do + acp <- mGet + mSet $ acp { _acp_line = _acp_line acp + i } + LineModeValid VerticalSpacing{} -> error "processSpacingSimple par" + _ -> error "ghc exhaustive check is insufficient" + hasSpace1 + :: LayoutConfig -> AltCurPos -> LineModeValidity VerticalSpacing -> Bool + hasSpace1 _ _ LineModeInvalid = False + hasSpace1 lconf acp (LineModeValid vs) = hasSpace2 lconf acp vs + hasSpace1 _ _ _ = error "ghc exhaustive check is insufficient" + hasSpace2 :: LayoutConfig -> AltCurPos -> VerticalSpacing -> Bool + hasSpace2 lconf (AltCurPos line _indent _ _) (VerticalSpacing sameLine VerticalSpacingParNone _) + = line + sameLine <= confUnpack (_lconfig_cols lconf) + hasSpace2 lconf (AltCurPos line indent indentPrep _) (VerticalSpacing sameLine (VerticalSpacingParSome par) _) + = line + + sameLine + <= confUnpack (_lconfig_cols lconf) + && indent + + indentPrep + + par + <= confUnpack (_lconfig_cols lconf) + hasSpace2 lconf (AltCurPos line _indent _ _) (VerticalSpacing sameLine VerticalSpacingParAlways{} _) + = line + sameLine <= confUnpack (_lconfig_cols lconf) getSpacing :: forall m @@ -353,10 +370,11 @@ getSpacing !bridoc = rec bridoc -- BDWrapAnnKey _annKey bd -> rec bd BDFEmpty -> return $ LineModeValid $ VerticalSpacing 0 VerticalSpacingParNone False - BDFLit t -> - return $ LineModeValid $ VerticalSpacing (Text.length t) VerticalSpacingParNone False - BDFSeq list -> - sumVs <$> rec `mapM` list + BDFLit t -> return $ LineModeValid $ VerticalSpacing + (Text.length t) + VerticalSpacingParNone + False + BDFSeq list -> sumVs <$> rec `mapM` list BDFCols _sig list -> sumVs <$> rec `mapM` list BDFSeparator -> return $ LineModeValid $ VerticalSpacing 1 VerticalSpacingParNone False @@ -364,22 +382,28 @@ getSpacing !bridoc = rec bridoc mVs <- rec bd return $ mVs <&> \vs -> vs { _vs_paragraph = case _vs_paragraph vs of - VerticalSpacingParNone -> VerticalSpacingParNone - VerticalSpacingParAlways i -> VerticalSpacingParAlways $ case indent of - BrIndentNone -> i - BrIndentRegular -> i + ( confUnpack - $ _lconfig_indentAmount - $ _conf_layout - $ config - ) + VerticalSpacingParNone -> VerticalSpacingParNone + VerticalSpacingParAlways i -> + VerticalSpacingParAlways $ case indent of + BrIndentNone -> i + BrIndentRegular -> + i + + (confUnpack + $ _lconfig_indentAmount + $ _conf_layout + $ config + ) BrIndentSpecial j -> i + j - VerticalSpacingParSome i -> VerticalSpacingParSome $ case indent of - BrIndentNone -> i - BrIndentRegular -> i + ( confUnpack - $ _lconfig_indentAmount - $ _conf_layout - $ config - ) + VerticalSpacingParSome i -> + VerticalSpacingParSome $ case indent of + BrIndentNone -> i + BrIndentRegular -> + i + + (confUnpack + $ _lconfig_indentAmount + $ _conf_layout + $ config + ) BrIndentSpecial j -> i + j } BDFBaseYPushCur bd -> do @@ -390,11 +414,13 @@ getSpacing !bridoc = rec bridoc -- the reason is that we really want to _keep_ it Just if it is -- just so we properly communicate the is-multiline fact. -- An alternative would be setting to (Just 0). - { _vs_sameLine = max (_vs_sameLine vs) - (case _vs_paragraph vs of - VerticalSpacingParNone -> 0 - VerticalSpacingParSome i -> i - VerticalSpacingParAlways i -> min colMax i) + { _vs_sameLine = max + (_vs_sameLine vs) + (case _vs_paragraph vs of + VerticalSpacingParNone -> 0 + VerticalSpacingParSome i -> i + VerticalSpacingParAlways i -> min colMax i + ) , _vs_paragraph = VerticalSpacingParSome 0 } BDFBaseYPop bd -> rec bd @@ -408,86 +434,104 @@ getSpacing !bridoc = rec bridoc | VerticalSpacing lsp mPsp _ <- mVs , indSp <- mIndSp , lineMax <- getMaxVS $ mIndSp - , let pspResult = case mPsp of - VerticalSpacingParSome psp -> VerticalSpacingParSome $ max psp lineMax - VerticalSpacingParNone -> VerticalSpacingParSome $ lineMax - VerticalSpacingParAlways psp -> VerticalSpacingParAlways $ max psp lineMax - , let parFlagResult = mPsp == VerticalSpacingParNone - && _vs_paragraph indSp == VerticalSpacingParNone - && _vs_parFlag indSp + , let + pspResult = case mPsp of + VerticalSpacingParSome psp -> + VerticalSpacingParSome $ max psp lineMax + VerticalSpacingParNone -> VerticalSpacingParSome $ lineMax + VerticalSpacingParAlways psp -> + VerticalSpacingParAlways $ max psp lineMax + , let + parFlagResult = + mPsp + == VerticalSpacingParNone + && _vs_paragraph indSp + == VerticalSpacingParNone + && _vs_parFlag indSp ] BDFPar{} -> error "BDPar with indent in getSpacing" BDFAlt [] -> error "empty BDAlt" - BDFAlt (alt:_) -> rec alt - BDFForceMultiline bd -> do + BDFAlt (alt : _) -> rec alt + BDFForceMultiline bd -> do mVs <- rec bd return $ mVs >>= _vs_paragraph .> \case VerticalSpacingParNone -> LineModeInvalid - _ -> mVs + _ -> mVs BDFForceSingleline bd -> do mVs <- rec bd return $ mVs >>= _vs_paragraph .> \case VerticalSpacingParNone -> mVs - _ -> LineModeInvalid + _ -> LineModeInvalid BDFForwardLineMode bd -> rec bd BDFExternal _ _ _ txt -> return $ LineModeValid $ case Text.lines txt of [t] -> VerticalSpacing (Text.length t) VerticalSpacingParNone False - _ -> VerticalSpacing 999 VerticalSpacingParNone False + _ -> VerticalSpacing 999 VerticalSpacingParNone False BDFPlain txt -> return $ LineModeValid $ case Text.lines txt of [t] -> VerticalSpacing (Text.length t) VerticalSpacingParNone False - _ -> VerticalSpacing 999 VerticalSpacingParNone False + _ -> VerticalSpacing 999 VerticalSpacingParNone False BDFAnnotationPrior _annKey bd -> rec bd BDFAnnotationKW _annKey _kw bd -> rec bd - BDFAnnotationRest _annKey bd -> rec bd + BDFAnnotationRest _annKey bd -> rec bd BDFMoveToKWDP _annKey _kw _b bd -> rec bd - BDFLines [] -> return - $ LineModeValid - $ VerticalSpacing 0 VerticalSpacingParNone False - BDFLines ls@(_:_) -> do + BDFLines [] -> + return $ LineModeValid $ VerticalSpacing 0 VerticalSpacingParNone False + BDFLines ls@(_ : _) -> do lSps <- rec `mapM` ls - let (mVs:_) = lSps -- separated into let to avoid MonadFail - return $ [ VerticalSpacing lsp (VerticalSpacingParSome $ lineMax) False - | VerticalSpacing lsp _ _ <- mVs - , lineMax <- getMaxVS $ maxVs $ lSps - ] + let (mVs : _) = lSps -- separated into let to avoid MonadFail + return + $ [ VerticalSpacing lsp (VerticalSpacingParSome $ lineMax) False + | VerticalSpacing lsp _ _ <- mVs + , lineMax <- getMaxVS $ maxVs $ lSps + ] BDFEnsureIndent indent bd -> do mVs <- rec bd - let addInd = case indent of - BrIndentNone -> 0 - BrIndentRegular -> confUnpack - $ _lconfig_indentAmount - $ _conf_layout - $ config - BrIndentSpecial i -> i + let + addInd = case indent of + BrIndentNone -> 0 + BrIndentRegular -> + confUnpack $ _lconfig_indentAmount $ _conf_layout $ config + BrIndentSpecial i -> i return $ mVs <&> \(VerticalSpacing lsp psp pf) -> VerticalSpacing (lsp + addInd) psp pf BDFNonBottomSpacing b bd -> do mVs <- rec bd - return - $ mVs - <|> LineModeValid - (VerticalSpacing - 0 - (if b then VerticalSpacingParSome 0 - else VerticalSpacingParAlways colMax - ) - False - ) + return $ mVs <|> LineModeValid + (VerticalSpacing + 0 + (if b + then VerticalSpacingParSome 0 + else VerticalSpacingParAlways colMax + ) + False + ) BDFSetParSpacing bd -> do mVs <- rec bd return $ mVs <&> \vs -> vs { _vs_parFlag = True } BDFForceParSpacing bd -> do mVs <- rec bd - return $ [ vs | vs <- mVs, _vs_parFlag vs || _vs_paragraph vs == VerticalSpacingParNone ] + return + $ [ vs + | vs <- mVs + , _vs_parFlag vs || _vs_paragraph vs == VerticalSpacingParNone + ] BDFDebug s bd -> do r <- rec bd - tellDebugMess $ "getSpacing: BDFDebug " ++ show s ++ " (node-id=" ++ show brDcId ++ "): mVs=" ++ show r + tellDebugMess + $ "getSpacing: BDFDebug " + ++ show s + ++ " (node-id=" + ++ show brDcId + ++ "): mVs=" + ++ show r return r return result - maxVs :: [LineModeValidity VerticalSpacing] -> LineModeValidity VerticalSpacing + maxVs + :: [LineModeValidity VerticalSpacing] -> LineModeValidity VerticalSpacing maxVs = foldl' - (liftM2 (\(VerticalSpacing x1 x2 _) (VerticalSpacing y1 y2 _) -> - VerticalSpacing (max x1 y1) (case (x2, y2) of + (liftM2 + (\(VerticalSpacing x1 x2 _) (VerticalSpacing y1 y2 _) -> VerticalSpacing + (max x1 y1) + (case (x2, y2) of (x, VerticalSpacingParNone) -> x (VerticalSpacingParNone, x) -> x (VerticalSpacingParAlways i, VerticalSpacingParAlways j) -> @@ -497,9 +541,14 @@ getSpacing !bridoc = rec bridoc (VerticalSpacingParSome j, VerticalSpacingParAlways i) -> VerticalSpacingParAlways $ max i j (VerticalSpacingParSome x, VerticalSpacingParSome y) -> - VerticalSpacingParSome $ max x y) False)) + VerticalSpacingParSome $ max x y + ) + False + ) + ) (LineModeValid $ VerticalSpacing 0 VerticalSpacingParNone False) - sumVs :: [LineModeValidity VerticalSpacing] -> LineModeValidity VerticalSpacing + sumVs + :: [LineModeValidity VerticalSpacing] -> LineModeValidity VerticalSpacing sumVs sps = foldl' (liftM2 go) initial sps where go (VerticalSpacing x1 x2 x3) (VerticalSpacing y1 y2 _) = VerticalSpacing @@ -508,18 +557,19 @@ getSpacing !bridoc = rec bridoc (x, VerticalSpacingParNone) -> x (VerticalSpacingParNone, x) -> x (VerticalSpacingParAlways i, VerticalSpacingParAlways j) -> - VerticalSpacingParAlways $ i+j + VerticalSpacingParAlways $ i + j (VerticalSpacingParAlways i, VerticalSpacingParSome j) -> - VerticalSpacingParAlways $ i+j + VerticalSpacingParAlways $ i + j (VerticalSpacingParSome i, VerticalSpacingParAlways j) -> - VerticalSpacingParAlways $ i+j + VerticalSpacingParAlways $ i + j (VerticalSpacingParSome x, VerticalSpacingParSome y) -> - VerticalSpacingParSome $ x + y) + VerticalSpacingParSome $ x + y + ) x3 singleline (LineModeValid x) = _vs_paragraph x == VerticalSpacingParNone - singleline _ = False + singleline _ = False isPar (LineModeValid x) = _vs_parFlag x - isPar _ = False + isPar _ = False parFlag = case sps of [] -> True _ -> all singleline (List.init sps) && isPar (List.last sps) @@ -539,374 +589,395 @@ getSpacings -> BriDocNumbered -> Memo.MemoT Int [VerticalSpacing] m [VerticalSpacing] getSpacings limit bridoc = preFilterLimit <$> rec bridoc - where + where -- when we do `take K . filter someCondition` on a list of spacings, we -- need to first (also) limit the size of the input list, otherwise a -- _large_ input with a similarly _large_ prefix not passing our filtering -- process could lead to exponential runtime behaviour. -- TODO: 3 is arbitrary. - preFilterLimit :: [VerticalSpacing] -> [VerticalSpacing] - preFilterLimit = take (3*limit) - memoWithKey :: Memo.MonadMemo k v m1 => k -> m1 v -> m1 v - memoWithKey k v = Memo.memo (const v) k - rec :: BriDocNumbered -> Memo.MemoT Int [VerticalSpacing] m [VerticalSpacing] - rec (brDcId, brdc) = memoWithKey brDcId $ do - config <- mAsk - let colMax = config & _conf_layout & _lconfig_cols & confUnpack - let hasOkColCount (VerticalSpacing lsp psp _) = - lsp <= colMax && case psp of - VerticalSpacingParNone -> True - VerticalSpacingParSome i -> i <= colMax - VerticalSpacingParAlways{} -> True - let specialCompare vs1 vs2 = - if ( (_vs_sameLine vs1 == _vs_sameLine vs2) - && (_vs_parFlag vs1 == _vs_parFlag vs2) - ) - then case (_vs_paragraph vs1, _vs_paragraph vs2) of - (VerticalSpacingParAlways i1, VerticalSpacingParAlways i2) -> - if i1 < i2 then Smaller else Bigger - (p1, p2) -> if p1 == p2 then Smaller else Unequal - else Unequal - let allowHangingQuasiQuotes = - config - & _conf_layout - & _lconfig_allowHangingQuasiQuotes - & confUnpack - let -- this is like List.nub, with one difference: if two elements - -- are unequal only in _vs_paragraph, with both ParAlways, we - -- treat them like equals and replace the first occurence with the - -- smallest member of this "equal group". - specialNub :: [VerticalSpacing] -> [VerticalSpacing] - specialNub [] = [] - specialNub (x1 : xr) = case go x1 xr of - (r, xs') -> r : specialNub xs' - where - go y1 [] = (y1, []) - go y1 (y2 : yr) = case specialCompare y1 y2 of - Unequal -> let (r, yr') = go y1 yr in (r, y2 : yr') - Smaller -> go y1 yr - Bigger -> go y2 yr - let -- the standard function used to enforce a constant upper bound - -- on the number of elements returned for each node. Should be - -- applied whenever in a parent the combination of spacings from - -- its children might cause excess of the upper bound. - filterAndLimit :: [VerticalSpacing] -> [VerticalSpacing] - filterAndLimit = take limit - -- prune so we always consider a constant - -- amount of spacings per node of the BriDoc. - . specialNub - -- In the end we want to know if there is at least - -- one valid spacing for any alternative. - -- If there are duplicates in the list, then these - -- will either all be valid (so having more than the - -- first is pointless) or all invalid (in which - -- case having any of them is pointless). - -- Nonetheless I think the order of spacings should - -- be preserved as it provides a deterministic - -- choice for which spacings to prune (which is - -- an argument against simply using a Set). - -- I have also considered `fmap head . group` which - -- seems to work similarly well for common cases - -- and which might behave even better when it comes - -- to determinism of the algorithm. But determinism - -- should not be overrated here either - in the end - -- this is about deterministic behaviour of the - -- pruning we do that potentially results in - -- non-optimal layouts, and we'd rather take optimal - -- layouts when we can than take non-optimal layouts - -- just to be consistent with other cases where - -- we'd choose non-optimal layouts. - . filter hasOkColCount - -- throw out any spacings (i.e. children) that - -- already use more columns than available in - -- total. - . preFilterLimit - result <- case brdc of - -- BDWrapAnnKey _annKey bd -> rec bd - BDFEmpty -> - return $ [VerticalSpacing 0 VerticalSpacingParNone False] - BDFLit t -> - return $ [VerticalSpacing (Text.length t) VerticalSpacingParNone False] - BDFSeq list -> - fmap sumVs . mapM filterAndLimit <$> rec `mapM` list - BDFCols _sig list -> - fmap sumVs . mapM filterAndLimit <$> rec `mapM` list - BDFSeparator -> - return $ [VerticalSpacing 1 VerticalSpacingParNone False] - BDFAddBaseY indent bd -> do - mVs <- rec bd - return $ mVs <&> \vs -> vs - { _vs_paragraph = case _vs_paragraph vs of - VerticalSpacingParNone -> VerticalSpacingParNone - VerticalSpacingParAlways i -> VerticalSpacingParAlways $ case indent of - BrIndentNone -> i - BrIndentRegular -> i + ( confUnpack - $ _lconfig_indentAmount - $ _conf_layout - $ config - ) - BrIndentSpecial j -> i + j - VerticalSpacingParSome i -> VerticalSpacingParSome $ case indent of - BrIndentNone -> i - BrIndentRegular -> i + ( confUnpack - $ _lconfig_indentAmount - $ _conf_layout - $ config - ) - BrIndentSpecial j -> i + j - } - BDFBaseYPushCur bd -> do - mVs <- rec bd - return $ mVs <&> \vs -> vs - -- We leave par as-is, even though it technically is not - -- accurate (in general). - -- the reason is that we really want to _keep_ it Just if it is - -- just so we properly communicate the is-multiline fact. - -- An alternative would be setting to (Just 0). - { _vs_sameLine = max (_vs_sameLine vs) - (case _vs_paragraph vs of - VerticalSpacingParNone -> 0 - VerticalSpacingParSome i -> i - VerticalSpacingParAlways i -> min colMax i) - , _vs_paragraph = case _vs_paragraph vs of - VerticalSpacingParNone -> VerticalSpacingParNone - VerticalSpacingParSome i -> VerticalSpacingParSome i - VerticalSpacingParAlways i -> VerticalSpacingParAlways i - } - BDFBaseYPop bd -> rec bd - BDFIndentLevelPushCur bd -> rec bd - BDFIndentLevelPop bd -> rec bd - BDFPar BrIndentNone sameLine indented -> do - mVss <- filterAndLimit <$> rec sameLine - indSps <- filterAndLimit <$> rec indented - let mVsIndSp = take limit - $ [ (x,y) - | x<-mVss - , y<-indSps - ] - return $ mVsIndSp <&> - \(VerticalSpacing lsp mPsp _, indSp) -> - VerticalSpacing - lsp - (case mPsp of - VerticalSpacingParSome psp -> - VerticalSpacingParSome $ max psp $ getMaxVS indSp -- TODO - VerticalSpacingParNone -> spMakePar indSp - VerticalSpacingParAlways psp -> - VerticalSpacingParAlways $ max psp $ getMaxVS indSp) - ( mPsp == VerticalSpacingParNone - && _vs_paragraph indSp == VerticalSpacingParNone - && _vs_parFlag indSp - ) - - BDFPar{} -> error "BDPar with indent in getSpacing" - BDFAlt [] -> error "empty BDAlt" - -- BDAlt (alt:_) -> rec alt - BDFAlt alts -> do - r <- rec `mapM` alts - return $ filterAndLimit =<< r - BDFForceMultiline bd -> do - mVs <- filterAndLimit <$> rec bd - return $ filter ((/=VerticalSpacingParNone) . _vs_paragraph) mVs - BDFForceSingleline bd -> do - mVs <- filterAndLimit <$> rec bd - return $ filter ((==VerticalSpacingParNone) . _vs_paragraph) mVs - BDFForwardLineMode bd -> rec bd - BDFExternal _ _ _ txt | [t] <- Text.lines txt -> - return $ [VerticalSpacing (Text.length t) VerticalSpacingParNone False] - BDFExternal{} -> - return $ [] -- yes, we just assume that we cannot properly layout - -- this. - BDFPlain t -> return - [ case Text.lines t of - [] -> VerticalSpacing 0 VerticalSpacingParNone False - [t1 ] -> VerticalSpacing - (Text.length t1) - VerticalSpacingParNone - False - (t1 : _) -> VerticalSpacing - (Text.length t1) - (VerticalSpacingParAlways 0) - True - | allowHangingQuasiQuotes - ] - BDFAnnotationPrior _annKey bd -> rec bd - BDFAnnotationKW _annKey _kw bd -> rec bd - BDFAnnotationRest _annKey bd -> rec bd - BDFMoveToKWDP _annKey _kw _b bd -> rec bd - BDFLines [] -> return $ [VerticalSpacing 0 VerticalSpacingParNone False] - BDFLines ls@(_:_) -> do - -- we simply assume that lines is only used "properly", i.e. in - -- such a way that the first line can be treated "as a part of the - -- paragraph". That most importantly means that Lines should never - -- be inserted anywhere but at the start of the line. A - -- counterexample would be anything like Seq[Lit "foo", Lines]. - lSpss <- map filterAndLimit <$> rec `mapM` ls - let worbled = fmap reverse - $ sequence - $ reverse - $ lSpss - sumF lSps@(lSp1:_) = VerticalSpacing (_vs_sameLine lSp1) - (spMakePar $ maxVs lSps) - False - sumF [] = error $ "should not happen. if my logic does not fail" - ++ "me, this follows from not (null ls)." - return $ sumF <$> worbled - -- lSpss@(mVs:_) <- rec `mapM` ls - -- return $ case Control.Lens.transposeOf traverse lSpss of -- TODO: we currently only - -- -- consider the first alternative for the - -- -- line's spacings. - -- -- also i am not sure if always including - -- -- the first line length in the paragraph - -- -- length gives the desired results. - -- -- it is the safe path though, for now. - -- [] -> [] - -- (lSps:_) -> mVs <&> \(VerticalSpacing lsp _) -> - -- VerticalSpacing lsp $ VerticalSpacingParSome $ getMaxVS $ maxVs lSps - BDFEnsureIndent indent bd -> do - mVs <- rec bd - let addInd = case indent of - BrIndentNone -> 0 - BrIndentRegular -> confUnpack - $ _lconfig_indentAmount - $ _conf_layout - $ config - BrIndentSpecial i -> i - return $ mVs <&> \(VerticalSpacing lsp psp parFlag) -> - VerticalSpacing (lsp + addInd) psp parFlag - BDFNonBottomSpacing b bd -> do - -- TODO: the `b` flag is an ugly hack, but I was not able to make - -- all tests work without it. It should be possible to have - -- `spMakePar` map VSPAlways{} to VSPSome x1, which fixes this - -- problem but breaks certain other cases. - mVs <- rec bd - return $ if null mVs - then [VerticalSpacing - 0 - (if b then VerticalSpacingParSome 0 - else VerticalSpacingParAlways colMax - ) - False - ] - else mVs <&> \vs -> vs - { _vs_sameLine = min colMax (_vs_sameLine vs) - , _vs_paragraph = case _vs_paragraph vs of - VerticalSpacingParNone -> VerticalSpacingParNone - VerticalSpacingParAlways i - | b -> VerticalSpacingParSome 0 - | otherwise -> VerticalSpacingParAlways i - VerticalSpacingParSome i - | b -> VerticalSpacingParSome 0 - | otherwise -> VerticalSpacingParAlways i - } - -- the version below is an alternative idea: fold the input - -- spacings into a single spacing. This was hoped to improve in - -- certain cases where non-bottom alternatives took up "too much - -- explored search space"; the downside is that it also cuts - -- the search-space short in other cases where it is not necessary, - -- leading to unnecessary new-lines. Disabled for now. A better - -- solution would require conditionally folding the search-space - -- only in appropriate locations (i.e. a new BriDoc node type - -- for this purpose, perhaps "BDFNonBottomSpacing1"). - -- else - -- [ Foldable.foldl1 - -- (\(VerticalSpacing x1 x2 _) (VerticalSpacing y1 y2 _) -> - -- VerticalSpacing - -- (min x1 y1) - -- (case (x2, y2) of - -- (x, VerticalSpacingParNone) -> x - -- (VerticalSpacingParNone, x) -> x - -- (VerticalSpacingParAlways i, VerticalSpacingParAlways j) -> - -- VerticalSpacingParAlways $ min i j - -- (VerticalSpacingParAlways i, VerticalSpacingParSome j) -> - -- VerticalSpacingParAlways $ min i j - -- (VerticalSpacingParSome i, VerticalSpacingParAlways j) -> - -- VerticalSpacingParAlways $ min i j - -- (VerticalSpacingParSome x, VerticalSpacingParSome y) -> - -- VerticalSpacingParSome $ min x y) - -- False) - -- mVs - -- ] - BDFSetParSpacing bd -> do - mVs <- rec bd - return $ mVs <&> \vs -> vs { _vs_parFlag = True } - BDFForceParSpacing bd -> do - mVs <- preFilterLimit <$> rec bd - return $ [ vs | vs <- mVs, _vs_parFlag vs || _vs_paragraph vs == VerticalSpacingParNone ] - BDFDebug s bd -> do - r <- rec bd - tellDebugMess $ "getSpacings: BDFDebug " ++ show s ++ " (node-id=" ++ show brDcId ++ "): vs=" ++ show (take 9 r) - return r - return result - maxVs :: [VerticalSpacing] -> VerticalSpacing - maxVs = foldl' - (\(VerticalSpacing x1 x2 _) (VerticalSpacing y1 y2 _) -> + preFilterLimit :: [VerticalSpacing] -> [VerticalSpacing] + preFilterLimit = take (3 * limit) + memoWithKey :: Memo.MonadMemo k v m1 => k -> m1 v -> m1 v + memoWithKey k v = Memo.memo (const v) k + rec + :: BriDocNumbered -> Memo.MemoT Int [VerticalSpacing] m [VerticalSpacing] + rec (brDcId, brdc) = memoWithKey brDcId $ do + config <- mAsk + let colMax = config & _conf_layout & _lconfig_cols & confUnpack + let + hasOkColCount (VerticalSpacing lsp psp _) = + lsp <= colMax && case psp of + VerticalSpacingParNone -> True + VerticalSpacingParSome i -> i <= colMax + VerticalSpacingParAlways{} -> True + let + specialCompare vs1 vs2 = + if ((_vs_sameLine vs1 == _vs_sameLine vs2) + && (_vs_parFlag vs1 == _vs_parFlag vs2) + ) + then case (_vs_paragraph vs1, _vs_paragraph vs2) of + (VerticalSpacingParAlways i1, VerticalSpacingParAlways i2) -> + if i1 < i2 then Smaller else Bigger + (p1, p2) -> if p1 == p2 then Smaller else Unequal + else Unequal + let + allowHangingQuasiQuotes = + config & _conf_layout & _lconfig_allowHangingQuasiQuotes & confUnpack + let -- this is like List.nub, with one difference: if two elements + -- are unequal only in _vs_paragraph, with both ParAlways, we + -- treat them like equals and replace the first occurence with the + -- smallest member of this "equal group". + specialNub :: [VerticalSpacing] -> [VerticalSpacing] + specialNub [] = [] + specialNub (x1 : xr) = case go x1 xr of + (r, xs') -> r : specialNub xs' + where + go y1 [] = (y1, []) + go y1 (y2 : yr) = case specialCompare y1 y2 of + Unequal -> let (r, yr') = go y1 yr in (r, y2 : yr') + Smaller -> go y1 yr + Bigger -> go y2 yr + let -- the standard function used to enforce a constant upper bound + -- on the number of elements returned for each node. Should be + -- applied whenever in a parent the combination of spacings from + -- its children might cause excess of the upper bound. + filterAndLimit :: [VerticalSpacing] -> [VerticalSpacing] + filterAndLimit = + take limit + -- prune so we always consider a constant + -- amount of spacings per node of the BriDoc. + . specialNub + -- In the end we want to know if there is at least + -- one valid spacing for any alternative. + -- If there are duplicates in the list, then these + -- will either all be valid (so having more than the + -- first is pointless) or all invalid (in which + -- case having any of them is pointless). + -- Nonetheless I think the order of spacings should + -- be preserved as it provides a deterministic + -- choice for which spacings to prune (which is + -- an argument against simply using a Set). + -- I have also considered `fmap head . group` which + -- seems to work similarly well for common cases + -- and which might behave even better when it comes + -- to determinism of the algorithm. But determinism + -- should not be overrated here either - in the end + -- this is about deterministic behaviour of the + -- pruning we do that potentially results in + -- non-optimal layouts, and we'd rather take optimal + -- layouts when we can than take non-optimal layouts + -- just to be consistent with other cases where + -- we'd choose non-optimal layouts. + . filter hasOkColCount + -- throw out any spacings (i.e. children) that + -- already use more columns than available in + -- total. + . preFilterLimit + result <- case brdc of + -- BDWrapAnnKey _annKey bd -> rec bd + BDFEmpty -> return $ [VerticalSpacing 0 VerticalSpacingParNone False] + BDFLit t -> + return + $ [VerticalSpacing (Text.length t) VerticalSpacingParNone False] + BDFSeq list -> fmap sumVs . mapM filterAndLimit <$> rec `mapM` list + BDFCols _sig list -> + fmap sumVs . mapM filterAndLimit <$> rec `mapM` list + BDFSeparator -> + return $ [VerticalSpacing 1 VerticalSpacingParNone False] + BDFAddBaseY indent bd -> do + mVs <- rec bd + return $ mVs <&> \vs -> vs + { _vs_paragraph = case _vs_paragraph vs of + VerticalSpacingParNone -> VerticalSpacingParNone + VerticalSpacingParAlways i -> + VerticalSpacingParAlways $ case indent of + BrIndentNone -> i + BrIndentRegular -> + i + + (confUnpack + $ _lconfig_indentAmount + $ _conf_layout + $ config + ) + BrIndentSpecial j -> i + j + VerticalSpacingParSome i -> + VerticalSpacingParSome $ case indent of + BrIndentNone -> i + BrIndentRegular -> + i + + (confUnpack + $ _lconfig_indentAmount + $ _conf_layout + $ config + ) + BrIndentSpecial j -> i + j + } + BDFBaseYPushCur bd -> do + mVs <- rec bd + return $ mVs <&> \vs -> vs + -- We leave par as-is, even though it technically is not + -- accurate (in general). + -- the reason is that we really want to _keep_ it Just if it is + -- just so we properly communicate the is-multiline fact. + -- An alternative would be setting to (Just 0). + { _vs_sameLine = max + (_vs_sameLine vs) + (case _vs_paragraph vs of + VerticalSpacingParNone -> 0 + VerticalSpacingParSome i -> i + VerticalSpacingParAlways i -> min colMax i + ) + , _vs_paragraph = case _vs_paragraph vs of + VerticalSpacingParNone -> VerticalSpacingParNone + VerticalSpacingParSome i -> VerticalSpacingParSome i + VerticalSpacingParAlways i -> VerticalSpacingParAlways i + } + BDFBaseYPop bd -> rec bd + BDFIndentLevelPushCur bd -> rec bd + BDFIndentLevelPop bd -> rec bd + BDFPar BrIndentNone sameLine indented -> do + mVss <- filterAndLimit <$> rec sameLine + indSps <- filterAndLimit <$> rec indented + let mVsIndSp = take limit $ [ (x, y) | x <- mVss, y <- indSps ] + return $ mVsIndSp <&> \(VerticalSpacing lsp mPsp _, indSp) -> VerticalSpacing - (max x1 y1) - (case (x2, y2) of - (x, VerticalSpacingParNone) -> x - (VerticalSpacingParNone, x) -> x - (VerticalSpacingParAlways i, VerticalSpacingParAlways j) -> - VerticalSpacingParAlways $ max i j - (VerticalSpacingParAlways i, VerticalSpacingParSome j) -> - VerticalSpacingParAlways $ max i j - (VerticalSpacingParSome i, VerticalSpacingParAlways j) -> - VerticalSpacingParAlways $ max i j - (VerticalSpacingParSome x, VerticalSpacingParSome y) -> - VerticalSpacingParSome $ max x y) - False) - (VerticalSpacing 0 VerticalSpacingParNone False) - sumVs :: [VerticalSpacing] -> VerticalSpacing - sumVs sps = foldl' go initial sps - where - go (VerticalSpacing x1 x2 x3) (VerticalSpacing y1 y2 _) = VerticalSpacing - (x1 + y1) - (case (x2, y2) of - (x, VerticalSpacingParNone) -> x - (VerticalSpacingParNone, x) -> x - (VerticalSpacingParAlways i, VerticalSpacingParAlways j) -> - VerticalSpacingParAlways $ i+j - (VerticalSpacingParAlways i, VerticalSpacingParSome j) -> - VerticalSpacingParAlways $ i+j - (VerticalSpacingParSome i, VerticalSpacingParAlways j) -> - VerticalSpacingParAlways $ i+j - (VerticalSpacingParSome x, VerticalSpacingParSome y) -> VerticalSpacingParSome $ x + y) - x3 - singleline x = _vs_paragraph x == VerticalSpacingParNone - isPar x = _vs_parFlag x - parFlag = case sps of - [] -> True - _ -> all singleline (List.init sps) && isPar (List.last sps) - initial = VerticalSpacing 0 VerticalSpacingParNone parFlag - getMaxVS :: VerticalSpacing -> Int - getMaxVS (VerticalSpacing x1 x2 _) = x1 `max` case x2 of - VerticalSpacingParSome i -> i - VerticalSpacingParNone -> 0 - VerticalSpacingParAlways i -> i - spMakePar :: VerticalSpacing -> VerticalSpacingPar - spMakePar (VerticalSpacing x1 x2 _) = case x2 of - VerticalSpacingParSome i -> VerticalSpacingParSome $ x1 `max` i - VerticalSpacingParNone -> VerticalSpacingParSome $ x1 - VerticalSpacingParAlways i -> VerticalSpacingParAlways $ x1 `max` i + lsp + (case mPsp of + VerticalSpacingParSome psp -> + VerticalSpacingParSome $ max psp $ getMaxVS indSp -- TODO + VerticalSpacingParNone -> spMakePar indSp + VerticalSpacingParAlways psp -> + VerticalSpacingParAlways $ max psp $ getMaxVS indSp + ) + (mPsp + == VerticalSpacingParNone + && _vs_paragraph indSp + == VerticalSpacingParNone + && _vs_parFlag indSp + ) + + BDFPar{} -> error "BDPar with indent in getSpacing" + BDFAlt [] -> error "empty BDAlt" + -- BDAlt (alt:_) -> rec alt + BDFAlt alts -> do + r <- rec `mapM` alts + return $ filterAndLimit =<< r + BDFForceMultiline bd -> do + mVs <- filterAndLimit <$> rec bd + return $ filter ((/= VerticalSpacingParNone) . _vs_paragraph) mVs + BDFForceSingleline bd -> do + mVs <- filterAndLimit <$> rec bd + return $ filter ((== VerticalSpacingParNone) . _vs_paragraph) mVs + BDFForwardLineMode bd -> rec bd + BDFExternal _ _ _ txt | [t] <- Text.lines txt -> + return + $ [VerticalSpacing (Text.length t) VerticalSpacingParNone False] + BDFExternal{} -> return $ [] -- yes, we just assume that we cannot properly layout + -- this. + BDFPlain t -> return + [ case Text.lines t of + [] -> VerticalSpacing 0 VerticalSpacingParNone False + [t1] -> + VerticalSpacing (Text.length t1) VerticalSpacingParNone False + (t1 : _) -> VerticalSpacing + (Text.length t1) + (VerticalSpacingParAlways 0) + True + | allowHangingQuasiQuotes + ] + BDFAnnotationPrior _annKey bd -> rec bd + BDFAnnotationKW _annKey _kw bd -> rec bd + BDFAnnotationRest _annKey bd -> rec bd + BDFMoveToKWDP _annKey _kw _b bd -> rec bd + BDFLines [] -> + return $ [VerticalSpacing 0 VerticalSpacingParNone False] + BDFLines ls@(_ : _) -> do + -- we simply assume that lines is only used "properly", i.e. in + -- such a way that the first line can be treated "as a part of the + -- paragraph". That most importantly means that Lines should never + -- be inserted anywhere but at the start of the line. A + -- counterexample would be anything like Seq[Lit "foo", Lines]. + lSpss <- map filterAndLimit <$> rec `mapM` ls + let + worbled = fmap reverse $ sequence $ reverse $ lSpss + sumF lSps@(lSp1 : _) = + VerticalSpacing (_vs_sameLine lSp1) (spMakePar $ maxVs lSps) False + sumF [] = + error + $ "should not happen. if my logic does not fail" + ++ "me, this follows from not (null ls)." + return $ sumF <$> worbled + -- lSpss@(mVs:_) <- rec `mapM` ls + -- return $ case Control.Lens.transposeOf traverse lSpss of -- TODO: we currently only + -- -- consider the first alternative for the + -- -- line's spacings. + -- -- also i am not sure if always including + -- -- the first line length in the paragraph + -- -- length gives the desired results. + -- -- it is the safe path though, for now. + -- [] -> [] + -- (lSps:_) -> mVs <&> \(VerticalSpacing lsp _) -> + -- VerticalSpacing lsp $ VerticalSpacingParSome $ getMaxVS $ maxVs lSps + BDFEnsureIndent indent bd -> do + mVs <- rec bd + let + addInd = case indent of + BrIndentNone -> 0 + BrIndentRegular -> + confUnpack $ _lconfig_indentAmount $ _conf_layout $ config + BrIndentSpecial i -> i + return $ mVs <&> \(VerticalSpacing lsp psp parFlag) -> + VerticalSpacing (lsp + addInd) psp parFlag + BDFNonBottomSpacing b bd -> do + -- TODO: the `b` flag is an ugly hack, but I was not able to make + -- all tests work without it. It should be possible to have + -- `spMakePar` map VSPAlways{} to VSPSome x1, which fixes this + -- problem but breaks certain other cases. + mVs <- rec bd + return $ if null mVs + then + [ VerticalSpacing + 0 + (if b + then VerticalSpacingParSome 0 + else VerticalSpacingParAlways colMax + ) + False + ] + else mVs <&> \vs -> vs + { _vs_sameLine = min colMax (_vs_sameLine vs) + , _vs_paragraph = case _vs_paragraph vs of + VerticalSpacingParNone -> VerticalSpacingParNone + VerticalSpacingParAlways i + | b -> VerticalSpacingParSome 0 + | otherwise -> VerticalSpacingParAlways i + VerticalSpacingParSome i + | b -> VerticalSpacingParSome 0 + | otherwise -> VerticalSpacingParAlways i + } + -- the version below is an alternative idea: fold the input + -- spacings into a single spacing. This was hoped to improve in + -- certain cases where non-bottom alternatives took up "too much + -- explored search space"; the downside is that it also cuts + -- the search-space short in other cases where it is not necessary, + -- leading to unnecessary new-lines. Disabled for now. A better + -- solution would require conditionally folding the search-space + -- only in appropriate locations (i.e. a new BriDoc node type + -- for this purpose, perhaps "BDFNonBottomSpacing1"). + -- else + -- [ Foldable.foldl1 + -- (\(VerticalSpacing x1 x2 _) (VerticalSpacing y1 y2 _) -> + -- VerticalSpacing + -- (min x1 y1) + -- (case (x2, y2) of + -- (x, VerticalSpacingParNone) -> x + -- (VerticalSpacingParNone, x) -> x + -- (VerticalSpacingParAlways i, VerticalSpacingParAlways j) -> + -- VerticalSpacingParAlways $ min i j + -- (VerticalSpacingParAlways i, VerticalSpacingParSome j) -> + -- VerticalSpacingParAlways $ min i j + -- (VerticalSpacingParSome i, VerticalSpacingParAlways j) -> + -- VerticalSpacingParAlways $ min i j + -- (VerticalSpacingParSome x, VerticalSpacingParSome y) -> + -- VerticalSpacingParSome $ min x y) + -- False) + -- mVs + -- ] + BDFSetParSpacing bd -> do + mVs <- rec bd + return $ mVs <&> \vs -> vs { _vs_parFlag = True } + BDFForceParSpacing bd -> do + mVs <- preFilterLimit <$> rec bd + return + $ [ vs + | vs <- mVs + , _vs_parFlag vs || _vs_paragraph vs == VerticalSpacingParNone + ] + BDFDebug s bd -> do + r <- rec bd + tellDebugMess + $ "getSpacings: BDFDebug " + ++ show s + ++ " (node-id=" + ++ show brDcId + ++ "): vs=" + ++ show (take 9 r) + return r + return result + maxVs :: [VerticalSpacing] -> VerticalSpacing + maxVs = foldl' + (\(VerticalSpacing x1 x2 _) (VerticalSpacing y1 y2 _) -> VerticalSpacing + (max x1 y1) + (case (x2, y2) of + (x, VerticalSpacingParNone) -> x + (VerticalSpacingParNone, x) -> x + (VerticalSpacingParAlways i, VerticalSpacingParAlways j) -> + VerticalSpacingParAlways $ max i j + (VerticalSpacingParAlways i, VerticalSpacingParSome j) -> + VerticalSpacingParAlways $ max i j + (VerticalSpacingParSome i, VerticalSpacingParAlways j) -> + VerticalSpacingParAlways $ max i j + (VerticalSpacingParSome x, VerticalSpacingParSome y) -> + VerticalSpacingParSome $ max x y + ) + False + ) + (VerticalSpacing 0 VerticalSpacingParNone False) + sumVs :: [VerticalSpacing] -> VerticalSpacing + sumVs sps = foldl' go initial sps + where + go (VerticalSpacing x1 x2 x3) (VerticalSpacing y1 y2 _) = VerticalSpacing + (x1 + y1) + (case (x2, y2) of + (x, VerticalSpacingParNone) -> x + (VerticalSpacingParNone, x) -> x + (VerticalSpacingParAlways i, VerticalSpacingParAlways j) -> + VerticalSpacingParAlways $ i + j + (VerticalSpacingParAlways i, VerticalSpacingParSome j) -> + VerticalSpacingParAlways $ i + j + (VerticalSpacingParSome i, VerticalSpacingParAlways j) -> + VerticalSpacingParAlways $ i + j + (VerticalSpacingParSome x, VerticalSpacingParSome y) -> + VerticalSpacingParSome $ x + y + ) + x3 + singleline x = _vs_paragraph x == VerticalSpacingParNone + isPar x = _vs_parFlag x + parFlag = case sps of + [] -> True + _ -> all singleline (List.init sps) && isPar (List.last sps) + initial = VerticalSpacing 0 VerticalSpacingParNone parFlag + getMaxVS :: VerticalSpacing -> Int + getMaxVS (VerticalSpacing x1 x2 _) = x1 `max` case x2 of + VerticalSpacingParSome i -> i + VerticalSpacingParNone -> 0 + VerticalSpacingParAlways i -> i + spMakePar :: VerticalSpacing -> VerticalSpacingPar + spMakePar (VerticalSpacing x1 x2 _) = case x2 of + VerticalSpacingParSome i -> VerticalSpacingParSome $ x1 `max` i + VerticalSpacingParNone -> VerticalSpacingParSome $ x1 + VerticalSpacingParAlways i -> VerticalSpacingParAlways $ x1 `max` i fixIndentationForMultiple :: (MonadMultiReader (CConfig Identity) m) => AltCurPos -> BrIndent -> m Int fixIndentationForMultiple acp indent = do indAmount <- mAsk <&> _conf_layout .> _lconfig_indentAmount .> confUnpack - let indAddRaw = case indent of - BrIndentNone -> 0 - BrIndentRegular -> indAmount - BrIndentSpecial i -> i + let + indAddRaw = case indent of + BrIndentNone -> 0 + BrIndentRegular -> indAmount + BrIndentSpecial i -> i -- for IndentPolicyMultiple, we restrict the amount of added -- indentation in such a manner that we end up on a multiple of the -- base indentation. indPolicy <- mAsk <&> _conf_layout .> _lconfig_indentPolicy .> confUnpack pure $ if indPolicy == IndentPolicyMultiple then - let indAddMultiple1 = - indAddRaw - ((_acp_indent acp + indAddRaw) `mod` indAmount) - indAddMultiple2 = if indAddMultiple1 <= 0 - then indAddMultiple1 + indAmount - else indAddMultiple1 - in indAddMultiple2 + let + indAddMultiple1 = + indAddRaw - ((_acp_indent acp + indAddRaw) `mod` indAmount) + indAddMultiple2 = if indAddMultiple1 <= 0 + then indAddMultiple1 + indAmount + else indAddMultiple1 + in indAddMultiple2 else indAddRaw diff --git a/source/library/Language/Haskell/Brittany/Internal/Transformations/Columns.hs b/source/library/Language/Haskell/Brittany/Internal/Transformations/Columns.hs index 89a2c6f..5229134 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Transformations/Columns.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Transformations/Columns.hs @@ -3,16 +3,10 @@ module Language.Haskell.Brittany.Internal.Transformations.Columns where - - -import Language.Haskell.Brittany.Internal.Prelude -import qualified GHC.OldList as List - -import Language.Haskell.Brittany.Internal.Types - import qualified Data.Generics.Uniplate.Direct as Uniplate - - +import qualified GHC.OldList as List +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.Types transformSimplifyColumns :: BriDoc -> BriDoc transformSimplifyColumns = Uniplate.rewrite $ \case @@ -20,118 +14,150 @@ transformSimplifyColumns = Uniplate.rewrite $ \case -- BDWrapAnnKey annKey $ transformSimplify bd BDEmpty -> Nothing BDLit{} -> Nothing - BDSeq list | any (\case BDSeq{} -> True - BDEmpty{} -> True - _ -> False) list -> Just $ BDSeq $ list >>= \case - BDEmpty -> [] - BDSeq l -> l - x -> [x] - BDSeq (BDCols sig1 cols1@(_:_):rest) - | all (\case BDSeparator -> True; _ -> False) rest -> - Just $ BDCols sig1 (List.init cols1 ++ [BDSeq (List.last cols1:rest)]) - BDLines lines | any (\case BDLines{} -> True - BDEmpty{} -> True - _ -> False) lines -> - Just $ BDLines $ filter isNotEmpty $ lines >>= \case + BDSeq list + | any + (\case + BDSeq{} -> True + BDEmpty{} -> True + _ -> False + ) + list + -> Just $ BDSeq $ list >>= \case + BDEmpty -> [] + BDSeq l -> l + x -> [x] + BDSeq (BDCols sig1 cols1@(_ : _) : rest) + | all + (\case + BDSeparator -> True + _ -> False + ) + rest + -> Just $ BDCols sig1 (List.init cols1 ++ [BDSeq (List.last cols1 : rest)]) + BDLines lines + | any + (\case + BDLines{} -> True + BDEmpty{} -> True + _ -> False + ) + lines + -> Just $ BDLines $ filter isNotEmpty $ lines >>= \case BDLines l -> l x -> [x] -- prior floating in - BDAnnotationPrior annKey1 (BDSeq (l:lr)) -> - Just $ BDSeq (BDAnnotationPrior annKey1 l:lr) - BDAnnotationPrior annKey1 (BDLines (l:lr)) -> - Just $ BDLines (BDAnnotationPrior annKey1 l:lr) - BDAnnotationPrior annKey1 (BDCols sig (l:lr)) -> - Just $ BDCols sig (BDAnnotationPrior annKey1 l:lr) + BDAnnotationPrior annKey1 (BDSeq (l : lr)) -> + Just $ BDSeq (BDAnnotationPrior annKey1 l : lr) + BDAnnotationPrior annKey1 (BDLines (l : lr)) -> + Just $ BDLines (BDAnnotationPrior annKey1 l : lr) + BDAnnotationPrior annKey1 (BDCols sig (l : lr)) -> + Just $ BDCols sig (BDAnnotationPrior annKey1 l : lr) -- post floating in BDAnnotationRest annKey1 (BDSeq list) -> - Just $ BDSeq $ List.init list ++ [BDAnnotationRest annKey1 $ List.last list] + Just + $ BDSeq + $ List.init list + ++ [BDAnnotationRest annKey1 $ List.last list] BDAnnotationRest annKey1 (BDLines list) -> - Just $ BDLines $ List.init list ++ [BDAnnotationRest annKey1 $ List.last list] + Just + $ BDLines + $ List.init list + ++ [BDAnnotationRest annKey1 $ List.last list] BDAnnotationRest annKey1 (BDCols sig cols) -> - Just $ BDCols sig $ List.init cols ++ [BDAnnotationRest annKey1 $ List.last cols] + Just + $ BDCols sig + $ List.init cols + ++ [BDAnnotationRest annKey1 $ List.last cols] BDAnnotationKW annKey1 kw (BDSeq list) -> - Just $ BDSeq $ List.init list ++ [BDAnnotationKW annKey1 kw $ List.last list] + Just + $ BDSeq + $ List.init list + ++ [BDAnnotationKW annKey1 kw $ List.last list] BDAnnotationKW annKey1 kw (BDLines list) -> - Just $ BDLines $ List.init list ++ [BDAnnotationKW annKey1 kw $ List.last list] + Just + $ BDLines + $ List.init list + ++ [BDAnnotationKW annKey1 kw $ List.last list] BDAnnotationKW annKey1 kw (BDCols sig cols) -> - Just $ BDCols sig $ List.init cols ++ [BDAnnotationKW annKey1 kw $ List.last cols] + Just + $ BDCols sig + $ List.init cols + ++ [BDAnnotationKW annKey1 kw $ List.last cols] -- ensureIndent float-in -- not sure if the following rule is necessary; tests currently are -- unaffected. -- BDEnsureIndent indent (BDLines lines) -> -- Just $ BDLines $ BDEnsureIndent indent <$> lines -- matching col special transformation - BDCols sig1 cols1@(_:_) - | BDLines lines@(_:_:_) <- List.last cols1 + BDCols sig1 cols1@(_ : _) + | BDLines lines@(_ : _ : _) <- List.last cols1 , BDCols sig2 cols2 <- List.last lines - , sig1==sig2 -> - Just $ BDLines - [ BDCols sig1 $ List.init cols1 ++ [BDLines $ List.init lines] - , BDCols sig2 cols2 - ] - BDCols sig1 cols1@(_:_) - | BDLines lines@(_:_:_) <- List.last cols1 + , sig1 == sig2 + -> Just $ BDLines + [ BDCols sig1 $ List.init cols1 ++ [BDLines $ List.init lines] + , BDCols sig2 cols2 + ] + BDCols sig1 cols1@(_ : _) + | BDLines lines@(_ : _ : _) <- List.last cols1 , BDEnsureIndent _ (BDCols sig2 cols2) <- List.last lines - , sig1==sig2 -> - Just $ BDLines - [ BDCols sig1 $ List.init cols1 ++ [BDLines $ List.init lines] - , BDCols sig2 cols2 - ] - BDPar ind col1@(BDCols sig1 _) col2@(BDCols sig2 _) | sig1==sig2 -> + , sig1 == sig2 + -> Just $ BDLines + [ BDCols sig1 $ List.init cols1 ++ [BDLines $ List.init lines] + , BDCols sig2 cols2 + ] + BDPar ind col1@(BDCols sig1 _) col2@(BDCols sig2 _) | sig1 == sig2 -> Just $ BDAddBaseY ind (BDLines [col1, col2]) - BDPar ind col1@(BDCols sig1 _) (BDLines (col2@(BDCols sig2 _):rest)) - | sig1==sig2 -> - Just $ BDPar ind (BDLines [col1, col2]) (BDLines rest) + BDPar ind col1@(BDCols sig1 _) (BDLines (col2@(BDCols sig2 _) : rest)) + | sig1 == sig2 -> Just $ BDPar ind (BDLines [col1, col2]) (BDLines rest) BDPar ind (BDLines lines1) col2@(BDCols sig2 _) - | BDCols sig1 _ <- List.last lines1 - , sig1==sig2 -> - Just $ BDAddBaseY ind (BDLines $ lines1 ++ [col2]) - BDPar ind (BDLines lines1) (BDLines (col2@(BDCols sig2 _):rest)) - | BDCols sig1 _ <- List.last lines1 - , sig1==sig2 -> - Just $ BDPar ind (BDLines $ lines1 ++ [col2]) (BDLines rest) + | BDCols sig1 _ <- List.last lines1, sig1 == sig2 -> Just + $ BDAddBaseY ind (BDLines $ lines1 ++ [col2]) + BDPar ind (BDLines lines1) (BDLines (col2@(BDCols sig2 _) : rest)) + | BDCols sig1 _ <- List.last lines1, sig1 == sig2 -> Just + $ BDPar ind (BDLines $ lines1 ++ [col2]) (BDLines rest) -- BDPar ind1 (BDCols sig1 cols1) (BDPar ind2 line (BDCols sig2 cols2)) -- | sig1==sig2 -> -- Just $ BDPar -- ind1 -- (BDLines [BDCols sig1 cols1, BDCols sig]) - BDCols sig1 cols | BDPar _ind line (BDCols sig2 cols2) <- List.last cols - , sig1==sig2 -> - Just $ BDLines - [ BDCols sig1 (List.init cols ++ [line]) + BDCols sig1 cols + | BDPar _ind line (BDCols sig2 cols2) <- List.last cols, sig1 == sig2 + -> Just + $ BDLines [BDCols sig1 (List.init cols ++ [line]), BDCols sig2 cols2] + BDCols sig1 cols + | BDPar ind line (BDLines lines) <- List.last cols + , BDCols sig2 cols2 <- List.last lines + , sig1 == sig2 + -> Just $ BDLines + [ BDCols sig1 + $ List.init cols + ++ [BDPar ind line (BDLines $ List.init lines)] , BDCols sig2 cols2 ] - BDCols sig1 cols | BDPar ind line (BDLines lines) <- List.last cols - , BDCols sig2 cols2 <- List.last lines - , sig1==sig2 -> - Just $ BDLines - [ BDCols sig1 $ List.init cols ++ [BDPar ind line (BDLines $ List.init lines)] - , BDCols sig2 cols2 - ] - BDLines [x] -> Just $ x - BDLines [] -> Just $ BDEmpty - BDSeq{} -> Nothing - BDCols{} -> Nothing - BDSeparator -> Nothing - BDAddBaseY{} -> Nothing - BDBaseYPushCur{} -> Nothing - BDBaseYPop{} -> Nothing + BDLines [x] -> Just $ x + BDLines [] -> Just $ BDEmpty + BDSeq{} -> Nothing + BDCols{} -> Nothing + BDSeparator -> Nothing + BDAddBaseY{} -> Nothing + BDBaseYPushCur{} -> Nothing + BDBaseYPop{} -> Nothing BDIndentLevelPushCur{} -> Nothing - BDIndentLevelPop{} -> Nothing - BDPar{} -> Nothing - BDAlt{} -> Nothing - BDForceMultiline{} -> Nothing + BDIndentLevelPop{} -> Nothing + BDPar{} -> Nothing + BDAlt{} -> Nothing + BDForceMultiline{} -> Nothing BDForceSingleline{} -> Nothing BDForwardLineMode{} -> Nothing - BDExternal{} -> Nothing - BDPlain{} -> Nothing - BDLines{} -> Nothing + BDExternal{} -> Nothing + BDPlain{} -> Nothing + BDLines{} -> Nothing BDAnnotationPrior{} -> Nothing - BDAnnotationKW{} -> Nothing - BDAnnotationRest{} -> Nothing - BDMoveToKWDP{} -> Nothing - BDEnsureIndent{} -> Nothing - BDSetParSpacing{} -> Nothing + BDAnnotationKW{} -> Nothing + BDAnnotationRest{} -> Nothing + BDMoveToKWDP{} -> Nothing + BDEnsureIndent{} -> Nothing + BDSetParSpacing{} -> Nothing BDForceParSpacing{} -> Nothing - BDDebug{} -> Nothing + BDDebug{} -> Nothing BDNonBottomSpacing _ x -> Just x diff --git a/source/library/Language/Haskell/Brittany/Internal/Transformations/Floating.hs b/source/library/Language/Haskell/Brittany/Internal/Transformations/Floating.hs index 0231306..c320dbf 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Transformations/Floating.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Transformations/Floating.hs @@ -3,25 +3,20 @@ module Language.Haskell.Brittany.Internal.Transformations.Floating where - - +import qualified Data.Generics.Uniplate.Direct as Uniplate +import qualified GHC.OldList as List import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified GHC.OldList as List - -import Language.Haskell.Brittany.Internal.Utils -import Language.Haskell.Brittany.Internal.Types - -import qualified Data.Generics.Uniplate.Direct as Uniplate - - +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.Utils -- note that this is not total, and cannot be with that exact signature. mergeIndents :: BrIndent -> BrIndent -> BrIndent -mergeIndents BrIndentNone x = x -mergeIndents x BrIndentNone = x -mergeIndents (BrIndentSpecial i) (BrIndentSpecial j) = BrIndentSpecial (max i j) -mergeIndents _ _ = error "mergeIndents" +mergeIndents BrIndentNone x = x +mergeIndents x BrIndentNone = x +mergeIndents (BrIndentSpecial i) (BrIndentSpecial j) = + BrIndentSpecial (max i j) +mergeIndents _ _ = error "mergeIndents" transformSimplifyFloating :: BriDoc -> BriDoc @@ -31,169 +26,192 @@ transformSimplifyFloating = stepBO .> stepFull -- better complexity. -- UPDATE: by now, stepBO does more than stepFull; for semantic equivalence -- the push/pop cases would need to be copied over - where - descendPrior = transformDownMay $ \case - -- prior floating in - BDAnnotationPrior annKey1 (BDPar ind line indented) -> - Just $ BDPar ind (BDAnnotationPrior annKey1 line) indented - BDAnnotationPrior annKey1 (BDSeq (l:lr)) -> - Just $ BDSeq (BDAnnotationPrior annKey1 l:lr) - BDAnnotationPrior annKey1 (BDLines (l:lr)) -> - Just $ BDLines (BDAnnotationPrior annKey1 l:lr) - BDAnnotationPrior annKey1 (BDCols sig (l:lr)) -> - Just $ BDCols sig (BDAnnotationPrior annKey1 l:lr) - BDAnnotationPrior annKey1 (BDAddBaseY indent x) -> - Just $ BDAddBaseY indent $ BDAnnotationPrior annKey1 x - BDAnnotationPrior annKey1 (BDDebug s x) -> - Just $ BDDebug s $ BDAnnotationPrior annKey1 x - _ -> Nothing - descendRest = transformDownMay $ \case - -- post floating in - BDAnnotationRest annKey1 (BDPar ind line indented) -> - Just $ BDPar ind line $ BDAnnotationRest annKey1 indented - BDAnnotationRest annKey1 (BDSeq list) -> - Just $ BDSeq $ List.init list ++ [BDAnnotationRest annKey1 $ List.last list] - BDAnnotationRest annKey1 (BDLines list) -> - Just $ BDLines $ List.init list ++ [BDAnnotationRest annKey1 $ List.last list] - BDAnnotationRest annKey1 (BDCols sig cols) -> - Just $ BDCols sig $ List.init cols ++ [BDAnnotationRest annKey1 $ List.last cols] - BDAnnotationRest annKey1 (BDAddBaseY indent x) -> - Just $ BDAddBaseY indent $ BDAnnotationRest annKey1 x - BDAnnotationRest annKey1 (BDDebug s x) -> - Just $ BDDebug s $ BDAnnotationRest annKey1 x - _ -> Nothing - descendKW = transformDownMay $ \case - -- post floating in - BDAnnotationKW annKey1 kw (BDPar ind line indented) -> - Just $ BDPar ind line $ BDAnnotationKW annKey1 kw indented - BDAnnotationKW annKey1 kw (BDSeq list) -> - Just $ BDSeq $ List.init list ++ [BDAnnotationKW annKey1 kw $ List.last list] - BDAnnotationKW annKey1 kw (BDLines list) -> - Just $ BDLines $ List.init list ++ [BDAnnotationKW annKey1 kw $ List.last list] - BDAnnotationKW annKey1 kw (BDCols sig cols) -> - Just $ BDCols sig $ List.init cols ++ [BDAnnotationKW annKey1 kw $ List.last cols] - BDAnnotationKW annKey1 kw (BDAddBaseY indent x) -> - Just $ BDAddBaseY indent $ BDAnnotationKW annKey1 kw x - BDAnnotationKW annKey1 kw (BDDebug s x) -> - Just $ BDDebug s $ BDAnnotationKW annKey1 kw x - _ -> Nothing - descendBYPush = transformDownMay $ \case - BDBaseYPushCur (BDCols sig cols@(_:_)) -> - Just $ BDCols sig (BDBaseYPushCur (List.head cols) : List.tail cols) - BDBaseYPushCur (BDDebug s x) -> - Just $ BDDebug s (BDBaseYPushCur x) - _ -> Nothing - descendBYPop = transformDownMay $ \case - BDBaseYPop (BDCols sig cols@(_:_)) -> - Just $ BDCols sig (List.init cols ++ [BDBaseYPop (List.last cols)]) - BDBaseYPop (BDDebug s x) -> - Just $ BDDebug s (BDBaseYPop x) - _ -> Nothing - descendILPush = transformDownMay $ \case - BDIndentLevelPushCur (BDCols sig cols@(_:_)) -> - Just $ BDCols sig (BDIndentLevelPushCur (List.head cols) : List.tail cols) - BDIndentLevelPushCur (BDDebug s x) -> - Just $ BDDebug s (BDIndentLevelPushCur x) - _ -> Nothing - descendILPop = transformDownMay $ \case - BDIndentLevelPop (BDCols sig cols@(_:_)) -> - Just $ BDCols sig (List.init cols ++ [BDIndentLevelPop (List.last cols)]) - BDIndentLevelPop (BDDebug s x) -> - Just $ BDDebug s (BDIndentLevelPop x) - _ -> Nothing - descendAddB = transformDownMay $ \case - BDAddBaseY BrIndentNone x -> - Just x - -- AddIndent floats into Lines. - BDAddBaseY indent (BDLines lines) -> - Just $ BDLines $ BDAddBaseY indent <$> lines - -- AddIndent floats into last column - BDAddBaseY indent (BDCols sig cols) -> - Just $ BDCols sig $ List.init cols ++ [BDAddBaseY indent $ List.last cols] - -- merge AddIndent and Par - BDAddBaseY ind1 (BDPar ind2 line indented) -> - Just $ BDPar (mergeIndents ind1 ind2) line indented - BDAddBaseY ind (BDAnnotationPrior annKey1 x) -> - Just $ BDAnnotationPrior annKey1 (BDAddBaseY ind x) - BDAddBaseY ind (BDAnnotationRest annKey1 x) -> - Just $ BDAnnotationRest annKey1 (BDAddBaseY ind x) - BDAddBaseY ind (BDAnnotationKW annKey1 kw x) -> - Just $ BDAnnotationKW annKey1 kw (BDAddBaseY ind x) - BDAddBaseY ind (BDSeq list) -> - Just $ BDSeq $ List.init list ++ [BDAddBaseY ind (List.last list)] - BDAddBaseY _ lit@BDLit{} -> - Just $ lit - BDAddBaseY ind (BDBaseYPushCur x) -> - Just $ BDBaseYPushCur (BDAddBaseY ind x) - BDAddBaseY ind (BDBaseYPop x) -> - Just $ BDBaseYPop (BDAddBaseY ind x) - BDAddBaseY ind (BDDebug s x) -> - Just $ BDDebug s (BDAddBaseY ind x) - BDAddBaseY ind (BDIndentLevelPop x) -> - Just $ BDIndentLevelPop (BDAddBaseY ind x) - BDAddBaseY ind (BDIndentLevelPushCur x) -> - Just $ BDIndentLevelPushCur (BDAddBaseY ind x) - BDAddBaseY ind (BDEnsureIndent ind2 x) -> - Just $ BDEnsureIndent (mergeIndents ind ind2) x - _ -> Nothing - stepBO :: BriDoc -> BriDoc - stepBO = -- traceFunctionWith "stepBO" (show . briDocToDocWithAnns) (show . briDocToDocWithAnns) $ - transformUp f - where - f = \case - x@BDAnnotationPrior{} -> descendPrior x - x@BDAnnotationKW{} -> descendKW x - x@BDAnnotationRest{} -> descendRest x - x@BDAddBaseY{} -> descendAddB x - x@BDBaseYPushCur{} -> descendBYPush x - x@BDBaseYPop{} -> descendBYPop x - x@BDIndentLevelPushCur{} -> descendILPush x - x@BDIndentLevelPop{} -> descendILPop x - x -> x - stepFull = -- traceFunctionWith "stepFull" (show . briDocToDocWithAnns) (show . briDocToDocWithAnns) $ - Uniplate.rewrite $ \case - BDAddBaseY BrIndentNone x -> - Just $ x - -- AddIndent floats into Lines. - BDAddBaseY indent (BDLines lines) -> - Just $ BDLines $ BDAddBaseY indent <$> lines - -- AddIndent floats into last column - BDAddBaseY indent (BDCols sig cols) -> - Just $ BDCols sig $ List.init cols ++ [BDAddBaseY indent $ List.last cols] - BDAddBaseY ind (BDSeq list) -> - Just $ BDSeq $ List.init list ++ [BDAddBaseY ind (List.last list)] - -- merge AddIndent and Par - BDAddBaseY ind1 (BDPar ind2 line indented) -> - Just $ BDPar (mergeIndents ind1 ind2) line indented - BDAddBaseY _ lit@BDLit{} -> - Just $ lit - BDAddBaseY ind (BDBaseYPushCur x) -> - Just $ BDBaseYPushCur (BDAddBaseY ind x) - BDAddBaseY ind (BDBaseYPop x) -> - Just $ BDBaseYPop (BDAddBaseY ind x) - -- prior floating in - BDAnnotationPrior annKey1 (BDPar ind line indented) -> - Just $ BDPar ind (BDAnnotationPrior annKey1 line) indented - BDAnnotationPrior annKey1 (BDSeq (l:lr)) -> - Just $ BDSeq ((BDAnnotationPrior annKey1 l):lr) - BDAnnotationPrior annKey1 (BDLines (l:lr)) -> - Just $ BDLines ((BDAnnotationPrior annKey1 l):lr) - BDAnnotationPrior annKey1 (BDCols sig (l:lr)) -> - Just $ BDCols sig ((BDAnnotationPrior annKey1 l):lr) - -- EnsureIndent float-in - -- BDEnsureIndent indent (BDCols sig (col:colr)) -> - -- Just $ BDCols sig (BDEnsureIndent indent col : (BDAddBaseY indent <$> colr)) - -- not sure if the following rule is necessary; tests currently are - -- unaffected. - -- BDEnsureIndent indent (BDLines lines) -> - -- Just $ BDLines $ BDEnsureIndent indent <$> lines - -- post floating in - BDAnnotationRest annKey1 (BDPar ind line indented) -> - Just $ BDPar ind line $ BDAnnotationRest annKey1 indented - BDAnnotationRest annKey1 (BDSeq list) -> - Just $ BDSeq $ List.init list ++ [BDAnnotationRest annKey1 $ List.last list] - BDAnnotationRest annKey1 (BDLines list) -> - Just $ BDLines $ List.init list ++ [BDAnnotationRest annKey1 $ List.last list] - BDAnnotationRest annKey1 (BDCols sig cols) -> - Just $ BDCols sig $ List.init cols ++ [BDAnnotationRest annKey1 $ List.last cols] - _ -> Nothing + where + descendPrior = transformDownMay $ \case + -- prior floating in + BDAnnotationPrior annKey1 (BDPar ind line indented) -> + Just $ BDPar ind (BDAnnotationPrior annKey1 line) indented + BDAnnotationPrior annKey1 (BDSeq (l : lr)) -> + Just $ BDSeq (BDAnnotationPrior annKey1 l : lr) + BDAnnotationPrior annKey1 (BDLines (l : lr)) -> + Just $ BDLines (BDAnnotationPrior annKey1 l : lr) + BDAnnotationPrior annKey1 (BDCols sig (l : lr)) -> + Just $ BDCols sig (BDAnnotationPrior annKey1 l : lr) + BDAnnotationPrior annKey1 (BDAddBaseY indent x) -> + Just $ BDAddBaseY indent $ BDAnnotationPrior annKey1 x + BDAnnotationPrior annKey1 (BDDebug s x) -> + Just $ BDDebug s $ BDAnnotationPrior annKey1 x + _ -> Nothing + descendRest = transformDownMay $ \case + -- post floating in + BDAnnotationRest annKey1 (BDPar ind line indented) -> + Just $ BDPar ind line $ BDAnnotationRest annKey1 indented + BDAnnotationRest annKey1 (BDSeq list) -> + Just + $ BDSeq + $ List.init list + ++ [BDAnnotationRest annKey1 $ List.last list] + BDAnnotationRest annKey1 (BDLines list) -> + Just + $ BDLines + $ List.init list + ++ [BDAnnotationRest annKey1 $ List.last list] + BDAnnotationRest annKey1 (BDCols sig cols) -> + Just + $ BDCols sig + $ List.init cols + ++ [BDAnnotationRest annKey1 $ List.last cols] + BDAnnotationRest annKey1 (BDAddBaseY indent x) -> + Just $ BDAddBaseY indent $ BDAnnotationRest annKey1 x + BDAnnotationRest annKey1 (BDDebug s x) -> + Just $ BDDebug s $ BDAnnotationRest annKey1 x + _ -> Nothing + descendKW = transformDownMay $ \case + -- post floating in + BDAnnotationKW annKey1 kw (BDPar ind line indented) -> + Just $ BDPar ind line $ BDAnnotationKW annKey1 kw indented + BDAnnotationKW annKey1 kw (BDSeq list) -> + Just + $ BDSeq + $ List.init list + ++ [BDAnnotationKW annKey1 kw $ List.last list] + BDAnnotationKW annKey1 kw (BDLines list) -> + Just + $ BDLines + $ List.init list + ++ [BDAnnotationKW annKey1 kw $ List.last list] + BDAnnotationKW annKey1 kw (BDCols sig cols) -> + Just + $ BDCols sig + $ List.init cols + ++ [BDAnnotationKW annKey1 kw $ List.last cols] + BDAnnotationKW annKey1 kw (BDAddBaseY indent x) -> + Just $ BDAddBaseY indent $ BDAnnotationKW annKey1 kw x + BDAnnotationKW annKey1 kw (BDDebug s x) -> + Just $ BDDebug s $ BDAnnotationKW annKey1 kw x + _ -> Nothing + descendBYPush = transformDownMay $ \case + BDBaseYPushCur (BDCols sig cols@(_ : _)) -> + Just $ BDCols sig (BDBaseYPushCur (List.head cols) : List.tail cols) + BDBaseYPushCur (BDDebug s x) -> Just $ BDDebug s (BDBaseYPushCur x) + _ -> Nothing + descendBYPop = transformDownMay $ \case + BDBaseYPop (BDCols sig cols@(_ : _)) -> + Just $ BDCols sig (List.init cols ++ [BDBaseYPop (List.last cols)]) + BDBaseYPop (BDDebug s x) -> Just $ BDDebug s (BDBaseYPop x) + _ -> Nothing + descendILPush = transformDownMay $ \case + BDIndentLevelPushCur (BDCols sig cols@(_ : _)) -> Just + $ BDCols sig (BDIndentLevelPushCur (List.head cols) : List.tail cols) + BDIndentLevelPushCur (BDDebug s x) -> + Just $ BDDebug s (BDIndentLevelPushCur x) + _ -> Nothing + descendILPop = transformDownMay $ \case + BDIndentLevelPop (BDCols sig cols@(_ : _)) -> + Just $ BDCols sig (List.init cols ++ [BDIndentLevelPop (List.last cols)]) + BDIndentLevelPop (BDDebug s x) -> Just $ BDDebug s (BDIndentLevelPop x) + _ -> Nothing + descendAddB = transformDownMay $ \case + BDAddBaseY BrIndentNone x -> Just x + -- AddIndent floats into Lines. + BDAddBaseY indent (BDLines lines) -> + Just $ BDLines $ BDAddBaseY indent <$> lines + -- AddIndent floats into last column + BDAddBaseY indent (BDCols sig cols) -> + Just + $ BDCols sig + $ List.init cols + ++ [BDAddBaseY indent $ List.last cols] + -- merge AddIndent and Par + BDAddBaseY ind1 (BDPar ind2 line indented) -> + Just $ BDPar (mergeIndents ind1 ind2) line indented + BDAddBaseY ind (BDAnnotationPrior annKey1 x) -> + Just $ BDAnnotationPrior annKey1 (BDAddBaseY ind x) + BDAddBaseY ind (BDAnnotationRest annKey1 x) -> + Just $ BDAnnotationRest annKey1 (BDAddBaseY ind x) + BDAddBaseY ind (BDAnnotationKW annKey1 kw x) -> + Just $ BDAnnotationKW annKey1 kw (BDAddBaseY ind x) + BDAddBaseY ind (BDSeq list) -> + Just $ BDSeq $ List.init list ++ [BDAddBaseY ind (List.last list)] + BDAddBaseY _ lit@BDLit{} -> Just $ lit + BDAddBaseY ind (BDBaseYPushCur x) -> + Just $ BDBaseYPushCur (BDAddBaseY ind x) + BDAddBaseY ind (BDBaseYPop x) -> Just $ BDBaseYPop (BDAddBaseY ind x) + BDAddBaseY ind (BDDebug s x) -> Just $ BDDebug s (BDAddBaseY ind x) + BDAddBaseY ind (BDIndentLevelPop x) -> + Just $ BDIndentLevelPop (BDAddBaseY ind x) + BDAddBaseY ind (BDIndentLevelPushCur x) -> + Just $ BDIndentLevelPushCur (BDAddBaseY ind x) + BDAddBaseY ind (BDEnsureIndent ind2 x) -> + Just $ BDEnsureIndent (mergeIndents ind ind2) x + _ -> Nothing + stepBO :: BriDoc -> BriDoc + stepBO = -- traceFunctionWith "stepBO" (show . briDocToDocWithAnns) (show . briDocToDocWithAnns) $ + transformUp f + where + f = \case + x@BDAnnotationPrior{} -> descendPrior x + x@BDAnnotationKW{} -> descendKW x + x@BDAnnotationRest{} -> descendRest x + x@BDAddBaseY{} -> descendAddB x + x@BDBaseYPushCur{} -> descendBYPush x + x@BDBaseYPop{} -> descendBYPop x + x@BDIndentLevelPushCur{} -> descendILPush x + x@BDIndentLevelPop{} -> descendILPop x + x -> x + stepFull = -- traceFunctionWith "stepFull" (show . briDocToDocWithAnns) (show . briDocToDocWithAnns) $ + Uniplate.rewrite $ \case + BDAddBaseY BrIndentNone x -> Just $ x + -- AddIndent floats into Lines. + BDAddBaseY indent (BDLines lines) -> + Just $ BDLines $ BDAddBaseY indent <$> lines + -- AddIndent floats into last column + BDAddBaseY indent (BDCols sig cols) -> + Just + $ BDCols sig + $ List.init cols + ++ [BDAddBaseY indent $ List.last cols] + BDAddBaseY ind (BDSeq list) -> + Just $ BDSeq $ List.init list ++ [BDAddBaseY ind (List.last list)] + -- merge AddIndent and Par + BDAddBaseY ind1 (BDPar ind2 line indented) -> + Just $ BDPar (mergeIndents ind1 ind2) line indented + BDAddBaseY _ lit@BDLit{} -> Just $ lit + BDAddBaseY ind (BDBaseYPushCur x) -> + Just $ BDBaseYPushCur (BDAddBaseY ind x) + BDAddBaseY ind (BDBaseYPop x) -> Just $ BDBaseYPop (BDAddBaseY ind x) + -- prior floating in + BDAnnotationPrior annKey1 (BDPar ind line indented) -> + Just $ BDPar ind (BDAnnotationPrior annKey1 line) indented + BDAnnotationPrior annKey1 (BDSeq (l : lr)) -> + Just $ BDSeq ((BDAnnotationPrior annKey1 l) : lr) + BDAnnotationPrior annKey1 (BDLines (l : lr)) -> + Just $ BDLines ((BDAnnotationPrior annKey1 l) : lr) + BDAnnotationPrior annKey1 (BDCols sig (l : lr)) -> + Just $ BDCols sig ((BDAnnotationPrior annKey1 l) : lr) + -- EnsureIndent float-in + -- BDEnsureIndent indent (BDCols sig (col:colr)) -> + -- Just $ BDCols sig (BDEnsureIndent indent col : (BDAddBaseY indent <$> colr)) + -- not sure if the following rule is necessary; tests currently are + -- unaffected. + -- BDEnsureIndent indent (BDLines lines) -> + -- Just $ BDLines $ BDEnsureIndent indent <$> lines + -- post floating in + BDAnnotationRest annKey1 (BDPar ind line indented) -> + Just $ BDPar ind line $ BDAnnotationRest annKey1 indented + BDAnnotationRest annKey1 (BDSeq list) -> + Just + $ BDSeq + $ List.init list + ++ [BDAnnotationRest annKey1 $ List.last list] + BDAnnotationRest annKey1 (BDLines list) -> + Just + $ BDLines + $ List.init list + ++ [BDAnnotationRest annKey1 $ List.last list] + BDAnnotationRest annKey1 (BDCols sig cols) -> + Just + $ BDCols sig + $ List.init cols + ++ [BDAnnotationRest annKey1 $ List.last cols] + _ -> Nothing diff --git a/source/library/Language/Haskell/Brittany/Internal/Transformations/Indent.hs b/source/library/Language/Haskell/Brittany/Internal/Transformations/Indent.hs index 7f7d7e5..9596e5b 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Transformations/Indent.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Transformations/Indent.hs @@ -3,16 +3,10 @@ module Language.Haskell.Brittany.Internal.Transformations.Indent where - - -import Language.Haskell.Brittany.Internal.Prelude -import qualified GHC.OldList as List - -import Language.Haskell.Brittany.Internal.Types - import qualified Data.Generics.Uniplate.Direct as Uniplate - - +import qualified GHC.OldList as List +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.Types -- prepare layouting by translating BDPar's, replacing them with Indents and -- floating those in. This gives a more clear picture of what exactly is @@ -31,15 +25,17 @@ transformSimplifyIndent = Uniplate.rewrite $ \case -- [ BDAddBaseY ind x -- , BDEnsureIndent ind indented -- ] - BDLines lines | any ( \case - BDLines{} -> True - BDEmpty{} -> True - _ -> False - ) - lines -> - Just $ BDLines $ filter isNotEmpty $ lines >>= \case + BDLines lines + | any + (\case + BDLines{} -> True + BDEmpty{} -> True + _ -> False + ) + lines + -> Just $ BDLines $ filter isNotEmpty $ lines >>= \case BDLines l -> l - x -> [x] + x -> [x] BDLines [l] -> Just l BDAddBaseY i (BDAnnotationPrior k x) -> Just $ BDAnnotationPrior k (BDAddBaseY i x) @@ -53,4 +49,4 @@ transformSimplifyIndent = Uniplate.rewrite $ \case Just $ BDCols sig $ List.init l ++ [BDAddBaseY i $ List.last l] BDAddBaseY _ lit@BDLit{} -> Just lit - _ -> Nothing + _ -> Nothing diff --git a/source/library/Language/Haskell/Brittany/Internal/Transformations/Par.hs b/source/library/Language/Haskell/Brittany/Internal/Transformations/Par.hs index 305ee08..7fb4aff 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Transformations/Par.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Transformations/Par.hs @@ -3,14 +3,9 @@ module Language.Haskell.Brittany.Internal.Transformations.Par where - - import Language.Haskell.Brittany.Internal.Prelude - -import Language.Haskell.Brittany.Internal.Utils -import Language.Haskell.Brittany.Internal.Types - - +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.Utils transformSimplifyPar :: BriDoc -> BriDoc transformSimplifyPar = transformUp $ \case @@ -24,25 +19,28 @@ transformSimplifyPar = transformUp $ \case BDPar ind1 line (BDLines (BDEnsureIndent ind2 p1 : indenteds)) BDPar ind1 (BDPar ind2 line p1) p2 -> BDPar ind1 line (BDLines [BDEnsureIndent ind2 p1, p2]) - BDLines lines | any ( \case - BDLines{} -> True - BDEmpty{} -> True - _ -> False - ) - lines -> case go lines of - [] -> BDEmpty - [x] -> x - xs -> BDLines xs + BDLines lines + | any + (\case + BDLines{} -> True + BDEmpty{} -> True + _ -> False + ) + lines + -> case go lines of + [] -> BDEmpty + [x] -> x + xs -> BDLines xs where go = (=<<) $ \case BDLines l -> go l - BDEmpty -> [] - x -> [x] - BDLines [] -> BDEmpty - BDLines [x] -> x + BDEmpty -> [] + x -> [x] + BDLines [] -> BDEmpty + BDLines [x] -> x -- BDCols sig cols | BDPar ind line indented <- List.last cols -> -- Just $ BDPar ind (BDCols sig (List.init cols ++ [line])) indented -- BDPar BrIndentNone line indented -> -- Just $ BDLines [line, indented] BDEnsureIndent BrIndentNone x -> x - x -> x + x -> x diff --git a/source/library/Language/Haskell/Brittany/Internal/Types.hs b/source/library/Language/Haskell/Brittany/Internal/Types.hs index 76b7735..41d809b 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Types.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Types.hs @@ -12,31 +12,20 @@ module Language.Haskell.Brittany.Internal.Types where - - -import Language.Haskell.Brittany.Internal.Prelude import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS import qualified Data.Data -import qualified Data.Strict.Maybe as Strict -import qualified Safe - -import qualified Language.Haskell.GHC.ExactPrint as ExactPrint -import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types - -import qualified Data.Text.Lazy.Builder as Text.Builder - -import GHC ( Located, GenLocated, AnnKeywordId, SrcSpan ) - -import Language.Haskell.GHC.ExactPrint ( AnnKey ) -import Language.Haskell.GHC.ExactPrint.Types ( Anns ) - -import Language.Haskell.Brittany.Internal.Config.Types - -import Data.Generics.Uniplate.Direct as Uniplate - +import Data.Generics.Uniplate.Direct as Uniplate import qualified Data.Kind as Kind - - +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text.Lazy.Builder as Text.Builder +import GHC (AnnKeywordId, GenLocated, Located, SrcSpan) +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Prelude +import qualified Language.Haskell.GHC.ExactPrint as ExactPrint +import Language.Haskell.GHC.ExactPrint (AnnKey) +import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types +import Language.Haskell.GHC.ExactPrint.Types (Anns) +import qualified Safe data PerItemConfig = PerItemConfig { _icd_perBinding :: Map String (CConfig Maybe) @@ -44,20 +33,26 @@ data PerItemConfig = PerItemConfig } deriving Data.Data.Data -type PPM = MultiRWSS.MultiRWS - '[Map ExactPrint.AnnKey ExactPrint.Anns, PerItemConfig, Config, ExactPrint.Anns] - '[Text.Builder.Builder, [BrittanyError], Seq String] - '[] +type PPM + = MultiRWSS.MultiRWS + '[ Map ExactPrint.AnnKey ExactPrint.Anns + , PerItemConfig + , Config + , ExactPrint.Anns + ] + '[Text.Builder.Builder , [BrittanyError] , Seq String] + '[] -type PPMLocal = MultiRWSS.MultiRWS - '[Config, ExactPrint.Anns] - '[Text.Builder.Builder, [BrittanyError], Seq String] - '[] +type PPMLocal + = MultiRWSS.MultiRWS + '[Config , ExactPrint.Anns] + '[Text.Builder.Builder , [BrittanyError] , Seq String] + '[] newtype TopLevelDeclNameMap = TopLevelDeclNameMap (Map ExactPrint.AnnKey String) data LayoutState = LayoutState - { _lstate_baseYs :: [Int] + { _lstate_baseYs :: [Int] -- ^ stack of number of current indentation columns -- (not number of indentations). , _lstate_curYOrAddNewline :: Either Int Int @@ -65,7 +60,7 @@ data LayoutState = LayoutState -- 1) number of chars in the current line. -- 2) number of newlines to be inserted before inserting any -- non-space elements. - , _lstate_indLevels :: [Int] + , _lstate_indLevels :: [Int] -- ^ stack of current indentation levels. set for -- any layout-affected elements such as -- let/do/case/where elements. @@ -78,14 +73,14 @@ data LayoutState = LayoutState -- on the first indented element have an -- annotation offset relative to the last -- non-indented element, which is confusing. - , _lstate_comments :: Anns - , _lstate_commentCol :: Maybe Int -- this communicates two things: + , _lstate_comments :: Anns + , _lstate_commentCol :: Maybe Int -- this communicates two things: -- firstly, that cursor is currently -- at the end of a comment (so needs -- newline before any actual content). -- secondly, the column at which -- insertion of comments started. - , _lstate_addSepSpace :: Maybe Int -- number of spaces to insert if anyone + , _lstate_addSepSpace :: Maybe Int -- number of spaces to insert if anyone -- writes (any non-spaces) in the -- current line. -- , _lstate_isNewline :: NewLineState @@ -115,14 +110,21 @@ lstate_indLevel = Safe.headNote "lstate_baseY" . _lstate_indLevels instance Show LayoutState where show state = "LayoutState" - ++ "{baseYs=" ++ show (_lstate_baseYs state) - ++ ",curYOrAddNewline=" ++ show (_lstate_curYOrAddNewline state) - ++ ",indLevels=" ++ show (_lstate_indLevels state) - ++ ",indLevelLinger=" ++ show (_lstate_indLevelLinger state) - ++ ",commentCol=" ++ show (_lstate_commentCol state) - ++ ",addSepSpace=" ++ show (_lstate_addSepSpace state) - ++ ",commentNewlines=" ++ show (_lstate_commentNewlines state) - ++ "}" + ++ "{baseYs=" + ++ show (_lstate_baseYs state) + ++ ",curYOrAddNewline=" + ++ show (_lstate_curYOrAddNewline state) + ++ ",indLevels=" + ++ show (_lstate_indLevels state) + ++ ",indLevelLinger=" + ++ show (_lstate_indLevelLinger state) + ++ ",commentCol=" + ++ show (_lstate_commentCol state) + ++ ",addSepSpace=" + ++ show (_lstate_addSepSpace state) + ++ ",commentNewlines=" + ++ show (_lstate_commentNewlines state) + ++ "}" -- data NewLineState = NewLineStateInit -- initial state. we do not know if in a -- -- newline, really. by special-casing @@ -223,14 +225,16 @@ data BrIndent = BrIndentNone | BrIndentSpecial Int deriving (Eq, Ord, Data.Data.Data, Show) -type ToBriDocM = MultiRWSS.MultiRWS - '[Config, Anns] -- reader - '[[BrittanyError], Seq String] -- writer - '[NodeAllocIndex] -- state +type ToBriDocM + = MultiRWSS.MultiRWS + '[Config , Anns] -- reader + '[[BrittanyError] , Seq String] -- writer + '[NodeAllocIndex] -- state -type ToBriDoc (sym :: Kind.Type -> Kind.Type) = Located (sym GhcPs) -> ToBriDocM BriDocNumbered -type ToBriDoc' sym = Located sym -> ToBriDocM BriDocNumbered -type ToBriDocC sym c = Located sym -> ToBriDocM c +type ToBriDoc (sym :: Kind.Type -> Kind.Type) + = Located (sym GhcPs) -> ToBriDocM BriDocNumbered +type ToBriDoc' sym = Located sym -> ToBriDocM BriDocNumbered +type ToBriDocC sym c = Located sym -> ToBriDocM c data DocMultiLine = MultiLineNo @@ -338,21 +342,21 @@ type BriDocFInt = BriDocF ((,) Int) type BriDocNumbered = (Int, BriDocFInt) instance Uniplate.Uniplate BriDoc where - uniplate x@BDEmpty{} = plate x - uniplate x@BDLit{} = plate x - uniplate (BDSeq list ) = plate BDSeq ||* list - uniplate (BDCols sig list) = plate BDCols |- sig ||* list - uniplate x@BDSeparator = plate x - uniplate (BDAddBaseY ind bd ) = plate BDAddBaseY |- ind |* bd - uniplate (BDBaseYPushCur bd) = plate BDBaseYPushCur |* bd - uniplate (BDBaseYPop bd) = plate BDBaseYPop |* bd + uniplate x@BDEmpty{} = plate x + uniplate x@BDLit{} = plate x + uniplate (BDSeq list) = plate BDSeq ||* list + uniplate (BDCols sig list) = plate BDCols |- sig ||* list + uniplate x@BDSeparator = plate x + uniplate (BDAddBaseY ind bd) = plate BDAddBaseY |- ind |* bd + uniplate (BDBaseYPushCur bd) = plate BDBaseYPushCur |* bd + uniplate (BDBaseYPop bd) = plate BDBaseYPop |* bd uniplate (BDIndentLevelPushCur bd) = plate BDIndentLevelPushCur |* bd - uniplate (BDIndentLevelPop bd) = plate BDIndentLevelPop |* bd + uniplate (BDIndentLevelPop bd) = plate BDIndentLevelPop |* bd uniplate (BDPar ind line indented) = plate BDPar |- ind |* line |* indented - uniplate (BDAlt alts ) = plate BDAlt ||* alts - uniplate (BDForwardLineMode bd ) = plate BDForwardLineMode |* bd - uniplate x@BDExternal{} = plate x - uniplate x@BDPlain{} = plate x + uniplate (BDAlt alts) = plate BDAlt ||* alts + uniplate (BDForwardLineMode bd) = plate BDForwardLineMode |* bd + uniplate x@BDExternal{} = plate x + uniplate x@BDPlain{} = plate x uniplate (BDAnnotationPrior annKey bd) = plate BDAnnotationPrior |- annKey |* bd uniplate (BDAnnotationKW annKey kw bd) = @@ -361,83 +365,84 @@ instance Uniplate.Uniplate BriDoc where plate BDAnnotationRest |- annKey |* bd uniplate (BDMoveToKWDP annKey kw b bd) = plate BDMoveToKWDP |- annKey |- kw |- b |* bd - uniplate (BDLines lines ) = plate BDLines ||* lines - uniplate (BDEnsureIndent ind bd ) = plate BDEnsureIndent |- ind |* bd - uniplate (BDForceMultiline bd ) = plate BDForceMultiline |* bd - uniplate (BDForceSingleline bd ) = plate BDForceSingleline |* bd + uniplate (BDLines lines) = plate BDLines ||* lines + uniplate (BDEnsureIndent ind bd) = plate BDEnsureIndent |- ind |* bd + uniplate (BDForceMultiline bd) = plate BDForceMultiline |* bd + uniplate (BDForceSingleline bd) = plate BDForceSingleline |* bd uniplate (BDNonBottomSpacing b bd) = plate BDNonBottomSpacing |- b |* bd - uniplate (BDSetParSpacing bd ) = plate BDSetParSpacing |* bd - uniplate (BDForceParSpacing bd ) = plate BDForceParSpacing |* bd - uniplate (BDDebug s bd ) = plate BDDebug |- s |* bd + uniplate (BDSetParSpacing bd) = plate BDSetParSpacing |* bd + uniplate (BDForceParSpacing bd) = plate BDForceParSpacing |* bd + uniplate (BDDebug s bd) = plate BDDebug |- s |* bd newtype NodeAllocIndex = NodeAllocIndex Int -- TODO: rename to "dropLabels" ? unwrapBriDocNumbered :: BriDocNumbered -> BriDoc unwrapBriDocNumbered tpl = case snd tpl of - BDFEmpty -> BDEmpty - BDFLit t -> BDLit t - BDFSeq list -> BDSeq $ rec <$> list - BDFCols sig list -> BDCols sig $ rec <$> list - BDFSeparator -> BDSeparator - BDFAddBaseY ind bd -> BDAddBaseY ind $ rec bd - BDFBaseYPushCur bd -> BDBaseYPushCur $ rec bd - BDFBaseYPop bd -> BDBaseYPop $ rec bd - BDFIndentLevelPushCur bd -> BDIndentLevelPushCur $ rec bd - BDFIndentLevelPop bd -> BDIndentLevelPop $ rec bd - BDFPar ind line indented -> BDPar ind (rec line) (rec indented) - BDFAlt alts -> BDAlt $ rec <$> alts -- not that this will happen - BDFForwardLineMode bd -> BDForwardLineMode $ rec bd - BDFExternal k ks c t -> BDExternal k ks c t - BDFPlain t -> BDPlain t + BDFEmpty -> BDEmpty + BDFLit t -> BDLit t + BDFSeq list -> BDSeq $ rec <$> list + BDFCols sig list -> BDCols sig $ rec <$> list + BDFSeparator -> BDSeparator + BDFAddBaseY ind bd -> BDAddBaseY ind $ rec bd + BDFBaseYPushCur bd -> BDBaseYPushCur $ rec bd + BDFBaseYPop bd -> BDBaseYPop $ rec bd + BDFIndentLevelPushCur bd -> BDIndentLevelPushCur $ rec bd + BDFIndentLevelPop bd -> BDIndentLevelPop $ rec bd + BDFPar ind line indented -> BDPar ind (rec line) (rec indented) + BDFAlt alts -> BDAlt $ rec <$> alts -- not that this will happen + BDFForwardLineMode bd -> BDForwardLineMode $ rec bd + BDFExternal k ks c t -> BDExternal k ks c t + BDFPlain t -> BDPlain t BDFAnnotationPrior annKey bd -> BDAnnotationPrior annKey $ rec bd BDFAnnotationKW annKey kw bd -> BDAnnotationKW annKey kw $ rec bd - BDFAnnotationRest annKey bd -> BDAnnotationRest annKey $ rec bd + BDFAnnotationRest annKey bd -> BDAnnotationRest annKey $ rec bd BDFMoveToKWDP annKey kw b bd -> BDMoveToKWDP annKey kw b $ rec bd - BDFLines lines -> BDLines $ rec <$> lines - BDFEnsureIndent ind bd -> BDEnsureIndent ind $ rec bd - BDFForceMultiline bd -> BDForceMultiline $ rec bd - BDFForceSingleline bd -> BDForceSingleline $ rec bd - BDFNonBottomSpacing b bd -> BDNonBottomSpacing b $ rec bd - BDFSetParSpacing bd -> BDSetParSpacing $ rec bd - BDFForceParSpacing bd -> BDForceParSpacing $ rec bd - BDFDebug s bd -> BDDebug (s ++ "@" ++ show (fst tpl)) $ rec bd + BDFLines lines -> BDLines $ rec <$> lines + BDFEnsureIndent ind bd -> BDEnsureIndent ind $ rec bd + BDFForceMultiline bd -> BDForceMultiline $ rec bd + BDFForceSingleline bd -> BDForceSingleline $ rec bd + BDFNonBottomSpacing b bd -> BDNonBottomSpacing b $ rec bd + BDFSetParSpacing bd -> BDSetParSpacing $ rec bd + BDFForceParSpacing bd -> BDForceParSpacing $ rec bd + BDFDebug s bd -> BDDebug (s ++ "@" ++ show (fst tpl)) $ rec bd where rec = unwrapBriDocNumbered isNotEmpty :: BriDoc -> Bool isNotEmpty BDEmpty = False -isNotEmpty _ = True +isNotEmpty _ = True -- this might not work. is not used anywhere either. briDocSeqSpine :: BriDoc -> () briDocSeqSpine = \case - BDEmpty -> () - BDLit _t -> () - BDSeq list -> foldl' ((briDocSeqSpine .) . seq) () list - BDCols _sig list -> foldl' ((briDocSeqSpine .) . seq) () list - BDSeparator -> () - BDAddBaseY _ind bd -> briDocSeqSpine bd - BDBaseYPushCur bd -> briDocSeqSpine bd - BDBaseYPop bd -> briDocSeqSpine bd - BDIndentLevelPushCur bd -> briDocSeqSpine bd - BDIndentLevelPop bd -> briDocSeqSpine bd - BDPar _ind line indented -> briDocSeqSpine line `seq` briDocSeqSpine indented - BDAlt alts -> foldl' (\() -> briDocSeqSpine) () alts - BDForwardLineMode bd -> briDocSeqSpine bd - BDExternal{} -> () - BDPlain{} -> () - BDAnnotationPrior _annKey bd -> briDocSeqSpine bd - BDAnnotationKW _annKey _kw bd -> briDocSeqSpine bd - BDAnnotationRest _annKey bd -> briDocSeqSpine bd + BDEmpty -> () + BDLit _t -> () + BDSeq list -> foldl' ((briDocSeqSpine .) . seq) () list + BDCols _sig list -> foldl' ((briDocSeqSpine .) . seq) () list + BDSeparator -> () + BDAddBaseY _ind bd -> briDocSeqSpine bd + BDBaseYPushCur bd -> briDocSeqSpine bd + BDBaseYPop bd -> briDocSeqSpine bd + BDIndentLevelPushCur bd -> briDocSeqSpine bd + BDIndentLevelPop bd -> briDocSeqSpine bd + BDPar _ind line indented -> + briDocSeqSpine line `seq` briDocSeqSpine indented + BDAlt alts -> foldl' (\() -> briDocSeqSpine) () alts + BDForwardLineMode bd -> briDocSeqSpine bd + BDExternal{} -> () + BDPlain{} -> () + BDAnnotationPrior _annKey bd -> briDocSeqSpine bd + BDAnnotationKW _annKey _kw bd -> briDocSeqSpine bd + BDAnnotationRest _annKey bd -> briDocSeqSpine bd BDMoveToKWDP _annKey _kw _b bd -> briDocSeqSpine bd - BDLines lines -> foldl' (\() -> briDocSeqSpine) () lines - BDEnsureIndent _ind bd -> briDocSeqSpine bd - BDForceMultiline bd -> briDocSeqSpine bd - BDForceSingleline bd -> briDocSeqSpine bd - BDNonBottomSpacing _ bd -> briDocSeqSpine bd - BDSetParSpacing bd -> briDocSeqSpine bd - BDForceParSpacing bd -> briDocSeqSpine bd - BDDebug _s bd -> briDocSeqSpine bd + BDLines lines -> foldl' (\() -> briDocSeqSpine) () lines + BDEnsureIndent _ind bd -> briDocSeqSpine bd + BDForceMultiline bd -> briDocSeqSpine bd + BDForceSingleline bd -> briDocSeqSpine bd + BDNonBottomSpacing _ bd -> briDocSeqSpine bd + BDSetParSpacing bd -> briDocSeqSpine bd + BDForceParSpacing bd -> briDocSeqSpine bd + BDDebug _s bd -> briDocSeqSpine bd briDocForceSpine :: BriDoc -> BriDoc briDocForceSpine bd = briDocSeqSpine bd `seq` bd @@ -456,18 +461,19 @@ data VerticalSpacingPar -- product like (Normal|Always, None|Some Int). deriving (Eq, Show) -data VerticalSpacing - = VerticalSpacing - { _vs_sameLine :: !Int - , _vs_paragraph :: !VerticalSpacingPar - , _vs_parFlag :: !Bool - } +data VerticalSpacing = VerticalSpacing + { _vs_sameLine :: !Int + , _vs_paragraph :: !VerticalSpacingPar + , _vs_parFlag :: !Bool + } deriving (Eq, Show) newtype LineModeValidity a = LineModeValidity (Strict.Maybe a) deriving (Functor, Applicative, Monad, Show, Alternative) -pattern LineModeValid :: forall t. t -> LineModeValidity t -pattern LineModeValid x = LineModeValidity (Strict.Just x) :: LineModeValidity t -pattern LineModeInvalid :: forall t. LineModeValidity t -pattern LineModeInvalid = LineModeValidity Strict.Nothing :: LineModeValidity t +pattern LineModeValid :: forall t . t -> LineModeValidity t +pattern LineModeValid x = + LineModeValidity (Strict.Just x) :: LineModeValidity t +pattern LineModeInvalid :: forall t . LineModeValidity t +pattern LineModeInvalid = + LineModeValidity Strict.Nothing :: LineModeValidity t diff --git a/source/library/Language/Haskell/Brittany/Internal/Utils.hs b/source/library/Language/Haskell/Brittany/Internal/Utils.hs index a12f7ea..a52caa4 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Utils.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Utils.hs @@ -7,40 +7,29 @@ module Language.Haskell.Brittany.Internal.Utils where - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Data.ByteString as B import qualified Data.Coerce +import Data.Data +import Data.Generics.Aliases +import qualified Data.Generics.Uniplate.Direct as Uniplate import qualified Data.Semigroup as Semigroup import qualified Data.Sequence as Seq +import DataTreePrint +import qualified GHC.Data.FastString as GHC +import qualified GHC.Driver.Session as GHC +import qualified GHC.Hs.Extension as HsExtension import qualified GHC.OldList as List - +import GHC.Types.Name.Occurrence as OccName (occNameString) +import qualified GHC.Types.SrcLoc as GHC +import qualified GHC.Utils.Outputable as GHC +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Types import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types import qualified Language.Haskell.GHC.ExactPrint.Utils as ExactPrint.Utils - -import Data.Data -import Data.Generics.Aliases - import qualified Text.PrettyPrint as PP -import qualified GHC.Utils.Outputable as GHC -import qualified GHC.Driver.Session as GHC -import qualified GHC.Data.FastString as GHC -import qualified GHC.Types.SrcLoc as GHC -import GHC.Types.Name.Occurrence as OccName ( occNameString ) -import qualified Data.ByteString as B - -import DataTreePrint - -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Types - -import qualified Data.Generics.Uniplate.Direct as Uniplate -import qualified GHC.Hs.Extension as HsExtension - - - parDoc :: String -> PP.Doc parDoc = PP.fsep . fmap PP.text . List.words @@ -55,7 +44,8 @@ showOutputable :: (GHC.Outputable a) => a -> String showOutputable = GHC.showPpr GHC.unsafeGlobalDynFlags fromMaybeIdentity :: Identity a -> Maybe a -> Identity a -fromMaybeIdentity x y = Data.Coerce.coerce $ fromMaybe (Data.Coerce.coerce x) y +fromMaybeIdentity x y = + Data.Coerce.coerce $ fromMaybe (Data.Coerce.coerce x) y fromOptionIdentity :: Identity a -> Maybe a -> Identity a fromOptionIdentity x y = @@ -70,24 +60,26 @@ instance (Num a, Ord a) => Semigroup (Max a) where (<>) = Data.Coerce.coerce (max :: a -> a -> a) instance (Num a, Ord a) => Monoid (Max a) where - mempty = Max 0 + mempty = Max 0 mappend = (<>) newtype ShowIsId = ShowIsId String deriving Data -instance Show ShowIsId where show (ShowIsId x) = x +instance Show ShowIsId where + show (ShowIsId x) = x -data A x = A ShowIsId x deriving Data +data A x = A ShowIsId x + deriving Data customLayouterF :: ExactPrint.Types.Anns -> LayouterF customLayouterF anns layoutF = DataToLayouter - $ f - `extQ` showIsId - `extQ` fastString - `extQ` bytestring - `extQ` occName - `extQ` srcSpan + $ f + `extQ` showIsId + `extQ` fastString + `extQ` bytestring + `extQ` occName + `extQ` srcSpan `ext2Q` located where DataToLayouter f = defaultLayouterF layoutF @@ -95,18 +87,22 @@ customLayouterF anns layoutF = simpleLayouter s = NodeLayouter (length s) False (const $ PP.text s) showIsId :: ShowIsId -> NodeLayouter showIsId (ShowIsId s) = NodeLayouter (length s + 2) True $ \case - Left True -> PP.parens $ PP.text s - Left False -> PP.text s - Right _ -> PP.text s + Left True -> PP.parens $ PP.text s + Left False -> PP.text s + Right _ -> PP.text s fastString = - simpleLayouter . ("{FastString: "++) . (++"}") . show :: GHC.FastString + simpleLayouter . ("{FastString: " ++) . (++ "}") . show :: GHC.FastString -> NodeLayouter bytestring = simpleLayouter . show :: B.ByteString -> NodeLayouter - occName = simpleLayouter . ("{OccName: "++) . (++"}") . OccName.occNameString + occName = + simpleLayouter . ("{OccName: " ++) . (++ "}") . OccName.occNameString srcSpan :: GHC.SrcSpan -> NodeLayouter - srcSpan ss = simpleLayouter + srcSpan ss = + simpleLayouter -- - $ "{"++ showSDoc_ (GHC.ppr ss)++"}" - $ "{" ++ showOutputable ss ++ "}" + $ "{" + ++ showOutputable ss + ++ "}" located :: (Data b, Data loc) => GHC.GenLocated loc b -> NodeLayouter located (GHC.L ss a) = runDataToLayouter layoutF $ A annStr a where @@ -118,12 +114,12 @@ customLayouterF anns layoutF = customLayouterNoAnnsF :: LayouterF customLayouterNoAnnsF layoutF = DataToLayouter - $ f - `extQ` showIsId - `extQ` fastString - `extQ` bytestring - `extQ` occName - `extQ` srcSpan + $ f + `extQ` showIsId + `extQ` fastString + `extQ` bytestring + `extQ` occName + `extQ` srcSpan `ext2Q` located where DataToLayouter f = defaultLayouterF layoutF @@ -131,14 +127,15 @@ customLayouterNoAnnsF layoutF = simpleLayouter s = NodeLayouter (length s) False (const $ PP.text s) showIsId :: ShowIsId -> NodeLayouter showIsId (ShowIsId s) = NodeLayouter (length s + 2) True $ \case - Left True -> PP.parens $ PP.text s - Left False -> PP.text s - Right _ -> PP.text s + Left True -> PP.parens $ PP.text s + Left False -> PP.text s + Right _ -> PP.text s fastString = - simpleLayouter . ("{FastString: "++) . (++"}") . show :: GHC.FastString + simpleLayouter . ("{FastString: " ++) . (++ "}") . show :: GHC.FastString -> NodeLayouter bytestring = simpleLayouter . show :: B.ByteString -> NodeLayouter - occName = simpleLayouter . ("{OccName: "++) . (++"}") . OccName.occNameString + occName = + simpleLayouter . ("{OccName: " ++) . (++ "}") . OccName.occNameString srcSpan :: GHC.SrcSpan -> NodeLayouter srcSpan ss = simpleLayouter $ "{" ++ showSDoc_ (GHC.ppr ss) ++ "}" located :: (Data b) => GHC.GenLocated loc b -> NodeLayouter @@ -202,12 +199,11 @@ traceIfDumpConf s accessor val = do whenM (mAsk <&> _conf_debug .> accessor .> confUnpack) $ do trace ("---- " ++ s ++ " ----\n" ++ show val) $ return () -tellDebugMess :: MonadMultiWriter - (Seq String) m => String -> m () +tellDebugMess :: MonadMultiWriter (Seq String) m => String -> m () tellDebugMess s = mTell $ Seq.singleton s -tellDebugMessShow :: forall a m . (MonadMultiWriter - (Seq String) m, Show a) => a -> m () +tellDebugMessShow + :: forall a m . (MonadMultiWriter (Seq String) m, Show a) => a -> m () tellDebugMessShow = tellDebugMess . show -- i should really put that into multistate.. @@ -222,29 +218,28 @@ briDocToDoc = astToDoc . removeAnnotations where removeAnnotations = Uniplate.transform $ \case BDAnnotationPrior _ x -> x - BDAnnotationKW _ _ x -> x - BDAnnotationRest _ x -> x - x -> x + BDAnnotationKW _ _ x -> x + BDAnnotationRest _ x -> x + x -> x briDocToDocWithAnns :: BriDoc -> PP.Doc briDocToDocWithAnns = astToDoc annsDoc :: ExactPrint.Types.Anns -> PP.Doc -annsDoc = printTreeWithCustom 100 customLayouterNoAnnsF . fmap (ShowIsId . show) +annsDoc = + printTreeWithCustom 100 customLayouterNoAnnsF . fmap (ShowIsId . show) breakEither :: (a -> Either b c) -> [a] -> ([b], [c]) -breakEither _ [] = ([], []) -breakEither fn (a1:aR) = case fn a1 of - Left b -> (b : bs, cs) +breakEither _ [] = ([], []) +breakEither fn (a1 : aR) = case fn a1 of + Left b -> (b : bs, cs) Right c -> (bs, c : cs) - where - (bs, cs) = breakEither fn aR + where (bs, cs) = breakEither fn aR spanMaybe :: (a -> Maybe b) -> [a] -> ([b], [a]) -spanMaybe f (x1:xR) | Just y <- f x1 = (y : ys, xs) - where - (ys, xs) = spanMaybe f xR -spanMaybe _ xs = ([], xs) +spanMaybe f (x1 : xR) | Just y <- f x1 = (y : ys, xs) + where (ys, xs) = spanMaybe f xR +spanMaybe _ xs = ([], xs) data FirstLastView a = FirstLastEmpty @@ -254,7 +249,7 @@ data FirstLastView a splitFirstLast :: [a] -> FirstLastView a splitFirstLast [] = FirstLastEmpty splitFirstLast [x] = FirstLastSingleton x -splitFirstLast (x1:xr) = FirstLast x1 (List.init xr) (List.last xr) +splitFirstLast (x1 : xr) = FirstLast x1 (List.init xr) (List.last xr) -- TODO: move to uniplate upstream? -- aka `transform` @@ -273,7 +268,7 @@ lines' :: String -> [String] lines' s = case break (== '\n') s of (s1, []) -> [s1] (s1, [_]) -> [s1, ""] - (s1, (_:r)) -> s1 : lines' r + (s1, (_ : r)) -> s1 : lines' r absurdExt :: HsExtension.NoExtCon -> a absurdExt = HsExtension.noExtCon diff --git a/source/library/Language/Haskell/Brittany/Main.hs b/source/library/Language/Haskell/Brittany/Main.hs index 87ebe66..7f22f11 100644 --- a/source/library/Language/Haskell/Brittany/Main.hs +++ b/source/library/Language/Haskell/Brittany/Main.hs @@ -4,58 +4,41 @@ module Language.Haskell.Brittany.Main where - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils +import Control.Monad (zipWithM) import qualified Control.Monad.Trans.Except as ExceptT +import Data.CZipWith import qualified Data.Either import qualified Data.List.Extra +import qualified Data.Monoid import qualified Data.Semigroup as Semigroup import qualified Data.Text as Text import qualified Data.Text.IO as Text.IO import qualified Data.Text.Lazy as TextL +import DataTreePrint +import GHC (GenLocated(L)) +import qualified GHC.Driver.Session as GHC +import qualified GHC.LanguageExtensions.Type as GHC import qualified GHC.OldList as List -import qualified System.IO - --- brittany { lconfig_importAsColumn: 60, lconfig_importColumn: 60 } -import qualified Language.Haskell.GHC.ExactPrint as ExactPrint -import qualified Data.Monoid - -import GHC ( GenLocated(L) ) -import GHC.Utils.Outputable ( Outputable(..) - , showSDocUnsafe - ) - -import Text.Read ( Read(..) ) -import qualified Text.ParserCombinators.ReadP as ReadP -import qualified Text.ParserCombinators.ReadPrec as ReadPrec - -import Control.Monad ( zipWithM ) -import Data.CZipWith - -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal -import Language.Haskell.Brittany.Internal.Config -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Utils -import Language.Haskell.Brittany.Internal.Obfuscation - -import qualified Text.PrettyPrint as PP - -import DataTreePrint -import UI.Butcher.Monadic - +import GHC.Utils.Outputable (Outputable(..), showSDocUnsafe) +import Language.Haskell.Brittany.Internal +import Language.Haskell.Brittany.Internal.Config +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Obfuscation +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.Utils +import qualified Language.Haskell.GHC.ExactPrint as ExactPrint +import Paths_brittany +import qualified System.Directory as Directory import qualified System.Exit -import qualified System.Directory as Directory -import qualified System.FilePath.Posix as FilePath - -import qualified GHC.Driver.Session as GHC -import qualified GHC.LanguageExtensions.Type as GHC - -import Paths_brittany - - +import qualified System.FilePath.Posix as FilePath +import qualified System.IO +import qualified Text.ParserCombinators.ReadP as ReadP +import qualified Text.ParserCombinators.ReadPrec as ReadPrec +import qualified Text.PrettyPrint as PP +import Text.Read (Read(..)) +import UI.Butcher.Monadic data WriteMode = Display | Inplace @@ -110,7 +93,7 @@ helpDoc = PP.vcat $ List.intersperse ] , parDoc $ "See https://github.com/lspitzner/brittany" , parDoc - $ "Please report bugs at" + $ "Please report bugs at" ++ " https://github.com/lspitzner/brittany/issues" ] @@ -147,15 +130,16 @@ mainCmdParser helpDesc = do addCmd "license" $ addCmdImpl $ print $ licenseDoc -- addButcherDebugCommand reorderStart - printHelp <- addSimpleBoolFlag "h" ["help"] mempty + printHelp <- addSimpleBoolFlag "h" ["help"] mempty printVersion <- addSimpleBoolFlag "" ["version"] mempty printLicense <- addSimpleBoolFlag "" ["license"] mempty noUserConfig <- addSimpleBoolFlag "" ["no-user-config"] mempty - configPaths <- addFlagStringParams "" - ["config-file"] - "PATH" - (flagHelpStr "path to config file") -- TODO: allow default on addFlagStringParam ? - cmdlineConfig <- cmdlineConfigParser + configPaths <- addFlagStringParams + "" + ["config-file"] + "PATH" + (flagHelpStr "path to config file") -- TODO: allow default on addFlagStringParam ? + cmdlineConfig <- cmdlineConfigParser suppressOutput <- addSimpleBoolFlag "" ["suppress-output"] @@ -181,7 +165,7 @@ mainCmdParser helpDesc = do "" ["write-mode"] "(display|inplace)" - ( flagHelp + (flagHelp (PP.vcat [ PP.text "display: output for any input(s) goes to stdout" , PP.text "inplace: override respective input file (without backup!)" @@ -211,11 +195,13 @@ mainCmdParser helpDesc = do $ ppHelpShallow helpDesc System.Exit.exitSuccess - let inputPaths = - if null inputParams then [Nothing] else map Just inputParams - let outputPaths = case writeMode of - Display -> repeat Nothing - Inplace -> inputPaths + let + inputPaths = + if null inputParams then [Nothing] else map Just inputParams + let + outputPaths = case writeMode of + Display -> repeat Nothing + Inplace -> inputPaths configsToLoad <- liftIO $ if null configPaths then @@ -230,14 +216,15 @@ mainCmdParser helpDesc = do ) >>= \case Nothing -> System.Exit.exitWith (System.Exit.ExitFailure 53) - Just x -> return x + Just x -> return x when (config & _conf_debug & _dconf_dump_config & confUnpack) $ trace (showConfigYaml config) $ return () - results <- zipWithM (coreIO putStrErrLn config suppressOutput checkMode) - inputPaths - outputPaths + results <- zipWithM + (coreIO putStrErrLn config suppressOutput checkMode) + inputPaths + outputPaths if checkMode then when (Changes `elem` (Data.Either.rights results)) @@ -266,58 +253,65 @@ coreIO -> IO (Either Int ChangeStatus) -- ^ Either an errorNo, or the change status. coreIO putErrorLnIO config suppressOutput checkMode inputPathM outputPathM = ExceptT.runExceptT $ do - let putErrorLn = liftIO . putErrorLnIO :: String -> ExceptT.ExceptT e IO () + let + putErrorLn = liftIO . putErrorLnIO :: String -> ExceptT.ExceptT e IO () let ghcOptions = config & _conf_forward & _options_ghc & runIdentity -- there is a good of code duplication between the following code and the -- `pureModuleTransform` function. Unfortunately, there are also a good -- amount of slight differences: This module is a bit more verbose, and -- it tries to use the full-blown `parseModule` function which supports -- CPP (but requires the input to be a file..). - let cppMode = config & _conf_preprocessor & _ppconf_CPPMode & confUnpack + let cppMode = config & _conf_preprocessor & _ppconf_CPPMode & confUnpack -- the flag will do the following: insert a marker string -- ("-- BRITANY_INCLUDE_HACK ") right before any lines starting with -- "#include" before processing (parsing) input; and remove that marker -- string from the transformation output. -- The flag is intentionally misspelled to prevent clashing with -- inline-config stuff. - let hackAroundIncludes = - config & _conf_preprocessor & _ppconf_hackAroundIncludes & confUnpack - let exactprintOnly = viaGlobal || viaDebug - where - viaGlobal = config & _conf_roundtrip_exactprint_only & confUnpack - viaDebug = - config & _conf_debug & _dconf_roundtrip_exactprint_only & confUnpack + let + hackAroundIncludes = + config & _conf_preprocessor & _ppconf_hackAroundIncludes & confUnpack + let + exactprintOnly = viaGlobal || viaDebug + where + viaGlobal = config & _conf_roundtrip_exactprint_only & confUnpack + viaDebug = + config & _conf_debug & _dconf_roundtrip_exactprint_only & confUnpack - let cppCheckFunc dynFlags = if GHC.xopt GHC.Cpp dynFlags - then case cppMode of - CPPModeAbort -> do - return $ Left "Encountered -XCPP. Aborting." - CPPModeWarn -> do - putErrorLnIO - $ "Warning: Encountered -XCPP." - ++ " Be warned that -XCPP is not supported and that" - ++ " brittany cannot check that its output is syntactically" - ++ " valid in its presence." - return $ Right True - CPPModeNowarn -> return $ Right True - else return $ Right False + let + cppCheckFunc dynFlags = if GHC.xopt GHC.Cpp dynFlags + then case cppMode of + CPPModeAbort -> do + return $ Left "Encountered -XCPP. Aborting." + CPPModeWarn -> do + putErrorLnIO + $ "Warning: Encountered -XCPP." + ++ " Be warned that -XCPP is not supported and that" + ++ " brittany cannot check that its output is syntactically" + ++ " valid in its presence." + return $ Right True + CPPModeNowarn -> return $ Right True + else return $ Right False (parseResult, originalContents) <- case inputPathM of Nothing -> do -- TODO: refactor this hack to not be mixed into parsing logic - let hackF s = if "#include" `isPrefixOf` s - then "-- BRITANY_INCLUDE_HACK " ++ s - else s - let hackTransform = if hackAroundIncludes && not exactprintOnly - then List.intercalate "\n" . fmap hackF . lines' - else id + let + hackF s = if "#include" `isPrefixOf` s + then "-- BRITANY_INCLUDE_HACK " ++ s + else s + let + hackTransform = if hackAroundIncludes && not exactprintOnly + then List.intercalate "\n" . fmap hackF . lines' + else id inputString <- liftIO System.IO.getContents - parseRes <- liftIO $ parseModuleFromString ghcOptions - "stdin" - cppCheckFunc - (hackTransform inputString) + parseRes <- liftIO $ parseModuleFromString + ghcOptions + "stdin" + cppCheckFunc + (hackTransform inputString) return (parseRes, Text.pack inputString) Just p -> liftIO $ do - parseRes <- parseModule ghcOptions p cppCheckFunc + parseRes <- parseModule ghcOptions p cppCheckFunc inputText <- Text.IO.readFile p -- The above means we read the file twice, but the -- GHC API does not really expose the source it @@ -346,10 +340,12 @@ coreIO putErrorLnIO config suppressOutput checkMode inputPathM outputPathM = pure c let moduleConf = cZipWith fromOptionIdentity config inlineConf when (config & _conf_debug & _dconf_dump_ast_full & confUnpack) $ do - let val = printTreeWithCustom 100 (customLayouterF anns) parsedSource + let + val = printTreeWithCustom 100 (customLayouterF anns) parsedSource trace ("---- ast ----\n" ++ show val) $ return () - let disableFormatting = - moduleConf & _conf_disable_formatting & confUnpack + let + disableFormatting = + moduleConf & _conf_disable_formatting & confUnpack (errsWarns, outSText, hasChanges) <- do if | disableFormatting -> do @@ -358,46 +354,52 @@ coreIO putErrorLnIO config suppressOutput checkMode inputPathM outputPathM = let r = Text.pack $ ExactPrint.exactPrint parsedSource anns pure ([], r, r /= originalContents) | otherwise -> do - let omitCheck = - moduleConf - & _conf_errorHandling - .> _econf_omit_output_valid_check - .> confUnpack + let + omitCheck = + moduleConf + & _conf_errorHandling + .> _econf_omit_output_valid_check + .> confUnpack (ews, outRaw) <- if hasCPP || omitCheck then return $ pPrintModule moduleConf perItemConf anns parsedSource - else liftIO $ pPrintModuleAndCheck moduleConf - perItemConf - anns - parsedSource - let hackF s = fromMaybe s $ TextL.stripPrefix - (TextL.pack "-- BRITANY_INCLUDE_HACK ") - s - let out = TextL.toStrict $ if hackAroundIncludes - then - TextL.intercalate (TextL.pack "\n") - $ hackF - <$> TextL.splitOn (TextL.pack "\n") outRaw - else outRaw + else liftIO $ pPrintModuleAndCheck + moduleConf + perItemConf + anns + parsedSource + let + hackF s = fromMaybe s $ TextL.stripPrefix + (TextL.pack "-- BRITANY_INCLUDE_HACK ") + s + let + out = TextL.toStrict $ if hackAroundIncludes + then + TextL.intercalate (TextL.pack "\n") + $ hackF + <$> TextL.splitOn (TextL.pack "\n") outRaw + else outRaw out' <- if moduleConf & _conf_obfuscate & confUnpack then lift $ obfuscate out else pure out pure $ (ews, out', out' /= originalContents) - let customErrOrder ErrorInput{} = 4 - customErrOrder LayoutWarning{} = -1 :: Int - customErrOrder ErrorOutputCheck{} = 1 - customErrOrder ErrorUnusedComment{} = 2 - customErrOrder ErrorUnknownNode{} = -2 :: Int - customErrOrder ErrorMacroConfig{} = 5 + let + customErrOrder ErrorInput{} = 4 + customErrOrder LayoutWarning{} = -1 :: Int + customErrOrder ErrorOutputCheck{} = 1 + customErrOrder ErrorUnusedComment{} = 2 + customErrOrder ErrorUnknownNode{} = -2 :: Int + customErrOrder ErrorMacroConfig{} = 5 unless (null errsWarns) $ do - let groupedErrsWarns = - Data.List.Extra.groupOn customErrOrder - $ List.sortOn customErrOrder - $ errsWarns + let + groupedErrsWarns = + Data.List.Extra.groupOn customErrOrder + $ List.sortOn customErrOrder + $ errsWarns groupedErrsWarns `forM_` \case (ErrorOutputCheck{} : _) -> do putErrorLn - $ "ERROR: brittany pretty printer" + $ "ERROR: brittany pretty printer" ++ " returned syntactically invalid result." (ErrorInput str : _) -> do putErrorLn $ "ERROR: parse error: " ++ str @@ -406,9 +408,10 @@ coreIO putErrorLnIO config suppressOutput checkMode inputPathM outputPathM = $ "WARNING: encountered unknown syntactical constructs:" uns `forM_` \case ErrorUnknownNode str ast@(L loc _) -> do - putErrorLn $ " " <> str <> " at " <> showSDocUnsafe (ppr loc) + putErrorLn $ " " <> str <> " at " <> showSDocUnsafe + (ppr loc) when - ( config + (config & _conf_debug & _dconf_dump_ast_unknown & confUnpack @@ -422,17 +425,17 @@ coreIO putErrorLnIO config suppressOutput checkMode inputPathM outputPathM = putErrorLn $ "WARNINGS:" warns `forM_` \case LayoutWarning str -> putErrorLn str - _ -> error "cannot happen (TM)" + _ -> error "cannot happen (TM)" unused@(ErrorUnusedComment{} : _) -> do putErrorLn - $ "Error: detected unprocessed comments." + $ "Error: detected unprocessed comments." ++ " The transformation output will most likely" ++ " not contain some of the comments" ++ " present in the input haskell source file." putErrorLn $ "Affected are the following comments:" unused `forM_` \case ErrorUnusedComment str -> putErrorLn str - _ -> error "cannot happen (TM)" + _ -> error "cannot happen (TM)" (ErrorMacroConfig err input : _) -> do putErrorLn $ "Error: parse error in inline configuration:" putErrorLn err @@ -443,8 +446,8 @@ coreIO putErrorLnIO config suppressOutput checkMode inputPathM outputPathM = let hasErrors = if config & _conf_errorHandling & _econf_Werror & confUnpack - then not $ null errsWarns - else 0 < maximum (-1 : fmap customErrOrder errsWarns) + then not $ null errsWarns + else 0 < maximum (-1 : fmap customErrOrder errsWarns) outputOnErrs = config & _conf_errorHandling @@ -459,10 +462,11 @@ coreIO putErrorLnIO config suppressOutput checkMode inputPathM outputPathM = $ addTraceSep (_conf_debug config) $ case outputPathM of Nothing -> liftIO $ Text.IO.putStr $ outSText - Just p -> liftIO $ do - let isIdentical = case inputPathM of - Nothing -> False - Just _ -> not hasChanges + Just p -> liftIO $ do + let + isIdentical = case inputPathM of + Nothing -> False + Just _ -> not hasChanges unless isIdentical $ Text.IO.writeFile p $ outSText when (checkMode && hasChanges) $ case inputPathM of @@ -474,15 +478,15 @@ coreIO putErrorLnIO config suppressOutput checkMode inputPathM outputPathM = where addTraceSep conf = if or - [ confUnpack $ _dconf_dump_annotations conf - , confUnpack $ _dconf_dump_ast_unknown conf - , confUnpack $ _dconf_dump_ast_full conf - , confUnpack $ _dconf_dump_bridoc_raw conf - , confUnpack $ _dconf_dump_bridoc_simpl_alt conf - , confUnpack $ _dconf_dump_bridoc_simpl_floating conf - , confUnpack $ _dconf_dump_bridoc_simpl_columns conf - , confUnpack $ _dconf_dump_bridoc_simpl_indent conf - , confUnpack $ _dconf_dump_bridoc_final conf - ] + [ confUnpack $ _dconf_dump_annotations conf + , confUnpack $ _dconf_dump_ast_unknown conf + , confUnpack $ _dconf_dump_ast_full conf + , confUnpack $ _dconf_dump_bridoc_raw conf + , confUnpack $ _dconf_dump_bridoc_simpl_alt conf + , confUnpack $ _dconf_dump_bridoc_simpl_floating conf + , confUnpack $ _dconf_dump_bridoc_simpl_columns conf + , confUnpack $ _dconf_dump_bridoc_simpl_indent conf + , confUnpack $ _dconf_dump_bridoc_final conf + ] then trace "----" else id diff --git a/source/test-suite/Main.hs b/source/test-suite/Main.hs index 774088f..a39eecf 100644 --- a/source/test-suite/Main.hs +++ b/source/test-suite/Main.hs @@ -2,35 +2,24 @@ {-# LANGUAGE MonadComprehensions #-} {-# LANGUAGE ScopedTypeVariables #-} -import Language.Haskell.Brittany.Internal.Prelude +import Data.Coerce (coerce) +import Data.List (groupBy) import qualified Data.Maybe import qualified Data.Semigroup as Semigroup import qualified Data.Text as Text +import qualified Data.Text.IO as Text.IO import qualified GHC.OldList as List -import qualified System.Directory - -import Test.Hspec - -import qualified Text.Parsec as Parsec -import Text.Parsec.Text ( Parser ) - -import Data.List ( groupBy ) - -import Language.Haskell.Brittany.Internal - -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Config - -import Data.Coerce ( coerce ) - -import qualified Data.Text.IO as Text.IO -import System.FilePath ( () ) - -import System.Timeout ( timeout ) - - - +import Language.Haskell.Brittany.Internal +import Language.Haskell.Brittany.Internal.Config +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified System.Directory +import System.FilePath (()) +import System.Timeout (timeout) +import Test.Hspec +import qualified Text.Parsec as Parsec +import Text.Parsec.Text (Parser) hush :: Either a b -> Maybe b hush = either (const Nothing) Just @@ -40,32 +29,32 @@ hush = either (const Nothing) Just asymptoticPerfTest :: Spec asymptoticPerfTest = do it "10 do statements" - $ roundTripEqualWithTimeout 1500000 - $ (Text.pack "func = do\n") + $ roundTripEqualWithTimeout 1500000 + $ (Text.pack "func = do\n") <> Text.replicate 10 (Text.pack " statement\n") it "10 do nestings" - $ roundTripEqualWithTimeout 4000000 - $ (Text.pack "func = ") + $ roundTripEqualWithTimeout 4000000 + $ (Text.pack "func = ") <> mconcat - ( [1 .. 10] - <&> \(i :: Int) -> - (Text.replicate (2 * i) (Text.pack " ") <> Text.pack "do\n") + ([1 .. 10] <&> \(i :: Int) -> + (Text.replicate (2 * i) (Text.pack " ") <> Text.pack "do\n") ) <> Text.replicate 2000 (Text.pack " ") <> Text.pack "return\n" <> Text.replicate 2002 (Text.pack " ") <> Text.pack "()" it "10 AppOps" - $ roundTripEqualWithTimeout 1000000 - $ (Text.pack "func = expr") + $ roundTripEqualWithTimeout 1000000 + $ (Text.pack "func = expr") <> Text.replicate 10 (Text.pack "\n . expr") --TODO roundTripEqualWithTimeout :: Int -> Text -> Expectation roundTripEqualWithTimeout time t = - timeout time (action >>= evaluate) >>= (`shouldSatisfy`Data.Maybe.isJust) + timeout time (action >>= evaluate) >>= (`shouldSatisfy` Data.Maybe.isJust) where - action = fmap (fmap PPTextWrapper) - (parsePrintModuleTests defaultTestConfig "TestFakeFileName.hs" t) + action = fmap + (fmap PPTextWrapper) + (parsePrintModuleTests defaultTestConfig "TestFakeFileName.hs" t) data InputLine @@ -85,10 +74,11 @@ data TestCase = TestCase main :: IO () main = do files <- System.Directory.listDirectory "data/" - let blts = - List.sort - $ filter (\x -> not ("tests-context-free.blt" `isSuffixOf` x)) - $ filter (".blt" `isSuffixOf`) files + let + blts = + List.sort + $ filter (\x -> not ("tests-context-free.blt" `isSuffixOf` x)) + $ filter (".blt" `isSuffixOf`) files inputs <- blts `forM` \blt -> Text.IO.readFile ("data" blt) let groups = createChunks =<< inputs inputCtxFree <- Text.IO.readFile "data/30-tests-context-free.blt" @@ -99,15 +89,17 @@ main = do it "gives properly formatted result for valid input" $ do let input = Text.pack $ unlines - ["func = [00000000000000000000000, 00000000000000000000000, 00000000000000000000000, 00000000000000000000000]"] - let expected = Text.pack $ unlines - [ "func =" - , " [ 00000000000000000000000" - , " , 00000000000000000000000" - , " , 00000000000000000000000" - , " , 00000000000000000000000" - , " ]" - ] + [ "func = [00000000000000000000000, 00000000000000000000000, 00000000000000000000000, 00000000000000000000000]" + ] + let + expected = Text.pack $ unlines + [ "func =" + , " [ 00000000000000000000000" + , " , 00000000000000000000000" + , " , 00000000000000000000000" + , " , 00000000000000000000000" + , " ]" + ] output <- liftIO $ parsePrintModule staticDefaultConfig input hush output `shouldBe` Just expected groups `forM_` \(groupname, tests) -> do @@ -154,30 +146,33 @@ main = do testProcessor = \case HeaderLine n : rest -> let normalLines = Data.Maybe.mapMaybe extractNormal rest - in TestCase - { testName = n - , isPending = any isPendingLine rest - , content = Text.unlines normalLines - } + in + TestCase + { testName = n + , isPending = any isPendingLine rest + , content = Text.unlines normalLines + } l -> - error $ "first non-empty line must start with #test footest\n" ++ show l + error + $ "first non-empty line must start with #test footest\n" + ++ show l extractNormal (NormalLine l) = Just l - extractNormal _ = Nothing + extractNormal _ = Nothing isPendingLine PendingLine{} = True - isPendingLine _ = False + isPendingLine _ = False specialLineParser :: Parser InputLine specialLineParser = Parsec.choice [ [ GroupLine $ Text.pack name - | _ <- Parsec.try $ Parsec.string "#group" - , _ <- Parsec.many1 $ Parsec.oneOf " \t" + | _ <- Parsec.try $ Parsec.string "#group" + , _ <- Parsec.many1 $ Parsec.oneOf " \t" , name <- Parsec.many1 $ Parsec.noneOf "\r\n:" - , _ <- Parsec.eof + , _ <- Parsec.eof ] , [ HeaderLine $ Text.pack name - | _ <- Parsec.try $ Parsec.string "#test" - , _ <- Parsec.many1 $ Parsec.oneOf " \t" + | _ <- Parsec.try $ Parsec.string "#test" + , _ <- Parsec.many1 $ Parsec.oneOf " \t" , name <- Parsec.many1 $ Parsec.noneOf "\r\n:" - , _ <- Parsec.eof + , _ <- Parsec.eof ] , [ PendingLine | _ <- Parsec.try $ Parsec.string "#pending" @@ -197,17 +192,17 @@ main = do ] lineMapper :: Text -> InputLine lineMapper line = case Parsec.runParser specialLineParser () "" line of - Left _e -> NormalLine line - Right l -> l + Left _e -> NormalLine line + Right l -> l lineIsSpace :: InputLine -> Bool lineIsSpace CommentLine = True - lineIsSpace _ = False + lineIsSpace _ = False grouperG :: InputLine -> InputLine -> Bool grouperG _ GroupLine{} = False - grouperG _ _ = True + grouperG _ _ = True grouperT :: InputLine -> InputLine -> Bool grouperT _ HeaderLine{} = False - grouperT _ _ = True + grouperT _ _ = True -------------------- @@ -225,43 +220,42 @@ instance Show PPTextWrapper where show (PPTextWrapper t) = "\n" ++ Text.unpack t -- brittany-next-binding --columns 160 --- brittany-next-binding { lconfig_indentPolicy: IndentPolicyLeft } defaultTestConfig :: Config defaultTestConfig = Config - { _conf_version = _conf_version staticDefaultConfig - , _conf_debug = _conf_debug staticDefaultConfig - , _conf_layout = LayoutConfig - { _lconfig_cols = coerce (80 :: Int) - , _lconfig_indentPolicy = coerce IndentPolicyFree - , _lconfig_indentAmount = coerce (2 :: Int) - , _lconfig_indentWhereSpecial = coerce True - , _lconfig_indentListSpecial = coerce True - , _lconfig_importColumn = coerce (60 :: Int) - , _lconfig_importAsColumn = coerce (60 :: Int) - , _lconfig_altChooser = coerce $ AltChooserBoundedSearch 3 - , _lconfig_columnAlignMode = coerce (ColumnAlignModeMajority 0.7) - , _lconfig_alignmentLimit = coerce (30 :: Int) + { _conf_version = _conf_version staticDefaultConfig + , _conf_debug = _conf_debug staticDefaultConfig + , _conf_layout = LayoutConfig + { _lconfig_cols = coerce (80 :: Int) + , _lconfig_indentPolicy = coerce IndentPolicyFree + , _lconfig_indentAmount = coerce (2 :: Int) + , _lconfig_indentWhereSpecial = coerce True + , _lconfig_indentListSpecial = coerce True + , _lconfig_importColumn = coerce (60 :: Int) + , _lconfig_importAsColumn = coerce (60 :: Int) + , _lconfig_altChooser = coerce $ AltChooserBoundedSearch 3 + , _lconfig_columnAlignMode = coerce (ColumnAlignModeMajority 0.7) + , _lconfig_alignmentLimit = coerce (30 :: Int) , _lconfig_alignmentBreakOnMultiline = coerce True - , _lconfig_hangingTypeSignature = coerce False - , _lconfig_reformatModulePreamble = coerce True + , _lconfig_hangingTypeSignature = coerce False + , _lconfig_reformatModulePreamble = coerce True , _lconfig_allowSingleLineExportList = coerce True - , _lconfig_allowHangingQuasiQuotes = coerce True + , _lconfig_allowHangingQuasiQuotes = coerce True , _lconfig_experimentalSemicolonNewlines = coerce False -- , _lconfig_allowSinglelineRecord = coerce False } - , _conf_errorHandling = (_conf_errorHandling staticDefaultConfig) { _econf_omit_output_valid_check = coerce True } - , _conf_preprocessor = _conf_preprocessor staticDefaultConfig - , _conf_forward = ForwardOptions { _options_ghc = Identity [] } + , _conf_errorHandling = (_conf_errorHandling staticDefaultConfig) { _econf_omit_output_valid_check = coerce True } + , _conf_preprocessor = _conf_preprocessor staticDefaultConfig + , _conf_forward = ForwardOptions { _options_ghc = Identity [] } , _conf_roundtrip_exactprint_only = coerce False - , _conf_disable_formatting = coerce False - , _conf_obfuscate = coerce False + , _conf_disable_formatting = coerce False + , _conf_obfuscate = coerce False } contextFreeTestConfig :: Config contextFreeTestConfig = defaultTestConfig { _conf_layout = (_conf_layout defaultTestConfig) - { _lconfig_indentPolicy = coerce IndentPolicyLeft - , _lconfig_alignmentLimit = coerce (1 :: Int) - , _lconfig_columnAlignMode = coerce ColumnAlignModeDisabled - } + { _lconfig_indentPolicy = coerce IndentPolicyLeft + , _lconfig_alignmentLimit = coerce (1 :: Int) + , _lconfig_columnAlignMode = coerce ColumnAlignModeDisabled + } } -- 2.30.2 From 4079981b1de020a462b296c069eff8f785299747 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sun, 7 Nov 2021 12:37:49 +0000 Subject: [PATCH 62/74] Revert "Format Brittany with Brittany" This reverts commit 4398b5880d05340e31186c2460c300b6698dadd4. --- brittany.yaml | 5 - source/library/Language/Haskell/Brittany.hs | 14 +- .../Language/Haskell/Brittany/Internal.hs | 543 +++---- .../Haskell/Brittany/Internal/Backend.hs | 540 +++---- .../Haskell/Brittany/Internal/BackendUtils.hs | 318 ++-- .../Haskell/Brittany/Internal/Config.hs | 271 ++-- .../Haskell/Brittany/Internal/Config/Types.hs | 88 +- .../Internal/Config/Types/Instances.hs | 35 +- .../Brittany/Internal/ExactPrintUtils.hs | 172 +- .../Brittany/Internal/LayouterBasics.hs | 220 +-- .../Brittany/Internal/Layouters/DataDecl.hs | 404 ++--- .../Brittany/Internal/Layouters/Decl.hs | 990 ++++++------ .../Brittany/Internal/Layouters/Expr.hs | 1233 +++++++------- .../Brittany/Internal/Layouters/Expr.hs-boot | 13 +- .../Haskell/Brittany/Internal/Layouters/IE.hs | 149 +- .../Brittany/Internal/Layouters/Import.hs | 203 ++- .../Brittany/Internal/Layouters/Module.hs | 128 +- .../Brittany/Internal/Layouters/Pattern.hs | 109 +- .../Brittany/Internal/Layouters/Stmt.hs | 52 +- .../Brittany/Internal/Layouters/Stmt.hs-boot | 11 +- .../Brittany/Internal/Layouters/Type.hs | 448 +++--- .../Haskell/Brittany/Internal/Obfuscation.hs | 30 +- .../Haskell/Brittany/Internal/Prelude.hs | 537 ++++--- .../Haskell/Brittany/Internal/PreludeUtils.hs | 26 +- .../Brittany/Internal/Transformations/Alt.hs | 1411 ++++++++--------- .../Internal/Transformations/Columns.hs | 208 ++- .../Internal/Transformations/Floating.hs | 378 +++-- .../Internal/Transformations/Indent.hs | 32 +- .../Brittany/Internal/Transformations/Par.hs | 40 +- .../Haskell/Brittany/Internal/Types.hs | 266 ++-- .../Haskell/Brittany/Internal/Utils.hs | 145 +- .../library/Language/Haskell/Brittany/Main.hs | 296 ++-- source/test-suite/Main.hs | 182 ++- 33 files changed, 4804 insertions(+), 4693 deletions(-) delete mode 100644 brittany.yaml diff --git a/brittany.yaml b/brittany.yaml deleted file mode 100644 index fba01fd..0000000 --- a/brittany.yaml +++ /dev/null @@ -1,5 +0,0 @@ -conf_layout: - lconfig_cols: 79 - lconfig_columnAlignMode: - tag: ColumnAlignModeDisabled - lconfig_indentPolicy: IndentPolicyLeft diff --git a/source/library/Language/Haskell/Brittany.hs b/source/library/Language/Haskell/Brittany.hs index a2726c8..8c225c6 100644 --- a/source/library/Language/Haskell/Brittany.hs +++ b/source/library/Language/Haskell/Brittany.hs @@ -16,9 +16,13 @@ module Language.Haskell.Brittany , CForwardOptions(..) , CPreProcessorConfig(..) , BrittanyError(..) - ) where + ) +where -import Language.Haskell.Brittany.Internal -import Language.Haskell.Brittany.Internal.Config -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Types + + + +import Language.Haskell.Brittany.Internal +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Config diff --git a/source/library/Language/Haskell/Brittany/Internal.hs b/source/library/Language/Haskell/Brittany/Internal.hs index f2f0fdc..71e885b 100644 --- a/source/library/Language/Haskell/Brittany/Internal.hs +++ b/source/library/Language/Haskell/Brittany/Internal.hs @@ -12,52 +12,68 @@ module Language.Haskell.Brittany.Internal , parseModuleFromString , extractCommentConfigs , getTopLevelDeclNameMap - ) where + ) +where -import Control.Monad.Trans.Except + + +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS import qualified Data.ByteString.Char8 -import Data.CZipWith -import Data.Char (isSpace) -import Data.HList.HList import qualified Data.Map as Map import qualified Data.Maybe import qualified Data.Semigroup as Semigroup import qualified Data.Sequence as Seq import qualified Data.Text as Text import qualified Data.Text.Lazy as TextL -import qualified Data.Text.Lazy.Builder as Text.Builder -import qualified Data.Yaml -import qualified GHC hiding (parseModule) -import GHC (GenLocated(L)) -import GHC.Data.Bag -import qualified GHC.Driver.Session as GHC -import GHC.Hs -import qualified GHC.LanguageExtensions.Type as GHC import qualified GHC.OldList as List -import GHC.Parser.Annotation (AnnKeywordId(..)) -import GHC.Types.SrcLoc (SrcSpan) -import Language.Haskell.Brittany.Internal.Backend -import Language.Haskell.Brittany.Internal.BackendUtils -import Language.Haskell.Brittany.Internal.Config -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.ExactPrintUtils -import Language.Haskell.Brittany.Internal.LayouterBasics -import Language.Haskell.Brittany.Internal.Layouters.Decl -import Language.Haskell.Brittany.Internal.Layouters.Module -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -import Language.Haskell.Brittany.Internal.Transformations.Alt -import Language.Haskell.Brittany.Internal.Transformations.Columns -import Language.Haskell.Brittany.Internal.Transformations.Floating -import Language.Haskell.Brittany.Internal.Transformations.Indent -import Language.Haskell.Brittany.Internal.Transformations.Par -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.Utils -import qualified Language.Haskell.GHC.ExactPrint as ExactPrint + +-- brittany { lconfig_importAsColumn: 60, lconfig_importColumn: 60 } +import qualified Language.Haskell.GHC.ExactPrint as ExactPrint +import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint import qualified Language.Haskell.GHC.ExactPrint.Parsers as ExactPrint.Parsers -import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint -import qualified UI.Butcher.Monadic as Butcher + +import Control.Monad.Trans.Except +import Data.HList.HList +import qualified Data.Yaml +import Data.CZipWith +import qualified UI.Butcher.Monadic as Butcher + +import qualified Data.Text.Lazy.Builder as Text.Builder + +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Config +import Language.Haskell.Brittany.Internal.LayouterBasics + +import Language.Haskell.Brittany.Internal.Layouters.Decl +import Language.Haskell.Brittany.Internal.Layouters.Module +import Language.Haskell.Brittany.Internal.Utils +import Language.Haskell.Brittany.Internal.Backend +import Language.Haskell.Brittany.Internal.BackendUtils +import Language.Haskell.Brittany.Internal.ExactPrintUtils + +import Language.Haskell.Brittany.Internal.Transformations.Alt +import Language.Haskell.Brittany.Internal.Transformations.Floating +import Language.Haskell.Brittany.Internal.Transformations.Par +import Language.Haskell.Brittany.Internal.Transformations.Columns +import Language.Haskell.Brittany.Internal.Transformations.Indent + +import qualified GHC + hiding ( parseModule ) +import GHC.Parser.Annotation ( AnnKeywordId(..) ) +import GHC ( GenLocated(L) + ) +import GHC.Types.SrcLoc ( SrcSpan ) +import GHC.Hs +import GHC.Data.Bag +import qualified GHC.Driver.Session as GHC +import qualified GHC.LanguageExtensions.Type as GHC + +import Data.Char ( isSpace ) + + data InlineConfigTarget = InlineConfigTargetModule @@ -75,36 +91,35 @@ extractCommentConfigs anns (TopLevelDeclNameMap declNameMap) = do [ ( k , [ x | (ExactPrint.Comment x _ _, _) <- - (ExactPrint.annPriorComments ann + ( ExactPrint.annPriorComments ann ++ ExactPrint.annFollowingComments ann ) ] - ++ [ x - | (ExactPrint.AnnComment (ExactPrint.Comment x _ _), _) <- - ExactPrint.annsDP ann - ] + ++ [ x + | (ExactPrint.AnnComment (ExactPrint.Comment x _ _), _) <- + ExactPrint.annsDP ann + ] ) | (k, ann) <- Map.toList anns ] - let - configLiness = commentLiness <&> second - (Data.Maybe.mapMaybe $ \line -> do - l1 <- - List.stripPrefix "-- BRITTANY" line - <|> List.stripPrefix "--BRITTANY" line - <|> List.stripPrefix "-- brittany" line - <|> List.stripPrefix "--brittany" line - <|> (List.stripPrefix "{- BRITTANY" line >>= stripSuffix "-}") - let l2 = dropWhile isSpace l1 - guard - (("@" `isPrefixOf` l2) - || ("-disable" `isPrefixOf` l2) - || ("-next" `isPrefixOf` l2) - || ("{" `isPrefixOf` l2) - || ("--" `isPrefixOf` l2) - ) - pure l2 - ) + let configLiness = commentLiness <&> second + (Data.Maybe.mapMaybe $ \line -> do + l1 <- + List.stripPrefix "-- BRITTANY" line + <|> List.stripPrefix "--BRITTANY" line + <|> List.stripPrefix "-- brittany" line + <|> List.stripPrefix "--brittany" line + <|> (List.stripPrefix "{- BRITTANY" line >>= stripSuffix "-}") + let l2 = dropWhile isSpace l1 + guard + ( ("@" `isPrefixOf` l2) + || ("-disable" `isPrefixOf` l2) + || ("-next" `isPrefixOf` l2) + || ("{" `isPrefixOf` l2) + || ("--" `isPrefixOf` l2) + ) + pure l2 + ) let configParser = Butcher.addAlternatives [ ( "commandline-config" @@ -123,44 +138,39 @@ extractCommentConfigs anns (TopLevelDeclNameMap declNameMap) = do ] parser = do -- we will (mis?)use butcher here to parse the inline config -- line. - let - nextDecl = do - conf <- configParser - Butcher.addCmdImpl (InlineConfigTargetNextDecl, conf) + let nextDecl = do + conf <- configParser + Butcher.addCmdImpl (InlineConfigTargetNextDecl, conf) Butcher.addCmd "-next-declaration" nextDecl Butcher.addCmd "-Next-Declaration" nextDecl Butcher.addCmd "-NEXT-DECLARATION" nextDecl - let - nextBinding = do - conf <- configParser - Butcher.addCmdImpl (InlineConfigTargetNextBinding, conf) + let nextBinding = do + conf <- configParser + Butcher.addCmdImpl (InlineConfigTargetNextBinding, conf) Butcher.addCmd "-next-binding" nextBinding Butcher.addCmd "-Next-Binding" nextBinding Butcher.addCmd "-NEXT-BINDING" nextBinding - let - disableNextBinding = do - Butcher.addCmdImpl - ( InlineConfigTargetNextBinding - , mempty { _conf_roundtrip_exactprint_only = pure $ pure True } - ) + let disableNextBinding = do + Butcher.addCmdImpl + ( InlineConfigTargetNextBinding + , mempty { _conf_roundtrip_exactprint_only = pure $ pure True } + ) Butcher.addCmd "-disable-next-binding" disableNextBinding Butcher.addCmd "-Disable-Next-Binding" disableNextBinding Butcher.addCmd "-DISABLE-NEXT-BINDING" disableNextBinding - let - disableNextDecl = do - Butcher.addCmdImpl - ( InlineConfigTargetNextDecl - , mempty { _conf_roundtrip_exactprint_only = pure $ pure True } - ) + let disableNextDecl = do + Butcher.addCmdImpl + ( InlineConfigTargetNextDecl + , mempty { _conf_roundtrip_exactprint_only = pure $ pure True } + ) Butcher.addCmd "-disable-next-declaration" disableNextDecl Butcher.addCmd "-Disable-Next-Declaration" disableNextDecl Butcher.addCmd "-DISABLE-NEXT-DECLARATION" disableNextDecl - let - disableFormatting = do - Butcher.addCmdImpl - ( InlineConfigTargetModule - , mempty { _conf_disable_formatting = pure $ pure True } - ) + let disableFormatting = do + Butcher.addCmdImpl + ( InlineConfigTargetModule + , mempty { _conf_disable_formatting = pure $ pure True } + ) Butcher.addCmd "-disable" disableFormatting Butcher.addCmd "@" $ do -- Butcher.addCmd "module" $ do @@ -168,42 +178,41 @@ extractCommentConfigs anns (TopLevelDeclNameMap declNameMap) = do -- Butcher.addCmdImpl (InlineConfigTargetModule, conf) Butcher.addNullCmd $ do bindingName <- Butcher.addParamString "BINDING" mempty - conf <- configParser + conf <- configParser Butcher.addCmdImpl (InlineConfigTargetBinding bindingName, conf) conf <- configParser Butcher.addCmdImpl (InlineConfigTargetModule, conf) lineConfigss <- configLiness `forM` \(k, ss) -> do r <- ss `forM` \s -> case Butcher.runCmdParserSimple s parser of - Left err -> Left $ (err, s) - Right c -> Right $ c + Left err -> Left $ (err, s) + Right c -> Right $ c pure (k, r) - let - perModule = foldl' - (<>) - mempty - [ conf - | (_, lineConfigs) <- lineConfigss - , (InlineConfigTargetModule, conf) <- lineConfigs - ] + let perModule = foldl' + (<>) + mempty + [ conf + | (_ , lineConfigs) <- lineConfigss + , (InlineConfigTargetModule, conf ) <- lineConfigs + ] let perBinding = Map.fromListWith (<>) [ (n, conf) - | (k, lineConfigs) <- lineConfigss - , (target, conf) <- lineConfigs - , n <- case target of + | (k , lineConfigs) <- lineConfigss + , (target, conf ) <- lineConfigs + , n <- case target of InlineConfigTargetBinding s -> [s] - InlineConfigTargetNextBinding - | Just name <- Map.lookup k declNameMap -> [name] + InlineConfigTargetNextBinding | Just name <- Map.lookup k declNameMap -> + [name] _ -> [] ] let perKey = Map.fromListWith (<>) [ (k, conf) - | (k, lineConfigs) <- lineConfigss - , (target, conf) <- lineConfigs + | (k , lineConfigs) <- lineConfigss + , (target, conf ) <- lineConfigs , case target of InlineConfigTargetNextDecl -> True InlineConfigTargetNextBinding | Nothing <- Map.lookup k declNameMap -> @@ -221,7 +230,7 @@ getTopLevelDeclNameMap :: GHC.ParsedSource -> TopLevelDeclNameMap getTopLevelDeclNameMap (L _ (HsModule _ _name _exports _ decls _ _)) = TopLevelDeclNameMap $ Map.fromList [ (ExactPrint.mkAnnKey decl, name) - | decl <- decls + | decl <- decls , (name : _) <- [getDeclBindingNames decl] ] @@ -239,78 +248,70 @@ getTopLevelDeclNameMap (L _ (HsModule _ _name _exports _ decls _ _)) = -- won't do. parsePrintModule :: Config -> Text -> IO (Either [BrittanyError] Text) parsePrintModule configWithDebugs inputText = runExceptT $ do - let - config = - configWithDebugs { _conf_debug = _conf_debug staticDefaultConfig } - let ghcOptions = config & _conf_forward & _options_ghc & runIdentity - let config_pp = config & _conf_preprocessor - let cppMode = config_pp & _ppconf_CPPMode & confUnpack + let config = + configWithDebugs { _conf_debug = _conf_debug staticDefaultConfig } + let ghcOptions = config & _conf_forward & _options_ghc & runIdentity + let config_pp = config & _conf_preprocessor + let cppMode = config_pp & _ppconf_CPPMode & confUnpack let hackAroundIncludes = config_pp & _ppconf_hackAroundIncludes & confUnpack (anns, parsedSource, hasCPP) <- do - let - hackF s = if "#include" `isPrefixOf` s - then "-- BRITANY_INCLUDE_HACK " ++ s - else s - let - hackTransform = if hackAroundIncludes - then List.intercalate "\n" . fmap hackF . lines' - else id - let - cppCheckFunc dynFlags = if GHC.xopt GHC.Cpp dynFlags - then case cppMode of - CPPModeAbort -> return $ Left "Encountered -XCPP. Aborting." - CPPModeWarn -> return $ Right True - CPPModeNowarn -> return $ Right True - else return $ Right False + let hackF s = if "#include" `isPrefixOf` s + then "-- BRITANY_INCLUDE_HACK " ++ s + else s + let hackTransform = if hackAroundIncludes + then List.intercalate "\n" . fmap hackF . lines' + else id + let cppCheckFunc dynFlags = if GHC.xopt GHC.Cpp dynFlags + then case cppMode of + CPPModeAbort -> return $ Left "Encountered -XCPP. Aborting." + CPPModeWarn -> return $ Right True + CPPModeNowarn -> return $ Right True + else return $ Right False parseResult <- lift $ parseModuleFromString ghcOptions "stdin" cppCheckFunc (hackTransform $ Text.unpack inputText) case parseResult of - Left err -> throwE [ErrorInput err] - Right x -> pure x + Left err -> throwE [ErrorInput err] + Right x -> pure x (inlineConf, perItemConf) <- either (throwE . (: []) . uncurry ErrorMacroConfig) pure $ extractCommentConfigs anns (getTopLevelDeclNameMap parsedSource) - let moduleConfig = cZipWith fromOptionIdentity config inlineConf + let moduleConfig = cZipWith fromOptionIdentity config inlineConf let disableFormatting = moduleConfig & _conf_disable_formatting & confUnpack if disableFormatting then do return inputText else do (errsWarns, outputTextL) <- do - let - omitCheck = - moduleConfig - & _conf_errorHandling - & _econf_omit_output_valid_check - & confUnpack + let omitCheck = + moduleConfig + & _conf_errorHandling + & _econf_omit_output_valid_check + & confUnpack (ews, outRaw) <- if hasCPP || omitCheck then return $ pPrintModule moduleConfig perItemConf anns parsedSource else lift $ pPrintModuleAndCheck moduleConfig perItemConf anns parsedSource - let - hackF s = fromMaybe s - $ TextL.stripPrefix (TextL.pack "-- BRITANY_INCLUDE_HACK ") s + let hackF s = fromMaybe s + $ TextL.stripPrefix (TextL.pack "-- BRITANY_INCLUDE_HACK ") s pure $ if hackAroundIncludes then ( ews - , TextL.intercalate (TextL.pack "\n") - $ hackF - <$> TextL.splitOn (TextL.pack "\n") outRaw + , TextL.intercalate (TextL.pack "\n") $ hackF <$> TextL.splitOn + (TextL.pack "\n") + outRaw ) else (ews, outRaw) - let - customErrOrder ErrorInput{} = 4 - customErrOrder LayoutWarning{} = 0 :: Int - customErrOrder ErrorOutputCheck{} = 1 - customErrOrder ErrorUnusedComment{} = 2 - customErrOrder ErrorUnknownNode{} = 3 - customErrOrder ErrorMacroConfig{} = 5 - let - hasErrors = - if moduleConfig & _conf_errorHandling & _econf_Werror & confUnpack + let customErrOrder ErrorInput{} = 4 + customErrOrder LayoutWarning{} = 0 :: Int + customErrOrder ErrorOutputCheck{} = 1 + customErrOrder ErrorUnusedComment{} = 2 + customErrOrder ErrorUnknownNode{} = 3 + customErrOrder ErrorMacroConfig{} = 5 + let hasErrors = + if moduleConfig & _conf_errorHandling & _econf_Werror & confUnpack then not $ null errsWarns else 0 < maximum (-1 : fmap customErrOrder errsWarns) if hasErrors @@ -330,27 +331,26 @@ pPrintModule -> GHC.ParsedSource -> ([BrittanyError], TextL.Text) pPrintModule conf inlineConf anns parsedModule = - let - ((out, errs), debugStrings) = - runIdentity - $ MultiRWSS.runMultiRWSTNil - $ MultiRWSS.withMultiWriterAW - $ MultiRWSS.withMultiWriterAW - $ MultiRWSS.withMultiWriterW - $ MultiRWSS.withMultiReader anns - $ MultiRWSS.withMultiReader conf - $ MultiRWSS.withMultiReader inlineConf - $ MultiRWSS.withMultiReader (extractToplevelAnns parsedModule anns) - $ do - traceIfDumpConf "bridoc annotations raw" _dconf_dump_annotations - $ annsDoc anns - ppModule parsedModule - tracer = if Seq.null debugStrings - then id - else - trace ("---- DEBUGMESSAGES ---- ") - . foldr (seq . join trace) id debugStrings - in tracer $ (errs, Text.Builder.toLazyText out) + let ((out, errs), debugStrings) = + runIdentity + $ MultiRWSS.runMultiRWSTNil + $ MultiRWSS.withMultiWriterAW + $ MultiRWSS.withMultiWriterAW + $ MultiRWSS.withMultiWriterW + $ MultiRWSS.withMultiReader anns + $ MultiRWSS.withMultiReader conf + $ MultiRWSS.withMultiReader inlineConf + $ MultiRWSS.withMultiReader (extractToplevelAnns parsedModule anns) + $ do + traceIfDumpConf "bridoc annotations raw" _dconf_dump_annotations + $ annsDoc anns + ppModule parsedModule + tracer = if Seq.null debugStrings + then id + else + trace ("---- DEBUGMESSAGES ---- ") + . foldr (seq . join trace) id debugStrings + in tracer $ (errs, Text.Builder.toLazyText out) -- unless () $ do -- -- debugStrings `forM_` \s -> @@ -365,17 +365,15 @@ pPrintModuleAndCheck -> GHC.ParsedSource -> IO ([BrittanyError], TextL.Text) pPrintModuleAndCheck conf inlineConf anns parsedModule = do - let ghcOptions = conf & _conf_forward & _options_ghc & runIdentity + let ghcOptions = conf & _conf_forward & _options_ghc & runIdentity let (errs, output) = pPrintModule conf inlineConf anns parsedModule - parseResult <- parseModuleFromString - ghcOptions - "output" - (\_ -> return $ Right ()) - (TextL.unpack output) - let - errs' = errs ++ case parseResult of - Left{} -> [ErrorOutputCheck] - Right{} -> [] + parseResult <- parseModuleFromString ghcOptions + "output" + (\_ -> return $ Right ()) + (TextL.unpack output) + let errs' = errs ++ case parseResult of + Left{} -> [ErrorOutputCheck] + Right{} -> [] return (errs', output) @@ -386,22 +384,18 @@ parsePrintModuleTests conf filename input = do let inputStr = Text.unpack input parseResult <- ExactPrint.Parsers.parseModuleFromString filename inputStr case parseResult of - Left err -> - return $ Left $ "parsing error: " ++ show (bagToList (show <$> err)) + Left err -> return $ Left $ "parsing error: " ++ show (bagToList (show <$> err)) Right (anns, parsedModule) -> runExceptT $ do (inlineConf, perItemConf) <- - case - extractCommentConfigs anns (getTopLevelDeclNameMap parsedModule) - of - Left err -> throwE $ "error in inline config: " ++ show err - Right x -> pure x + case extractCommentConfigs anns (getTopLevelDeclNameMap parsedModule) of + Left err -> throwE $ "error in inline config: " ++ show err + Right x -> pure x let moduleConf = cZipWith fromOptionIdentity conf inlineConf - let - omitCheck = - conf - & _conf_errorHandling - .> _econf_omit_output_valid_check - .> confUnpack + let omitCheck = + conf + & _conf_errorHandling + .> _econf_omit_output_valid_check + .> confUnpack (errs, ltext) <- if omitCheck then return $ pPrintModule moduleConf perItemConf anns parsedModule else lift @@ -411,13 +405,13 @@ parsePrintModuleTests conf filename input = do else let errStrs = errs <&> \case - ErrorInput str -> str + ErrorInput str -> str ErrorUnusedComment str -> str - LayoutWarning str -> str + LayoutWarning str -> str ErrorUnknownNode str _ -> str ErrorMacroConfig str _ -> "when parsing inline config: " ++ str - ErrorOutputCheck -> "Output is not syntactically valid." - in throwE $ "pretty printing error(s):\n" ++ List.unlines errStrs + ErrorOutputCheck -> "Output is not syntactically valid." + in throwE $ "pretty printing error(s):\n" ++ List.unlines errStrs isErrorUnusedComment :: BrittanyError -> Bool isErrorUnusedComment x = case x of @@ -470,30 +464,27 @@ ppModule lmod@(L _loc _m@(HsModule _ _name _exports _ decls _ _)) = do let annKey = ExactPrint.mkAnnKey lmod post <- ppPreamble lmod decls `forM_` \decl -> do - let declAnnKey = ExactPrint.mkAnnKey decl + let declAnnKey = ExactPrint.mkAnnKey decl let declBindingNames = getDeclBindingNames decl inlineConf <- mAsk let mDeclConf = Map.lookup declAnnKey $ _icd_perKey inlineConf - let - mBindingConfs = - declBindingNames <&> \n -> Map.lookup n $ _icd_perBinding inlineConf - filteredAnns <- mAsk <&> \annMap -> - Map.union (Map.findWithDefault Map.empty annKey annMap) - $ Map.findWithDefault Map.empty declAnnKey annMap + let mBindingConfs = + declBindingNames <&> \n -> Map.lookup n $ _icd_perBinding inlineConf + filteredAnns <- mAsk + <&> \annMap -> + Map.union (Map.findWithDefault Map.empty annKey annMap) $ + Map.findWithDefault Map.empty declAnnKey annMap - traceIfDumpConf - "bridoc annotations filtered/transformed" - _dconf_dump_annotations + traceIfDumpConf "bridoc annotations filtered/transformed" + _dconf_dump_annotations $ annsDoc filteredAnns config <- mAsk - let - config' = cZipWith fromOptionIdentity config - $ mconcat (catMaybes (mBindingConfs ++ [mDeclConf])) + let config' = cZipWith fromOptionIdentity config + $ mconcat (catMaybes (mBindingConfs ++ [mDeclConf])) - let - exactprintOnly = config' & _conf_roundtrip_exactprint_only & confUnpack + let exactprintOnly = config' & _conf_roundtrip_exactprint_only & confUnpack toLocal config' filteredAnns $ do bd <- if exactprintOnly then briDocMToPPM $ briDocByExactNoComment decl @@ -506,34 +497,33 @@ ppModule lmod@(L _loc _m@(HsModule _ _name _exports _ decls _ _)) = do else briDocMToPPM $ briDocByExactNoComment decl layoutBriDoc bd - let - finalComments = filter - (fst .> \case - ExactPrint.AnnComment{} -> True - _ -> False - ) - post + let finalComments = filter + (fst .> \case + ExactPrint.AnnComment{} -> True + _ -> False + ) + post post `forM_` \case (ExactPrint.AnnComment (ExactPrint.Comment cmStr _ _), l) -> do ppmMoveToExactLoc l mTell $ Text.Builder.fromString cmStr (ExactPrint.AnnEofPos, (ExactPrint.DP (eofZ, eofX))) -> - let - folder (acc, _) (kw, ExactPrint.DP (y, x)) = case kw of - ExactPrint.AnnComment cm | span <- ExactPrint.commentIdentifier cm -> - ( acc + y + GHC.srcSpanEndLine span - GHC.srcSpanStartLine span - , x + GHC.srcSpanEndCol span - GHC.srcSpanStartCol span - ) - _ -> (acc + y, x) - (cmY, cmX) = foldl' folder (0, 0) finalComments - in ppmMoveToExactLoc $ ExactPrint.DP (eofZ - cmY, eofX - cmX) + let folder (acc, _) (kw, ExactPrint.DP (y, x)) = case kw of + ExactPrint.AnnComment cm + | span <- ExactPrint.commentIdentifier cm + -> ( acc + y + GHC.srcSpanEndLine span - GHC.srcSpanStartLine span + , x + GHC.srcSpanEndCol span - GHC.srcSpanStartCol span + ) + _ -> (acc + y, x) + (cmY, cmX) = foldl' folder (0, 0) finalComments + in ppmMoveToExactLoc $ ExactPrint.DP (eofZ - cmY, eofX - cmX) _ -> return () getDeclBindingNames :: LHsDecl GhcPs -> [String] getDeclBindingNames (L _ decl) = case decl of SigD _ (TypeSig _ ns _) -> ns <&> \(L _ n) -> Text.unpack (rdrNameToText n) ValD _ (FunBind _ (L _ n) _ _) -> [Text.unpack $ rdrNameToText n] - _ -> [] + _ -> [] -- Prints the information associated with the module annotation @@ -550,9 +540,8 @@ ppPreamble lmod@(L loc m@HsModule{}) = do -- attached annotations that come after the module's where -- from the module node config <- mAsk - let - shouldReformatPreamble = - config & _conf_layout & _lconfig_reformatModulePreamble & confUnpack + let shouldReformatPreamble = + config & _conf_layout & _lconfig_reformatModulePreamble & confUnpack let (filteredAnns', post) = @@ -562,23 +551,23 @@ ppPreamble lmod@(L loc m@HsModule{}) = do let modAnnsDp = ExactPrint.annsDP mAnn isWhere (ExactPrint.G AnnWhere) = True - isWhere _ = False + isWhere _ = False isEof (ExactPrint.AnnEofPos) = True - isEof _ = False - whereInd = List.findIndex (isWhere . fst) modAnnsDp - eofInd = List.findIndex (isEof . fst) modAnnsDp + isEof _ = False + whereInd = List.findIndex (isWhere . fst) modAnnsDp + eofInd = List.findIndex (isEof . fst) modAnnsDp (pre, post') = case (whereInd, eofInd) of (Nothing, Nothing) -> ([], modAnnsDp) - (Just i, Nothing) -> List.splitAt (i + 1) modAnnsDp + (Just i , Nothing) -> List.splitAt (i + 1) modAnnsDp (Nothing, Just _i) -> ([], modAnnsDp) - (Just i, Just j) -> List.splitAt (min (i + 1) j) modAnnsDp + (Just i , Just j ) -> List.splitAt (min (i + 1) j) modAnnsDp mAnn' = mAnn { ExactPrint.annsDP = pre } filteredAnns'' = Map.insert (ExactPrint.mkAnnKey lmod) mAnn' filteredAnns - in (filteredAnns'', post') - traceIfDumpConf - "bridoc annotations filtered/transformed" - _dconf_dump_annotations + in + (filteredAnns'', post') + traceIfDumpConf "bridoc annotations filtered/transformed" + _dconf_dump_annotations $ annsDoc filteredAnns' if shouldReformatPreamble @@ -587,7 +576,7 @@ ppPreamble lmod@(L loc m@HsModule{}) = do layoutBriDoc briDoc else let emptyModule = L loc m { hsmodDecls = [] } - in MultiRWSS.withMultiReader filteredAnns' $ processDefault emptyModule + in MultiRWSS.withMultiReader filteredAnns' $ processDefault emptyModule return post _sigHead :: Sig GhcPs -> String @@ -600,7 +589,7 @@ _bindHead :: HsBind GhcPs -> String _bindHead = \case FunBind _ fId _ [] -> "FunBind " ++ (Text.unpack $ lrdrNameToText $ fId) PatBind _ _pat _ ([], []) -> "PatBind smth" - _ -> "unknown bind" + _ -> "unknown bind" @@ -618,67 +607,63 @@ layoutBriDoc briDoc = do transformAlts briDoc >>= mSet mGet >>= briDocToDoc - .> traceIfDumpConf "bridoc post-alt" _dconf_dump_bridoc_simpl_alt + .> traceIfDumpConf "bridoc post-alt" _dconf_dump_bridoc_simpl_alt -- bridoc transformation: float stuff in mGet >>= transformSimplifyFloating .> mSet mGet >>= briDocToDoc - .> traceIfDumpConf - "bridoc post-floating" - _dconf_dump_bridoc_simpl_floating + .> traceIfDumpConf "bridoc post-floating" + _dconf_dump_bridoc_simpl_floating -- bridoc transformation: par removal mGet >>= transformSimplifyPar .> mSet mGet >>= briDocToDoc - .> traceIfDumpConf "bridoc post-par" _dconf_dump_bridoc_simpl_par + .> traceIfDumpConf "bridoc post-par" _dconf_dump_bridoc_simpl_par -- bridoc transformation: float stuff in mGet >>= transformSimplifyColumns .> mSet mGet >>= briDocToDoc - .> traceIfDumpConf "bridoc post-columns" _dconf_dump_bridoc_simpl_columns + .> traceIfDumpConf "bridoc post-columns" _dconf_dump_bridoc_simpl_columns -- bridoc transformation: indent mGet >>= transformSimplifyIndent .> mSet mGet >>= briDocToDoc - .> traceIfDumpConf "bridoc post-indent" _dconf_dump_bridoc_simpl_indent + .> traceIfDumpConf "bridoc post-indent" _dconf_dump_bridoc_simpl_indent mGet >>= briDocToDoc - .> traceIfDumpConf "bridoc final" _dconf_dump_bridoc_final + .> traceIfDumpConf "bridoc final" _dconf_dump_bridoc_final -- -- convert to Simple type -- simpl <- mGet <&> transformToSimple -- return simpl anns :: ExactPrint.Anns <- mAsk - let - state = LayoutState - { _lstate_baseYs = [0] - , _lstate_curYOrAddNewline = Right 0 -- important that we dont use left - -- here because moveToAnn stuff - -- of the first node needs to do - -- its thing properly. - , _lstate_indLevels = [0] - , _lstate_indLevelLinger = 0 - , _lstate_comments = anns - , _lstate_commentCol = Nothing - , _lstate_addSepSpace = Nothing - , _lstate_commentNewlines = 0 - } + let state = LayoutState { _lstate_baseYs = [0] + , _lstate_curYOrAddNewline = Right 0 -- important that we dont use left + -- here because moveToAnn stuff + -- of the first node needs to do + -- its thing properly. + , _lstate_indLevels = [0] + , _lstate_indLevelLinger = 0 + , _lstate_comments = anns + , _lstate_commentCol = Nothing + , _lstate_addSepSpace = Nothing + , _lstate_commentNewlines = 0 + } state' <- MultiRWSS.withMultiStateS state $ layoutBriDocM briDoc' - let - remainingComments = - [ c - | (ExactPrint.AnnKey _ con, elemAnns) <- Map.toList - (_lstate_comments state') - -- With the new import layouter, we manually process comments - -- without relying on the backend to consume the comments out of - -- the state/map. So they will end up here, and we need to ignore - -- them. - , ExactPrint.unConName con /= "ImportDecl" - , c <- extractAllComments elemAnns - ] + let remainingComments = + [ c + | (ExactPrint.AnnKey _ con, elemAnns) <- Map.toList + (_lstate_comments state') + -- With the new import layouter, we manually process comments + -- without relying on the backend to consume the comments out of + -- the state/map. So they will end up here, and we need to ignore + -- them. + , ExactPrint.unConName con /= "ImportDecl" + , c <- extractAllComments elemAnns + ] remainingComments `forM_` (fst .> show .> ErrorUnusedComment .> (: []) .> mTell) diff --git a/source/library/Language/Haskell/Brittany/Internal/Backend.hs b/source/library/Language/Haskell/Brittany/Internal/Backend.hs index 0dfa6d6..142fe2f 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Backend.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Backend.hs @@ -6,6 +6,10 @@ module Language.Haskell.Brittany.Internal.Backend where + + +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Control.Monad.Trans.State.Strict as StateS import qualified Data.Either as Either import qualified Data.Foldable as Foldable @@ -17,32 +21,32 @@ import qualified Data.Semigroup as Semigroup import qualified Data.Sequence as Seq import qualified Data.Set as Set import qualified Data.Text as Text -import qualified Data.Text.Lazy.Builder as Text.Builder import qualified GHC.OldList as List -import Language.Haskell.Brittany.Internal.BackendUtils -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.LayouterBasics -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.Utils + import qualified Language.Haskell.GHC.ExactPrint as ExactPrint import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types -type ColIndex = Int +import Language.Haskell.Brittany.Internal.LayouterBasics +import Language.Haskell.Brittany.Internal.BackendUtils +import Language.Haskell.Brittany.Internal.Utils +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Types + + +import qualified Data.Text.Lazy.Builder as Text.Builder + + + +type ColIndex = Int data ColumnSpacing = ColumnSpacingLeaf Int | ColumnSpacingRef Int Int -type ColumnBlock a = [a] +type ColumnBlock a = [a] type ColumnBlocks a = Seq [a] -type ColMap1 - = IntMapL.IntMap {- ColIndex -} - (Bool, ColumnBlocks ColumnSpacing) -type ColMap2 - = IntMapL.IntMap {- ColIndex -} - (Float, ColumnBlock Int, ColumnBlocks Int) +type ColMap1 = IntMapL.IntMap {- ColIndex -} (Bool, ColumnBlocks ColumnSpacing) +type ColMap2 = IntMapL.IntMap {- ColIndex -} (Float, ColumnBlock Int, ColumnBlocks Int) -- (ratio of hasSpace, maximum, raw) data ColInfo @@ -52,23 +56,20 @@ data ColInfo instance Show ColInfo where show ColInfoStart = "ColInfoStart" - show (ColInfoNo bd) = - "ColInfoNo " ++ show (take 30 (show (briDocToDoc bd)) ++ "..") - show (ColInfo ind sig list) = - "ColInfo " ++ show ind ++ " " ++ show sig ++ " " ++ show list + show (ColInfoNo bd) = "ColInfoNo " ++ show (take 30 (show (briDocToDoc bd)) ++ "..") + show (ColInfo ind sig list) = "ColInfo " ++ show ind ++ " " ++ show sig ++ " " ++ show list data ColBuildState = ColBuildState { _cbs_map :: ColMap1 , _cbs_index :: ColIndex } -type LayoutConstraints m - = ( MonadMultiReader Config m - , MonadMultiReader ExactPrint.Types.Anns m - , MonadMultiWriter Text.Builder.Builder m - , MonadMultiWriter (Seq String) m - , MonadMultiState LayoutState m - ) +type LayoutConstraints m = ( MonadMultiReader Config m + , MonadMultiReader ExactPrint.Types.Anns m + , MonadMultiWriter Text.Builder.Builder m + , MonadMultiWriter (Seq String) m + , MonadMultiState LayoutState m + ) layoutBriDocM :: forall m . LayoutConstraints m => BriDoc -> m () layoutBriDocM = \case @@ -89,11 +90,10 @@ layoutBriDocM = \case BDSeparator -> do layoutAddSepSpace BDAddBaseY indent bd -> do - let - indentF = case indent of - BrIndentNone -> id - BrIndentRegular -> layoutWithAddBaseCol - BrIndentSpecial i -> layoutWithAddBaseColN i + let indentF = case indent of + BrIndentNone -> id + BrIndentRegular -> layoutWithAddBaseCol + BrIndentSpecial i -> layoutWithAddBaseColN i indentF $ layoutBriDocM bd BDBaseYPushCur bd -> do layoutBaseYPushCur @@ -108,39 +108,36 @@ layoutBriDocM = \case layoutBriDocM bd layoutIndentLevelPop BDEnsureIndent indent bd -> do - let - indentF = case indent of - BrIndentNone -> id - BrIndentRegular -> layoutWithAddBaseCol - BrIndentSpecial i -> layoutWithAddBaseColN i + let indentF = case indent of + BrIndentNone -> id + BrIndentRegular -> layoutWithAddBaseCol + BrIndentSpecial i -> layoutWithAddBaseColN i indentF $ do layoutWriteEnsureBlock layoutBriDocM bd BDPar indent sameLine indented -> do layoutBriDocM sameLine - let - indentF = case indent of - BrIndentNone -> id - BrIndentRegular -> layoutWithAddBaseCol - BrIndentSpecial i -> layoutWithAddBaseColN i + let indentF = case indent of + BrIndentNone -> id + BrIndentRegular -> layoutWithAddBaseCol + BrIndentSpecial i -> layoutWithAddBaseColN i indentF $ do layoutWriteNewlineBlock layoutBriDocM indented - BDLines lines -> alignColsLines lines - BDAlt [] -> error "empty BDAlt" - BDAlt (alt : _) -> layoutBriDocM alt - BDForceMultiline bd -> layoutBriDocM bd - BDForceSingleline bd -> layoutBriDocM bd - BDForwardLineMode bd -> layoutBriDocM bd + BDLines lines -> alignColsLines lines + BDAlt [] -> error "empty BDAlt" + BDAlt (alt:_) -> layoutBriDocM alt + BDForceMultiline bd -> layoutBriDocM bd + BDForceSingleline bd -> layoutBriDocM bd + BDForwardLineMode bd -> layoutBriDocM bd BDExternal annKey subKeys shouldAddComment t -> do - let - tlines = Text.lines $ t <> Text.pack "\n" - tlineCount = length tlines + let tlines = Text.lines $ t <> Text.pack "\n" + tlineCount = length tlines anns :: ExactPrint.Anns <- mAsk when shouldAddComment $ do layoutWriteAppend - $ Text.pack - $ "{-" + $ Text.pack + $ "{-" ++ show (annKey, Map.lookup annKey anns) ++ "-}" zip [1 ..] tlines `forM_` \(i, l) -> do @@ -157,10 +154,9 @@ layoutBriDocM = \case BDAnnotationPrior annKey bd -> do state <- mGet let m = _lstate_comments state - let - moveToExactLocationAction = case _lstate_curYOrAddNewline state of - Left{} -> pure () - Right{} -> moveToExactAnn annKey + let moveToExactLocationAction = case _lstate_curYOrAddNewline state of + Left{} -> pure () + Right{} -> moveToExactAnn annKey mAnn <- do let mAnn = ExactPrint.annPriorComments <$> Map.lookup annKey m mSet $ state @@ -171,8 +167,8 @@ layoutBriDocM = \case } return mAnn case mAnn of - Nothing -> moveToExactLocationAction - Just [] -> moveToExactLocationAction + Nothing -> moveToExactLocationAction + Just [] -> moveToExactLocationAction Just priors -> do -- layoutResetSepSpace priors @@ -180,10 +176,9 @@ layoutBriDocM = \case when (comment /= "(" && comment /= ")") $ do let commentLines = Text.lines $ Text.pack $ comment case comment of - ('#' : _) -> - layoutMoveToCommentPos y (-999) (length commentLines) + ('#':_) -> layoutMoveToCommentPos y (-999) (length commentLines) -- ^ evil hack for CPP - _ -> layoutMoveToCommentPos y x (length commentLines) + _ -> layoutMoveToCommentPos y x (length commentLines) -- fixedX <- fixMoveToLineByIsNewline x -- replicateM_ fixedX layoutWriteNewline -- layoutMoveToIndentCol y @@ -195,20 +190,18 @@ layoutBriDocM = \case layoutBriDocM bd mComments <- do state <- mGet - let m = _lstate_comments state + let m = _lstate_comments state let mAnn = ExactPrint.annsDP <$> Map.lookup annKey m - let - mToSpan = case mAnn of - Just anns | Maybe.isNothing keyword -> Just anns - Just ((ExactPrint.Types.G kw1, _) : annR) | keyword == Just kw1 -> - Just annR - _ -> Nothing + let mToSpan = case mAnn of + Just anns | Maybe.isNothing keyword -> Just anns + Just ((ExactPrint.Types.G kw1, _):annR) | keyword == Just kw1 -> Just + annR + _ -> Nothing case mToSpan of Just anns -> do - let - (comments, rest) = flip spanMaybe anns $ \case - (ExactPrint.Types.AnnComment x, dp) -> Just (x, dp) - _ -> Nothing + let (comments, rest) = flip spanMaybe anns $ \case + (ExactPrint.Types.AnnComment x, dp) -> Just (x, dp) + _ -> Nothing mSet $ state { _lstate_comments = Map.adjust (\ann -> ann { ExactPrint.annsDP = rest }) @@ -220,19 +213,17 @@ layoutBriDocM = \case case mComments of Nothing -> pure () Just comments -> do - comments - `forM_` \(ExactPrint.Types.Comment comment _ _, ExactPrint.Types.DP (y, x)) -> - when (comment /= "(" && comment /= ")") $ do - let commentLines = Text.lines $ Text.pack $ comment - -- evil hack for CPP: - case comment of - ('#' : _) -> - layoutMoveToCommentPos y (-999) (length commentLines) - _ -> layoutMoveToCommentPos y x (length commentLines) - -- fixedX <- fixMoveToLineByIsNewline x - -- replicateM_ fixedX layoutWriteNewline - -- layoutMoveToIndentCol y - layoutWriteAppendMultiline commentLines + comments `forM_` \(ExactPrint.Types.Comment comment _ _, ExactPrint.Types.DP (y, x)) -> + when (comment /= "(" && comment /= ")") $ do + let commentLines = Text.lines $ Text.pack $ comment + -- evil hack for CPP: + case comment of + ('#':_) -> layoutMoveToCommentPos y (-999) (length commentLines) + _ -> layoutMoveToCommentPos y x (length commentLines) + -- fixedX <- fixMoveToLineByIsNewline x + -- replicateM_ fixedX layoutWriteNewline + -- layoutMoveToIndentCol y + layoutWriteAppendMultiline commentLines -- mModify $ \s -> s { _lstate_curYOrAddNewline = Right 0 } BDAnnotationRest annKey bd -> do layoutBriDocM bd @@ -241,26 +232,21 @@ layoutBriDocM = \case let m = _lstate_comments state pure $ Map.lookup annKey m let mComments = nonEmpty . extractAllComments =<< annMay - let - semiCount = length - [ () - | Just ann <- [annMay] - , (ExactPrint.Types.AnnSemiSep, _) <- ExactPrint.Types.annsDP ann - ] - shouldAddSemicolonNewlines <- - mAsk - <&> _conf_layout - .> _lconfig_experimentalSemicolonNewlines - .> confUnpack + let semiCount = length [ () + | Just ann <- [ annMay ] + , (ExactPrint.Types.AnnSemiSep, _) <- ExactPrint.Types.annsDP ann + ] + shouldAddSemicolonNewlines <- mAsk <&> + _conf_layout .> _lconfig_experimentalSemicolonNewlines .> confUnpack mModify $ \state -> state { _lstate_comments = Map.adjust - (\ann -> ann - { ExactPrint.annFollowingComments = [] - , ExactPrint.annPriorComments = [] - , ExactPrint.annsDP = flip filter (ExactPrint.annsDP ann) $ \case - (ExactPrint.Types.AnnComment{}, _) -> False - _ -> True - } + ( \ann -> ann { ExactPrint.annFollowingComments = [] + , ExactPrint.annPriorComments = [] + , ExactPrint.annsDP = + flip filter (ExactPrint.annsDP ann) $ \case + (ExactPrint.Types.AnnComment{}, _) -> False + _ -> True + } ) annKey (_lstate_comments state) @@ -268,40 +254,37 @@ layoutBriDocM = \case case mComments of Nothing -> do when shouldAddSemicolonNewlines $ do - [1 .. semiCount] `forM_` const layoutWriteNewline + [1..semiCount] `forM_` const layoutWriteNewline Just comments -> do - comments - `forM_` \(ExactPrint.Types.Comment comment _ _, ExactPrint.Types.DP (y, x)) -> - when (comment /= "(" && comment /= ")") $ do - let commentLines = Text.lines $ Text.pack comment - case comment of - ('#' : _) -> layoutMoveToCommentPos y (-999) 1 - -- ^ evil hack for CPP - ")" -> pure () - -- ^ fixes the formatting of parens - -- on the lhs of type alias defs - _ -> layoutMoveToCommentPos y x (length commentLines) - -- fixedX <- fixMoveToLineByIsNewline x - -- replicateM_ fixedX layoutWriteNewline - -- layoutMoveToIndentCol y - layoutWriteAppendMultiline commentLines + comments `forM_` \(ExactPrint.Types.Comment comment _ _, ExactPrint.Types.DP (y, x)) -> + when (comment /= "(" && comment /= ")") $ do + let commentLines = Text.lines $ Text.pack comment + case comment of + ('#':_) -> layoutMoveToCommentPos y (-999) 1 + -- ^ evil hack for CPP + ")" -> pure () + -- ^ fixes the formatting of parens + -- on the lhs of type alias defs + _ -> layoutMoveToCommentPos y x (length commentLines) + -- fixedX <- fixMoveToLineByIsNewline x + -- replicateM_ fixedX layoutWriteNewline + -- layoutMoveToIndentCol y + layoutWriteAppendMultiline commentLines -- mModify $ \s -> s { _lstate_curYOrAddNewline = Right 0 } BDMoveToKWDP annKey keyword shouldRestoreIndent bd -> do mDP <- do state <- mGet - let m = _lstate_comments state + let m = _lstate_comments state let mAnn = ExactPrint.annsDP <$> Map.lookup annKey m - let - relevant = - [ dp - | Just ann <- [mAnn] - , (ExactPrint.Types.G kw1, dp) <- ann - , keyword == kw1 - ] + let relevant = [ dp + | Just ann <- [mAnn] + , (ExactPrint.Types.G kw1, dp) <- ann + , keyword == kw1 + ] -- mTell $ Seq.fromList [show keyword, "KWDP: " ++ show annKey ++ " " ++ show mAnn, show relevant] case relevant of [] -> pure Nothing - (ExactPrint.Types.DP (y, x) : _) -> do + (ExactPrint.Types.DP (y, x):_) -> do mSet state { _lstate_commentNewlines = 0 } pure $ Just (y - _lstate_commentNewlines state, x) case mDP of @@ -312,8 +295,8 @@ layoutBriDocM = \case layoutMoveToCommentPos y (if shouldRestoreIndent then x else 0) 1 layoutBriDocM bd BDNonBottomSpacing _ bd -> layoutBriDocM bd - BDSetParSpacing bd -> layoutBriDocM bd - BDForceParSpacing bd -> layoutBriDocM bd + BDSetParSpacing bd -> layoutBriDocM bd + BDForceParSpacing bd -> layoutBriDocM bd BDDebug s bd -> do mTell $ Text.Builder.fromText $ Text.pack $ "{-" ++ s ++ "-}" layoutBriDocM bd @@ -324,73 +307,73 @@ briDocLineLength briDoc = flip StateS.evalState False $ rec briDoc -- appended at the current position. where rec = \case - BDEmpty -> return $ 0 - BDLit t -> StateS.put False $> Text.length t - BDSeq bds -> sum <$> rec `mapM` bds - BDCols _ bds -> sum <$> rec `mapM` bds + BDEmpty -> return $ 0 + BDLit t -> StateS.put False $> Text.length t + BDSeq bds -> sum <$> rec `mapM` bds + BDCols _ bds -> sum <$> rec `mapM` bds BDSeparator -> StateS.get >>= \b -> StateS.put True $> if b then 0 else 1 - BDAddBaseY _ bd -> rec bd - BDBaseYPushCur bd -> rec bd - BDBaseYPop bd -> rec bd + BDAddBaseY _ bd -> rec bd + BDBaseYPushCur bd -> rec bd + BDBaseYPop bd -> rec bd BDIndentLevelPushCur bd -> rec bd - BDIndentLevelPop bd -> rec bd - BDPar _ line _ -> rec line - BDAlt{} -> error "briDocLineLength BDAlt" - BDForceMultiline bd -> rec bd - BDForceSingleline bd -> rec bd - BDForwardLineMode bd -> rec bd - BDExternal _ _ _ t -> return $ Text.length t - BDPlain t -> return $ Text.length t - BDAnnotationPrior _ bd -> rec bd - BDAnnotationKW _ _ bd -> rec bd - BDAnnotationRest _ bd -> rec bd - BDMoveToKWDP _ _ _ bd -> rec bd - BDLines ls@(_ : _) -> do + BDIndentLevelPop bd -> rec bd + BDPar _ line _ -> rec line + BDAlt{} -> error "briDocLineLength BDAlt" + BDForceMultiline bd -> rec bd + BDForceSingleline bd -> rec bd + BDForwardLineMode bd -> rec bd + BDExternal _ _ _ t -> return $ Text.length t + BDPlain t -> return $ Text.length t + BDAnnotationPrior _ bd -> rec bd + BDAnnotationKW _ _ bd -> rec bd + BDAnnotationRest _ bd -> rec bd + BDMoveToKWDP _ _ _ bd -> rec bd + BDLines ls@(_ : _) -> do x <- StateS.get return $ maximum $ ls <&> \l -> StateS.evalState (rec l) x - BDLines [] -> error "briDocLineLength BDLines []" - BDEnsureIndent _ bd -> rec bd - BDSetParSpacing bd -> rec bd - BDForceParSpacing bd -> rec bd + BDLines [] -> error "briDocLineLength BDLines []" + BDEnsureIndent _ bd -> rec bd + BDSetParSpacing bd -> rec bd + BDForceParSpacing bd -> rec bd BDNonBottomSpacing _ bd -> rec bd - BDDebug _ bd -> rec bd + BDDebug _ bd -> rec bd briDocIsMultiLine :: BriDoc -> Bool briDocIsMultiLine briDoc = rec briDoc where rec :: BriDoc -> Bool rec = \case - BDEmpty -> False - BDLit _ -> False - BDSeq bds -> any rec bds - BDCols _ bds -> any rec bds - BDSeparator -> False - BDAddBaseY _ bd -> rec bd - BDBaseYPushCur bd -> rec bd - BDBaseYPop bd -> rec bd - BDIndentLevelPushCur bd -> rec bd - BDIndentLevelPop bd -> rec bd - BDPar{} -> True - BDAlt{} -> error "briDocIsMultiLine BDAlt" - BDForceMultiline _ -> True - BDForceSingleline bd -> rec bd - BDForwardLineMode bd -> rec bd + BDEmpty -> False + BDLit _ -> False + BDSeq bds -> any rec bds + BDCols _ bds -> any rec bds + BDSeparator -> False + BDAddBaseY _ bd -> rec bd + BDBaseYPushCur bd -> rec bd + BDBaseYPop bd -> rec bd + BDIndentLevelPushCur bd -> rec bd + BDIndentLevelPop bd -> rec bd + BDPar{} -> True + BDAlt{} -> error "briDocIsMultiLine BDAlt" + BDForceMultiline _ -> True + BDForceSingleline bd -> rec bd + BDForwardLineMode bd -> rec bd BDExternal _ _ _ t | [_] <- Text.lines t -> False - BDExternal{} -> True - BDPlain t | [_] <- Text.lines t -> False - BDPlain _ -> True - BDAnnotationPrior _ bd -> rec bd - BDAnnotationKW _ _ bd -> rec bd - BDAnnotationRest _ bd -> rec bd - BDMoveToKWDP _ _ _ bd -> rec bd - BDLines (_ : _ : _) -> True - BDLines [_] -> False + BDExternal{} -> True + BDPlain t | [_] <- Text.lines t -> False + BDPlain _ -> True + BDAnnotationPrior _ bd -> rec bd + BDAnnotationKW _ _ bd -> rec bd + BDAnnotationRest _ bd -> rec bd + BDMoveToKWDP _ _ _ bd -> rec bd + BDLines (_ : _ : _) -> True + BDLines [_ ] -> False BDLines [] -> error "briDocIsMultiLine BDLines []" - BDEnsureIndent _ bd -> rec bd - BDSetParSpacing bd -> rec bd - BDForceParSpacing bd -> rec bd - BDNonBottomSpacing _ bd -> rec bd - BDDebug _ bd -> rec bd + BDEnsureIndent _ bd -> rec bd + BDSetParSpacing bd -> rec bd + BDForceParSpacing bd -> rec bd + BDNonBottomSpacing _ bd -> rec bd + BDDebug _ bd -> rec bd -- In theory -- ========= @@ -475,16 +458,16 @@ alignColsLines bridocs = do -- colInfos `forM_` \colInfo -> do return $ Either.fromLeft 0 (_lstate_curYOrAddNewline state) + fromMaybe 0 (_lstate_addSepSpace state) - colMax <- mAsk <&> _conf_layout .> _lconfig_cols .> confUnpack - alignMax <- mAsk <&> _conf_layout .> _lconfig_alignmentLimit .> confUnpack + colMax <- mAsk <&> _conf_layout .> _lconfig_cols .> confUnpack + alignMax <- mAsk <&> _conf_layout .> _lconfig_alignmentLimit .> confUnpack alignBreak <- mAsk <&> _conf_layout .> _lconfig_alignmentBreakOnMultiline .> confUnpack case () of _ -> do -- tellDebugMess ("processedMap: " ++ show processedMap) sequence_ - $ List.intersperse layoutWriteEnsureNewlineBlock - $ colInfos + $ List.intersperse layoutWriteEnsureNewlineBlock + $ colInfos <&> processInfo colMax processedMap where (colInfos, finalState) = @@ -501,41 +484,40 @@ alignColsLines bridocs = do -- colInfos `forM_` \colInfo -> do where alignMax' = max 0 alignMax processedMap :: ColMap2 - processedMap = fix $ \result -> - _cbs_map finalState <&> \(lastFlag, colSpacingss) -> + processedMap = + fix $ \result -> _cbs_map finalState <&> \(lastFlag, colSpacingss) -> let colss = colSpacingss <&> \spss -> case reverse spss of [] -> [] - (xN : xR) -> - reverse - $ (if lastFlag then fLast else fInit) xN - : fmap fInit xR + (xN:xR) -> + reverse $ (if lastFlag then fLast else fInit) xN : fmap fInit xR where - fLast (ColumnSpacingLeaf len) = len + fLast (ColumnSpacingLeaf len ) = len fLast (ColumnSpacingRef len _) = len fInit (ColumnSpacingLeaf len) = len - fInit (ColumnSpacingRef _ i) = case IntMapL.lookup i result of - Nothing -> 0 + fInit (ColumnSpacingRef _ i ) = case IntMapL.lookup i result of + Nothing -> 0 Just (_, maxs, _) -> sum maxs maxCols = {-Foldable.foldl1 maxZipper-} fmap colAggregation $ transpose $ Foldable.toList colss (_, posXs) = -- trace ("colss=" ++ show colss ++ ", maxCols=" ++ show maxCols ++ " for " ++ take 100 (show $ briDocToDoc $ head bridocs)) $ - mapAccumL (\acc x -> (acc + x, acc)) curX maxCols + mapAccumL (\acc x -> (acc + x, acc)) curX maxCols counter count l = if List.last posXs + List.last l <= colMax then count + 1 else count ratio = fromIntegral (foldl counter (0 :: Int) colss) / fromIntegral (length colss) - in (ratio, maxCols, colss) + in + (ratio, maxCols, colss) mergeBriDocs :: [BriDoc] -> StateS.State ColBuildState [ColInfo] mergeBriDocs bds = mergeBriDocsW ColInfoStart bds mergeBriDocsW :: ColInfo -> [BriDoc] -> StateS.State ColBuildState [ColInfo] - mergeBriDocsW _ [] = return [] - mergeBriDocsW lastInfo (bd : bdr) = do - info <- mergeInfoBriDoc True lastInfo bd + mergeBriDocsW _ [] = return [] + mergeBriDocsW lastInfo (bd:bdr) = do + info <- mergeInfoBriDoc True lastInfo bd infor <- mergeBriDocsW -- (if alignBreak && briDocIsMultiLine bd then ColInfoStart else info) (if shouldBreakAfter bd then ColInfoStart else info) @@ -563,27 +545,28 @@ alignColsLines bridocs = do -- colInfos `forM_` \colInfo -> do -- personal preference to not break alignment for those, even if -- multiline. Really, this should be configurable.. (TODO) shouldBreakAfter :: BriDoc -> Bool - shouldBreakAfter bd = alignBreak && briDocIsMultiLine bd && case bd of - (BDCols ColTyOpPrefix _) -> False - (BDCols ColPatternsFuncPrefix _) -> True - (BDCols ColPatternsFuncInfix _) -> True - (BDCols ColPatterns _) -> True - (BDCols ColCasePattern _) -> True - (BDCols ColBindingLine{} _) -> True - (BDCols ColGuard _) -> True - (BDCols ColGuardedBody _) -> True - (BDCols ColBindStmt _) -> True - (BDCols ColDoLet _) -> True - (BDCols ColRec _) -> False - (BDCols ColRecUpdate _) -> False - (BDCols ColRecDecl _) -> False - (BDCols ColListComp _) -> False - (BDCols ColList _) -> False - (BDCols ColApp{} _) -> True - (BDCols ColTuple _) -> False - (BDCols ColTuples _) -> False - (BDCols ColOpPrefix _) -> False - _ -> True + shouldBreakAfter bd = alignBreak && + briDocIsMultiLine bd && case bd of + (BDCols ColTyOpPrefix _) -> False + (BDCols ColPatternsFuncPrefix _) -> True + (BDCols ColPatternsFuncInfix _) -> True + (BDCols ColPatterns _) -> True + (BDCols ColCasePattern _) -> True + (BDCols ColBindingLine{} _) -> True + (BDCols ColGuard _) -> True + (BDCols ColGuardedBody _) -> True + (BDCols ColBindStmt _) -> True + (BDCols ColDoLet _) -> True + (BDCols ColRec _) -> False + (BDCols ColRecUpdate _) -> False + (BDCols ColRecDecl _) -> False + (BDCols ColListComp _) -> False + (BDCols ColList _) -> False + (BDCols ColApp{} _) -> True + (BDCols ColTuple _) -> False + (BDCols ColTuples _) -> False + (BDCols ColOpPrefix _) -> False + _ -> True mergeInfoBriDoc :: Bool @@ -591,22 +574,23 @@ alignColsLines bridocs = do -- colInfos `forM_` \colInfo -> do -> BriDoc -> StateS.StateT ColBuildState Identity ColInfo mergeInfoBriDoc lastFlag ColInfoStart = briDocToColInfo lastFlag - mergeInfoBriDoc lastFlag ColInfoNo{} = briDocToColInfo lastFlag + mergeInfoBriDoc lastFlag ColInfoNo{} = briDocToColInfo lastFlag mergeInfoBriDoc lastFlag (ColInfo infoInd infoSig subLengthsInfos) = \case brdc@(BDCols colSig subDocs) - | infoSig == colSig && length subLengthsInfos == length subDocs -> do + | infoSig == colSig && length subLengthsInfos == length subDocs + -> do let isLastList = if lastFlag - then (== length subDocs) <$> [1 ..] + then (==length subDocs) <$> [1 ..] else repeat False infos <- zip3 isLastList (snd <$> subLengthsInfos) subDocs `forM` \(lf, info, bd) -> mergeInfoBriDoc lf info bd - let curLengths = briDocLineLength <$> subDocs + let curLengths = briDocLineLength <$> subDocs let trueSpacings = getTrueSpacings (zip curLengths infos) do -- update map s <- StateS.get - let m = _cbs_map s + let m = _cbs_map s let (Just (_, spaces)) = IntMapS.lookup infoInd m StateS.put s { _cbs_map = IntMapS.insert @@ -615,17 +599,17 @@ alignColsLines bridocs = do -- colInfos `forM_` \colInfo -> do m } return $ ColInfo infoInd colSig (zip curLengths infos) - | otherwise -> briDocToColInfo lastFlag brdc + | otherwise + -> briDocToColInfo lastFlag brdc brdc -> return $ ColInfoNo brdc briDocToColInfo :: Bool -> BriDoc -> StateS.State ColBuildState ColInfo briDocToColInfo lastFlag = \case BDCols sig list -> withAlloc lastFlag $ \ind -> do - let - isLastList = - if lastFlag then (== length list) <$> [1 ..] else repeat False + let isLastList = + if lastFlag then (==length list) <$> [1 ..] else repeat False subInfos <- zip isLastList list `forM` uncurry briDocToColInfo - let lengthInfos = zip (briDocLineLength <$> list) subInfos + let lengthInfos = zip (briDocLineLength <$> list) subInfos let trueSpacings = getTrueSpacings lengthInfos return $ (Seq.singleton trueSpacings, ColInfo ind sig lengthInfos) bd -> return $ ColInfoNo bd @@ -633,11 +617,11 @@ briDocToColInfo lastFlag = \case getTrueSpacings :: [(Int, ColInfo)] -> [ColumnSpacing] getTrueSpacings lengthInfos = lengthInfos <&> \case (len, ColInfo i _ _) -> ColumnSpacingRef len i - (len, _) -> ColumnSpacingLeaf len + (len, _ ) -> ColumnSpacingLeaf len withAlloc :: Bool - -> ( ColIndex + -> ( ColIndex -> StateS.State ColBuildState (ColumnBlocks ColumnSpacing, ColInfo) ) -> StateS.State ColBuildState ColInfo @@ -652,14 +636,13 @@ withAlloc lastFlag f = do processInfo :: LayoutConstraints m => Int -> ColMap2 -> ColInfo -> m () processInfo maxSpace m = \case - ColInfoStart -> error "should not happen (TM)" - ColInfoNo doc -> layoutBriDocM doc + ColInfoStart -> error "should not happen (TM)" + ColInfoNo doc -> layoutBriDocM doc ColInfo ind _ list -> -- trace ("processInfo ind=" ++ show ind ++ ", list=" ++ show list ++ ", colmap=" ++ show m) $ do colMaxConf <- mAsk <&> _conf_layout .> _lconfig_cols .> confUnpack - alignMode <- - mAsk <&> _conf_layout .> _lconfig_columnAlignMode .> confUnpack - curX <- do + alignMode <- mAsk <&> _conf_layout .> _lconfig_columnAlignMode .> confUnpack + curX <- do state <- mGet -- tellDebugMess ("processInfo: " ++ show (_lstate_curYOrAddNewline state) ++ " - " ++ show ((_lstate_addSepSpace state))) let spaceAdd = fromMaybe 0 $ _lstate_addSepSpace state @@ -671,11 +654,10 @@ processInfo maxSpace m = \case let colMax = min colMaxConf (curX + maxSpace) -- tellDebugMess $ show curX let Just (ratio, maxCols1, _colss) = IntMapS.lookup ind m - let - maxCols2 = list <&> \case - (_, ColInfo i _ _) -> - let Just (_, ms, _) = IntMapS.lookup i m in sum ms - (l, _) -> l + let maxCols2 = list <&> \case + (_, ColInfo i _ _) -> + let Just (_, ms, _) = IntMapS.lookup i m in sum ms + (l, _) -> l let maxCols = zipWith max maxCols1 maxCols2 let (maxX, posXs) = mapAccumL (\acc x -> (acc + x, acc)) curX maxCols -- handle the cases that the vertical alignment leads to more than max @@ -686,48 +668,46 @@ processInfo maxSpace m = \case -- sizes in such a way that it works _if_ we have sizes (*factor) -- in each column. but in that line, in the last column, we will be -- forced to occupy the full vertical space, not reduced by any factor. - let - fixedPosXs = case alignMode of - ColumnAlignModeAnimouslyScale i | maxX > colMax -> fixed <&> (+ curX) - where - factor :: Float = - -- 0.0001 as an offering to the floating point gods. - min - 1.0001 - (fromIntegral (i + colMax - curX) / fromIntegral (maxX - curX)) - offsets = (subtract curX) <$> posXs - fixed = offsets <&> fromIntegral .> (* factor) .> truncate - _ -> posXs - let - spacings = - zipWith (-) (List.tail fixedPosXs ++ [min maxX colMax]) fixedPosXs + let fixedPosXs = case alignMode of + ColumnAlignModeAnimouslyScale i | maxX > colMax -> fixed <&> (+curX) + where + factor :: Float = + -- 0.0001 as an offering to the floating point gods. + min + 1.0001 + (fromIntegral (i + colMax - curX) / fromIntegral (maxX - curX)) + offsets = (subtract curX) <$> posXs + fixed = offsets <&> fromIntegral .> (*factor) .> truncate + _ -> posXs + let spacings = zipWith (-) + (List.tail fixedPosXs ++ [min maxX colMax]) + fixedPosXs -- tellDebugMess $ "ind = " ++ show ind -- tellDebugMess $ "maxCols = " ++ show maxCols -- tellDebugMess $ "fixedPosXs = " ++ show fixedPosXs -- tellDebugMess $ "list = " ++ show list -- tellDebugMess $ "maxSpace = " ++ show maxSpace - let - alignAct = zip3 fixedPosXs spacings list `forM_` \(destX, s, x) -> do - layoutWriteEnsureAbsoluteN destX - processInfo s m (snd x) - noAlignAct = list `forM_` (snd .> processInfoIgnore) - animousAct = -- trace ("animousAct fixedPosXs=" ++ show fixedPosXs ++ ", list=" ++ show list ++ ", maxSpace=" ++ show maxSpace ++ ", colMax="++show colMax) $ - if List.last fixedPosXs + fst (List.last list) > colMax - -- per-item check if there is overflowing. - then noAlignAct - else alignAct + let alignAct = zip3 fixedPosXs spacings list `forM_` \(destX, s, x) -> do + layoutWriteEnsureAbsoluteN destX + processInfo s m (snd x) + noAlignAct = list `forM_` (snd .> processInfoIgnore) + animousAct = -- trace ("animousAct fixedPosXs=" ++ show fixedPosXs ++ ", list=" ++ show list ++ ", maxSpace=" ++ show maxSpace ++ ", colMax="++show colMax) $ + if List.last fixedPosXs + fst (List.last list) > colMax + -- per-item check if there is overflowing. + then noAlignAct + else alignAct case alignMode of - ColumnAlignModeDisabled -> noAlignAct - ColumnAlignModeUnanimously | maxX <= colMax -> alignAct - ColumnAlignModeUnanimously -> noAlignAct + ColumnAlignModeDisabled -> noAlignAct + ColumnAlignModeUnanimously | maxX <= colMax -> alignAct + ColumnAlignModeUnanimously -> noAlignAct ColumnAlignModeMajority limit | ratio >= limit -> animousAct - ColumnAlignModeMajority{} -> noAlignAct - ColumnAlignModeAnimouslyScale{} -> animousAct - ColumnAlignModeAnimously -> animousAct - ColumnAlignModeAlways -> alignAct + ColumnAlignModeMajority{} -> noAlignAct + ColumnAlignModeAnimouslyScale{} -> animousAct + ColumnAlignModeAnimously -> animousAct + ColumnAlignModeAlways -> alignAct processInfoIgnore :: LayoutConstraints m => ColInfo -> m () processInfoIgnore = \case - ColInfoStart -> error "should not happen (TM)" - ColInfoNo doc -> layoutBriDocM doc + ColInfoStart -> error "should not happen (TM)" + ColInfoNo doc -> layoutBriDocM doc ColInfo _ _ list -> list `forM_` (snd .> processInfoIgnore) diff --git a/source/library/Language/Haskell/Brittany/Internal/BackendUtils.hs b/source/library/Language/Haskell/Brittany/Internal/BackendUtils.hs index e48da84..6c34ea9 100644 --- a/source/library/Language/Haskell/Brittany/Internal/BackendUtils.hs +++ b/source/library/Language/Haskell/Brittany/Internal/BackendUtils.hs @@ -3,29 +3,42 @@ module Language.Haskell.Brittany.Internal.BackendUtils where + +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Data.Data import qualified Data.Either import qualified Data.Map as Map import qualified Data.Maybe import qualified Data.Semigroup as Semigroup import qualified Data.Text as Text -import qualified Data.Text.Lazy.Builder as Text.Builder -import GHC (Located) import qualified GHC.OldList as List -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.Utils -import Language.Haskell.GHC.ExactPrint.Types (AnnKey, Annotation) -import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint -traceLocal :: (MonadMultiState LayoutState m) => a -> m () +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.GHC.ExactPrint.Types ( AnnKey + , Annotation + ) + +import qualified Data.Text.Lazy.Builder as Text.Builder +import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint +import Language.Haskell.Brittany.Internal.Utils + +import GHC ( Located ) + + + +traceLocal + :: (MonadMultiState LayoutState m) + => a + -> m () traceLocal _ = return () layoutWriteAppend - :: (MonadMultiWriter Text.Builder.Builder m, MonadMultiState LayoutState m) + :: ( MonadMultiWriter Text.Builder.Builder m + , MonadMultiState LayoutState m + ) => Text -> m () layoutWriteAppend t = do @@ -41,13 +54,15 @@ layoutWriteAppend t = do mTell $ Text.Builder.fromText $ t mModify $ \s -> s { _lstate_curYOrAddNewline = Left $ case _lstate_curYOrAddNewline s of - Left c -> c + Text.length t + spaces - Right{} -> Text.length t + spaces + Left c -> c + Text.length t + spaces + Right{} -> Text.length t + spaces , _lstate_addSepSpace = Nothing } layoutWriteAppendSpaces - :: (MonadMultiWriter Text.Builder.Builder m, MonadMultiState LayoutState m) + :: ( MonadMultiWriter Text.Builder.Builder m + , MonadMultiState LayoutState m + ) => Int -> m () layoutWriteAppendSpaces i = do @@ -55,18 +70,20 @@ layoutWriteAppendSpaces i = do unless (i == 0) $ do state <- mGet mSet $ state - { _lstate_addSepSpace = Just $ maybe i (+ i) $ _lstate_addSepSpace state + { _lstate_addSepSpace = Just $ maybe i (+i) $ _lstate_addSepSpace state } layoutWriteAppendMultiline - :: (MonadMultiWriter Text.Builder.Builder m, MonadMultiState LayoutState m) + :: ( MonadMultiWriter Text.Builder.Builder m + , MonadMultiState LayoutState m + ) => [Text] -> m () layoutWriteAppendMultiline ts = do traceLocal ("layoutWriteAppendMultiline", ts) case ts of - [] -> layoutWriteAppend (Text.pack "") -- need to write empty, too. - (l : lr) -> do + [] -> layoutWriteAppend (Text.pack "") -- need to write empty, too. + (l:lr) -> do layoutWriteAppend l lr `forM_` \x -> do layoutWriteNewline @@ -74,15 +91,16 @@ layoutWriteAppendMultiline ts = do -- adds a newline and adds spaces to reach the base column. layoutWriteNewlineBlock - :: (MonadMultiWriter Text.Builder.Builder m, MonadMultiState LayoutState m) + :: ( MonadMultiWriter Text.Builder.Builder m + , MonadMultiState LayoutState m + ) => m () layoutWriteNewlineBlock = do traceLocal ("layoutWriteNewlineBlock") state <- mGet - mSet $ state - { _lstate_curYOrAddNewline = Right 1 - , _lstate_addSepSpace = Just $ lstate_baseY state - } + mSet $ state { _lstate_curYOrAddNewline = Right 1 + , _lstate_addSepSpace = Just $ lstate_baseY state + } -- layoutMoveToIndentCol :: ( MonadMultiState LayoutState m -- , MonadMultiWriter (Seq String) m) => Int -> m () @@ -98,13 +116,13 @@ layoutWriteNewlineBlock = do -- else _lstate_indLevelLinger state + i - _lstate_curY state -- } -layoutSetCommentCol :: (MonadMultiState LayoutState m) => m () +layoutSetCommentCol + :: (MonadMultiState LayoutState m) => m () layoutSetCommentCol = do state <- mGet - let - col = case _lstate_curYOrAddNewline state of - Left i -> i + fromMaybe 0 (_lstate_addSepSpace state) - Right{} -> lstate_baseY state + let col = case _lstate_curYOrAddNewline state of + Left i -> i + fromMaybe 0 (_lstate_addSepSpace state) + Right{} -> lstate_baseY state traceLocal ("layoutSetCommentCol", col) unless (Data.Maybe.isJust $ _lstate_commentCol state) $ mSet state { _lstate_commentCol = Just col } @@ -112,7 +130,9 @@ layoutSetCommentCol = do -- This is also used to move to non-comments in a couple of places. Seems -- to be harmless so far.. layoutMoveToCommentPos - :: (MonadMultiWriter Text.Builder.Builder m, MonadMultiState LayoutState m) + :: ( MonadMultiWriter Text.Builder.Builder m + , MonadMultiState LayoutState m + ) => Int -> Int -> Int @@ -122,35 +142,38 @@ layoutMoveToCommentPos y x commentLines = do state <- mGet mSet state { _lstate_curYOrAddNewline = case _lstate_curYOrAddNewline state of - Left i -> if y == 0 then Left i else Right y + Left i -> if y == 0 then Left i else Right y Right{} -> Right y - , _lstate_addSepSpace = + , _lstate_addSepSpace = Just $ if Data.Maybe.isJust (_lstate_commentCol state) then case _lstate_curYOrAddNewline state of - Left{} -> if y == 0 then x else _lstate_indLevelLinger state + x + Left{} -> if y == 0 then x else _lstate_indLevelLinger state + x Right{} -> _lstate_indLevelLinger state + x else if y == 0 then x else _lstate_indLevelLinger state + x - , _lstate_commentCol = Just $ case _lstate_commentCol state of - Just existing -> existing - Nothing -> case _lstate_curYOrAddNewline state of - Left i -> i + fromMaybe 0 (_lstate_addSepSpace state) - Right{} -> lstate_baseY state + , _lstate_commentCol = + Just $ case _lstate_commentCol state of + Just existing -> existing + Nothing -> case _lstate_curYOrAddNewline state of + Left i -> i + fromMaybe 0 (_lstate_addSepSpace state) + Right{} -> lstate_baseY state , _lstate_commentNewlines = - _lstate_commentNewlines state + y + commentLines - 1 + _lstate_commentNewlines state + y + commentLines - 1 } -- | does _not_ add spaces to again reach the current base column. layoutWriteNewline - :: (MonadMultiWriter Text.Builder.Builder m, MonadMultiState LayoutState m) + :: ( MonadMultiWriter Text.Builder.Builder m + , MonadMultiState LayoutState m + ) => m () layoutWriteNewline = do traceLocal ("layoutWriteNewline") state <- mGet mSet $ state { _lstate_curYOrAddNewline = case _lstate_curYOrAddNewline state of - Left{} -> Right 1 + Left{} -> Right 1 Right i -> Right (i + 1) - , _lstate_addSepSpace = Nothing + , _lstate_addSepSpace = Nothing } _layoutResetCommentNewlines :: MonadMultiState LayoutState m => m () @@ -158,67 +181,77 @@ _layoutResetCommentNewlines = do mModify $ \state -> state { _lstate_commentNewlines = 0 } layoutWriteEnsureNewlineBlock - :: (MonadMultiWriter Text.Builder.Builder m, MonadMultiState LayoutState m) + :: ( MonadMultiWriter Text.Builder.Builder m + , MonadMultiState LayoutState m + ) => m () layoutWriteEnsureNewlineBlock = do traceLocal ("layoutWriteEnsureNewlineBlock") state <- mGet mSet $ state { _lstate_curYOrAddNewline = case _lstate_curYOrAddNewline state of - Left{} -> Right 1 + Left{} -> Right 1 Right i -> Right $ max 1 i - , _lstate_addSepSpace = Just $ lstate_baseY state - , _lstate_commentCol = Nothing + , _lstate_addSepSpace = Just $ lstate_baseY state + , _lstate_commentCol = Nothing } layoutWriteEnsureAbsoluteN - :: (MonadMultiWriter Text.Builder.Builder m, MonadMultiState LayoutState m) + :: ( MonadMultiWriter Text.Builder.Builder m + , MonadMultiState LayoutState m + ) => Int -> m () layoutWriteEnsureAbsoluteN n = do state <- mGet - let - diff = case (_lstate_commentCol state, _lstate_curYOrAddNewline state) of - (Just c, _) -> n - c - (Nothing, Left i) -> n - i - (Nothing, Right{}) -> n + let diff = case (_lstate_commentCol state, _lstate_curYOrAddNewline state) of + (Just c , _ ) -> n - c + (Nothing, Left i ) -> n - i + (Nothing, Right{}) -> n traceLocal ("layoutWriteEnsureAbsoluteN", n, diff) when (diff > 0) $ do - mSet $ state { _lstate_addSepSpace = Just diff } -- this always sets to + mSet $ state { _lstate_addSepSpace = Just diff -- this always sets to -- at least (Just 1), so we won't -- overwrite any old value in any -- bad way. + } -layoutBaseYPushInternal :: (MonadMultiState LayoutState m) => Int -> m () +layoutBaseYPushInternal + :: (MonadMultiState LayoutState m) + => Int + -> m () layoutBaseYPushInternal i = do traceLocal ("layoutBaseYPushInternal", i) mModify $ \s -> s { _lstate_baseYs = i : _lstate_baseYs s } -layoutBaseYPopInternal :: (MonadMultiState LayoutState m) => m () +layoutBaseYPopInternal + :: (MonadMultiState LayoutState m) => m () layoutBaseYPopInternal = do traceLocal ("layoutBaseYPopInternal") mModify $ \s -> s { _lstate_baseYs = List.tail $ _lstate_baseYs s } layoutIndentLevelPushInternal - :: (MonadMultiState LayoutState m) => Int -> m () + :: (MonadMultiState LayoutState m) + => Int + -> m () layoutIndentLevelPushInternal i = do traceLocal ("layoutIndentLevelPushInternal", i) - mModify $ \s -> s - { _lstate_indLevelLinger = lstate_indLevel s - , _lstate_indLevels = i : _lstate_indLevels s - } + mModify $ \s -> s { _lstate_indLevelLinger = lstate_indLevel s + , _lstate_indLevels = i : _lstate_indLevels s + } -layoutIndentLevelPopInternal :: (MonadMultiState LayoutState m) => m () +layoutIndentLevelPopInternal + :: (MonadMultiState LayoutState m) => m () layoutIndentLevelPopInternal = do traceLocal ("layoutIndentLevelPopInternal") - mModify $ \s -> s - { _lstate_indLevelLinger = lstate_indLevel s - , _lstate_indLevels = List.tail $ _lstate_indLevels s - } + mModify $ \s -> s { _lstate_indLevelLinger = lstate_indLevel s + , _lstate_indLevels = List.tail $ _lstate_indLevels s + } -layoutRemoveIndentLevelLinger :: (MonadMultiState LayoutState m) => m () +layoutRemoveIndentLevelLinger :: ( MonadMultiState LayoutState m) => m () layoutRemoveIndentLevelLinger = do - mModify $ \s -> s { _lstate_indLevelLinger = lstate_indLevel s } + mModify $ \s -> s { _lstate_indLevelLinger = lstate_indLevel s + } layoutWithAddBaseCol :: ( MonadMultiWriter Text.Builder.Builder m @@ -250,7 +283,9 @@ layoutWithAddBaseColBlock m = do layoutBaseYPopInternal layoutWithAddBaseColNBlock - :: (MonadMultiWriter Text.Builder.Builder m, MonadMultiState LayoutState m) + :: ( MonadMultiWriter Text.Builder.Builder m + , MonadMultiState LayoutState m + ) => Int -> m () -> m () @@ -263,23 +298,27 @@ layoutWithAddBaseColNBlock amount m = do layoutBaseYPopInternal layoutWriteEnsureBlock - :: (MonadMultiWriter Text.Builder.Builder m, MonadMultiState LayoutState m) + :: ( MonadMultiWriter Text.Builder.Builder m + , MonadMultiState LayoutState m + ) => m () layoutWriteEnsureBlock = do traceLocal ("layoutWriteEnsureBlock") state <- mGet let diff = case (_lstate_addSepSpace state, _lstate_curYOrAddNewline state) of - (Nothing, Left i) -> lstate_baseY state - i + (Nothing, Left i ) -> lstate_baseY state - i (Nothing, Right{}) -> lstate_baseY state - (Just sp, Left i) -> max sp (lstate_baseY state - i) + (Just sp, Left i ) -> max sp (lstate_baseY state - i) (Just sp, Right{}) -> max sp (lstate_baseY state) -- when (diff>0) $ layoutWriteNewlineBlock when (diff > 0) $ do mSet $ state { _lstate_addSepSpace = Just $ diff } layoutWithAddBaseColN - :: (MonadMultiWriter Text.Builder.Builder m, MonadMultiState LayoutState m) + :: ( MonadMultiWriter Text.Builder.Builder m + , MonadMultiState LayoutState m + ) => Int -> m () -> m () @@ -289,36 +328,39 @@ layoutWithAddBaseColN amount m = do m layoutBaseYPopInternal -layoutBaseYPushCur :: (MonadMultiState LayoutState m) => m () +layoutBaseYPushCur + :: (MonadMultiState LayoutState m) => m () layoutBaseYPushCur = do traceLocal ("layoutBaseYPushCur") state <- mGet case _lstate_commentCol state of Nothing -> case (_lstate_curYOrAddNewline state, _lstate_addSepSpace state) of - (Left i, Just j) -> layoutBaseYPushInternal (i + j) - (Left i, Nothing) -> layoutBaseYPushInternal i - (Right{}, _) -> layoutBaseYPushInternal $ lstate_baseY state + (Left i , Just j ) -> layoutBaseYPushInternal (i + j) + (Left i , Nothing) -> layoutBaseYPushInternal i + (Right{}, _ ) -> layoutBaseYPushInternal $ lstate_baseY state Just cCol -> layoutBaseYPushInternal cCol -layoutBaseYPop :: (MonadMultiState LayoutState m) => m () +layoutBaseYPop + :: (MonadMultiState LayoutState m) => m () layoutBaseYPop = do traceLocal ("layoutBaseYPop") layoutBaseYPopInternal -layoutIndentLevelPushCur :: (MonadMultiState LayoutState m) => m () +layoutIndentLevelPushCur + :: (MonadMultiState LayoutState m) => m () layoutIndentLevelPushCur = do traceLocal ("layoutIndentLevelPushCur") state <- mGet - let - y = case (_lstate_curYOrAddNewline state, _lstate_addSepSpace state) of - (Left i, Just j) -> i + j - (Left i, Nothing) -> i - (Right{}, Just j) -> j - (Right{}, Nothing) -> 0 + let y = case (_lstate_curYOrAddNewline state, _lstate_addSepSpace state) of + (Left i , Just j ) -> i + j + (Left i , Nothing) -> i + (Right{}, Just j ) -> j + (Right{}, Nothing) -> 0 layoutIndentLevelPushInternal y -layoutIndentLevelPop :: (MonadMultiState LayoutState m) => m () +layoutIndentLevelPop + :: (MonadMultiState LayoutState m) => m () layoutIndentLevelPop = do traceLocal ("layoutIndentLevelPop") layoutIndentLevelPopInternal @@ -328,12 +370,12 @@ layoutIndentLevelPop = do -- make sense. layoutRemoveIndentLevelLinger -layoutAddSepSpace :: (MonadMultiState LayoutState m) => m () +layoutAddSepSpace :: (MonadMultiState LayoutState m) + => m () layoutAddSepSpace = do state <- mGet mSet $ state - { _lstate_addSepSpace = Just $ fromMaybe 1 $ _lstate_addSepSpace state - } + { _lstate_addSepSpace = Just $ fromMaybe 1 $ _lstate_addSepSpace state } -- TODO: when refactoring is complete, the other version of this method -- can probably be removed. @@ -348,7 +390,7 @@ moveToExactAnn annKey = do traceLocal ("moveToExactAnn", annKey) anns <- mAsk case Map.lookup annKey anns of - Nothing -> return () + Nothing -> return () Just ann -> do -- curY <- mGet <&> _lstate_curY let ExactPrint.DP (y, _x) = ExactPrint.annEntryDelta ann @@ -357,19 +399,19 @@ moveToExactAnn annKey = do moveToY :: MonadMultiState LayoutState m => Int -> m () moveToY y = mModify $ \state -> - let - upd = case _lstate_curYOrAddNewline state of - Left i -> if y == 0 then Left i else Right y - Right i -> Right $ max y i - in - state - { _lstate_curYOrAddNewline = upd - , _lstate_addSepSpace = if Data.Either.isRight upd - then _lstate_commentCol state <|> _lstate_addSepSpace state <|> Just - (lstate_baseY state) - else Nothing - , _lstate_commentCol = Nothing - } + let upd = case _lstate_curYOrAddNewline state of + Left i -> if y == 0 then Left i else Right y + Right i -> Right $ max y i + in state + { _lstate_curYOrAddNewline = upd + , _lstate_addSepSpace = if Data.Either.isRight upd + then + _lstate_commentCol state + <|> _lstate_addSepSpace state + <|> Just (lstate_baseY state) + else Nothing + , _lstate_commentCol = Nothing + } -- fixMoveToLineByIsNewline :: MonadMultiState -- LayoutState m => Int -> m Int -- fixMoveToLineByIsNewline x = do @@ -379,7 +421,9 @@ moveToY y = mModify $ \state -> -- else x ppmMoveToExactLoc - :: MonadMultiWriter Text.Builder.Builder m => ExactPrint.DeltaPos -> m () + :: MonadMultiWriter Text.Builder.Builder m + => ExactPrint.DeltaPos + -> m () ppmMoveToExactLoc (ExactPrint.DP (x, y)) = do replicateM_ x $ mTell $ Text.Builder.fromString "\n" replicateM_ y $ mTell $ Text.Builder.fromString " " @@ -395,77 +439,75 @@ layoutWritePriorComments layoutWritePriorComments ast = do mAnn <- do state <- mGet - let key = ExactPrint.mkAnnKey ast + let key = ExactPrint.mkAnnKey ast let anns = _lstate_comments state let mAnn = ExactPrint.annPriorComments <$> Map.lookup key anns mSet $ state - { _lstate_comments = Map.adjust - (\ann -> ann { ExactPrint.annPriorComments = [] }) - key - anns + { _lstate_comments = + Map.adjust (\ann -> ann { ExactPrint.annPriorComments = [] }) key anns } return mAnn case mAnn of Nothing -> return () Just priors -> do unless (null priors) $ layoutSetCommentCol - priors - `forM_` \(ExactPrint.Comment comment _ _, ExactPrint.DP (x, y)) -> do - replicateM_ x layoutWriteNewline - layoutWriteAppendSpaces y - layoutWriteAppendMultiline $ Text.lines $ Text.pack comment + priors `forM_` \( ExactPrint.Comment comment _ _ + , ExactPrint.DP (x, y) + ) -> do + replicateM_ x layoutWriteNewline + layoutWriteAppendSpaces y + layoutWriteAppendMultiline $ Text.lines $ Text.pack comment -- TODO: update and use, or clean up. Currently dead code. -- this currently only extracs from the `annsDP` field of Annotations. -- per documentation, this seems sufficient, as the -- "..`annFollowingComments` are only added by AST transformations ..". -layoutWritePostComments - :: ( Data.Data.Data ast - , MonadMultiWriter Text.Builder.Builder m - , MonadMultiState LayoutState m - ) - => Located ast - -> m () +layoutWritePostComments :: (Data.Data.Data ast, + MonadMultiWriter Text.Builder.Builder m, + MonadMultiState LayoutState m) + => Located ast -> m () layoutWritePostComments ast = do mAnn <- do state <- mGet - let key = ExactPrint.mkAnnKey ast + let key = ExactPrint.mkAnnKey ast let anns = _lstate_comments state let mAnn = ExactPrint.annFollowingComments <$> Map.lookup key anns mSet $ state - { _lstate_comments = Map.adjust - (\ann -> ann { ExactPrint.annFollowingComments = [] }) - key - anns + { _lstate_comments = + Map.adjust (\ann -> ann { ExactPrint.annFollowingComments = [] }) + key + anns } return mAnn case mAnn of Nothing -> return () Just posts -> do unless (null posts) $ layoutSetCommentCol - posts `forM_` \(ExactPrint.Comment comment _ _, ExactPrint.DP (x, y)) -> - do - replicateM_ x layoutWriteNewline - layoutWriteAppend $ Text.pack $ replicate y ' ' - mModify $ \s -> s { _lstate_addSepSpace = Nothing } - layoutWriteAppendMultiline $ Text.lines $ Text.pack $ comment + posts `forM_` \( ExactPrint.Comment comment _ _ + , ExactPrint.DP (x, y) + ) -> do + replicateM_ x layoutWriteNewline + layoutWriteAppend $ Text.pack $ replicate y ' ' + mModify $ \s -> s { _lstate_addSepSpace = Nothing } + layoutWriteAppendMultiline $ Text.lines $ Text.pack $ comment layoutIndentRestorePostComment - :: (MonadMultiState LayoutState m, MonadMultiWriter Text.Builder.Builder m) + :: ( MonadMultiState LayoutState m + , MonadMultiWriter Text.Builder.Builder m + ) => m () layoutIndentRestorePostComment = do state <- mGet let mCommentCol = _lstate_commentCol state - let eCurYAddNL = _lstate_curYOrAddNewline state - mModify - $ \s -> s { _lstate_commentCol = Nothing, _lstate_commentNewlines = 0 } + let eCurYAddNL = _lstate_curYOrAddNewline state + mModify $ \s -> s { _lstate_commentCol = Nothing + , _lstate_commentNewlines = 0 + } case (mCommentCol, eCurYAddNL) of (Just commentCol, Left{}) -> do layoutWriteEnsureNewlineBlock - layoutWriteEnsureAbsoluteN $ commentCol + fromMaybe - 0 - (_lstate_addSepSpace state) - _ -> return () + layoutWriteEnsureAbsoluteN $ commentCol + fromMaybe 0 (_lstate_addSepSpace state) + _ -> return () -- layoutWritePriorCommentsRestore :: (Data.Data.Data ast, -- MonadMultiWriter Text.Builder.Builder m, diff --git a/source/library/Language/Haskell/Brittany/Internal/Config.hs b/source/library/Language/Haskell/Brittany/Internal/Config.hs index b951db9..66d6d7f 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Config.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Config.hs @@ -3,174 +3,185 @@ module Language.Haskell.Brittany.Internal.Config where + + +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Data.Bool as Bool import qualified Data.ByteString as ByteString import qualified Data.ByteString.Char8 -import Data.CZipWith -import Data.Coerce (coerce) -import qualified Data.List.NonEmpty as NonEmpty import qualified Data.Semigroup as Semigroup -import qualified Data.Yaml import qualified GHC.OldList as List -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Config.Types.Instances () -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -import Language.Haskell.Brittany.Internal.Utils -import qualified System.Console.CmdArgs.Explicit as CmdArgs import qualified System.Directory -import qualified System.Directory as Directory -import qualified System.FilePath.Posix as FilePath import qualified System.IO -import UI.Butcher.Monadic +import qualified Data.Yaml +import Data.CZipWith + +import UI.Butcher.Monadic + +import qualified System.Console.CmdArgs.Explicit + as CmdArgs + +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Config.Types.Instances () +import Language.Haskell.Brittany.Internal.Utils + +import Data.Coerce ( coerce + ) +import qualified Data.List.NonEmpty as NonEmpty + +import qualified System.Directory as Directory +import qualified System.FilePath.Posix as FilePath + +-- brittany-next-binding { lconfig_indentPolicy: IndentPolicyLeft } staticDefaultConfig :: Config staticDefaultConfig = Config - { _conf_version = coerce (1 :: Int) - , _conf_debug = DebugConfig - { _dconf_dump_config = coerce False - , _dconf_dump_annotations = coerce False - , _dconf_dump_ast_unknown = coerce False - , _dconf_dump_ast_full = coerce False - , _dconf_dump_bridoc_raw = coerce False - , _dconf_dump_bridoc_simpl_alt = coerce False + { _conf_version = coerce (1 :: Int) + , _conf_debug = DebugConfig + { _dconf_dump_config = coerce False + , _dconf_dump_annotations = coerce False + , _dconf_dump_ast_unknown = coerce False + , _dconf_dump_ast_full = coerce False + , _dconf_dump_bridoc_raw = coerce False + , _dconf_dump_bridoc_simpl_alt = coerce False , _dconf_dump_bridoc_simpl_floating = coerce False - , _dconf_dump_bridoc_simpl_par = coerce False - , _dconf_dump_bridoc_simpl_columns = coerce False - , _dconf_dump_bridoc_simpl_indent = coerce False - , _dconf_dump_bridoc_final = coerce False - , _dconf_roundtrip_exactprint_only = coerce False + , _dconf_dump_bridoc_simpl_par = coerce False + , _dconf_dump_bridoc_simpl_columns = coerce False + , _dconf_dump_bridoc_simpl_indent = coerce False + , _dconf_dump_bridoc_final = coerce False + , _dconf_roundtrip_exactprint_only = coerce False } - , _conf_layout = LayoutConfig - { _lconfig_cols = coerce (80 :: Int) - , _lconfig_indentPolicy = coerce IndentPolicyFree - , _lconfig_indentAmount = coerce (2 :: Int) - , _lconfig_indentWhereSpecial = coerce True - , _lconfig_indentListSpecial = coerce True - , _lconfig_importColumn = coerce (50 :: Int) - , _lconfig_importAsColumn = coerce (50 :: Int) + , _conf_layout = LayoutConfig + { _lconfig_cols = coerce (80 :: Int) + , _lconfig_indentPolicy = coerce IndentPolicyFree + , _lconfig_indentAmount = coerce (2 :: Int) + , _lconfig_indentWhereSpecial = coerce True + , _lconfig_indentListSpecial = coerce True + , _lconfig_importColumn = coerce (50 :: Int) + , _lconfig_importAsColumn = coerce (50 :: Int) , _lconfig_altChooser = coerce (AltChooserBoundedSearch 3) , _lconfig_columnAlignMode = coerce (ColumnAlignModeMajority 0.7) - , _lconfig_alignmentLimit = coerce (30 :: Int) - , _lconfig_alignmentBreakOnMultiline = coerce True - , _lconfig_hangingTypeSignature = coerce False - , _lconfig_reformatModulePreamble = coerce True - , _lconfig_allowSingleLineExportList = coerce False - , _lconfig_allowHangingQuasiQuotes = coerce True + , _lconfig_alignmentLimit = coerce (30 :: Int) + , _lconfig_alignmentBreakOnMultiline = coerce True + , _lconfig_hangingTypeSignature = coerce False + , _lconfig_reformatModulePreamble = coerce True + , _lconfig_allowSingleLineExportList = coerce False + , _lconfig_allowHangingQuasiQuotes = coerce True , _lconfig_experimentalSemicolonNewlines = coerce False -- , _lconfig_allowSinglelineRecord = coerce False } - , _conf_errorHandling = ErrorHandlingConfig - { _econf_produceOutputOnErrors = coerce False - , _econf_Werror = coerce False - , _econf_ExactPrintFallback = coerce ExactPrintFallbackModeInline + , _conf_errorHandling = ErrorHandlingConfig + { _econf_produceOutputOnErrors = coerce False + , _econf_Werror = coerce False + , _econf_ExactPrintFallback = coerce ExactPrintFallbackModeInline , _econf_omit_output_valid_check = coerce False } - , _conf_preprocessor = PreProcessorConfig - { _ppconf_CPPMode = coerce CPPModeAbort + , _conf_preprocessor = PreProcessorConfig + { _ppconf_CPPMode = coerce CPPModeAbort , _ppconf_hackAroundIncludes = coerce False } , _conf_forward = ForwardOptions { _options_ghc = Identity [] } , _conf_roundtrip_exactprint_only = coerce False - , _conf_disable_formatting = coerce False - , _conf_obfuscate = coerce False + , _conf_disable_formatting = coerce False + , _conf_obfuscate = coerce False } forwardOptionsSyntaxExtsEnabled :: ForwardOptions forwardOptionsSyntaxExtsEnabled = ForwardOptions { _options_ghc = Identity - [ "-XLambdaCase" - , "-XMultiWayIf" - , "-XGADTs" - , "-XPatternGuards" - , "-XViewPatterns" - , "-XTupleSections" - , "-XExplicitForAll" - , "-XImplicitParams" - , "-XQuasiQuotes" - , "-XTemplateHaskell" - , "-XBangPatterns" - , "-XTypeApplications" - ] + [ "-XLambdaCase" + , "-XMultiWayIf" + , "-XGADTs" + , "-XPatternGuards" + , "-XViewPatterns" + , "-XTupleSections" + , "-XExplicitForAll" + , "-XImplicitParams" + , "-XQuasiQuotes" + , "-XTemplateHaskell" + , "-XBangPatterns" + , "-XTypeApplications" + ] } --- brittany-next-binding --columns 200 +-- brittany-next-binding { lconfig_indentPolicy: IndentPolicyLeft, lconfig_cols: 200 } cmdlineConfigParser :: CmdParser Identity out (CConfig Maybe) cmdlineConfigParser = do -- TODO: why does the default not trigger; ind never should be []!! - ind <- addFlagReadParams "" ["indent"] "AMOUNT" (flagHelpStr "spaces per indentation level") - 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") - importAsCol <- addFlagReadParams "" ["import-as-col"] "N" (flagHelpStr "column to qualified-as module names at") + ind <- addFlagReadParams "" ["indent"] "AMOUNT" (flagHelpStr "spaces per indentation level") + 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") + importAsCol <- addFlagReadParams "" ["import-as-col"] "N" (flagHelpStr "column to qualified-as module names at") - 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") - dumpBriDocRaw <- addSimpleBoolFlag "" ["dump-bridoc-raw"] (flagHelp $ parDoc "dump the pre-transformation bridoc") - dumpBriDocAlt <- addSimpleBoolFlag "" ["dump-bridoc-alt"] (flagHelp $ parDoc "dump the partially transformed bridoc: after transformation: alt") - dumpBriDocPar <- addSimpleBoolFlag "" ["dump-bridoc-par"] (flagHelp $ parDoc "dump the partially transformed bridoc: after transformation: par") + 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") + dumpBriDocRaw <- addSimpleBoolFlag "" ["dump-bridoc-raw"] (flagHelp $ parDoc "dump the pre-transformation bridoc") + dumpBriDocAlt <- addSimpleBoolFlag "" ["dump-bridoc-alt"] (flagHelp $ parDoc "dump the partially transformed bridoc: after transformation: alt") + dumpBriDocPar <- addSimpleBoolFlag "" ["dump-bridoc-par"] (flagHelp $ parDoc "dump the partially transformed bridoc: after transformation: par") dumpBriDocFloating <- addSimpleBoolFlag "" ["dump-bridoc-floating"] (flagHelp $ parDoc "dump the partially transformed bridoc: after transformation: floating") - dumpBriDocColumns <- addSimpleBoolFlag "" ["dump-bridoc-columns"] (flagHelp $ parDoc "dump the partially transformed bridoc: after transformation: columns") - 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") + dumpBriDocColumns <- addSimpleBoolFlag "" ["dump-bridoc-columns"] (flagHelp $ parDoc "dump the partially transformed bridoc: after transformation: columns") + 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)") - wError <- addSimpleBoolFlag "" ["werror"] (flagHelp $ parDoc "treat warnings as errors") - omitValidCheck <- addSimpleBoolFlag "" ["omit-output-check"] (flagHelp $ parDoc "omit checking if the output is syntactically valid (debugging)") + 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 (debugging)") - roundtripOnly <- addSimpleBoolFlag "" ["exactprint-only"] (flagHelp $ parDoc "do not reformat, but exclusively use exactprint to roundtrip (debugging)") + roundtripOnly <- addSimpleBoolFlag "" ["exactprint-only"] (flagHelp $ parDoc "do not reformat, but exclusively use exactprint to roundtrip (debugging)") - optionsGhc <- addFlagStringParams "" ["ghc-options"] "STRING" (flagHelp $ parDoc "allows to define default language extensions. The parameter is forwarded to ghc.") - disableFormatting <- addSimpleBoolFlag "" ["disable-formatting"] (flagHelp $ parDoc "parse, but don't transform the input at all. Useful for inline config for specific modules.") - obfuscate <- addSimpleBoolFlag "" ["obfuscate"] (flagHelp $ parDoc "apply obfuscator to the output.") + optionsGhc <- addFlagStringParams "" ["ghc-options"] "STRING" (flagHelp $ parDoc "allows to define default language extensions. The parameter is forwarded to ghc.") + disableFormatting <- addSimpleBoolFlag "" ["disable-formatting"] (flagHelp $ parDoc "parse, but don't transform the input at all. Useful for inline config for specific modules.") + obfuscate <- addSimpleBoolFlag "" ["obfuscate"] (flagHelp $ parDoc "apply obfuscator to the output.") return $ Config - { _conf_version = mempty - , _conf_debug = DebugConfig - { _dconf_dump_config = wrapLast $ falseToNothing dumpConfig - , _dconf_dump_annotations = wrapLast $ falseToNothing dumpAnnotations - , _dconf_dump_ast_unknown = wrapLast $ falseToNothing dumpUnknownAST - , _dconf_dump_ast_full = wrapLast $ falseToNothing dumpCompleteAST - , _dconf_dump_bridoc_raw = wrapLast $ falseToNothing dumpBriDocRaw - , _dconf_dump_bridoc_simpl_alt = wrapLast $ falseToNothing dumpBriDocAlt - , _dconf_dump_bridoc_simpl_par = wrapLast $ falseToNothing dumpBriDocPar + { _conf_version = mempty + , _conf_debug = DebugConfig + { _dconf_dump_config = wrapLast $ falseToNothing dumpConfig + , _dconf_dump_annotations = wrapLast $ falseToNothing dumpAnnotations + , _dconf_dump_ast_unknown = wrapLast $ falseToNothing dumpUnknownAST + , _dconf_dump_ast_full = wrapLast $ falseToNothing dumpCompleteAST + , _dconf_dump_bridoc_raw = wrapLast $ falseToNothing dumpBriDocRaw + , _dconf_dump_bridoc_simpl_alt = wrapLast $ falseToNothing dumpBriDocAlt + , _dconf_dump_bridoc_simpl_par = wrapLast $ falseToNothing dumpBriDocPar , _dconf_dump_bridoc_simpl_floating = wrapLast $ falseToNothing dumpBriDocFloating - , _dconf_dump_bridoc_simpl_columns = wrapLast $ falseToNothing dumpBriDocColumns - , _dconf_dump_bridoc_simpl_indent = wrapLast $ falseToNothing dumpBriDocIndent - , _dconf_dump_bridoc_final = wrapLast $ falseToNothing dumpBriDocFinal - , _dconf_roundtrip_exactprint_only = mempty + , _dconf_dump_bridoc_simpl_columns = wrapLast $ falseToNothing dumpBriDocColumns + , _dconf_dump_bridoc_simpl_indent = wrapLast $ falseToNothing dumpBriDocIndent + , _dconf_dump_bridoc_final = wrapLast $ falseToNothing dumpBriDocFinal + , _dconf_roundtrip_exactprint_only = mempty } - , _conf_layout = LayoutConfig - { _lconfig_cols = optionConcat cols - , _lconfig_indentPolicy = mempty - , _lconfig_indentAmount = optionConcat ind - , _lconfig_indentWhereSpecial = mempty -- falseToNothing _ - , _lconfig_indentListSpecial = mempty -- falseToNothing _ - , _lconfig_importColumn = optionConcat importCol - , _lconfig_importAsColumn = optionConcat importAsCol - , _lconfig_altChooser = mempty - , _lconfig_columnAlignMode = mempty - , _lconfig_alignmentLimit = mempty - , _lconfig_alignmentBreakOnMultiline = mempty - , _lconfig_hangingTypeSignature = mempty - , _lconfig_reformatModulePreamble = mempty - , _lconfig_allowSingleLineExportList = mempty - , _lconfig_allowHangingQuasiQuotes = mempty + , _conf_layout = LayoutConfig + { _lconfig_cols = optionConcat cols + , _lconfig_indentPolicy = mempty + , _lconfig_indentAmount = optionConcat ind + , _lconfig_indentWhereSpecial = mempty -- falseToNothing _ + , _lconfig_indentListSpecial = mempty -- falseToNothing _ + , _lconfig_importColumn = optionConcat importCol + , _lconfig_importAsColumn = optionConcat importAsCol + , _lconfig_altChooser = mempty + , _lconfig_columnAlignMode = mempty + , _lconfig_alignmentLimit = mempty + , _lconfig_alignmentBreakOnMultiline = mempty + , _lconfig_hangingTypeSignature = mempty + , _lconfig_reformatModulePreamble = mempty + , _lconfig_allowSingleLineExportList = mempty + , _lconfig_allowHangingQuasiQuotes = mempty , _lconfig_experimentalSemicolonNewlines = mempty -- , _lconfig_allowSinglelineRecord = mempty } - , _conf_errorHandling = ErrorHandlingConfig - { _econf_produceOutputOnErrors = wrapLast $ falseToNothing outputOnErrors - , _econf_Werror = wrapLast $ falseToNothing wError - , _econf_ExactPrintFallback = mempty + , _conf_errorHandling = ErrorHandlingConfig + { _econf_produceOutputOnErrors = wrapLast $ falseToNothing outputOnErrors + , _econf_Werror = wrapLast $ falseToNothing wError + , _econf_ExactPrintFallback = mempty , _econf_omit_output_valid_check = wrapLast $ falseToNothing omitValidCheck } - , _conf_preprocessor = PreProcessorConfig { _ppconf_CPPMode = mempty, _ppconf_hackAroundIncludes = mempty } - , _conf_forward = ForwardOptions { _options_ghc = [ optionsGhc & List.unwords & CmdArgs.splitArgs | not $ null optionsGhc ] } + , _conf_preprocessor = PreProcessorConfig { _ppconf_CPPMode = mempty, _ppconf_hackAroundIncludes = mempty } + , _conf_forward = ForwardOptions { _options_ghc = [ optionsGhc & List.unwords & CmdArgs.splitArgs | not $ null optionsGhc ] } , _conf_roundtrip_exactprint_only = wrapLast $ falseToNothing roundtripOnly - , _conf_disable_formatting = wrapLast $ falseToNothing disableFormatting - , _conf_obfuscate = wrapLast $ falseToNothing obfuscate + , _conf_disable_formatting = wrapLast $ falseToNothing disableFormatting + , _conf_obfuscate = wrapLast $ falseToNothing obfuscate } where falseToNothing = Bool.bool Nothing (Just True) @@ -217,8 +228,8 @@ readConfig path = do fileConf <- case Data.Yaml.decodeEither' contents of Left e -> do liftIO - $ putStrErrLn - $ "error reading in brittany config from " + $ putStrErrLn + $ "error reading in brittany config from " ++ path ++ ":" liftIO $ putStrErrLn (Data.Yaml.prettyPrintParseException e) @@ -232,12 +243,11 @@ readConfig path = do userConfigPath :: IO System.IO.FilePath userConfigPath = do userBritPathSimple <- Directory.getAppUserDataDirectory "brittany" - userBritPathXdg <- Directory.getXdgDirectory Directory.XdgConfig "brittany" + userBritPathXdg <- Directory.getXdgDirectory Directory.XdgConfig "brittany" let searchDirs = [userBritPathSimple, userBritPathXdg] - globalConfig <- Directory.findFileWith - Directory.doesFileExist - searchDirs - "config.yaml" + globalConfig <- Directory.findFileWith Directory.doesFileExist + searchDirs + "config.yaml" maybe (writeUserConfig userBritPathXdg) pure globalConfig where writeUserConfig dir = do @@ -249,7 +259,7 @@ userConfigPath = do -- | Searches for a local (per-project) brittany config starting from a given directory findLocalConfigPath :: System.IO.FilePath -> IO (Maybe System.IO.FilePath) findLocalConfigPath dir = do - let dirParts = FilePath.splitDirectories dir + let dirParts = FilePath.splitDirectories dir -- when provided dir is "a/b/c", searchDirs is ["a/b/c", "a/b", "a", "/"] let searchDirs = FilePath.joinPath <$> reverse (List.inits dirParts) Directory.findFileWith Directory.doesFileExist searchDirs "brittany.yaml" @@ -261,9 +271,8 @@ readConfigs -> MaybeT IO Config readConfigs cmdlineConfig configPaths = do configs <- readConfig `mapM` configPaths - let - merged = - Semigroup.sconcat $ NonEmpty.reverse (cmdlineConfig :| catMaybes configs) + let merged = Semigroup.sconcat + $ NonEmpty.reverse (cmdlineConfig :| catMaybes configs) return $ cZipWith fromOptionIdentity staticDefaultConfig merged -- | Reads provided configs diff --git a/source/library/Language/Haskell/Brittany/Internal/Config/Types.hs b/source/library/Language/Haskell/Brittany/Internal/Config/Types.hs index 0b81ae6..929ac90 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Config/Types.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Config/Types.hs @@ -7,54 +7,63 @@ module Language.Haskell.Brittany.Internal.Config.Types where -import Data.CZipWith -import Data.Coerce (Coercible, coerce) -import Data.Data (Data) -import qualified Data.Semigroup as Semigroup -import Data.Semigroup (Last) -import Data.Semigroup.Generic -import GHC.Generics + + import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils () +import qualified Data.Semigroup as Semigroup + +import GHC.Generics + +import Data.Data ( Data ) + +import Data.Coerce ( Coercible, coerce ) + +import Data.Semigroup.Generic +import Data.Semigroup ( Last ) + +import Data.CZipWith + + confUnpack :: Coercible a b => Identity a -> b confUnpack (Identity x) = coerce x data CDebugConfig f = DebugConfig - { _dconf_dump_config :: f (Semigroup.Last Bool) - , _dconf_dump_annotations :: f (Semigroup.Last Bool) - , _dconf_dump_ast_unknown :: f (Semigroup.Last Bool) - , _dconf_dump_ast_full :: f (Semigroup.Last Bool) - , _dconf_dump_bridoc_raw :: f (Semigroup.Last Bool) - , _dconf_dump_bridoc_simpl_alt :: f (Semigroup.Last Bool) + { _dconf_dump_config :: f (Semigroup.Last Bool) + , _dconf_dump_annotations :: f (Semigroup.Last Bool) + , _dconf_dump_ast_unknown :: f (Semigroup.Last Bool) + , _dconf_dump_ast_full :: f (Semigroup.Last Bool) + , _dconf_dump_bridoc_raw :: f (Semigroup.Last Bool) + , _dconf_dump_bridoc_simpl_alt :: f (Semigroup.Last Bool) , _dconf_dump_bridoc_simpl_floating :: f (Semigroup.Last Bool) - , _dconf_dump_bridoc_simpl_par :: f (Semigroup.Last Bool) - , _dconf_dump_bridoc_simpl_columns :: f (Semigroup.Last Bool) - , _dconf_dump_bridoc_simpl_indent :: f (Semigroup.Last Bool) - , _dconf_dump_bridoc_final :: f (Semigroup.Last Bool) - , _dconf_roundtrip_exactprint_only :: f (Semigroup.Last Bool) + , _dconf_dump_bridoc_simpl_par :: f (Semigroup.Last Bool) + , _dconf_dump_bridoc_simpl_columns :: f (Semigroup.Last Bool) + , _dconf_dump_bridoc_simpl_indent :: f (Semigroup.Last Bool) + , _dconf_dump_bridoc_final :: f (Semigroup.Last Bool) + , _dconf_roundtrip_exactprint_only :: f (Semigroup.Last Bool) } - deriving Generic + deriving (Generic) data CLayoutConfig f = LayoutConfig - { _lconfig_cols :: f (Last Int) -- the thing that has default 80. + { _lconfig_cols :: f (Last Int) -- the thing that has default 80. , _lconfig_indentPolicy :: f (Last IndentPolicy) , _lconfig_indentAmount :: f (Last Int) , _lconfig_indentWhereSpecial :: f (Last Bool) -- indent where only 1 sometimes (TODO). - , _lconfig_indentListSpecial :: f (Last Bool) -- use some special indentation for "," + , _lconfig_indentListSpecial :: f (Last Bool) -- use some special indentation for "," -- when creating zero-indentation -- multi-line list literals. - , _lconfig_importColumn :: f (Last Int) + , _lconfig_importColumn :: f (Last Int) -- ^ for import statement layouting, column at which to align the -- elements to be imported from a module. -- It is expected that importAsColumn >= importCol. - , _lconfig_importAsColumn :: f (Last Int) + , _lconfig_importAsColumn :: f (Last Int) -- ^ for import statement layouting, column at which put the module's -- "as" name (which also affects the positioning of the "as" keyword). -- It is expected that importAsColumn >= importCol. - , _lconfig_altChooser :: f (Last AltChooser) + , _lconfig_altChooser :: f (Last AltChooser) , _lconfig_columnAlignMode :: f (Last ColumnAlignMode) - , _lconfig_alignmentLimit :: f (Last Int) + , _lconfig_alignmentLimit :: f (Last Int) -- roughly speaking, this sets an upper bound to the number of spaces -- inserted to create horizontal alignment. -- More specifically, if 'xs' are the widths of the columns in some @@ -139,17 +148,17 @@ data CLayoutConfig f = LayoutConfig -- -- > , y :: Double -- -- > } } - deriving Generic + deriving (Generic) data CForwardOptions f = ForwardOptions { _options_ghc :: f [String] } - deriving Generic + deriving (Generic) data CErrorHandlingConfig f = ErrorHandlingConfig - { _econf_produceOutputOnErrors :: f (Semigroup.Last Bool) - , _econf_Werror :: f (Semigroup.Last Bool) - , _econf_ExactPrintFallback :: f (Semigroup.Last ExactPrintFallbackMode) + { _econf_produceOutputOnErrors :: f (Semigroup.Last Bool) + , _econf_Werror :: f (Semigroup.Last Bool) + , _econf_ExactPrintFallback :: f (Semigroup.Last ExactPrintFallbackMode) -- ^ Determines when to fall back on the exactprint'ed output when -- syntactical constructs are encountered which are not yet handled by -- brittany. @@ -159,21 +168,21 @@ data CErrorHandlingConfig f = ErrorHandlingConfig -- has different semantics than the code pre-transformation. , _econf_omit_output_valid_check :: f (Semigroup.Last Bool) } - deriving Generic + deriving (Generic) data CPreProcessorConfig f = PreProcessorConfig { _ppconf_CPPMode :: f (Semigroup.Last CPPMode) , _ppconf_hackAroundIncludes :: f (Semigroup.Last Bool) } - deriving Generic + deriving (Generic) data CConfig f = Config - { _conf_version :: f (Semigroup.Last Int) - , _conf_debug :: CDebugConfig f - , _conf_layout :: CLayoutConfig f + { _conf_version :: f (Semigroup.Last Int) + , _conf_debug :: CDebugConfig f + , _conf_layout :: CLayoutConfig f , _conf_errorHandling :: CErrorHandlingConfig f - , _conf_forward :: CForwardOptions f - , _conf_preprocessor :: CPreProcessorConfig f + , _conf_forward :: CForwardOptions f + , _conf_preprocessor :: CPreProcessorConfig f , _conf_roundtrip_exactprint_only :: f (Semigroup.Last Bool) -- ^ this field is somewhat of a duplicate of the one in DebugConfig. -- It is used for per-declaration disabling by the inline config @@ -184,9 +193,10 @@ data CConfig f = Config -- module. Useful for wildcard application -- (`find -name "*.hs" | xargs brittany --write-mode inplace` or something -- in that direction). - , _conf_obfuscate :: f (Semigroup.Last Bool) + , _conf_obfuscate :: f (Semigroup.Last Bool) + } - deriving Generic + deriving (Generic) type DebugConfig = CDebugConfig Identity type LayoutConfig = CLayoutConfig Identity diff --git a/source/library/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs b/source/library/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs index be7a0bb..2c0c78f 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs @@ -18,16 +18,22 @@ module Language.Haskell.Brittany.Internal.Config.Types.Instances where + + +import Language.Haskell.Brittany.Internal.Prelude + +import Data.Yaml import qualified Data.Aeson.Key as Key import qualified Data.Aeson.Types as Aeson -import Data.Yaml + import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Prelude + + aesonDecodeOptionsBrittany :: Aeson.Options aesonDecodeOptionsBrittany = Aeson.defaultOptions { Aeson.omitNothingFields = True - , Aeson.fieldLabelModifier = dropWhile (== '_') + , Aeson.fieldLabelModifier = dropWhile (=='_') } instance FromJSON (CDebugConfig Maybe) where @@ -102,18 +108,17 @@ instance ToJSON (CConfig Maybe) where -- leafs, but for nodes of the config as well. This way e.g. "{}" is valid -- config file content. instance FromJSON (CConfig Maybe) where - parseJSON (Object v) = - Config - <$> (v .:? Key.fromString "conf_version") - <*> (v .:?= Key.fromString "conf_debug") - <*> (v .:?= Key.fromString "conf_layout") - <*> (v .:?= Key.fromString "conf_errorHandling") - <*> (v .:?= Key.fromString "conf_forward") - <*> (v .:?= Key.fromString "conf_preprocessor") - <*> (v .:? Key.fromString "conf_roundtrip_exactprint_only") - <*> (v .:? Key.fromString "conf_disable_formatting") - <*> (v .:? Key.fromString "conf_obfuscate") - parseJSON invalid = Aeson.typeMismatch "Config" invalid + parseJSON (Object v) = Config + <$> v .:? Key.fromString "conf_version" + <*> v .:?= Key.fromString "conf_debug" + <*> v .:?= Key.fromString "conf_layout" + <*> v .:?= Key.fromString "conf_errorHandling" + <*> v .:?= Key.fromString "conf_forward" + <*> v .:?= Key.fromString "conf_preprocessor" + <*> v .:? Key.fromString "conf_roundtrip_exactprint_only" + <*> v .:? Key.fromString "conf_disable_formatting" + <*> v .:? Key.fromString "conf_obfuscate" + parseJSON invalid = Aeson.typeMismatch "Config" invalid -- Pretends that the value is {} when the key is not present. (.:?=) :: FromJSON a => Object -> Key.Key -> Parser a diff --git a/source/library/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs b/source/library/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs index 5020745..46e1b6a 100644 --- a/source/library/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs +++ b/source/library/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs @@ -7,35 +7,48 @@ module Language.Haskell.Brittany.Internal.ExactPrintUtils where -import Control.Exception + + +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Control.Monad.State.Class as State.Class import qualified Control.Monad.Trans.Except as ExceptT import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import Data.Data import qualified Data.Foldable as Foldable -import qualified Data.Generics as SYB -import Data.HList.HList import qualified Data.Map as Map import qualified Data.Maybe import qualified Data.Sequence as Seq import qualified Data.Set as Set -import GHC (GenLocated(L)) -import qualified GHC hiding (parseModule) -import GHC.Data.Bag -import qualified GHC.Driver.CmdLine as GHC -import qualified GHC.Driver.Session as GHC -import GHC.Hs -import qualified GHC.Types.SrcLoc as GHC -import GHC.Types.SrcLoc (Located, SrcSpan) -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Language.Haskell.GHC.ExactPrint as ExactPrint -import qualified Language.Haskell.GHC.ExactPrint.Delta as ExactPrint -import qualified Language.Haskell.GHC.ExactPrint.Parsers as ExactPrint -import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint import qualified System.IO +import Language.Haskell.Brittany.Internal.Config.Types +import Data.Data +import Data.HList.HList + +import GHC ( GenLocated(L) ) +import qualified GHC.Driver.Session as GHC +import qualified GHC hiding (parseModule) +import qualified GHC.Types.SrcLoc as GHC +import qualified GHC.Driver.CmdLine as GHC + +import GHC.Hs +import GHC.Data.Bag + +import GHC.Types.SrcLoc ( SrcSpan, Located ) + + +import qualified Language.Haskell.GHC.ExactPrint as ExactPrint +import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint +import qualified Language.Haskell.GHC.ExactPrint.Parsers as ExactPrint +import qualified Language.Haskell.GHC.ExactPrint.Delta as ExactPrint + +import qualified Data.Generics as SYB + +import Control.Exception +-- import Data.Generics.Schemes + + + parseModule :: [String] -> System.IO.FilePath @@ -54,7 +67,7 @@ parseModuleWithCpp -> IO (Either String (ExactPrint.Anns, GHC.ParsedSource, a)) parseModuleWithCpp cpp opts args fp dynCheck = ExactPrint.ghcWrapper $ ExceptT.runExceptT $ do - dflags0 <- lift $ GHC.getSessionDynFlags + dflags0 <- lift $ GHC.getSessionDynFlags (dflags1, leftover, warnings) <- lift $ GHC.parseDynamicFlagsCmdLine dflags0 (GHC.noLoc <$> ("-hide-all-packages" : args)) @@ -66,20 +79,17 @@ parseModuleWithCpp cpp opts args fp dynCheck = void $ lift $ GHC.setSessionDynFlags dflags1 dflags2 <- lift $ ExactPrint.initDynFlags fp unless (null leftover) - $ ExceptT.throwE - $ "when parsing ghc flags: leftover flags: " + $ ExceptT.throwE + $ "when parsing ghc flags: leftover flags: " ++ show (leftover <&> \(L _ s) -> s) unless (null warnings) - $ ExceptT.throwE - $ "when parsing ghc flags: encountered warnings: " + $ ExceptT.throwE + $ "when parsing ghc flags: encountered warnings: " ++ show (warnings <&> warnExtractorCompat) - x <- ExceptT.ExceptT $ liftIO $ dynCheck dflags2 + x <- ExceptT.ExceptT $ liftIO $ dynCheck dflags2 res <- lift $ ExactPrint.parseModuleApiAnnsWithCppInternal cpp dflags2 fp - either - (\err -> ExceptT.throwE $ "transform error: " ++ show - (bagToList (show <$> err)) - ) - (\(a, m) -> pure (a, m, x)) + either (\err -> ExceptT.throwE $ "transform error: " ++ show (bagToList (show <$> err))) + (\(a, m) -> pure (a, m, x)) $ ExactPrint.postParseTransform res opts parseModuleFromString @@ -97,51 +107,46 @@ parseModuleFromString args fp dynCheck str = -- bridoc transformation stuff. -- (reminder to update note on `parsePrintModule` if this changes.) mask_ $ ExactPrint.ghcWrapper $ ExceptT.runExceptT $ do - dflags0 <- lift $ ExactPrint.initDynFlagsPure fp str + dflags0 <- lift $ ExactPrint.initDynFlagsPure fp str (dflags1, leftover, warnings) <- lift $ GHC.parseDynamicFlagsCmdLine dflags0 (GHC.noLoc <$> args) unless (null leftover) - $ ExceptT.throwE - $ "when parsing ghc flags: leftover flags: " + $ ExceptT.throwE + $ "when parsing ghc flags: leftover flags: " ++ show (leftover <&> \(L _ s) -> s) unless (null warnings) - $ ExceptT.throwE - $ "when parsing ghc flags: encountered warnings: " + $ ExceptT.throwE + $ "when parsing ghc flags: encountered warnings: " ++ show (warnings <&> warnExtractorCompat) dynCheckRes <- ExceptT.ExceptT $ liftIO $ dynCheck dflags1 let res = ExactPrint.parseModuleFromStringInternal dflags1 fp str case res of - Left err -> - ExceptT.throwE $ "parse error: " ++ show (bagToList (show <$> err)) - Right (a, m) -> pure (a, m, dynCheckRes) + Left err -> ExceptT.throwE $ "parse error: " ++ show (bagToList (show <$> err)) + Right (a , m ) -> pure (a, m, dynCheckRes) commentAnnFixTransformGlob :: SYB.Data ast => ast -> ExactPrint.Transform () commentAnnFixTransformGlob ast = do - let - extract :: forall a . SYB.Data a => a -> Seq (SrcSpan, ExactPrint.AnnKey) - extract = -- traceFunctionWith "extract" (show . SYB.typeOf) show $ - const Seq.empty - `SYB.ext1Q` (\l@(L span _) -> - Seq.singleton (span, ExactPrint.mkAnnKey l) - ) + let extract :: forall a . SYB.Data a => a -> Seq (SrcSpan, ExactPrint.AnnKey) + extract = -- traceFunctionWith "extract" (show . SYB.typeOf) show $ + const Seq.empty + `SYB.ext1Q` + (\l@(L span _) -> Seq.singleton (span, ExactPrint.mkAnnKey l)) let nodes = SYB.everything (<>) extract ast - let - annsMap :: Map GHC.RealSrcLoc ExactPrint.AnnKey - annsMap = Map.fromListWith - (const id) - [ (GHC.realSrcSpanEnd span, annKey) - | (GHC.RealSrcSpan span _, annKey) <- Foldable.toList nodes - ] + let annsMap :: Map GHC.RealSrcLoc ExactPrint.AnnKey + annsMap = Map.fromListWith + (const id) + [ (GHC.realSrcSpanEnd span, annKey) + | (GHC.RealSrcSpan span _, annKey) <- Foldable.toList nodes + ] nodes `forM_` (snd .> processComs annsMap) where processComs annsMap annKey1 = do mAnn <- State.Class.gets fst <&> Map.lookup annKey1 mAnn `forM_` \ann1 -> do - let - priors = ExactPrint.annPriorComments ann1 - follows = ExactPrint.annFollowingComments ann1 - assocs = ExactPrint.annsDP ann1 + let priors = ExactPrint.annPriorComments ann1 + follows = ExactPrint.annFollowingComments ann1 + assocs = ExactPrint.annsDP ann1 let processCom :: (ExactPrint.Comment, ExactPrint.DeltaPos) @@ -153,32 +158,31 @@ commentAnnFixTransformGlob ast = do (ExactPrint.CN "RecordCon", ExactPrint.CN "HsRecField") -> move $> False (x, y) | x == y -> move $> False - _ -> return True + _ -> return True where ExactPrint.AnnKey annKeyLoc1 con1 = annKey1 ExactPrint.AnnKey annKeyLoc2 con2 = annKey2 - loc1 = GHC.realSrcSpanStart annKeyLoc1 - loc2 = GHC.realSrcSpanStart annKeyLoc2 + loc1 = GHC.realSrcSpanStart annKeyLoc1 + loc2 = GHC.realSrcSpanStart annKeyLoc2 move = ExactPrint.modifyAnnsT $ \anns -> let - ann2 = Data.Maybe.fromJust $ Map.lookup annKey2 anns + ann2 = Data.Maybe.fromJust $ Map.lookup annKey2 anns ann2' = ann2 { ExactPrint.annFollowingComments = - ExactPrint.annFollowingComments ann2 ++ [comPair] + ExactPrint.annFollowingComments ann2 ++ [comPair] } - in Map.insert annKey2 ann2' anns + in + Map.insert annKey2 ann2' anns _ -> return True -- retain comment at current node. - priors' <- filterM processCom priors + priors' <- filterM processCom priors follows' <- filterM processCom follows - assocs' <- flip filterM assocs $ \case + assocs' <- flip filterM assocs $ \case (ExactPrint.AnnComment com, dp) -> processCom (com, dp) - _ -> return True - let - ann1' = ann1 - { ExactPrint.annPriorComments = priors' - , ExactPrint.annFollowingComments = follows' - , ExactPrint.annsDP = assocs' - } + _ -> return True + let ann1' = ann1 { ExactPrint.annPriorComments = priors' + , ExactPrint.annFollowingComments = follows' + , ExactPrint.annsDP = assocs' + } ExactPrint.modifyAnnsT $ \anns -> Map.insert annKey1 ann1' anns @@ -266,30 +270,29 @@ extractToplevelAnns lmod anns = output | (k, ExactPrint.Ann _ _ _ _ _ (Just captured)) <- Map.toList anns ] declMap = declMap1 `Map.union` declMap2 - modKey = ExactPrint.mkAnnKey lmod - output = groupMap (\k _ -> Map.findWithDefault modKey k declMap) anns + modKey = ExactPrint.mkAnnKey lmod + output = groupMap (\k _ -> Map.findWithDefault modKey k declMap) anns groupMap :: (Ord k, Ord l) => (k -> a -> l) -> Map k a -> Map l (Map k a) -groupMap f = Map.foldlWithKey' - (\m k a -> Map.alter (insert k a) (f k a) m) - Map.empty +groupMap f = Map.foldlWithKey' (\m k a -> Map.alter (insert k a) (f k a) m) + Map.empty where - insert k a Nothing = Just (Map.singleton k a) + insert k a Nothing = Just (Map.singleton k a) insert k a (Just m) = Just (Map.insert k a m) foldedAnnKeys :: Data.Data.Data ast => ast -> Set ExactPrint.AnnKey foldedAnnKeys ast = SYB.everything Set.union - (\x -> maybe + ( \x -> maybe Set.empty Set.singleton [ SYB.gmapQi 1 (ExactPrint.mkAnnKey . L l) x | locTyCon == SYB.typeRepTyCon (SYB.typeOf x) , l :: SrcSpan <- SYB.gmapQi 0 SYB.cast x - ] -- for some reason, ghc-8.8 has forgotten how to infer the type of l, -- even though it is passed to mkAnnKey above, which only accepts -- SrcSpan. + ] ) ast where locTyCon = SYB.typeRepTyCon (SYB.typeOf (L () ())) @@ -298,8 +301,8 @@ foldedAnnKeys ast = SYB.everything withTransformedAnns :: Data ast => ast - -> MultiRWSS.MultiRWS '[Config , ExactPrint.Anns] w s a - -> MultiRWSS.MultiRWS '[Config , ExactPrint.Anns] w s a + -> MultiRWSS.MultiRWS '[Config, ExactPrint.Anns] w s a + -> MultiRWSS.MultiRWS '[Config, ExactPrint.Anns] w s a withTransformedAnns ast m = MultiRWSS.mGetRawR >>= \case readers@(conf :+: anns :+: HNil) -> do -- TODO: implement `local` for MultiReader/MultiRWS @@ -309,10 +312,9 @@ withTransformedAnns ast m = MultiRWSS.mGetRawR >>= \case pure x where f anns = - let - ((), (annsBalanced, _), _) = - ExactPrint.runTransform anns (commentAnnFixTransformGlob ast) - in annsBalanced + let ((), (annsBalanced, _), _) = + ExactPrint.runTransform anns (commentAnnFixTransformGlob ast) + in annsBalanced warnExtractorCompat :: GHC.Warn -> String diff --git a/source/library/Language/Haskell/Brittany/Internal/LayouterBasics.hs b/source/library/Language/Haskell/Brittany/Internal/LayouterBasics.hs index 8f861d4..422c7be 100644 --- a/source/library/Language/Haskell/Brittany/Internal/LayouterBasics.hs +++ b/source/library/Language/Haskell/Brittany/Internal/LayouterBasics.hs @@ -6,37 +6,50 @@ module Language.Haskell.Brittany.Internal.LayouterBasics where + + +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import qualified Control.Monad.Writer.Strict as Writer -import qualified Data.Char as Char -import Data.Data import qualified Data.Map as Map import qualified Data.Semigroup as Semigroup import qualified Data.Sequence as Seq import qualified Data.Set as Set import qualified Data.Text as Text -import qualified Data.Text.Lazy.Builder as Text.Builder -import DataTreePrint -import GHC (GenLocated(L), Located, moduleName, moduleNameString) import qualified GHC.OldList as List -import GHC.Parser.Annotation (AnnKeywordId(..)) -import GHC.Types.Name (getOccString) -import GHC.Types.Name.Occurrence (occNameString) -import GHC.Types.Name.Reader (RdrName(..)) -import qualified GHC.Types.SrcLoc as GHC -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.ExactPrintUtils -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.Utils + +import qualified Control.Monad.Writer.Strict as Writer + import qualified Language.Haskell.GHC.ExactPrint as ExactPrint import qualified Language.Haskell.GHC.ExactPrint.Annotate as ExactPrint.Annotate import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint -import Language.Haskell.GHC.ExactPrint.Types (AnnKey, Annotation) import qualified Language.Haskell.GHC.ExactPrint.Utils as ExactPrint.Utils +import Language.Haskell.GHC.ExactPrint.Types ( AnnKey, Annotation ) + +import qualified Data.Text.Lazy.Builder as Text.Builder + +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.Utils +import Language.Haskell.Brittany.Internal.ExactPrintUtils + +import GHC.Types.Name.Reader ( RdrName(..) ) +import GHC ( Located, GenLocated(L), moduleName, moduleNameString ) +import qualified GHC.Types.SrcLoc as GHC +import GHC.Types.Name.Occurrence ( occNameString ) +import GHC.Types.Name ( getOccString ) +import GHC.Parser.Annotation ( AnnKeywordId(..) ) + +import Data.Data + +import qualified Data.Char as Char + +import DataTreePrint + + + processDefault :: ( ExactPrint.Annotate.Annotate ast , MonadMultiWriter Text.Builder.Builder m @@ -54,7 +67,7 @@ processDefault x = do -- the module (header). This would remove the need for this hack! case str of "\n" -> return () - _ -> mTell $ Text.Builder.fromString str + _ -> mTell $ Text.Builder.fromString str -- | Use ExactPrint's output for this node; add a newly generated inline comment -- at insertion position (meant to point out to the user that this node is @@ -66,10 +79,9 @@ briDocByExact -> ToBriDocM BriDocNumbered briDocByExact ast = do anns <- mAsk - traceIfDumpConf - "ast" - _dconf_dump_ast_unknown - (printTreeWithCustom 100 (customLayouterF anns) ast) + traceIfDumpConf "ast" + _dconf_dump_ast_unknown + (printTreeWithCustom 100 (customLayouterF anns) ast) docExt ast anns True -- | Use ExactPrint's output for this node. @@ -83,10 +95,9 @@ briDocByExactNoComment -> ToBriDocM BriDocNumbered briDocByExactNoComment ast = do anns <- mAsk - traceIfDumpConf - "ast" - _dconf_dump_ast_unknown - (printTreeWithCustom 100 (customLayouterF anns) ast) + traceIfDumpConf "ast" + _dconf_dump_ast_unknown + (printTreeWithCustom 100 (customLayouterF anns) ast) docExt ast anns False -- | Use ExactPrint's output for this node, presuming that this output does @@ -99,26 +110,24 @@ briDocByExactInlineOnly -> ToBriDocM BriDocNumbered briDocByExactInlineOnly infoStr ast = do anns <- mAsk - traceIfDumpConf - "ast" - _dconf_dump_ast_unknown - (printTreeWithCustom 100 (customLayouterF anns) ast) + traceIfDumpConf "ast" + _dconf_dump_ast_unknown + (printTreeWithCustom 100 (customLayouterF anns) ast) let exactPrinted = Text.pack $ ExactPrint.exactPrint ast anns fallbackMode <- mAsk <&> _conf_errorHandling .> _econf_ExactPrintFallback .> confUnpack - let - exactPrintNode t = allocateNode $ BDFExternal - (ExactPrint.Types.mkAnnKey ast) - (foldedAnnKeys ast) - False - t - let - errorAction = do - mTell [ErrorUnknownNode infoStr ast] - docLit $ Text.pack "{- BRITTANY ERROR UNHANDLED SYNTACTICAL CONSTRUCT -}" + let exactPrintNode t = allocateNode $ BDFExternal + (ExactPrint.Types.mkAnnKey ast) + (foldedAnnKeys ast) + False + t + let errorAction = do + mTell [ErrorUnknownNode infoStr ast] + docLit + $ Text.pack "{- BRITTANY ERROR UNHANDLED SYNTACTICAL CONSTRUCT -}" case (fallbackMode, Text.lines exactPrinted) of - (ExactPrintFallbackModeNever, _) -> errorAction - (_, [t]) -> exactPrintNode + (ExactPrintFallbackModeNever, _ ) -> errorAction + (_ , [t]) -> exactPrintNode (Text.dropWhile Char.isSpace . Text.dropWhileEnd Char.isSpace $ t) (ExactPrintFallbackModeRisky, _) -> exactPrintNode exactPrinted _ -> errorAction @@ -143,21 +152,20 @@ lrdrNameToTextAnnGen lrdrNameToTextAnnGen f ast@(L _ n) = do anns <- mAsk let t = f $ rdrNameToText n - let - hasUni x (ExactPrint.Types.G y, _) = x == y - hasUni _ _ = False + let hasUni x (ExactPrint.Types.G y, _) = x == y + hasUni _ _ = False -- TODO: in general: we should _always_ process all annotaiton stuff here. -- whatever we don't probably should have had some effect on the -- output. in such cases, resorting to byExact is probably the safe -- choice. return $ case Map.lookup (ExactPrint.Types.mkAnnKey ast) anns of - Nothing -> t + Nothing -> t Just (ExactPrint.Types.Ann _ _ _ aks _ _) -> case n of - Exact{} | t == Text.pack "()" -> t - _ | any (hasUni AnnBackquote) aks -> Text.pack "`" <> t <> Text.pack "`" + Exact{} | t == Text.pack "()" -> t + _ | any (hasUni AnnBackquote) aks -> Text.pack "`" <> t <> Text.pack "`" _ | any (hasUni AnnCommaTuple) aks -> t - _ | any (hasUni AnnOpenP) aks -> Text.pack "(" <> t <> Text.pack ")" - _ | otherwise -> t + _ | any (hasUni AnnOpenP) aks -> Text.pack "(" <> t <> Text.pack ")" + _ | otherwise -> t lrdrNameToTextAnn :: (MonadMultiReader Config m, MonadMultiReader (Map AnnKey Annotation) m) @@ -170,10 +178,9 @@ lrdrNameToTextAnnTypeEqualityIsSpecial => Located RdrName -> m Text lrdrNameToTextAnnTypeEqualityIsSpecial ast = do - let - f x = if x == Text.pack "Data.Type.Equality~" - then Text.pack "~" -- rraaaahhh special casing rraaahhhhhh - else x + let f x = if x == Text.pack "Data.Type.Equality~" + then Text.pack "~" -- rraaaahhh special casing rraaahhhhhh + else x lrdrNameToTextAnnGen f ast -- | Same as lrdrNameToTextAnnTypeEqualityIsSpecial, but also inspects @@ -191,11 +198,10 @@ lrdrNameToTextAnnTypeEqualityIsSpecialAndRespectTick -> m Text lrdrNameToTextAnnTypeEqualityIsSpecialAndRespectTick ast1 ast2 = do hasQuote <- hasAnnKeyword ast1 AnnSimpleQuote - x <- lrdrNameToTextAnn ast2 - let - lit = if x == Text.pack "Data.Type.Equality~" - then Text.pack "~" -- rraaaahhh special casing rraaahhhhhh - else x + x <- lrdrNameToTextAnn ast2 + let lit = if x == Text.pack "Data.Type.Equality~" + then Text.pack "~" -- rraaaahhh special casing rraaahhhhhh + else x return $ if hasQuote then Text.cons '\'' lit else lit askIndent :: (MonadMultiReader Config m) => m Int @@ -213,11 +219,12 @@ extractRestComments ann = ExactPrint.annFollowingComments ann ++ (ExactPrint.annsDP ann >>= \case (ExactPrint.AnnComment com, dp) -> [(com, dp)] - _ -> [] + _ -> [] ) filterAnns :: Data.Data.Data ast => ast -> ExactPrint.Anns -> ExactPrint.Anns -filterAnns ast = Map.filterWithKey (\k _ -> k `Set.member` foldedAnnKeys ast) +filterAnns ast = + Map.filterWithKey (\k _ -> k `Set.member` foldedAnnKeys ast) -- | True if there are any comments that are -- a) connected to any node below (in AST sense) the given node AND @@ -235,16 +242,15 @@ hasCommentsBetween -> ToBriDocM Bool hasCommentsBetween ast leftKey rightKey = do mAnn <- astAnn ast - let - go1 [] = False - go1 ((ExactPrint.G kw, _dp) : rest) | kw == leftKey = go2 rest - go1 (_ : rest) = go1 rest - go2 [] = False - go2 ((ExactPrint.AnnComment _, _dp) : _rest) = True - go2 ((ExactPrint.G kw, _dp) : _rest) | kw == rightKey = False - go2 (_ : rest) = go2 rest + let go1 [] = False + go1 ((ExactPrint.G kw, _dp) : rest) | kw == leftKey = go2 rest + go1 (_ : rest) = go1 rest + go2 [] = False + go2 ((ExactPrint.AnnComment _, _dp) : _rest) = True + go2 ((ExactPrint.G kw, _dp) : _rest) | kw == rightKey = False + go2 (_ : rest) = go2 rest case mAnn of - Nothing -> pure False + Nothing -> pure False Just ann -> pure $ go1 $ ExactPrint.annsDP ann -- | True if there are any comments that are connected to any node below (in AST @@ -254,8 +260,7 @@ hasAnyCommentsConnected ast = not . null <$> astConnectedComments ast -- | True if there are any regular comments connected to any node below (in AST -- sense) the given node -hasAnyRegularCommentsConnected - :: Data ast => GHC.Located ast -> ToBriDocM Bool +hasAnyRegularCommentsConnected :: Data ast => GHC.Located ast -> ToBriDocM Bool hasAnyRegularCommentsConnected ast = any isRegularComment <$> astConnectedComments ast @@ -292,7 +297,7 @@ hasAnyRegularCommentsRest ast = astAnn ast <&> \case hasAnnKeywordComment :: Data ast => GHC.Located ast -> AnnKeywordId -> ToBriDocM Bool hasAnnKeywordComment ast annKeyword = astAnn ast <&> \case - Nothing -> False + Nothing -> False Just ann -> any hasK (extractAllComments ann) where hasK = (== Just annKeyword) . ExactPrint.Types.commentOrigin . fst @@ -306,7 +311,7 @@ hasAnnKeyword ast annKeyword = astAnn ast <&> \case Just (ExactPrint.Types.Ann _ _ _ aks _ _) -> any hasK aks where hasK (ExactPrint.Types.G x, _) = x == annKeyword - hasK _ = False + hasK _ = False astAnn :: (Data ast, MonadMultiReader (Map AnnKey Annotation) m) @@ -455,10 +460,12 @@ newtype CollectAltM a = CollectAltM (Writer.Writer [ToBriDocM BriDocNumbered] a) deriving (Functor, Applicative, Monad) addAlternativeCond :: Bool -> ToBriDocM BriDocNumbered -> CollectAltM () -addAlternativeCond cond doc = when cond (addAlternative doc) +addAlternativeCond cond doc = + when cond (addAlternative doc) addAlternative :: ToBriDocM BriDocNumbered -> CollectAltM () -addAlternative = CollectAltM . Writer.tell . (: []) +addAlternative = + CollectAltM . Writer.tell . (: []) runFilteredAlternative :: CollectAltM () -> ToBriDocM BriDocNumbered runFilteredAlternative (CollectAltM action) = @@ -475,8 +482,7 @@ docLines l = allocateNode . BDFLines =<< sequence l docCols :: ColSig -> [ToBriDocM BriDocNumbered] -> ToBriDocM BriDocNumbered docCols sig l = allocateNode . BDFCols sig =<< sequence l -docAddBaseY - :: BrIndent -> ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered +docAddBaseY :: BrIndent -> ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered docAddBaseY ind bdm = allocateNode . BDFAddBaseY ind =<< bdm docSetBaseY :: ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered @@ -511,8 +517,7 @@ docAnnotationKW -> Maybe AnnKeywordId -> ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered -docAnnotationKW annKey kw bdm = - allocateNode . BDFAnnotationKW annKey kw =<< bdm +docAnnotationKW annKey kw bdm = allocateNode . BDFAnnotationKW annKey kw =<< bdm docMoveToKWDP :: AnnKey @@ -564,7 +569,7 @@ docParenR :: ToBriDocM BriDocNumbered docParenR = docLit $ Text.pack ")" docParenHashLSep :: ToBriDocM BriDocNumbered -docParenHashLSep = docSeq [docLit $ Text.pack "(#", docSeparator] +docParenHashLSep = docSeq [docLit $ Text.pack "(#", docSeparator] docParenHashRSep :: ToBriDocM BriDocNumbered docParenHashRSep = docSeq [docSeparator, docLit $ Text.pack "#)"] @@ -626,26 +631,32 @@ instance DocWrapable (ToBriDocM BriDocNumbered) where docWrapNodePrior ast bdm = do bd <- bdm i1 <- allocNodeIndex - return $ (,) i1 $ BDFAnnotationPrior (ExactPrint.Types.mkAnnKey ast) $ bd + return + $ (,) i1 + $ BDFAnnotationPrior (ExactPrint.Types.mkAnnKey ast) + $ bd docWrapNodeRest ast bdm = do bd <- bdm i2 <- allocNodeIndex - return $ (,) i2 $ BDFAnnotationRest (ExactPrint.Types.mkAnnKey ast) $ bd + return + $ (,) i2 + $ BDFAnnotationRest (ExactPrint.Types.mkAnnKey ast) + $ bd instance DocWrapable (ToBriDocM a) => DocWrapable [ToBriDocM a] where docWrapNode ast bdms = case bdms of [] -> [] [bd] -> [docWrapNode ast bd] - (bd1 : bdR) | (bdN : bdM) <- reverse bdR -> + (bd1:bdR) | (bdN:bdM) <- reverse bdR -> [docWrapNodePrior ast bd1] ++ reverse bdM ++ [docWrapNodeRest ast bdN] _ -> error "cannot happen (TM)" docWrapNodePrior ast bdms = case bdms of [] -> [] [bd] -> [docWrapNodePrior ast bd] - (bd1 : bdR) -> docWrapNodePrior ast bd1 : bdR + (bd1:bdR) -> docWrapNodePrior ast bd1 : bdR docWrapNodeRest ast bdms = case reverse bdms of - [] -> [] - (bdN : bdR) -> reverse $ docWrapNodeRest ast bdN : bdR + [] -> [] + (bdN:bdR) -> reverse $ docWrapNodeRest ast bdN : bdR instance DocWrapable (ToBriDocM a) => DocWrapable (ToBriDocM [a]) where docWrapNode ast bdsm = do @@ -655,25 +666,25 @@ instance DocWrapable (ToBriDocM a) => DocWrapable (ToBriDocM [a]) where [bd] -> do bd' <- docWrapNode ast (return bd) return [bd'] - (bd1 : bdR) | (bdN : bdM) <- reverse bdR -> do + (bd1:bdR) | (bdN:bdM) <- reverse bdR -> do bd1' <- docWrapNodePrior ast (return bd1) - bdN' <- docWrapNodeRest ast (return bdN) + bdN' <- docWrapNodeRest ast (return bdN) return $ [bd1'] ++ reverse bdM ++ [bdN'] _ -> error "cannot happen (TM)" docWrapNodePrior ast bdsm = do bds <- bdsm case bds of [] -> return [] - (bd1 : bdR) -> do + (bd1:bdR) -> do bd1' <- docWrapNodePrior ast (return bd1) - return (bd1' : bdR) + return (bd1':bdR) docWrapNodeRest ast bdsm = do bds <- bdsm case reverse bds of [] -> return [] - (bdN : bdR) -> do + (bdN:bdR) -> do bdN' <- docWrapNodeRest ast (return bdN) - return $ reverse (bdN' : bdR) + return $ reverse (bdN':bdR) instance DocWrapable (ToBriDocM a) => DocWrapable (ToBriDocM (Seq a)) where docWrapNode ast bdsm = do @@ -686,7 +697,7 @@ instance DocWrapable (ToBriDocM a) => DocWrapable (ToBriDocM (Seq a)) where return $ Seq.singleton bd1' bdM Seq.:> bdN -> do bd1' <- docWrapNodePrior ast (return bd1) - bdN' <- docWrapNodeRest ast (return bdN) + bdN' <- docWrapNodeRest ast (return bdN) return $ (bd1' Seq.<| bdM) Seq.|> bdN' docWrapNodePrior ast bdsm = do bds <- bdsm @@ -730,7 +741,7 @@ docPar -> ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered docPar lineM indentedM = do - line <- lineM + line <- lineM indented <- indentedM allocateNode $ BDFPar BrIndentNone line indented @@ -767,15 +778,14 @@ briDocMToPPM m = do briDocMToPPMInner :: ToBriDocM a -> PPMLocal (a, [BrittanyError], Seq String) briDocMToPPMInner m = do readers <- MultiRWSS.mGetRawR - let - ((x, errs), debugs) = - runIdentity - $ MultiRWSS.runMultiRWSTNil - $ MultiRWSS.withMultiStateA (NodeAllocIndex 1) - $ MultiRWSS.withMultiReaders readers - $ MultiRWSS.withMultiWriterAW - $ MultiRWSS.withMultiWriterAW - $ m + let ((x, errs), debugs) = + runIdentity + $ MultiRWSS.runMultiRWSTNil + $ MultiRWSS.withMultiStateA (NodeAllocIndex 1) + $ MultiRWSS.withMultiReaders readers + $ MultiRWSS.withMultiWriterAW + $ MultiRWSS.withMultiWriterAW + $ m pure (x, errs, debugs) docSharedWrapper :: Monad m => (x -> m y) -> x -> m (m y) diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs index 3bafd56..acbe186 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs @@ -3,19 +3,26 @@ module Language.Haskell.Brittany.Internal.Layouters.DataDecl where + + +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Data.Data import qualified Data.Semigroup as Semigroup import qualified Data.Text as Text -import GHC (GenLocated(L), Located) -import qualified GHC -import GHC.Hs import qualified GHC.OldList as List -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.LayouterBasics -import Language.Haskell.Brittany.Internal.Layouters.Type -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -import Language.Haskell.Brittany.Internal.Types + +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.LayouterBasics +import Language.Haskell.Brittany.Internal.Config.Types + +import GHC ( Located, GenLocated(L) ) +import qualified GHC +import GHC.Hs + +import Language.Haskell.Brittany.Internal.Layouters.Type + + layoutDataDecl :: Located (TyClDecl GhcPs) @@ -25,29 +32,28 @@ layoutDataDecl -> ToBriDocM BriDocNumbered layoutDataDecl ltycl name (HsQTvs _ bndrs) defn = case defn of -- newtype MyType a b = MyType .. - HsDataDefn _ext NewType (L _ []) _ctype Nothing [cons] mDerivs -> - case cons of - (L _ (ConDeclH98 _ext consName (L _ False) _qvars (Just (L _ [])) details _conDoc)) - -> docWrapNode ltycl $ do - nameStr <- lrdrNameToTextAnn name - consNameStr <- lrdrNameToTextAnn consName - tyVarLine <- return <$> createBndrDoc bndrs - -- headDoc <- fmap return $ docSeq - -- [ appSep $ docLitS "newtype") - -- , appSep $ docLit nameStr - -- , appSep tyVarLine - -- ] - rhsDoc <- return <$> createDetailsDoc consNameStr details - createDerivingPar mDerivs $ docSeq - [ appSep $ docLitS "newtype" - , appSep $ docLit nameStr - , appSep tyVarLine - , docSeparator - , docLitS "=" - , docSeparator - , rhsDoc - ] - _ -> briDocByExactNoComment ltycl + HsDataDefn _ext NewType (L _ []) _ctype Nothing [cons] mDerivs -> case cons of + (L _ (ConDeclH98 _ext consName (L _ False) _qvars (Just (L _ [])) details _conDoc)) -> + docWrapNode ltycl $ do + nameStr <- lrdrNameToTextAnn name + consNameStr <- lrdrNameToTextAnn consName + tyVarLine <- return <$> createBndrDoc bndrs + -- headDoc <- fmap return $ docSeq + -- [ appSep $ docLitS "newtype") + -- , appSep $ docLit nameStr + -- , appSep tyVarLine + -- ] + rhsDoc <- return <$> createDetailsDoc consNameStr details + createDerivingPar mDerivs $ docSeq + [ appSep $ docLitS "newtype" + , appSep $ docLit nameStr + , appSep tyVarLine + , docSeparator + , docLitS "=" + , docSeparator + , rhsDoc + ] + _ -> briDocByExactNoComment ltycl -- data MyData a b @@ -55,8 +61,8 @@ layoutDataDecl ltycl name (HsQTvs _ bndrs) defn = case defn of HsDataDefn _ext DataType (L _ lhsContext) _ctype Nothing [] mDerivs -> docWrapNode ltycl $ do lhsContextDoc <- docSharedWrapper createContextDoc lhsContext - nameStr <- lrdrNameToTextAnn name - tyVarLine <- return <$> createBndrDoc bndrs + nameStr <- lrdrNameToTextAnn name + tyVarLine <- return <$> createBndrDoc bndrs createDerivingPar mDerivs $ docSeq [ appSep $ docLitS "data" , lhsContextDoc @@ -68,36 +74,32 @@ layoutDataDecl ltycl name (HsQTvs _ bndrs) defn = case defn of -- data MyData = MyData { .. } HsDataDefn _ext DataType (L _ lhsContext) _ctype Nothing [cons] mDerivs -> case cons of - (L _ (ConDeclH98 _ext consName (L _ _hasExt) qvars mRhsContext details _conDoc)) - -> docWrapNode ltycl $ do + (L _ (ConDeclH98 _ext consName (L _ _hasExt) qvars mRhsContext details _conDoc)) -> + docWrapNode ltycl $ do lhsContextDoc <- docSharedWrapper createContextDoc lhsContext - nameStr <- lrdrNameToTextAnn name - consNameStr <- lrdrNameToTextAnn consName - tyVarLine <- return <$> createBndrDoc bndrs - forallDocMay <- case createForallDoc qvars of + nameStr <- lrdrNameToTextAnn name + consNameStr <- lrdrNameToTextAnn consName + tyVarLine <- return <$> createBndrDoc bndrs + forallDocMay <- case createForallDoc qvars of Nothing -> pure Nothing Just x -> Just . pure <$> x rhsContextDocMay <- case mRhsContext of - Nothing -> pure Nothing + Nothing -> pure Nothing Just (L _ ctxt) -> Just . pure <$> createContextDoc ctxt - rhsDoc <- return <$> createDetailsDoc consNameStr details - consDoc <- - fmap pure + rhsDoc <- return <$> createDetailsDoc consNameStr details + consDoc <- fmap pure $ docNonBottomSpacing $ case (forallDocMay, rhsContextDocMay) of (Just forallDoc, Just rhsContextDoc) -> docLines - [ docSeq - [docLitS "=", docSeparator, docForceSingleline forallDoc] + [ docSeq [docLitS "=", docSeparator, docForceSingleline forallDoc] , docSeq [ docLitS "." , docSeparator - , docSetBaseY - $ docLines [rhsContextDoc, docSetBaseY rhsDoc] + , docSetBaseY $ docLines [rhsContextDoc, docSetBaseY rhsDoc] ] ] (Just forallDoc, Nothing) -> docLines - [ docSeq - [docLitS "=", docSeparator, docForceSingleline forallDoc] + [ docSeq [docLitS "=", docSeparator, docForceSingleline forallDoc] , docSeq [docLitS ".", docSeparator, rhsDoc] ] (Nothing, Just rhsContextDoc) -> docSeq @@ -105,12 +107,12 @@ layoutDataDecl ltycl name (HsQTvs _ bndrs) defn = case defn of , docSeparator , docSetBaseY $ docLines [rhsContextDoc, docSetBaseY rhsDoc] ] - (Nothing, Nothing) -> - docSeq [docLitS "=", docSeparator, rhsDoc] + (Nothing, Nothing) -> docSeq [docLitS "=", docSeparator, rhsDoc] createDerivingPar mDerivs $ docAlt [ -- data D = forall a . Show a => D a docSeq - [ docNodeAnnKW ltycl (Just GHC.AnnData) $ docSeq + [ docNodeAnnKW ltycl (Just GHC.AnnData) + $ docSeq [ appSep $ docLitS "data" , docForceSingleline $ lhsContextDoc , appSep $ docLit nameStr @@ -122,13 +124,12 @@ layoutDataDecl ltycl name (HsQTvs _ bndrs) defn = case defn of , docSetIndentLevel $ docSeq [ case forallDocMay of Nothing -> docEmpty - Just forallDoc -> - docSeq - [ docForceSingleline forallDoc - , docSeparator - , docLitS "." - , docSeparator - ] + Just forallDoc -> docSeq + [ docForceSingleline forallDoc + , docSeparator + , docLitS "." + , docSeparator + ] , maybe docEmpty docForceSingleline rhsContextDocMay , rhsDoc ] @@ -136,26 +137,26 @@ layoutDataDecl ltycl name (HsQTvs _ bndrs) defn = case defn of , -- data D -- = forall a . Show a => D a docAddBaseY BrIndentRegular $ docPar - (docNodeAnnKW ltycl (Just GHC.AnnData) $ docSeq + ( docNodeAnnKW ltycl (Just GHC.AnnData) + $ docSeq [ appSep $ docLitS "data" , docForceSingleline lhsContextDoc , appSep $ docLit nameStr , tyVarLine ] ) - (docSeq + ( docSeq [ docLitS "=" , docSeparator , docSetIndentLevel $ docSeq [ case forallDocMay of Nothing -> docEmpty - Just forallDoc -> - docSeq - [ docForceSingleline forallDoc - , docSeparator - , docLitS "." - , docSeparator - ] + Just forallDoc -> docSeq + [ docForceSingleline forallDoc + , docSeparator + , docLitS "." + , docSeparator + ] , maybe docEmpty docForceSingleline rhsContextDocMay , rhsDoc ] @@ -166,7 +167,8 @@ layoutDataDecl ltycl name (HsQTvs _ bndrs) defn = case defn of -- . Show a => -- D a docAddBaseY BrIndentRegular $ docPar - (docNodeAnnKW ltycl (Just GHC.AnnData) $ docSeq + ( docNodeAnnKW ltycl (Just GHC.AnnData) + $ docSeq [ appSep $ docLitS "data" , docForceSingleline lhsContextDoc , appSep $ docLit nameStr @@ -187,10 +189,13 @@ layoutDataDecl ltycl name (HsQTvs _ bndrs) defn = case defn of -- hurt. docAddBaseY BrIndentRegular $ docPar (docLitS "data") - (docLines + ( docLines [ lhsContextDoc , docNodeAnnKW ltycl (Just GHC.AnnData) - $ docSeq [appSep $ docLit nameStr, tyVarLine] + $ docSeq + [ appSep $ docLit nameStr + , tyVarLine + ] , consDoc ] ) @@ -204,20 +209,20 @@ createContextDoc [] = docEmpty createContextDoc [t] = docSeq [layoutType t, docSeparator, docLitS "=>", docSeparator] createContextDoc (t1 : tR) = do - t1Doc <- docSharedWrapper layoutType t1 + t1Doc <- docSharedWrapper layoutType t1 tRDocs <- tR `forM` docSharedWrapper layoutType docAlt [ docSeq [ docLitS "(" - , docForceSingleline $ docSeq $ List.intersperse - docCommaSep - (t1Doc : tRDocs) + , docForceSingleline $ docSeq $ List.intersperse docCommaSep + (t1Doc : tRDocs) , docLitS ") =>" , docSeparator ] , docLines $ join [ [docSeq [docLitS "(", docSeparator, t1Doc]] - , tRDocs <&> \tRDoc -> docSeq [docLitS ",", docSeparator, tRDoc] + , tRDocs + <&> \tRDoc -> docSeq [docLitS ",", docSeparator, tRDoc] , [docLitS ") =>", docSeparator] ] ] @@ -229,18 +234,20 @@ createBndrDoc bs = do (L _ (KindedTyVar _ _ext lrdrName kind)) -> do d <- docSharedWrapper layoutType kind return $ (lrdrNameToText lrdrName, Just $ d) - docSeq $ List.intersperse docSeparator $ tyVarDocs <&> \(vname, mKind) -> - case mKind of - Nothing -> docLit vname - Just kind -> docSeq - [ docLitS "(" - , docLit vname - , docSeparator - , docLitS "::" - , docSeparator - , kind - , docLitS ")" - ] + docSeq + $ List.intersperse docSeparator + $ tyVarDocs + <&> \(vname, mKind) -> case mKind of + Nothing -> docLit vname + Just kind -> docSeq + [ docLitS "(" + , docLit vname + , docSeparator + , docLitS "::" + , docSeparator + , kind + , docLitS ")" + ] createDerivingPar :: HsDeriving GhcPs -> ToBriDocM BriDocNumbered -> ToBriDocM BriDocNumbered @@ -249,47 +256,48 @@ createDerivingPar derivs mainDoc = do (L _ []) -> mainDoc (L _ types) -> docPar mainDoc - $ docEnsureIndent BrIndentRegular - $ docLines - $ docWrapNode derivs - $ derivingClauseDoc + $ docEnsureIndent BrIndentRegular + $ docLines + $ docWrapNode derivs + $ derivingClauseDoc <$> types derivingClauseDoc :: LHsDerivingClause GhcPs -> ToBriDocM BriDocNumbered -derivingClauseDoc (L _ (HsDerivingClause _ext mStrategy types)) = - case types of - (L _ []) -> docSeq [] - (L _ ts) -> - let - tsLength = length ts - whenMoreThan1Type val = - if tsLength > 1 then docLitS val else docLitS "" - (lhsStrategy, rhsStrategy) = - maybe (docEmpty, docEmpty) strategyLeftRight mStrategy - in docSeq +derivingClauseDoc (L _ (HsDerivingClause _ext mStrategy types)) = case types of + (L _ []) -> docSeq [] + (L _ ts) -> + let + tsLength = length ts + whenMoreThan1Type val = + if tsLength > 1 then docLitS val else docLitS "" + (lhsStrategy, rhsStrategy) = maybe (docEmpty, docEmpty) strategyLeftRight mStrategy + in + docSeq [ docDeriving , docWrapNodePrior types $ lhsStrategy , docSeparator , whenMoreThan1Type "(" , docWrapNodeRest types - $ docSeq - $ List.intersperse docCommaSep - $ ts - <&> \case - HsIB _ t -> layoutType t + $ docSeq + $ List.intersperse docCommaSep + $ ts <&> \case + HsIB _ t -> layoutType t , whenMoreThan1Type ")" , rhsStrategy ] where strategyLeftRight = \case - (L _ StockStrategy) -> (docLitS " stock", docEmpty) - (L _ AnyclassStrategy) -> (docLitS " anyclass", docEmpty) - (L _ NewtypeStrategy) -> (docLitS " newtype", docEmpty) - lVia@(L _ (ViaStrategy viaTypes)) -> + (L _ StockStrategy ) -> (docLitS " stock", docEmpty) + (L _ AnyclassStrategy ) -> (docLitS " anyclass", docEmpty) + (L _ NewtypeStrategy ) -> (docLitS " newtype", docEmpty) + lVia@(L _ (ViaStrategy viaTypes) ) -> ( docEmpty , case viaTypes of - HsIB _ext t -> docSeq - [docWrapNode lVia $ docLitS " via", docSeparator, layoutType t] + HsIB _ext t -> docSeq + [ docWrapNode lVia $ docLitS " via" + , docSeparator + , layoutType t + ] ) docDeriving :: ToBriDocM BriDocNumbered @@ -299,25 +307,21 @@ createDetailsDoc :: Text -> HsConDeclDetails GhcPs -> (ToBriDocM BriDocNumbered) createDetailsDoc consNameStr details = case details of PrefixCon args -> do - indentPolicy <- - mAsk <&> _conf_layout .> _lconfig_indentPolicy .> confUnpack + indentPolicy <- mAsk <&> _conf_layout .> _lconfig_indentPolicy .> confUnpack let singleLine = docSeq [ docLit consNameStr , docSeparator , docForceSingleline - $ docSeq - $ List.intersperse docSeparator - $ fmap hsScaledThing args - <&> layoutType + $ docSeq + $ List.intersperse docSeparator + $ fmap hsScaledThing args <&> layoutType ] - leftIndented = - docSetParSpacing - . docAddBaseY BrIndentRegular - . docPar (docLit consNameStr) - . docLines - $ layoutType - <$> fmap hsScaledThing args + leftIndented = docSetParSpacing + . docAddBaseY BrIndentRegular + . docPar (docLit consNameStr) + . docLines + $ layoutType <$> fmap hsScaledThing args multiAppended = docSeq [ docLit consNameStr , docSeparator @@ -327,80 +331,79 @@ createDetailsDoc consNameStr details = case details of (docLit consNameStr) (docLines $ layoutType <$> fmap hsScaledThing args) case indentPolicy of - IndentPolicyLeft -> docAlt [singleLine, leftIndented] + IndentPolicyLeft -> docAlt [singleLine, leftIndented] IndentPolicyMultiple -> docAlt [singleLine, multiAppended, leftIndented] IndentPolicyFree -> docAlt [singleLine, multiAppended, multiIndented, leftIndented] - RecCon (L _ []) -> - docSeq [docLit consNameStr, docSeparator, docLit $ Text.pack "{}"] - RecCon lRec@(L _ fields@(_ : _)) -> do + RecCon (L _ []) -> docSeq [docLit consNameStr, docSeparator, docLit $ Text.pack "{}"] + RecCon lRec@(L _ fields@(_:_)) -> do let ((fName1, fType1) : fDocR) = mkFieldDocs fields -- allowSingleline <- mAsk <&> _conf_layout .> _lconfig_allowSinglelineRecord .> confUnpack let allowSingleline = False - docAddBaseY BrIndentRegular $ runFilteredAlternative $ do + docAddBaseY BrIndentRegular + $ runFilteredAlternative + $ do -- single-line: { i :: Int, b :: Bool } - addAlternativeCond allowSingleline $ docSeq - [ docLit consNameStr - , docSeparator - , docWrapNodePrior lRec $ docLitS "{" - , docSeparator - , docWrapNodeRest lRec - $ docForceSingleline - $ docSeq - $ join - $ [fName1, docSeparator, docLitS "::", docSeparator, fType1] - : [ [ docLitS "," - , docSeparator - , fName - , docSeparator - , docLitS "::" - , docSeparator - , fType - ] - | (fName, fType) <- fDocR - ] - , docSeparator - , docLitS "}" - ] - addAlternative $ docPar - (docLit consNameStr) - (docWrapNodePrior lRec $ docNonBottomSpacingS $ docLines - [ docAlt - [ docCols - ColRecDecl - [ appSep (docLitS "{") - , appSep $ docForceSingleline fName1 - , docSeq [docLitS "::", docSeparator] - , docForceSingleline $ fType1 - ] - , docSeq - [ docLitS "{" - , docSeparator - , docSetBaseY $ docAddBaseY BrIndentRegular $ docPar - fName1 - (docSeq [docLitS "::", docSeparator, fType1]) - ] - ] - , docWrapNodeRest lRec $ docLines $ fDocR <&> \(fName, fType) -> - docAlt - [ docCols - ColRecDecl - [ docCommaSep - , appSep $ docForceSingleline fName - , docSeq [docLitS "::", docSeparator] - , docForceSingleline fType + addAlternativeCond allowSingleline $ docSeq + [ docLit consNameStr + , docSeparator + , docWrapNodePrior lRec $ docLitS "{" + , docSeparator + , docWrapNodeRest lRec + $ docForceSingleline + $ docSeq + $ join + $ [fName1, docSeparator, docLitS "::", docSeparator, fType1] + : [ [ docLitS "," + , docSeparator + , fName + , docSeparator + , docLitS "::" + , docSeparator + , fType + ] + | (fName, fType) <- fDocR ] - , docSeq - [ docLitS "," - , docSeparator - , docSetBaseY $ docAddBaseY BrIndentRegular $ docPar - fName - (docSeq [docLitS "::", docSeparator, fType]) - ] - ] + , docSeparator , docLitS "}" ] - ) + addAlternative $ docPar + (docLit consNameStr) + (docWrapNodePrior lRec $ docNonBottomSpacingS $ docLines + [ docAlt + [ docCols ColRecDecl + [ appSep (docLitS "{") + , appSep $ docForceSingleline fName1 + , docSeq [docLitS "::", docSeparator] + , docForceSingleline $ fType1 + ] + , docSeq + [ docLitS "{" + , docSeparator + , docSetBaseY $ docAddBaseY BrIndentRegular $ docPar + fName1 + (docSeq [docLitS "::", docSeparator, fType1]) + ] + ] + , docWrapNodeRest lRec $ docLines $ fDocR <&> \(fName, fType) -> + docAlt + [ docCols ColRecDecl + [ docCommaSep + , appSep $ docForceSingleline fName + , docSeq [docLitS "::", docSeparator] + , docForceSingleline fType + ] + , docSeq + [ docLitS "," + , docSeparator + , docSetBaseY $ docAddBaseY BrIndentRegular $ docPar + fName + (docSeq [docLitS "::", docSeparator, fType]) + ] + ] + , docLitS "}" + ] + ) InfixCon arg1 arg2 -> docSeq [ layoutType $ hsScaledThing arg1 , docSeparator @@ -415,11 +418,10 @@ createDetailsDoc consNameStr details = case details of mkFieldDocs = fmap $ \lField -> case lField of L _ (ConDeclField _ext names t _) -> createNamesAndTypeDoc lField names t -createForallDoc - :: [LHsTyVarBndr flag GhcPs] -> Maybe (ToBriDocM BriDocNumbered) -createForallDoc [] = Nothing -createForallDoc lhsTyVarBndrs = - Just $ docSeq [docLitS "forall ", createBndrDoc lhsTyVarBndrs] +createForallDoc :: [LHsTyVarBndr flag GhcPs] -> Maybe (ToBriDocM BriDocNumbered) +createForallDoc [] = Nothing +createForallDoc lhsTyVarBndrs = Just $ docSeq + [docLitS "forall ", createBndrDoc lhsTyVarBndrs] createNamesAndTypeDoc :: Data.Data.Data ast @@ -429,8 +431,12 @@ createNamesAndTypeDoc -> (ToBriDocM BriDocNumbered, ToBriDocM BriDocNumbered) createNamesAndTypeDoc lField names t = ( docNodeAnnKW lField Nothing $ docWrapNodePrior lField $ docSeq - [ docSeq $ List.intersperse docCommaSep $ names <&> \case - L _ (FieldOcc _ fieldName) -> docLit =<< lrdrNameToTextAnn fieldName + [ docSeq + $ List.intersperse docCommaSep + $ names + <&> \case + L _ (FieldOcc _ fieldName) -> + docLit =<< lrdrNameToTextAnn fieldName ] , docWrapNodeRest lField $ layoutType t ) diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/Decl.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/Decl.hs index c2ff209..a96ae47 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/Decl.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/Decl.hs @@ -5,46 +5,56 @@ module Language.Haskell.Brittany.Internal.Layouters.Decl where + + +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Data.Data import qualified Data.Foldable import qualified Data.Maybe import qualified Data.Semigroup as Semigroup import qualified Data.Text as Text -import GHC (AnnKeywordId(..), GenLocated(L)) -import GHC.Data.Bag (bagToList, emptyBag) -import qualified GHC.Data.FastString as FastString -import GHC.Hs import qualified GHC.OldList as List -import GHC.Types.Basic - ( Activation(..) - , InlinePragma(..) - , InlineSpec(..) - , LexicalFixity(..) - , RuleMatchInfo(..) - ) -import GHC.Types.SrcLoc (Located, SrcSpan, getLoc, unLoc) -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.ExactPrintUtils -import Language.Haskell.Brittany.Internal.LayouterBasics -import Language.Haskell.Brittany.Internal.Layouters.DataDecl -import {-# SOURCE #-} Language.Haskell.Brittany.Internal.Layouters.Expr -import Language.Haskell.Brittany.Internal.Layouters.Pattern -import {-# SOURCE #-} Language.Haskell.Brittany.Internal.Layouters.Stmt -import Language.Haskell.Brittany.Internal.Layouters.Type -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -import Language.Haskell.Brittany.Internal.Types + +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.LayouterBasics +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Layouters.Type + import qualified Language.Haskell.GHC.ExactPrint as ExactPrint -import Language.Haskell.GHC.ExactPrint.Types (mkAnnKey) import qualified Language.Haskell.GHC.ExactPrint.Utils as ExactPrint +import Language.Haskell.Brittany.Internal.ExactPrintUtils + +import GHC ( GenLocated(L) + , AnnKeywordId(..) + ) +import GHC.Types.SrcLoc ( SrcSpan, Located , getLoc, unLoc ) +import qualified GHC.Data.FastString as FastString +import GHC.Hs +import GHC.Types.Basic ( InlinePragma(..) + , Activation(..) + , InlineSpec(..) + , RuleMatchInfo(..) + , LexicalFixity(..) + ) +import Language.Haskell.GHC.ExactPrint.Types ( mkAnnKey ) + +import {-# SOURCE #-} Language.Haskell.Brittany.Internal.Layouters.Expr +import {-# SOURCE #-} Language.Haskell.Brittany.Internal.Layouters.Stmt +import Language.Haskell.Brittany.Internal.Layouters.Pattern +import Language.Haskell.Brittany.Internal.Layouters.DataDecl + +import GHC.Data.Bag ( bagToList, emptyBag ) + + layoutDecl :: ToBriDoc HsDecl layoutDecl d@(L loc decl) = case decl of - SigD _ sig -> withTransformedAnns d $ layoutSig (L loc sig) + SigD _ sig -> withTransformedAnns d $ layoutSig (L loc sig) ValD _ bind -> withTransformedAnns d $ layoutBind (L loc bind) >>= \case - Left ns -> docLines $ return <$> ns - Right n -> return n - TyClD _ tycl -> withTransformedAnns d $ layoutTyCl (L loc tycl) + Left ns -> docLines $ return <$> ns + Right n -> return n + TyClD _ tycl -> withTransformedAnns d $ layoutTyCl (L loc tycl) InstD _ (TyFamInstD _ tfid) -> withTransformedAnns d $ layoutTyFamInstDecl False d tfid InstD _ (ClsInstD _ inst) -> @@ -57,61 +67,52 @@ layoutDecl d@(L loc decl) = case decl of layoutSig :: ToBriDoc Sig layoutSig lsig@(L _loc sig) = case sig of - TypeSig _ names (HsWC _ (HsIB _ typ)) -> - layoutNamesAndType Nothing names typ + TypeSig _ names (HsWC _ (HsIB _ typ)) -> layoutNamesAndType Nothing names typ InlineSig _ name (InlinePragma _ spec _arity phaseAct conlike) -> docWrapNode lsig $ do nameStr <- lrdrNameToTextAnn name specStr <- specStringCompat lsig spec - let - phaseStr = case phaseAct of - NeverActive -> "" -- not [] - for NOINLINE NeverActive is - -- in fact the default - AlwaysActive -> "" - ActiveBefore _ i -> "[~" ++ show i ++ "] " - ActiveAfter _ i -> "[" ++ show i ++ "] " - FinalActive -> error "brittany internal error: FinalActive" - let - conlikeStr = case conlike of - FunLike -> "" - ConLike -> "CONLIKE " + let phaseStr = case phaseAct of + NeverActive -> "" -- not [] - for NOINLINE NeverActive is + -- in fact the default + AlwaysActive -> "" + ActiveBefore _ i -> "[~" ++ show i ++ "] " + ActiveAfter _ i -> "[" ++ show i ++ "] " + FinalActive -> error "brittany internal error: FinalActive" + let conlikeStr = case conlike of + FunLike -> "" + ConLike -> "CONLIKE " docLit - $ Text.pack ("{-# " ++ specStr ++ conlikeStr ++ phaseStr) + $ Text.pack ("{-# " ++ specStr ++ conlikeStr ++ phaseStr) <> nameStr <> Text.pack " #-}" - ClassOpSig _ False names (HsIB _ typ) -> - layoutNamesAndType Nothing names typ - PatSynSig _ names (HsIB _ typ) -> - layoutNamesAndType (Just "pattern") names typ + ClassOpSig _ False names (HsIB _ typ) -> layoutNamesAndType Nothing names typ + PatSynSig _ names (HsIB _ typ) -> layoutNamesAndType (Just "pattern") names typ _ -> briDocByExactNoComment lsig -- TODO where layoutNamesAndType mKeyword names typ = docWrapNode lsig $ do - let - keyDoc = case mKeyword of - Just key -> [appSep . docLit $ Text.pack key] - Nothing -> [] + let keyDoc = case mKeyword of + Just key -> [appSep . docLit $ Text.pack key] + Nothing -> [] nameStrs <- names `forM` lrdrNameToTextAnn let nameStr = Text.intercalate (Text.pack ", ") $ nameStrs - typeDoc <- docSharedWrapper layoutType typ + typeDoc <- docSharedWrapper layoutType typ hasComments <- hasAnyCommentsBelow lsig - shouldBeHanging <- - mAsk <&> _conf_layout .> _lconfig_hangingTypeSignature .> confUnpack + shouldBeHanging <- mAsk + <&> _conf_layout + .> _lconfig_hangingTypeSignature + .> confUnpack if shouldBeHanging - then - docSeq - $ [ appSep - $ docWrapNodeRest lsig - $ docSeq - $ keyDoc - <> [docLit nameStr] - , docSetBaseY $ docLines - [ docCols - ColTyOpPrefix - [ docLit $ Text.pack ":: " - , docAddBaseY (BrIndentSpecial 3) $ typeDoc - ] - ] + then docSeq $ + [ appSep $ docWrapNodeRest lsig $ docSeq $ keyDoc <> [docLit nameStr] + , docSetBaseY $ docLines + [ docCols + ColTyOpPrefix + [ docLit $ Text.pack ":: " + , docAddBaseY (BrIndentSpecial 3) $ typeDoc ] + ] + ] else layoutLhsAndType hasComments (appSep . docWrapNodeRest lsig . docSeq $ keyDoc <> [docLit nameStr]) @@ -121,23 +122,22 @@ layoutSig lsig@(L _loc sig) = case sig of specStringCompat :: MonadMultiWriter [BrittanyError] m => LSig GhcPs -> InlineSpec -> m String specStringCompat ast = \case - NoUserInline -> mTell [ErrorUnknownNode "NoUserInline" ast] $> "" - Inline -> pure "INLINE " - Inlinable -> pure "INLINABLE " - NoInline -> pure "NOINLINE " + NoUserInline -> mTell [ErrorUnknownNode "NoUserInline" ast] $> "" + Inline -> pure "INLINE " + Inlinable -> pure "INLINABLE " + NoInline -> pure "NOINLINE " layoutGuardLStmt :: ToBriDoc' (Stmt GhcPs (LHsExpr GhcPs)) layoutGuardLStmt lgstmt@(L _ stmtLR) = docWrapNode lgstmt $ case stmtLR of - BodyStmt _ body _ _ -> layoutExpr body + BodyStmt _ body _ _ -> layoutExpr body BindStmt _ lPat expr -> do patDoc <- docSharedWrapper layoutPat lPat expDoc <- docSharedWrapper layoutExpr expr - docCols - ColBindStmt - [ appSep $ colsWrapPat =<< patDoc - , docSeq [appSep $ docLit $ Text.pack "<-", expDoc] - ] - _ -> unknownNodeError "" lgstmt -- TODO + docCols ColBindStmt + [ appSep $ colsWrapPat =<< patDoc + , docSeq [appSep $ docLit $ Text.pack "<-", expDoc] + ] + _ -> unknownNodeError "" lgstmt -- TODO -------------------------------------------------------------------------------- @@ -145,33 +145,37 @@ layoutGuardLStmt lgstmt@(L _ stmtLR) = docWrapNode lgstmt $ case stmtLR of -------------------------------------------------------------------------------- layoutBind - :: ToBriDocC (HsBindLR GhcPs GhcPs) (Either [BriDocNumbered] BriDocNumbered) + :: ToBriDocC + (HsBindLR GhcPs GhcPs) + (Either [BriDocNumbered] BriDocNumbered) layoutBind lbind@(L _ bind) = case bind of FunBind _ fId (MG _ lmatches@(L _ matches) _) [] -> do - idStr <- lrdrNameToTextAnn fId - binderDoc <- docLit $ Text.pack "=" + idStr <- lrdrNameToTextAnn fId + binderDoc <- docLit $ Text.pack "=" funcPatDocs <- docWrapNode lbind - $ docWrapNode lmatches - $ layoutPatternBind (Just idStr) binderDoc - `mapM` matches + $ docWrapNode lmatches + $ layoutPatternBind (Just idStr) binderDoc + `mapM` matches return $ Left $ funcPatDocs PatBind _ pat (GRHSs _ grhss whereBinds) ([], []) -> do - patDocs <- colsWrapPat =<< layoutPat pat + patDocs <- colsWrapPat =<< layoutPat pat clauseDocs <- layoutGrhs `mapM` grhss mWhereDocs <- layoutLocalBinds whereBinds let mWhereArg = mWhereDocs <&> (,) (mkAnnKey lbind) -- TODO: is this the right AnnKey? - binderDoc <- docLit $ Text.pack "=" + binderDoc <- docLit $ Text.pack "=" hasComments <- hasAnyCommentsBelow lbind - fmap Right $ docWrapNode lbind $ layoutPatternBindFinal - Nothing - binderDoc - (Just patDocs) - clauseDocs - mWhereArg - hasComments + fmap Right $ docWrapNode lbind $ layoutPatternBindFinal Nothing + binderDoc + (Just patDocs) + clauseDocs + mWhereArg + hasComments PatSynBind _ (PSB _ patID lpat rpat dir) -> do - fmap Right $ docWrapNode lbind $ layoutPatSynBind patID lpat dir rpat + fmap Right $ docWrapNode lbind $ layoutPatSynBind patID + lpat + dir + rpat _ -> Right <$> unknownNodeError "" lbind layoutIPBind :: ToBriDoc IPBind layoutIPBind lipbind@(L _ bind) = case bind of @@ -181,13 +185,7 @@ layoutIPBind lipbind@(L _ bind) = case bind of binderDoc <- docLit $ Text.pack "=" exprDoc <- layoutExpr expr hasComments <- hasAnyCommentsBelow lipbind - layoutPatternBindFinal - Nothing - binderDoc - (Just ipName) - [([], exprDoc, expr)] - Nothing - hasComments + layoutPatternBindFinal Nothing binderDoc (Just ipName) [([], exprDoc, expr)] Nothing hasComments data BagBindOrSig = BagBind (LHsBindLR GhcPs GhcPs) @@ -195,7 +193,7 @@ data BagBindOrSig = BagBind (LHsBindLR GhcPs GhcPs) bindOrSigtoSrcSpan :: BagBindOrSig -> SrcSpan bindOrSigtoSrcSpan (BagBind (L l _)) = l -bindOrSigtoSrcSpan (BagSig (L l _)) = l +bindOrSigtoSrcSpan (BagSig (L l _)) = l layoutLocalBinds :: ToBriDocC (HsLocalBindsLR GhcPs GhcPs) (Maybe [BriDocNumbered]) @@ -205,18 +203,18 @@ layoutLocalBinds lbinds@(L _ binds) = case binds of -- x@(HsValBinds (ValBindsIn{})) -> -- Just . (:[]) <$> unknownNodeError "HsValBinds (ValBindsIn _ (_:_))" x HsValBinds _ (ValBinds _ bindlrs sigs) -> do - let - unordered = - [ BagBind b | b <- Data.Foldable.toList bindlrs ] - ++ [ BagSig s | s <- sigs ] - ordered = List.sortOn (ExactPrint.rs . bindOrSigtoSrcSpan) unordered + let unordered = + [ BagBind b | b <- Data.Foldable.toList bindlrs ] + ++ [ BagSig s | s <- sigs ] + ordered = List.sortOn (ExactPrint.rs . bindOrSigtoSrcSpan) unordered docs <- docWrapNode lbinds $ join <$> ordered `forM` \case BagBind b -> either id return <$> layoutBind b - BagSig s -> return <$> layoutSig s + BagSig s -> return <$> layoutSig s return $ Just $ docs -- x@(HsValBinds (ValBindsOut _binds _lsigs)) -> HsValBinds _ (XValBindsLR{}) -> error "brittany internal error: XValBindsLR" - HsIPBinds _ (IPBinds _ bb) -> Just <$> mapM layoutIPBind bb + HsIPBinds _ (IPBinds _ bb) -> + Just <$> mapM layoutIPBind bb EmptyLocalBinds{} -> return $ Nothing -- TODO: we don't need the `LHsExpr GhcPs` anymore, now that there is @@ -226,7 +224,7 @@ layoutGrhs -> ToBriDocM ([BriDocNumbered], BriDocNumbered, LHsExpr GhcPs) layoutGrhs lgrhs@(L _ (GRHS _ guards body)) = do guardDocs <- docWrapNode lgrhs $ layoutStmt `mapM` guards - bodyDoc <- layoutExpr body + bodyDoc <- layoutExpr body return (guardDocs, bodyDoc, body) layoutPatternBind @@ -235,7 +233,7 @@ layoutPatternBind -> LMatch GhcPs (LHsExpr GhcPs) -> ToBriDocM BriDocNumbered layoutPatternBind funId binderDoc lmatch@(L _ match) = do - let pats = m_pats match + let pats = m_pats match let (GRHSs _ grhss whereBinds) = m_grhss match patDocs <- pats `forM` \p -> fmap return $ colsWrapPat =<< layoutPat p let isInfix = isInfixMatch match @@ -244,26 +242,25 @@ layoutPatternBind funId binderDoc lmatch@(L _ match) = do _ -> pure Nothing let mIdStr' = fixPatternBindIdentifier match <$> mIdStr patDoc <- docWrapNodePrior lmatch $ case (mIdStr', patDocs) of - (Just idStr, p1 : p2 : pr) | isInfix -> if null pr - then docCols - ColPatternsFuncInfix - [ appSep $ docForceSingleline p1 - , appSep $ docLit $ idStr - , docForceSingleline p2 - ] - else docCols - ColPatternsFuncInfix - ([ docCols - ColPatterns - [ docParenL - , appSep $ docForceSingleline p1 - , appSep $ docLit $ idStr - , docForceSingleline p2 - , appSep $ docParenR + (Just idStr, p1:p2:pr) | isInfix -> if null pr + then + docCols ColPatternsFuncInfix + [ appSep $ docForceSingleline p1 + , appSep $ docLit $ idStr + , docForceSingleline p2 + ] + else + docCols ColPatternsFuncInfix + ( [docCols ColPatterns + [ docParenL + , appSep $ docForceSingleline p1 + , appSep $ docLit $ idStr + , docForceSingleline p2 + , appSep $ docParenR + ] ] - ] - ++ (spacifyDocs $ docForceSingleline <$> pr) - ) + ++ (spacifyDocs $ docForceSingleline <$> pr) + ) (Just idStr, []) -> docLit idStr (Just idStr, ps) -> docCols ColPatternsFuncPrefix @@ -277,30 +274,30 @@ layoutPatternBind funId binderDoc lmatch@(L _ match) = do let mWhereArg = mWhereDocs <&> (,) (mkAnnKey lmatch) let alignmentToken = if null pats then Nothing else funId hasComments <- hasAnyCommentsBelow lmatch - layoutPatternBindFinal - alignmentToken - binderDoc - (Just patDoc) - clauseDocs - mWhereArg - hasComments + layoutPatternBindFinal alignmentToken + binderDoc + (Just patDoc) + clauseDocs + mWhereArg + hasComments -fixPatternBindIdentifier :: Match GhcPs (LHsExpr GhcPs) -> Text -> Text +fixPatternBindIdentifier + :: Match GhcPs (LHsExpr GhcPs) -> Text -> Text fixPatternBindIdentifier match idStr = go $ m_ctxt match where go = \case - (FunRhs _ _ SrcLazy) -> Text.cons '~' idStr - (FunRhs _ _ SrcStrict) -> Text.cons '!' idStr + (FunRhs _ _ SrcLazy ) -> Text.cons '~' idStr + (FunRhs _ _ SrcStrict ) -> Text.cons '!' idStr (FunRhs _ _ NoSrcStrict) -> idStr - (StmtCtxt ctx1) -> goInner ctx1 - _ -> idStr + (StmtCtxt ctx1 ) -> goInner ctx1 + _ -> idStr -- I have really no idea if this path ever occurs, but better safe than -- risking another "drop bangpatterns" bugs. goInner = \case - (PatGuard ctx1) -> go ctx1 - (ParStmtCtxt ctx1) -> goInner ctx1 + (PatGuard ctx1) -> go ctx1 + (ParStmtCtxt ctx1) -> goInner ctx1 (TransStmtCtxt ctx1) -> goInner ctx1 - _ -> idStr + _ -> idStr layoutPatternBindFinal :: Maybe Text @@ -311,304 +308,304 @@ layoutPatternBindFinal -- ^ AnnKey for the node that contains the AnnWhere position annotation -> Bool -> ToBriDocM BriDocNumbered -layoutPatternBindFinal alignmentToken binderDoc mPatDoc clauseDocs mWhereDocs hasComments - = do - let - patPartInline = case mPatDoc of - Nothing -> [] +layoutPatternBindFinal alignmentToken binderDoc mPatDoc clauseDocs mWhereDocs hasComments = do + let patPartInline = case mPatDoc of + Nothing -> [] Just patDoc -> [appSep $ docForceSingleline $ return patDoc] patPartParWrap = case mPatDoc of - Nothing -> id + Nothing -> id Just patDoc -> docPar (return patDoc) - whereIndent <- do - shouldSpecial <- - mAsk <&> _conf_layout .> _lconfig_indentWhereSpecial .> confUnpack - regularIndentAmount <- - mAsk <&> _conf_layout .> _lconfig_indentAmount .> confUnpack - pure $ if shouldSpecial - then BrIndentSpecial (max 1 (regularIndentAmount `div` 2)) - else BrIndentRegular - -- TODO: apart from this, there probably are more nodes below which could - -- be shared between alternatives. - wherePartMultiLine :: [ToBriDocM BriDocNumbered] <- case mWhereDocs of - Nothing -> return $ [] - Just (annKeyWhere, [w]) -> pure . pure <$> docAlt - [ docEnsureIndent BrIndentRegular $ docSeq - [ docLit $ Text.pack "where" - , docSeparator - , docForceSingleline $ return w - ] - , docMoveToKWDP annKeyWhere AnnWhere False + whereIndent <- do + shouldSpecial <- mAsk + <&> _conf_layout + .> _lconfig_indentWhereSpecial + .> confUnpack + regularIndentAmount <- mAsk + <&> _conf_layout + .> _lconfig_indentAmount + .> confUnpack + pure $ if shouldSpecial + then BrIndentSpecial (max 1 (regularIndentAmount `div` 2)) + else BrIndentRegular + -- TODO: apart from this, there probably are more nodes below which could + -- be shared between alternatives. + wherePartMultiLine :: [ToBriDocM BriDocNumbered] <- case mWhereDocs of + Nothing -> return $ [] + Just (annKeyWhere, [w]) -> pure . pure <$> docAlt + [ docEnsureIndent BrIndentRegular + $ docSeq + [ docLit $ Text.pack "where" + , docSeparator + , docForceSingleline $ return w + ] + , docMoveToKWDP annKeyWhere AnnWhere False $ docEnsureIndent whereIndent $ docLines - [ docLit $ Text.pack "where" - , docEnsureIndent whereIndent + [ docLit $ Text.pack "where" + , docEnsureIndent whereIndent $ docSetIndentLevel $ docNonBottomSpacing $ return w - ] - ] - Just (annKeyWhere, ws) -> - fmap (pure . pure) - $ docMoveToKWDP annKeyWhere AnnWhere False - $ docEnsureIndent whereIndent - $ docLines - [ docLit $ Text.pack "where" - , docEnsureIndent whereIndent - $ docSetIndentLevel - $ docNonBottomSpacing - $ docLines - $ return - <$> ws - ] - let - singleLineGuardsDoc guards = appSep $ case guards of - [] -> docEmpty + ] + ] + Just (annKeyWhere, ws) -> + fmap (pure . pure) + $ docMoveToKWDP annKeyWhere AnnWhere False + $ docEnsureIndent whereIndent + $ docLines + [ docLit $ Text.pack "where" + , docEnsureIndent whereIndent + $ docSetIndentLevel + $ docNonBottomSpacing + $ docLines + $ return + <$> ws + ] + let singleLineGuardsDoc guards = appSep $ case guards of + [] -> docEmpty [g] -> docSeq - [appSep $ docLit $ Text.pack "|", docForceSingleline $ return g] - gs -> - docSeq - $ [appSep $ docLit $ Text.pack "|"] - ++ (List.intersperse - docCommaSep - (docForceSingleline . return <$> gs) + [appSep $ docLit $ Text.pack "|", docForceSingleline $ return g] + gs -> docSeq + $ [appSep $ docLit $ Text.pack "|"] + ++ (List.intersperse docCommaSep + (docForceSingleline . return <$> gs) ) wherePart = case mWhereDocs of - Nothing -> Just docEmpty + Nothing -> Just docEmpty Just (_, [w]) -> Just $ docSeq [ docSeparator , appSep $ docLit $ Text.pack "where" , docSetIndentLevel $ docForceSingleline $ return w ] - _ -> Nothing + _ -> Nothing - indentPolicy <- - mAsk <&> _conf_layout .> _lconfig_indentPolicy .> confUnpack + indentPolicy <- mAsk + <&> _conf_layout + .> _lconfig_indentPolicy + .> confUnpack - runFilteredAlternative $ do + runFilteredAlternative $ do - case clauseDocs of - [(guards, body, _bodyRaw)] -> do - let guardPart = singleLineGuardsDoc guards - forM_ wherePart $ \wherePart' -> - -- one-line solution - addAlternativeCond (not hasComments) $ docCols - (ColBindingLine alignmentToken) - [ docSeq (patPartInline ++ [guardPart]) - , docSeq - [ appSep $ return binderDoc - , docForceSingleline $ return body - , wherePart' - ] + case clauseDocs of + [(guards, body, _bodyRaw)] -> do + let guardPart = singleLineGuardsDoc guards + forM_ wherePart $ \wherePart' -> + -- one-line solution + addAlternativeCond (not hasComments) $ docCols + (ColBindingLine alignmentToken) + [ docSeq (patPartInline ++ [guardPart]) + , docSeq + [ appSep $ return binderDoc + , docForceSingleline $ return body + , wherePart' ] - -- one-line solution + where in next line(s) - addAlternativeCond (Data.Maybe.isJust mWhereDocs) - $ docLines - $ [ docCols - (ColBindingLine alignmentToken) - [ docSeq (patPartInline ++ [guardPart]) - , docSeq - [ appSep $ return binderDoc - , docForceParSpacing $ docAddBaseY BrIndentRegular $ return - body - ] - ] - ] - ++ wherePartMultiLine - -- two-line solution + where in next line(s) - addAlternative - $ docLines - $ [ docForceSingleline - $ docSeq (patPartInline ++ [guardPart, return binderDoc]) - , docEnsureIndent BrIndentRegular $ docForceSingleline $ return - body - ] - ++ wherePartMultiLine - -- pattern and exactly one clause in single line, body as par; - -- where in following lines - addAlternative - $ docLines - $ [ docCols - (ColBindingLine alignmentToken) - [ docSeq (patPartInline ++ [guardPart]) - , docSeq - [ appSep $ return binderDoc - , docForceParSpacing $ docAddBaseY BrIndentRegular $ return - body - ] - ] - ] - -- , lineMod $ docAlt - -- [ docSetBaseY $ return body - -- , docAddBaseY BrIndentRegular $ return body - -- ] - ++ wherePartMultiLine - -- pattern and exactly one clause in single line, body in new line. - addAlternative - $ docLines - $ [ docSeq (patPartInline ++ [guardPart, return binderDoc]) - , docNonBottomSpacing - $ docEnsureIndent BrIndentRegular - $ docAddBaseY BrIndentRegular - $ return body - ] - ++ wherePartMultiLine + ] + -- one-line solution + where in next line(s) + addAlternativeCond (Data.Maybe.isJust mWhereDocs) + $ docLines + $ [ docCols + (ColBindingLine alignmentToken) + [ docSeq (patPartInline ++ [guardPart]) + , docSeq + [ appSep $ return binderDoc + , docForceParSpacing $ docAddBaseY BrIndentRegular $ return body + ] + ] + ] + ++ wherePartMultiLine + -- two-line solution + where in next line(s) + addAlternative + $ docLines + $ [ docForceSingleline + $ docSeq (patPartInline ++ [guardPart, return binderDoc]) + , docEnsureIndent BrIndentRegular $ docForceSingleline $ return body + ] + ++ wherePartMultiLine + -- pattern and exactly one clause in single line, body as par; + -- where in following lines + addAlternative + $ docLines + $ [ docCols + (ColBindingLine alignmentToken) + [ docSeq (patPartInline ++ [guardPart]) + , docSeq + [ appSep $ return binderDoc + , docForceParSpacing $ docAddBaseY BrIndentRegular $ return body + ] + ] + ] + -- , lineMod $ docAlt + -- [ docSetBaseY $ return body + -- , docAddBaseY BrIndentRegular $ return body + -- ] + ++ wherePartMultiLine + -- pattern and exactly one clause in single line, body in new line. + addAlternative + $ docLines + $ [ docSeq (patPartInline ++ [guardPart, return binderDoc]) + , docNonBottomSpacing + $ docEnsureIndent BrIndentRegular + $ docAddBaseY BrIndentRegular + $ return body + ] + ++ wherePartMultiLine - _ -> return () -- no alternatives exclusively when `length clauseDocs /= 1` + _ -> return () -- no alternatives exclusively when `length clauseDocs /= 1` - case mPatDoc of - Nothing -> return () - Just patDoc -> - -- multiple clauses added in-paragraph, each in a single line - -- example: foo | bar = baz - -- | lll = asd - addAlternativeCond (indentPolicy == IndentPolicyFree) - $ docLines - $ [ docSeq - [ appSep $ docForceSingleline $ return patDoc - , docSetBaseY - $ docLines - $ clauseDocs - <&> \(guardDocs, bodyDoc, _) -> do - let guardPart = singleLineGuardsDoc guardDocs - -- the docForceSingleline might seems superflous, but it - -- helps the alternative resolving impl. - docForceSingleline $ docCols - ColGuardedBody - [ guardPart - , docSeq - [ appSep $ return binderDoc - , docForceSingleline $ return bodyDoc - -- i am not sure if there is a benefit to using - -- docForceParSpacing additionally here: - -- , docAddBaseY BrIndentRegular $ return bodyDoc - ] - ] - ] - ] - ++ wherePartMultiLine - -- multiple clauses, each in a separate, single line - addAlternative - $ docLines - $ [ docAddBaseY BrIndentRegular - $ patPartParWrap - $ docLines - $ map docSetBaseY - $ clauseDocs - <&> \(guardDocs, bodyDoc, _) -> do - let guardPart = singleLineGuardsDoc guardDocs - -- the docForceSingleline might seems superflous, but it - -- helps the alternative resolving impl. - docForceSingleline $ docCols - ColGuardedBody - [ guardPart - , docSeq - [ appSep $ return binderDoc - , docForceSingleline $ return bodyDoc - -- i am not sure if there is a benefit to using - -- docForceParSpacing additionally here: - -- , docAddBaseY BrIndentRegular $ return bodyDoc - ] - ] - ] - ++ wherePartMultiLine - -- multiple clauses, each with the guard(s) in a single line, body - -- as a paragraph - addAlternative - $ docLines - $ [ docAddBaseY BrIndentRegular - $ patPartParWrap - $ docLines - $ map docSetBaseY - $ clauseDocs - <&> \(guardDocs, bodyDoc, _) -> - docSeq - $ (case guardDocs of - [] -> [] - [g] -> - [ docForceSingleline $ docSeq - [appSep $ docLit $ Text.pack "|", return g] - ] - gs -> - [ docForceSingleline - $ docSeq - $ [appSep $ docLit $ Text.pack "|"] - ++ List.intersperse docCommaSep (return <$> gs) - ] - ) - ++ [ docSeparator - , docCols - ColOpPrefix + case mPatDoc of + Nothing -> return () + Just patDoc -> + -- multiple clauses added in-paragraph, each in a single line + -- example: foo | bar = baz + -- | lll = asd + addAlternativeCond (indentPolicy == IndentPolicyFree) + $ docLines + $ [ docSeq + [ appSep $ docForceSingleline $ return patDoc + , docSetBaseY + $ docLines + $ clauseDocs + <&> \(guardDocs, bodyDoc, _) -> do + let guardPart = singleLineGuardsDoc guardDocs + -- the docForceSingleline might seems superflous, but it + -- helps the alternative resolving impl. + docForceSingleline $ docCols + ColGuardedBody + [ guardPart + , docSeq [ appSep $ return binderDoc - , docAddBaseY BrIndentRegular - $ docForceParSpacing - $ return bodyDoc + , docForceSingleline $ return bodyDoc + -- i am not sure if there is a benefit to using + -- docForceParSpacing additionally here: + -- , docAddBaseY BrIndentRegular $ return bodyDoc ] ] - ] - ++ wherePartMultiLine - -- multiple clauses, each with the guard(s) in a single line, body - -- in a new line as a paragraph - addAlternative - $ docLines - $ [ docAddBaseY BrIndentRegular - $ patPartParWrap - $ docLines - $ map docSetBaseY - $ clauseDocs - >>= \(guardDocs, bodyDoc, _) -> - (case guardDocs of - [] -> [] - [g] -> - [ docForceSingleline $ docSeq - [appSep $ docLit $ Text.pack "|", return g] - ] - gs -> - [ docForceSingleline - $ docSeq - $ [appSep $ docLit $ Text.pack "|"] - ++ List.intersperse docCommaSep (return <$> gs) - ] - ) - ++ [ docCols - ColOpPrefix - [ appSep $ return binderDoc - , docAddBaseY BrIndentRegular - $ docForceParSpacing - $ return bodyDoc - ] + ] + ] + ++ wherePartMultiLine + -- multiple clauses, each in a separate, single line + addAlternative + $ docLines + $ [ docAddBaseY BrIndentRegular + $ patPartParWrap + $ docLines + $ map docSetBaseY + $ clauseDocs + <&> \(guardDocs, bodyDoc, _) -> do + let guardPart = singleLineGuardsDoc guardDocs + -- the docForceSingleline might seems superflous, but it + -- helps the alternative resolving impl. + docForceSingleline $ docCols + ColGuardedBody + [ guardPart + , docSeq + [ appSep $ return binderDoc + , docForceSingleline $ return bodyDoc + -- i am not sure if there is a benefit to using + -- docForceParSpacing additionally here: + -- , docAddBaseY BrIndentRegular $ return bodyDoc + ] + ] + ] + ++ wherePartMultiLine + -- multiple clauses, each with the guard(s) in a single line, body + -- as a paragraph + addAlternative + $ docLines + $ [ docAddBaseY BrIndentRegular + $ patPartParWrap + $ docLines + $ map docSetBaseY + $ clauseDocs + <&> \(guardDocs, bodyDoc, _) -> + docSeq + $ ( case guardDocs of + [] -> [] + [g] -> + [ docForceSingleline + $ docSeq [appSep $ docLit $ Text.pack "|", return g] ] - ] - ++ wherePartMultiLine - -- conservative approach: everything starts on the left. - addAlternative - $ docLines - $ [ docAddBaseY BrIndentRegular - $ patPartParWrap - $ docLines - $ map docSetBaseY - $ clauseDocs - >>= \(guardDocs, bodyDoc, _) -> - (case guardDocs of - [] -> [] - [g] -> - [docSeq [appSep $ docLit $ Text.pack "|", return g]] - (g1 : gr) -> - (docSeq [appSep $ docLit $ Text.pack "|", return g1] - : (gr - <&> \g -> docSeq - [appSep $ docLit $ Text.pack ",", return g] - ) - ) - ) - ++ [ docCols - ColOpPrefix - [ appSep $ return binderDoc - , docAddBaseY BrIndentRegular $ return bodyDoc - ] + gs -> + [ docForceSingleline + $ docSeq + $ [appSep $ docLit $ Text.pack "|"] + ++ List.intersperse docCommaSep (return <$> gs) ] - ] - ++ wherePartMultiLine + ) + ++ [ docSeparator + , docCols + ColOpPrefix + [ appSep $ return binderDoc + , docAddBaseY BrIndentRegular + $ docForceParSpacing + $ return bodyDoc + ] + ] + ] + ++ wherePartMultiLine + -- multiple clauses, each with the guard(s) in a single line, body + -- in a new line as a paragraph + addAlternative + $ docLines + $ [ docAddBaseY BrIndentRegular + $ patPartParWrap + $ docLines + $ map docSetBaseY + $ clauseDocs + >>= \(guardDocs, bodyDoc, _) -> + ( case guardDocs of + [] -> [] + [g] -> + [ docForceSingleline + $ docSeq [appSep $ docLit $ Text.pack "|", return g] + ] + gs -> + [ docForceSingleline + $ docSeq + $ [appSep $ docLit $ Text.pack "|"] + ++ List.intersperse docCommaSep (return <$> gs) + ] + ) + ++ [ docCols + ColOpPrefix + [ appSep $ return binderDoc + , docAddBaseY BrIndentRegular + $ docForceParSpacing + $ return bodyDoc + ] + ] + ] + ++ wherePartMultiLine + -- conservative approach: everything starts on the left. + addAlternative + $ docLines + $ [ docAddBaseY BrIndentRegular + $ patPartParWrap + $ docLines + $ map docSetBaseY + $ clauseDocs + >>= \(guardDocs, bodyDoc, _) -> + ( case guardDocs of + [] -> [] + [g] -> + [docSeq [appSep $ docLit $ Text.pack "|", return g]] + (g1:gr) -> + ( docSeq [appSep $ docLit $ Text.pack "|", return g1] + : ( gr + <&> \g -> + docSeq + [appSep $ docLit $ Text.pack ",", return g] + ) + ) + ) + ++ [ docCols + ColOpPrefix + [ appSep $ return binderDoc + , docAddBaseY BrIndentRegular $ return bodyDoc + ] + ] + ] + ++ wherePartMultiLine -- | Layout a pattern synonym binding layoutPatSynBind @@ -618,51 +615,44 @@ layoutPatSynBind -> LPat GhcPs -> ToBriDocM BriDocNumbered layoutPatSynBind name patSynDetails patDir rpat = do - let - patDoc = docLit $ Text.pack "pattern" - binderDoc = case patDir of - ImplicitBidirectional -> docLit $ Text.pack "=" - _ -> docLit $ Text.pack "<-" - body = colsWrapPat =<< layoutPat rpat - whereDoc = docLit $ Text.pack "where" + let patDoc = docLit $ Text.pack "pattern" + binderDoc = case patDir of + ImplicitBidirectional -> docLit $ Text.pack "=" + _ -> docLit $ Text.pack "<-" + body = colsWrapPat =<< layoutPat rpat + whereDoc = docLit $ Text.pack "where" mWhereDocs <- layoutPatSynWhere patDir - headDoc <- - fmap pure - $ docSeq - $ [ patDoc - , docSeparator - , layoutLPatSyn name patSynDetails - , docSeparator - , binderDoc - ] + headDoc <- fmap pure $ docSeq $ + [ patDoc + , docSeparator + , layoutLPatSyn name patSynDetails + , docSeparator + , binderDoc + ] runFilteredAlternative $ do - addAlternative - $ + addAlternative $ -- pattern .. where -- .. -- .. - docAddBaseY BrIndentRegular - $ docSeq - ([headDoc, docSeparator, body] ++ case mWhereDocs of + docAddBaseY BrIndentRegular $ docSeq + ( [headDoc, docSeparator, body] + ++ case mWhereDocs of Just ds -> [docSeparator, docPar whereDoc (docLines ds)] Nothing -> [] - ) - addAlternative - $ + ) + addAlternative $ -- pattern .. = -- .. -- pattern .. <- -- .. where -- .. -- .. - docAddBaseY BrIndentRegular - $ docPar - headDoc - (case mWhereDocs of - Nothing -> body - Just ds -> - docLines ([docSeq [body, docSeparator, whereDoc]] ++ ds) - ) + docAddBaseY BrIndentRegular $ docPar + headDoc + (case mWhereDocs of + Nothing -> body + Just ds -> docLines ([ docSeq [body, docSeparator, whereDoc] ] ++ ds) + ) -- | Helper method for the left hand side of a pattern synonym layoutLPatSyn @@ -681,21 +671,18 @@ layoutLPatSyn name (InfixCon left right) = do layoutLPatSyn name (RecCon recArgs) = do docName <- lrdrNameToTextAnn name args <- mapM (lrdrNameToTextAnn . recordPatSynSelectorId) recArgs - docSeq - . fmap docLit - $ [docName, Text.pack " { "] + docSeq . fmap docLit + $ [docName, Text.pack " { " ] <> intersperse (Text.pack ", ") args <> [Text.pack " }"] -- | Helper method to get the where clause from of explicitly bidirectional -- pattern synonyms -layoutPatSynWhere - :: HsPatSynDir GhcPs -> ToBriDocM (Maybe [ToBriDocM BriDocNumbered]) +layoutPatSynWhere :: HsPatSynDir GhcPs -> ToBriDocM (Maybe [ToBriDocM BriDocNumbered]) layoutPatSynWhere hs = case hs of ExplicitBidirectional (MG _ (L _ lbinds) _) -> do binderDoc <- docLit $ Text.pack "=" - Just - <$> mapM (docSharedWrapper $ layoutPatternBind Nothing binderDoc) lbinds + Just <$> mapM (docSharedWrapper $ layoutPatternBind Nothing binderDoc) lbinds _ -> pure Nothing -------------------------------------------------------------------------------- @@ -705,10 +692,9 @@ layoutPatSynWhere hs = case hs of layoutTyCl :: ToBriDoc TyClDecl layoutTyCl ltycl@(L _loc tycl) = case tycl of SynDecl _ name vars fixity typ -> do - let - isInfix = case fixity of - Prefix -> False - Infix -> True + let isInfix = case fixity of + Prefix -> False + Infix -> True -- hasTrailingParen <- hasAnnKeywordComment ltycl AnnCloseP -- let parenWrapper = if hasTrailingParen -- then appSep . docWrapNodeRest ltycl @@ -737,7 +723,9 @@ layoutSynDecl isInfix wrapNodeRest name vars typ = do -- This isn't quite right, but does give syntactically valid results let needsParens = not (null rest) || hasOwnParens docSeq - $ [docLit $ Text.pack "type", docSeparator] + $ [ docLit $ Text.pack "type" + , docSeparator + ] ++ [ docParenL | needsParens ] ++ [ layoutTyVarBndr False a , docSeparator @@ -749,13 +737,13 @@ layoutSynDecl isInfix wrapNodeRest name vars typ = do ++ fmap (layoutTyVarBndr True) rest else docSeq - $ [ docLit $ Text.pack "type" - , docSeparator - , docWrapNode name $ docLit nameStr - ] + $ [ docLit $ Text.pack "type" + , docSeparator + , docWrapNode name $ docLit nameStr + ] ++ fmap (layoutTyVarBndr True) vars - sharedLhs <- docSharedWrapper id lhs - typeDoc <- docSharedWrapper layoutType typ + sharedLhs <- docSharedWrapper id lhs + typeDoc <- docSharedWrapper layoutType typ hasComments <- hasAnyCommentsConnected typ layoutLhsAndType hasComments sharedLhs "=" typeDoc @@ -764,11 +752,11 @@ layoutTyVarBndr needsSep lbndr@(L _ bndr) = do docWrapNodePrior lbndr $ case bndr of UserTyVar _ _ name -> do nameStr <- lrdrNameToTextAnn name - docSeq $ [ docSeparator | needsSep ] ++ [docLit nameStr] + docSeq $ [docSeparator | needsSep] ++ [docLit nameStr] KindedTyVar _ _ name kind -> do nameStr <- lrdrNameToTextAnn name docSeq - $ [ docSeparator | needsSep ] + $ [ docSeparator | needsSep ] ++ [ docLit $ Text.pack "(" , appSep $ docLit nameStr , appSep . docLit $ Text.pack "::" @@ -796,7 +784,7 @@ layoutTyFamInstDecl inClass outerNode tfid = do -- type instance forall a . MyType (Maybe a) = Either () a innerNode = outerNode docWrapNodePrior outerNode $ do - nameStr <- lrdrNameToTextAnn name + nameStr <- lrdrNameToTextAnn name needsParens <- hasAnnKeyword outerNode AnnOpenP let instanceDoc = if inClass @@ -807,35 +795,33 @@ layoutTyFamInstDecl inClass outerNode tfid = do makeForallDoc bndrs = do bndrDocs <- layoutTyVarBndrs bndrs docSeq - ([docLit (Text.pack "forall")] + ( [docLit (Text.pack "forall")] ++ processTyVarBndrsSingleline bndrDocs ) lhs = docWrapNode innerNode - . docSeq - $ [appSep instanceDoc] + . docSeq + $ [appSep instanceDoc] ++ [ makeForallDoc foralls | Just foralls <- [bndrsMay] ] ++ [ docParenL | needsParens ] ++ [appSep $ docWrapNode name $ docLit nameStr] ++ intersperse docSeparator (layoutHsTyPats pats) ++ [ docParenR | needsParens ] - hasComments <- - (||) + hasComments <- (||) <$> hasAnyRegularCommentsConnected outerNode <*> hasAnyRegularCommentsRest innerNode typeDoc <- docSharedWrapper layoutType typ layoutLhsAndType hasComments lhs "=" typeDoc -layoutHsTyPats - :: [HsArg (LHsType GhcPs) (LHsKind GhcPs)] -> [ToBriDocM BriDocNumbered] +layoutHsTyPats :: [HsArg (LHsType GhcPs) (LHsKind GhcPs)] -> [ToBriDocM BriDocNumbered] layoutHsTyPats pats = pats <&> \case - HsValArg tm -> layoutType tm + HsValArg tm -> layoutType tm HsTypeArg _l ty -> docSeq [docLit $ Text.pack "@", layoutType ty] -- we ignore the SourceLoc here.. this LPat not being (L _ Pat{}) change -- is a bit strange. Hopefully this does not ignore any important -- annotations. - HsArgPar _l -> error "brittany internal error: HsArgPar{}" + HsArgPar _l -> error "brittany internal error: HsArgPar{}" -------------------------------------------------------------------------------- -- ClsInstDecl @@ -850,27 +836,27 @@ layoutClsInst :: ToBriDoc ClsInstDecl layoutClsInst lcid@(L _ cid) = docLines [ layoutInstanceHead , docEnsureIndent BrIndentRegular - $ docSetIndentLevel - $ docSortedLines - $ fmap layoutAndLocateSig (cid_sigs cid) - ++ fmap layoutAndLocateBind (bagToList $ cid_binds cid) - ++ fmap layoutAndLocateTyFamInsts (cid_tyfam_insts cid) + $ docSetIndentLevel + $ docSortedLines + $ fmap layoutAndLocateSig (cid_sigs cid) + ++ fmap layoutAndLocateBind (bagToList $ cid_binds cid) + ++ fmap layoutAndLocateTyFamInsts (cid_tyfam_insts cid) ++ fmap layoutAndLocateDataFamInsts (cid_datafam_insts cid) ] where layoutInstanceHead :: ToBriDocM BriDocNumbered layoutInstanceHead = briDocByExactNoComment - $ InstD NoExtField - . ClsInstD NoExtField - . removeChildren + $ InstD NoExtField + . ClsInstD NoExtField + . removeChildren <$> lcid removeChildren :: ClsInstDecl GhcPs -> ClsInstDecl GhcPs removeChildren c = c - { cid_binds = emptyBag - , cid_sigs = [] - , cid_tyfam_insts = [] + { cid_binds = emptyBag + , cid_sigs = [] + , cid_tyfam_insts = [] , cid_datafam_insts = [] } @@ -878,11 +864,7 @@ layoutClsInst lcid@(L _ cid) = docLines docSortedLines :: [ToBriDocM (Located BriDocNumbered)] -> ToBriDocM BriDocNumbered docSortedLines l = - allocateNode - . BDFLines - . fmap unLoc - . List.sortOn (ExactPrint.rs . getLoc) - =<< sequence l + allocateNode . BDFLines . fmap unLoc . List.sortOn (ExactPrint.rs . getLoc) =<< sequence l layoutAndLocateSig :: ToBriDocC (Sig GhcPs) (Located BriDocNumbered) layoutAndLocateSig lsig@(L loc _) = L loc <$> layoutSig lsig @@ -894,8 +876,8 @@ layoutClsInst lcid@(L _ cid) = docLines joinBinds :: Either [BriDocNumbered] BriDocNumbered -> ToBriDocM BriDocNumbered joinBinds = \case - Left ns -> docLines $ return <$> ns - Right n -> return n + Left ns -> docLines $ return <$> ns + Right n -> return n layoutAndLocateTyFamInsts :: ToBriDocC (TyFamInstDecl GhcPs) (Located BriDocNumbered) @@ -961,11 +943,10 @@ layoutClsInst lcid@(L _ cid) = docLines stripWhitespace' t = Text.intercalate (Text.pack "\n") $ go $ List.drop 1 $ Text.lines t where - go [] = [] + go [] = [] go (line1 : lineR) = case Text.stripStart line1 of - st - | isTypeOrData st -> st : lineR - | otherwise -> st : go lineR + st | isTypeOrData st -> st : lineR + | otherwise -> st : go lineR isTypeOrData t' = (Text.pack "type" `Text.isPrefixOf` t') || (Text.pack "newtype" `Text.isPrefixOf` t') @@ -988,12 +969,7 @@ layoutLhsAndType hasComments lhs sep typeDoc = do -- lhs = type -- lhs :: type addAlternativeCond (not hasComments) $ docSeq - [ lhs - , docSeparator - , docLitS sep - , docSeparator - , docForceSingleline typeDoc - ] + [lhs, docSeparator, docLitS sep, docSeparator, docForceSingleline typeDoc] -- lhs -- :: typeA -- -> typeB diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/Expr.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/Expr.hs index 3bc4c67..344454c 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/Expr.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/Expr.hs @@ -4,150 +4,149 @@ module Language.Haskell.Brittany.Internal.Layouters.Expr where + + +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Data.Data import qualified Data.Semigroup as Semigroup import qualified Data.Sequence as Seq import qualified Data.Text as Text -import GHC (AnnKeywordId(..), GenLocated(L), RdrName(..), SrcSpan) -import qualified GHC.Data.FastString as FastString -import GHC.Hs import qualified GHC.OldList as List -import GHC.Types.Basic -import GHC.Types.Name -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.LayouterBasics -import Language.Haskell.Brittany.Internal.Layouters.Decl -import Language.Haskell.Brittany.Internal.Layouters.Pattern -import Language.Haskell.Brittany.Internal.Layouters.Stmt -import Language.Haskell.Brittany.Internal.Layouters.Type -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.Utils + +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.LayouterBasics +import Language.Haskell.Brittany.Internal.Config.Types + +import GHC ( GenLocated(L), SrcSpan, AnnKeywordId(..), RdrName(..) ) +import GHC.Hs +import GHC.Types.Name +import qualified GHC.Data.FastString as FastString +import GHC.Types.Basic + +import Language.Haskell.Brittany.Internal.Utils +import Language.Haskell.Brittany.Internal.Layouters.Pattern +import Language.Haskell.Brittany.Internal.Layouters.Decl +import Language.Haskell.Brittany.Internal.Layouters.Stmt +import Language.Haskell.Brittany.Internal.Layouters.Type + + layoutExpr :: ToBriDoc HsExpr layoutExpr lexpr@(L _ expr) = do - indentPolicy <- mAsk <&> _conf_layout .> _lconfig_indentPolicy .> confUnpack + indentPolicy <- mAsk + <&> _conf_layout + .> _lconfig_indentPolicy + .> confUnpack let allowFreeIndent = indentPolicy == IndentPolicyFree docWrapNode lexpr $ case expr of HsVar _ vname -> do docLit =<< lrdrNameToTextAnn vname - HsUnboundVar _ oname -> docLit $ Text.pack $ occNameString oname + HsUnboundVar _ oname -> + docLit $ Text.pack $ occNameString oname HsRecFld{} -> do -- TODO briDocByExactInlineOnly "HsRecFld" lexpr HsOverLabel _ext _reboundFromLabel name -> - let label = FastString.unpackFS name in docLit . Text.pack $ '#' : label + let label = FastString.unpackFS name + in docLit . Text.pack $ '#' : label HsIPVar _ext (HsIPName name) -> - let label = FastString.unpackFS name in docLit . Text.pack $ '?' : label + let label = FastString.unpackFS name + in docLit . Text.pack $ '?' : label HsOverLit _ olit -> do allocateNode $ overLitValBriDoc $ ol_val olit HsLit _ lit -> do allocateNode $ litBriDoc lit HsLam _ (MG _ (L _ [lmatch@(L _ match)]) _) - | pats <- m_pats match - , GRHSs _ [lgrhs] llocals <- m_grhss match - , L _ EmptyLocalBinds{} <- llocals - , L _ (GRHS _ [] body) <- lgrhs + | pats <- m_pats match + , GRHSs _ [lgrhs] llocals <- m_grhss match + , L _ EmptyLocalBinds {} <- llocals + , L _ (GRHS _ [] body) <- lgrhs -> do - patDocs <- zip (True : repeat False) pats `forM` \(isFirst, p) -> - fmap return $ do - -- this code could be as simple as `colsWrapPat =<< layoutPat p` - -- if it was not for the following two cases: - -- \ !x -> x - -- \ ~x -> x - -- These make it necessary to special-case an additional separator. - -- (TODO: we create a BDCols here, but then make it ineffective - -- by wrapping it in docSeq below. We _could_ add alignments for - -- stuff like lists-of-lambdas. Nothing terribly important..) - let - shouldPrefixSeparator = case p of + patDocs <- zip (True : repeat False) pats `forM` \(isFirst, p) -> + fmap return $ do + -- this code could be as simple as `colsWrapPat =<< layoutPat p` + -- if it was not for the following two cases: + -- \ !x -> x + -- \ ~x -> x + -- These make it necessary to special-case an additional separator. + -- (TODO: we create a BDCols here, but then make it ineffective + -- by wrapping it in docSeq below. We _could_ add alignments for + -- stuff like lists-of-lambdas. Nothing terribly important..) + let shouldPrefixSeparator = case p of L _ LazyPat{} -> isFirst L _ BangPat{} -> isFirst - _ -> False - patDocSeq <- layoutPat p - fixed <- case Seq.viewl patDocSeq of - p1 Seq.:< pr | shouldPrefixSeparator -> do - p1' <- docSeq [docSeparator, pure p1] - pure (p1' Seq.<| pr) - _ -> pure patDocSeq - colsWrapPat fixed - bodyDoc <- - docAddBaseY BrIndentRegular <$> docSharedWrapper layoutExpr body - let - funcPatternPartLine = docCols - ColCasePattern - (patDocs <&> (\p -> docSeq [docForceSingleline p, docSeparator])) - docAlt - [ -- single line - docSeq - [ docLit $ Text.pack "\\" - , docWrapNode lmatch $ docForceSingleline funcPatternPartLine - , appSep $ docLit $ Text.pack "->" - , docWrapNode lgrhs $ docForceSingleline bodyDoc - ] - -- double line - , docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar - (docSeq - [ docLit $ Text.pack "\\" - , docWrapNode lmatch $ appSep $ docForceSingleline - funcPatternPartLine - , docLit $ Text.pack "->" - ] - ) - (docWrapNode lgrhs $ docForceSingleline bodyDoc) - -- wrapped par spacing - , docSetParSpacing $ docSeq - [ docLit $ Text.pack "\\" - , docWrapNode lmatch $ docForceSingleline funcPatternPartLine - , appSep $ docLit $ Text.pack "->" - , docWrapNode lgrhs $ docForceParSpacing bodyDoc - ] - -- conservative - , docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar - (docSeq - [ docLit $ Text.pack "\\" - , docWrapNode lmatch $ appSep $ docForceSingleline - funcPatternPartLine - , docLit $ Text.pack "->" - ] - ) - (docWrapNode lgrhs $ docNonBottomSpacing bodyDoc) + _ -> False + patDocSeq <- layoutPat p + fixed <- case Seq.viewl patDocSeq of + p1 Seq.:< pr | shouldPrefixSeparator -> do + p1' <- docSeq [docSeparator, pure p1] + pure (p1' Seq.<| pr) + _ -> pure patDocSeq + colsWrapPat fixed + bodyDoc <- docAddBaseY BrIndentRegular <$> docSharedWrapper layoutExpr body + let funcPatternPartLine = + docCols ColCasePattern + (patDocs <&> (\p -> docSeq [docForceSingleline p, docSeparator])) + docAlt + [ -- single line + docSeq + [ docLit $ Text.pack "\\" + , docWrapNode lmatch $ docForceSingleline funcPatternPartLine + , appSep $ docLit $ Text.pack "->" + , docWrapNode lgrhs $ docForceSingleline bodyDoc ] - HsLam{} -> unknownNodeError "HsLam too complex" lexpr - HsLamCase _ (MG _ (L _ []) _) -> do - docSetParSpacing + -- double line + , docSetParSpacing $ docAddBaseY BrIndentRegular - $ (docLit $ Text.pack "\\case {}") + $ docPar + (docSeq + [ docLit $ Text.pack "\\" + , docWrapNode lmatch $ appSep $ docForceSingleline funcPatternPartLine + , docLit $ Text.pack "->" + ]) + (docWrapNode lgrhs $ docForceSingleline bodyDoc) + -- wrapped par spacing + , docSetParSpacing + $ docSeq + [ docLit $ Text.pack "\\" + , docWrapNode lmatch $ docForceSingleline funcPatternPartLine + , appSep $ docLit $ Text.pack "->" + , docWrapNode lgrhs $ docForceParSpacing bodyDoc + ] + -- conservative + , docSetParSpacing + $ docAddBaseY BrIndentRegular + $ docPar + (docSeq + [ docLit $ Text.pack "\\" + , docWrapNode lmatch $ appSep $ docForceSingleline funcPatternPartLine + , docLit $ Text.pack "->" + ]) + (docWrapNode lgrhs $ docNonBottomSpacing bodyDoc) + ] + HsLam{} -> + unknownNodeError "HsLam too complex" lexpr + HsLamCase _ (MG _ (L _ []) _) -> do + docSetParSpacing $ docAddBaseY BrIndentRegular $ + (docLit $ Text.pack "\\case {}") HsLamCase _ (MG _ lmatches@(L _ matches) _) -> do - binderDoc <- docLit $ Text.pack "->" - funcPatDocs <- - docWrapNode lmatches - $ layoutPatternBind Nothing binderDoc - `mapM` matches + binderDoc <- docLit $ Text.pack "->" + funcPatDocs <- docWrapNode lmatches + $ layoutPatternBind Nothing binderDoc `mapM` matches docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar (docLit $ Text.pack "\\case") - (docSetBaseAndIndent - $ docNonBottomSpacing - $ docLines - $ return - <$> funcPatDocs - ) + (docSetBaseAndIndent $ docNonBottomSpacing $ docLines $ return <$> funcPatDocs) HsApp _ exp1@(L _ HsApp{}) exp2 -> do - let - gather - :: [LHsExpr GhcPs] - -> LHsExpr GhcPs - -> (LHsExpr GhcPs, [LHsExpr GhcPs]) - gather list = \case - L _ (HsApp _ l r) -> gather (r : list) l - x -> (x, list) + let gather :: [LHsExpr GhcPs] -> LHsExpr GhcPs -> (LHsExpr GhcPs, [LHsExpr GhcPs]) + gather list = \case + L _ (HsApp _ l r) -> gather (r:list) l + x -> (x, list) let (headE, paramEs) = gather [exp2] exp1 - let - colsOrSequence = case headE of - L _ (HsVar _ (L _ (Unqual occname))) -> - docCols (ColApp $ Text.pack $ occNameString occname) - _ -> docSeq + let colsOrSequence = case headE of + L _ (HsVar _ (L _ (Unqual occname))) -> + docCols (ColApp $ Text.pack $ occNameString occname) + _ -> docSeq headDoc <- docSharedWrapper layoutExpr headE paramDocs <- docSharedWrapper layoutExpr `mapM` paramEs hasComments <- hasAnyCommentsConnected exp2 @@ -159,13 +158,13 @@ layoutExpr lexpr@(L _ expr) = do : spacifyDocs (docForceSingleline <$> paramDocs) -- foo x -- y - addAlternativeCond allowFreeIndent $ docSeq + addAlternativeCond allowFreeIndent + $ docSeq [ appSep (docForceSingleline headDoc) , docSetBaseY $ docAddBaseY BrIndentRegular $ docLines - $ docForceSingleline - <$> paramDocs + $ docForceSingleline <$> paramDocs ] -- foo -- x @@ -174,25 +173,30 @@ layoutExpr lexpr@(L _ expr) = do $ docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar - (docForceSingleline headDoc) - (docNonBottomSpacing $ docLines paramDocs) + (docForceSingleline headDoc) + ( docNonBottomSpacing + $ docLines paramDocs + ) -- ( multi -- line -- function -- ) -- x -- y - addAlternative $ docAddBaseY BrIndentRegular $ docPar - headDoc - (docNonBottomSpacing $ docLines paramDocs) + addAlternative + $ docAddBaseY BrIndentRegular + $ docPar + headDoc + ( docNonBottomSpacing + $ docLines paramDocs + ) HsApp _ exp1 exp2 -> do -- TODO: if expDoc1 is some literal, we may want to create a docCols here. expDoc1 <- docSharedWrapper layoutExpr exp1 expDoc2 <- docSharedWrapper layoutExpr exp2 docAlt [ -- func arg - docSeq - [appSep $ docForceSingleline expDoc1, docForceSingleline expDoc2] + docSeq [appSep $ docForceSingleline expDoc1, docForceSingleline expDoc2] , -- func argline1 -- arglines -- e.g. @@ -205,70 +209,77 @@ layoutExpr lexpr@(L _ expr) = do -- anyways, so it is _always_ par-spaced. $ docAddBaseY BrIndentRegular $ docSeq - [appSep $ docForceSingleline expDoc1, docForceParSpacing expDoc2] + [ appSep $ docForceSingleline expDoc1 + , docForceParSpacing expDoc2 + ] , -- func -- arg - docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar + docSetParSpacing + $ docAddBaseY BrIndentRegular + $ docPar (docForceSingleline expDoc1) (docNonBottomSpacing expDoc2) , -- fu -- nc -- ar -- gument - docAddBaseY BrIndentRegular $ docPar expDoc1 expDoc2 + docAddBaseY BrIndentRegular + $ docPar + expDoc1 + expDoc2 ] HsAppType _ exp1 (HsWC _ ty1) -> do t <- docSharedWrapper layoutType ty1 e <- docSharedWrapper layoutExpr exp1 docAlt [ docSeq - [ docForceSingleline e - , docSeparator - , docLit $ Text.pack "@" - , docForceSingleline t - ] - , docPar e (docSeq [docLit $ Text.pack "@", t]) + [ docForceSingleline e + , docSeparator + , docLit $ Text.pack "@" + , docForceSingleline t + ] + , docPar + e + (docSeq [docLit $ Text.pack "@", t ]) ] OpApp _ expLeft@(L _ OpApp{}) expOp expRight -> do - let - gather - :: [(LHsExpr GhcPs, LHsExpr GhcPs)] - -> LHsExpr GhcPs - -> (LHsExpr GhcPs, [(LHsExpr GhcPs, LHsExpr GhcPs)]) - gather opExprList = \case - (L _ (OpApp _ l1 op1 r1)) -> gather ((op1, r1) : opExprList) l1 - final -> (final, opExprList) - (leftOperand, appList) = gather [] expLeft + let gather :: [(LHsExpr GhcPs, LHsExpr GhcPs)] -> LHsExpr GhcPs -> (LHsExpr GhcPs, [(LHsExpr GhcPs, LHsExpr GhcPs)]) + gather opExprList = \case + (L _ (OpApp _ l1 op1 r1)) -> gather ((op1, r1): opExprList) l1 + final -> (final, opExprList) + (leftOperand, appList) = gather [] expLeft leftOperandDoc <- docSharedWrapper layoutExpr leftOperand - appListDocs <- appList `forM` \(x, y) -> - [ (xD, yD) - | xD <- docSharedWrapper layoutExpr x - , yD <- docSharedWrapper layoutExpr y - ] - opLastDoc <- docSharedWrapper layoutExpr expOp - expLastDoc <- docSharedWrapper layoutExpr expRight + appListDocs <- appList `forM` \(x,y) -> [ (xD, yD) + | xD <- docSharedWrapper layoutExpr x + , yD <- docSharedWrapper layoutExpr y + ] + opLastDoc <- docSharedWrapper layoutExpr expOp + expLastDoc <- docSharedWrapper layoutExpr expRight allowSinglelinePar <- do hasComLeft <- hasAnyCommentsConnected expLeft - hasComOp <- hasAnyCommentsConnected expOp + hasComOp <- hasAnyCommentsConnected expOp pure $ not hasComLeft && not hasComOp - let - allowPar = case (expOp, expRight) of - (L _ (HsVar _ (L _ (Unqual occname))), _) - | occNameString occname == "$" -> True - (_, L _ (HsApp _ _ (L _ HsVar{}))) -> False - _ -> True + let allowPar = case (expOp, expRight) of + (L _ (HsVar _ (L _ (Unqual occname))), _) + | occNameString occname == "$" -> True + (_, L _ (HsApp _ _ (L _ HsVar{}))) -> False + _ -> True runFilteredAlternative $ do -- > one + two + three -- or -- > one + two + case x of -- > _ -> three - addAlternativeCond allowSinglelinePar $ docSeq + addAlternativeCond allowSinglelinePar + $ docSeq [ appSep $ docForceSingleline leftOperandDoc - , docSeq $ appListDocs <&> \(od, ed) -> docSeq - [appSep $ docForceSingleline od, appSep $ docForceSingleline ed] + , docSeq + $ appListDocs <&> \(od, ed) -> docSeq + [ appSep $ docForceSingleline od + , appSep $ docForceSingleline ed + ] , appSep $ docForceSingleline opLastDoc , (if allowPar then docForceParSpacing else docForceSingleline) - expLastDoc + expLastDoc ] -- this case rather leads to some unfortunate layouting than to anything -- useful; disabling for now. (it interfers with cols stuff.) @@ -283,31 +294,29 @@ layoutExpr lexpr@(L _ expr) = do -- > one -- > + two -- > + three - addAlternative $ docPar - leftOperandDoc - (docLines - $ (appListDocs <&> \(od, ed) -> - docCols ColOpPrefix [appSep od, docSetBaseY ed] + addAlternative $ + docPar + leftOperandDoc + ( docLines + $ (appListDocs <&> \(od, ed) -> docCols ColOpPrefix [appSep od, docSetBaseY ed]) + ++ [docCols ColOpPrefix [appSep opLastDoc, docSetBaseY expLastDoc]] ) - ++ [docCols ColOpPrefix [appSep opLastDoc, docSetBaseY expLastDoc]] - ) OpApp _ expLeft expOp expRight -> do - expDocLeft <- docSharedWrapper layoutExpr expLeft - expDocOp <- docSharedWrapper layoutExpr expOp + expDocLeft <- docSharedWrapper layoutExpr expLeft + expDocOp <- docSharedWrapper layoutExpr expOp expDocRight <- docSharedWrapper layoutExpr expRight - let - allowPar = case (expOp, expRight) of - (L _ (HsVar _ (L _ (Unqual occname))), _) - | occNameString occname == "$" -> True - (_, L _ (HsApp _ _ (L _ HsVar{}))) -> False - _ -> True - let - leftIsDoBlock = case expLeft of - L _ HsDo{} -> True - _ -> False + let allowPar = case (expOp, expRight) of + (L _ (HsVar _ (L _ (Unqual occname))), _) + | occNameString occname == "$" -> True + (_, L _ (HsApp _ _ (L _ HsVar{}))) -> False + _ -> True + let leftIsDoBlock = case expLeft of + L _ HsDo{} -> True + _ -> False runFilteredAlternative $ do -- one-line - addAlternative $ docSeq + addAlternative + $ docSeq [ appSep $ docForceSingleline expDocLeft , appSep $ docForceSingleline expDocOp , docForceSingleline expDocRight @@ -322,35 +331,35 @@ layoutExpr lexpr@(L _ expr) = do -- two-line addAlternative $ do let - expDocOpAndRight = docForceSingleline $ docCols - ColOpPrefix - [appSep $ expDocOp, docSetBaseY expDocRight] + expDocOpAndRight = docForceSingleline + $ docCols ColOpPrefix [appSep $ expDocOp, docSetBaseY expDocRight] if leftIsDoBlock then docLines [expDocLeft, expDocOpAndRight] - else docAddBaseY BrIndentRegular - $ docPar expDocLeft expDocOpAndRight + else docAddBaseY BrIndentRegular $ docPar expDocLeft expDocOpAndRight -- TODO: in both cases, we don't force expDocLeft to be -- single-line, which has certain.. interesting consequences. -- At least, the "two-line" label is not entirely -- accurate. -- one-line + par - addAlternativeCond allowPar $ docSeq + addAlternativeCond allowPar + $ docSeq [ appSep $ docForceSingleline expDocLeft , appSep $ docForceSingleline expDocOp , docForceParSpacing expDocRight ] -- more lines addAlternative $ do - let - expDocOpAndRight = - docCols ColOpPrefix [appSep expDocOp, docSetBaseY expDocRight] + let expDocOpAndRight = + docCols ColOpPrefix [appSep expDocOp, docSetBaseY expDocRight] if leftIsDoBlock then docLines [expDocLeft, expDocOpAndRight] else docAddBaseY BrIndentRegular - $ docPar expDocLeft expDocOpAndRight + $ docPar expDocLeft expDocOpAndRight NegApp _ op _ -> do opDoc <- docSharedWrapper layoutExpr op - docSeq [docLit $ Text.pack "-", opDoc] + docSeq [ docLit $ Text.pack "-" + , opDoc + ] HsPar _ innerExp -> do innerExpDoc <- docSharedWrapper (docWrapNode lexpr . layoutExpr) innerExp docAlt @@ -360,8 +369,7 @@ layoutExpr lexpr@(L _ expr) = do , docLit $ Text.pack ")" ] , docSetBaseY $ docLines - [ docCols - ColOpPrefix + [ docCols ColOpPrefix [ docLit $ Text.pack "(" , docAddBaseY (BrIndentSpecial 2) innerExpDoc ] @@ -370,33 +378,33 @@ layoutExpr lexpr@(L _ expr) = do ] SectionL _ left op -> do -- TODO: add to testsuite leftDoc <- docSharedWrapper layoutExpr left - opDoc <- docSharedWrapper layoutExpr op + opDoc <- docSharedWrapper layoutExpr op docSeq [leftDoc, docSeparator, opDoc] SectionR _ op right -> do -- TODO: add to testsuite - opDoc <- docSharedWrapper layoutExpr op + opDoc <- docSharedWrapper layoutExpr op rightDoc <- docSharedWrapper layoutExpr right docSeq [opDoc, docSeparator, rightDoc] ExplicitTuple _ args boxity -> do - let - argExprs = args <&> \arg -> case arg of - (L _ (Present _ e)) -> (arg, Just e) - (L _ (Missing NoExtField)) -> (arg, Nothing) - argDocs <- forM argExprs $ docSharedWrapper $ \(arg, exprM) -> - docWrapNode arg $ maybe docEmpty layoutExpr exprM + let argExprs = args <&> \arg -> case arg of + (L _ (Present _ e)) -> (arg, Just e); + (L _ (Missing NoExtField)) -> (arg, Nothing) + argDocs <- forM argExprs + $ docSharedWrapper + $ \(arg, exprM) -> docWrapNode arg $ maybe docEmpty layoutExpr exprM hasComments <- orM - (hasCommentsBetween lexpr AnnOpenP AnnCloseP + ( hasCommentsBetween lexpr AnnOpenP AnnCloseP : map hasAnyCommentsBelow args ) - let - (openLit, closeLit) = case boxity of - Boxed -> (docLit $ Text.pack "(", docLit $ Text.pack ")") - Unboxed -> (docParenHashLSep, docParenHashRSep) + let (openLit, closeLit) = case boxity of + Boxed -> (docLit $ Text.pack "(", docLit $ Text.pack ")") + Unboxed -> (docParenHashLSep, docParenHashRSep) case splitFirstLast argDocs of - FirstLastEmpty -> - docSeq [openLit, docNodeAnnKW lexpr (Just AnnOpenP) closeLit] + FirstLastEmpty -> docSeq + [ openLit + , docNodeAnnKW lexpr (Just AnnOpenP) closeLit + ] FirstLastSingleton e -> docAlt - [ docCols - ColTuple + [ docCols ColTuple [ openLit , docNodeAnnKW lexpr (Just AnnOpenP) $ docForceSingleline e , closeLit @@ -411,88 +419,74 @@ layoutExpr lexpr@(L _ expr) = do ] FirstLast e1 ems eN -> runFilteredAlternative $ do addAlternativeCond (not hasComments) - $ docCols ColTuple - $ [docSeq [openLit, docForceSingleline e1]] + $ docCols ColTuple + $ [docSeq [openLit, docForceSingleline e1]] ++ (ems <&> \e -> docSeq [docCommaSep, docForceSingleline e]) - ++ [ docSeq - [ docCommaSep - , docNodeAnnKW lexpr (Just AnnOpenP) (docForceSingleline eN) - , closeLit - ] - ] - addAlternative - $ let - start = docCols ColTuples [appSep openLit, e1] - linesM = ems <&> \d -> docCols ColTuples [docCommaSep, d] - lineN = docCols - ColTuples - [docCommaSep, docNodeAnnKW lexpr (Just AnnOpenP) eN] - end = closeLit - in docSetBaseY $ docLines $ [start] ++ linesM ++ [lineN, end] + ++ [docSeq [docCommaSep, docNodeAnnKW lexpr (Just AnnOpenP) (docForceSingleline eN), closeLit]] + addAlternative $ + let + start = docCols ColTuples + [appSep openLit, e1] + linesM = ems <&> \d -> + docCols ColTuples [docCommaSep, d] + lineN = docCols ColTuples [docCommaSep, docNodeAnnKW lexpr (Just AnnOpenP) eN] + end = closeLit + in docSetBaseY $ docLines $ [start] ++ linesM ++ [lineN, end] HsCase _ cExp (MG _ (L _ []) _) -> do cExpDoc <- docSharedWrapper layoutExpr cExp docAlt - [ docAddBaseY BrIndentRegular $ docSeq - [ appSep $ docLit $ Text.pack "case" - , appSep $ docForceSingleline cExpDoc - , docLit $ Text.pack "of {}" - ] + [ docAddBaseY BrIndentRegular + $ docSeq + [ appSep $ docLit $ Text.pack "case" + , appSep $ docForceSingleline cExpDoc + , docLit $ Text.pack "of {}" + ] , docPar - (docAddBaseY BrIndentRegular - $ docPar (docLit $ Text.pack "case") cExpDoc - ) - (docLit $ Text.pack "of {}") + ( docAddBaseY BrIndentRegular + $ docPar (docLit $ Text.pack "case") cExpDoc + ) + (docLit $ Text.pack "of {}") ] HsCase _ cExp (MG _ lmatches@(L _ matches) _) -> do cExpDoc <- docSharedWrapper layoutExpr cExp binderDoc <- docLit $ Text.pack "->" - funcPatDocs <- - docWrapNode lmatches - $ layoutPatternBind Nothing binderDoc - `mapM` matches + funcPatDocs <- docWrapNode lmatches + $ layoutPatternBind Nothing binderDoc `mapM` matches docAlt - [ docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar - (docSeq + [ docSetParSpacing + $ docAddBaseY BrIndentRegular + $ docPar + ( docSeq [ appSep $ docLit $ Text.pack "case" , appSep $ docForceSingleline cExpDoc , docLit $ Text.pack "of" - ] - ) - (docSetBaseAndIndent - $ docNonBottomSpacing - $ docLines - $ return - <$> funcPatDocs - ) + ]) + (docSetBaseAndIndent $ docNonBottomSpacing $ docLines $ return <$> funcPatDocs) , docPar - (docAddBaseY BrIndentRegular - $ docPar (docLit $ Text.pack "case") cExpDoc - ) - (docAddBaseY BrIndentRegular $ docPar - (docLit $ Text.pack "of") - (docSetBaseAndIndent - $ docNonBottomSpacing - $ docLines - $ return - <$> funcPatDocs + ( docAddBaseY BrIndentRegular + $ docPar (docLit $ Text.pack "case") cExpDoc + ) + ( docAddBaseY BrIndentRegular + $ docPar (docLit $ Text.pack "of") + (docSetBaseAndIndent $ docNonBottomSpacing $ docLines $ return <$> funcPatDocs) ) - ) ] HsIf _ ifExpr thenExpr elseExpr -> do - ifExprDoc <- docSharedWrapper layoutExpr ifExpr + ifExprDoc <- docSharedWrapper layoutExpr ifExpr thenExprDoc <- docSharedWrapper layoutExpr thenExpr elseExprDoc <- docSharedWrapper layoutExpr elseExpr hasComments <- hasAnyCommentsBelow lexpr - let - maySpecialIndent = case indentPolicy of - IndentPolicyLeft -> BrIndentRegular - IndentPolicyMultiple -> BrIndentRegular - IndentPolicyFree -> BrIndentSpecial 3 + let maySpecialIndent = + case indentPolicy of + IndentPolicyLeft -> BrIndentRegular + IndentPolicyMultiple -> BrIndentRegular + IndentPolicyFree -> BrIndentSpecial 3 -- TODO: some of the alternatives (especially last and last-but-one) -- overlap. docSetIndentLevel $ runFilteredAlternative $ do -- if _ then _ else _ - addAlternativeCond (not hasComments) $ docSeq + addAlternativeCond (not hasComments) + $ docSeq [ appSep $ docLit $ Text.pack "if" , appSep $ docForceSingleline ifExprDoc , appSep $ docLit $ Text.pack "then" @@ -517,34 +511,25 @@ layoutExpr lexpr@(L _ expr) = do $ docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar - (docSeq + ( docSeq [ docNodeAnnKW lexpr Nothing $ appSep $ docLit $ Text.pack "if" - , docNodeAnnKW lexpr (Just AnnIf) - $ docForceSingleline ifExprDoc - ] - ) + , docNodeAnnKW lexpr (Just AnnIf) $ docForceSingleline ifExprDoc + ]) (docLines [ docAddBaseY BrIndentRegular $ docNodeAnnKW lexpr (Just AnnThen) - $ docNonBottomSpacing - $ docAlt - [ docSeq - [ appSep $ docLit $ Text.pack "then" - , docForceParSpacing thenExprDoc - ] - , docAddBaseY BrIndentRegular - $ docPar (docLit $ Text.pack "then") thenExprDoc - ] - , docAddBaseY BrIndentRegular $ docNonBottomSpacing $ docAlt - [ docSeq - [ appSep $ docLit $ Text.pack "else" - , docForceParSpacing elseExprDoc - ] + $ docNonBottomSpacing $ docAlt + [ docSeq [appSep $ docLit $ Text.pack "then", docForceParSpacing thenExprDoc] , docAddBaseY BrIndentRegular - $ docPar (docLit $ Text.pack "else") elseExprDoc + $ docPar (docLit $ Text.pack "then") thenExprDoc ] - ] - ) + , docAddBaseY BrIndentRegular + $ docNonBottomSpacing $ docAlt + [ docSeq [appSep $ docLit $ Text.pack "else", docForceParSpacing elseExprDoc] + , docAddBaseY BrIndentRegular + $ docPar (docLit $ Text.pack "else") elseExprDoc + ] + ]) -- either -- if multi -- line @@ -562,69 +547,62 @@ layoutExpr lexpr@(L _ expr) = do -- else -- stuff -- note that this does _not_ have par-spacing - addAlternative $ docAddBaseY BrIndentRegular $ docPar - (docAddBaseY maySpecialIndent $ docSeq - [ docNodeAnnKW lexpr Nothing $ appSep $ docLit $ Text.pack "if" - , docNodeAnnKW lexpr (Just AnnIf) $ ifExprDoc - ] - ) - (docLines - [ docAddBaseY BrIndentRegular - $ docNodeAnnKW lexpr (Just AnnThen) - $ docAlt - [ docSeq - [ appSep $ docLit $ Text.pack "then" - , docForceParSpacing thenExprDoc + addAlternative + $ docAddBaseY BrIndentRegular + $ docPar + ( docAddBaseY maySpecialIndent + $ docSeq + [ docNodeAnnKW lexpr Nothing $ appSep $ docLit $ Text.pack "if" + , docNodeAnnKW lexpr (Just AnnIf) $ ifExprDoc + ]) + (docLines + [ docAddBaseY BrIndentRegular + $ docNodeAnnKW lexpr (Just AnnThen) + $ docAlt + [ docSeq [appSep $ docLit $ Text.pack "then", docForceParSpacing thenExprDoc] + , docAddBaseY BrIndentRegular + $ docPar (docLit $ Text.pack "then") thenExprDoc ] , docAddBaseY BrIndentRegular - $ docPar (docLit $ Text.pack "then") thenExprDoc - ] - , docAddBaseY BrIndentRegular $ docAlt - [ docSeq - [ appSep $ docLit $ Text.pack "else" - , docForceParSpacing elseExprDoc - ] - , docAddBaseY BrIndentRegular - $ docPar (docLit $ Text.pack "else") elseExprDoc + $ docAlt + [ docSeq [appSep $ docLit $ Text.pack "else", docForceParSpacing elseExprDoc] + , docAddBaseY BrIndentRegular + $ docPar (docLit $ Text.pack "else") elseExprDoc + ] + ]) + addAlternative + $ docSetBaseY + $ docLines + [ docAddBaseY maySpecialIndent + $ docSeq + [ docNodeAnnKW lexpr Nothing $ appSep $ docLit $ Text.pack "if" + , docNodeAnnKW lexpr (Just AnnIf) $ ifExprDoc ] - ] - ) - addAlternative $ docSetBaseY $ docLines - [ docAddBaseY maySpecialIndent $ docSeq - [ docNodeAnnKW lexpr Nothing $ appSep $ docLit $ Text.pack "if" - , docNodeAnnKW lexpr (Just AnnIf) $ ifExprDoc - ] - , docNodeAnnKW lexpr (Just AnnThen) - $ docAddBaseY BrIndentRegular - $ docPar (docLit $ Text.pack "then") thenExprDoc - , docAddBaseY BrIndentRegular + , docNodeAnnKW lexpr (Just AnnThen) + $ docAddBaseY BrIndentRegular + $ docPar (docLit $ Text.pack "then") thenExprDoc + , docAddBaseY BrIndentRegular $ docPar (docLit $ Text.pack "else") elseExprDoc - ] + ] HsMultiIf _ cases -> do - clauseDocs <- cases `forM` layoutGrhs - binderDoc <- docLit $ Text.pack "->" + clauseDocs <- cases `forM` layoutGrhs + binderDoc <- docLit $ Text.pack "->" hasComments <- hasAnyCommentsBelow lexpr docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar (docLit $ Text.pack "if") - (layoutPatternBindFinal - Nothing - binderDoc - Nothing - clauseDocs - Nothing - hasComments - ) + (layoutPatternBindFinal Nothing binderDoc Nothing clauseDocs Nothing hasComments) HsLet _ binds exp1 -> do - expDoc1 <- docSharedWrapper layoutExpr exp1 + expDoc1 <- docSharedWrapper layoutExpr exp1 -- We jump through some ugly hoops here to ensure proper sharing. hasComments <- hasAnyCommentsBelow lexpr - mBindDocs <- fmap (fmap pure) <$> layoutLocalBinds binds + mBindDocs <- fmap (fmap pure) <$> layoutLocalBinds binds let ifIndentFreeElse :: a -> a -> a - ifIndentFreeElse x y = case indentPolicy of - IndentPolicyLeft -> y - IndentPolicyMultiple -> y - IndentPolicyFree -> x + ifIndentFreeElse x y = + case indentPolicy of + IndentPolicyLeft -> y + IndentPolicyMultiple -> y + IndentPolicyFree -> x -- this `docSetBaseAndIndent` might seem out of place (especially the -- Indent part; setBase is necessary due to the use of docLines below), -- but is here due to ghc-exactprint's DP handling of "let" in @@ -637,35 +615,36 @@ layoutExpr lexpr@(L _ expr) = do Just [bindDoc] -> runFilteredAlternative $ do addAlternativeCond (not hasComments) $ docSeq [ appSep $ docLit $ Text.pack "let" - , docNodeAnnKW lexpr (Just AnnLet) $ appSep $ docForceSingleline - bindDoc + , docNodeAnnKW lexpr (Just AnnLet) + $ appSep $ docForceSingleline bindDoc , appSep $ docLit $ Text.pack "in" , docForceSingleline expDoc1 ] addAlternative $ docLines - [ docNodeAnnKW lexpr (Just AnnLet) $ docAlt - [ docSeq - [ appSep $ docLit $ Text.pack "let" - , ifIndentFreeElse docSetBaseAndIndent docForceSingleline - $ bindDoc + [ docNodeAnnKW lexpr (Just AnnLet) + $ docAlt + [ docSeq + [ appSep $ docLit $ Text.pack "let" + , ifIndentFreeElse docSetBaseAndIndent docForceSingleline + $ bindDoc + ] + , docAddBaseY BrIndentRegular + $ docPar + (docLit $ Text.pack "let") + (docSetBaseAndIndent bindDoc) ] - , docAddBaseY BrIndentRegular $ docPar - (docLit $ Text.pack "let") - (docSetBaseAndIndent bindDoc) - ] , docAlt - [ docSeq - [ appSep $ docLit $ Text.pack $ ifIndentFreeElse "in " "in" - , ifIndentFreeElse - docSetBaseAndIndent - docForceSingleline - expDoc1 + [ docSeq + [ appSep $ docLit $ Text.pack $ ifIndentFreeElse "in " "in" + , ifIndentFreeElse docSetBaseAndIndent docForceSingleline expDoc1 + ] + , docAddBaseY BrIndentRegular + $ docPar + (docLit $ Text.pack "in") + (docSetBaseY expDoc1) ] - , docAddBaseY BrIndentRegular - $ docPar (docLit $ Text.pack "in") (docSetBaseY expDoc1) - ] ] - Just bindDocs@(_ : _) -> runFilteredAlternative $ do + Just bindDocs@(_:_) -> runFilteredAlternative $ do --either -- let -- a = b @@ -679,91 +658,102 @@ layoutExpr lexpr@(L _ expr) = do -- c = d -- in -- fooooooooooooooooooo - let - noHangingBinds = - [ docNonBottomSpacing $ docAddBaseY BrIndentRegular $ docPar - (docLit $ Text.pack "let") - (docSetBaseAndIndent $ docLines bindDocs) - , docSeq - [ docLit $ Text.pack "in " - , docAddBaseY BrIndentRegular $ docForceParSpacing expDoc1 + let noHangingBinds = + [ docNonBottomSpacing $ docAddBaseY BrIndentRegular + $ docPar + (docLit $ Text.pack "let") + (docSetBaseAndIndent $ docLines bindDocs) + , docSeq + [ docLit $ Text.pack "in " + , docAddBaseY BrIndentRegular + $ docForceParSpacing expDoc1 + ] ] - ] addAlternative $ case indentPolicy of - IndentPolicyLeft -> docLines noHangingBinds + IndentPolicyLeft -> docLines noHangingBinds IndentPolicyMultiple -> docLines noHangingBinds - IndentPolicyFree -> docLines - [ docNodeAnnKW lexpr (Just AnnLet) $ docSeq + IndentPolicyFree -> docLines + [ docNodeAnnKW lexpr (Just AnnLet) + $ docSeq [ appSep $ docLit $ Text.pack "let" , docSetBaseAndIndent $ docLines bindDocs ] - , docSeq [appSep $ docLit $ Text.pack "in ", docSetBaseY expDoc1] + , docSeq + [ appSep $ docLit $ Text.pack "in " + , docSetBaseY expDoc1 + ] ] - addAlternative $ docLines + addAlternative + $ docLines [ docNodeAnnKW lexpr (Just AnnLet) $ docAddBaseY BrIndentRegular $ docPar - (docLit $ Text.pack "let") - (docSetBaseAndIndent $ docLines $ bindDocs) + (docLit $ Text.pack "let") + (docSetBaseAndIndent $ docLines $ bindDocs) , docAddBaseY BrIndentRegular - $ docPar (docLit $ Text.pack "in") (docSetBaseY $ expDoc1) + $ docPar + (docLit $ Text.pack "in") + (docSetBaseY $ expDoc1) ] _ -> docSeq [appSep $ docLit $ Text.pack "let in", expDoc1] -- docSeq [appSep $ docLit "let in", expDoc1] HsDo _ stmtCtx (L _ stmts) -> case stmtCtx of DoExpr _ -> do stmtDocs <- docSharedWrapper layoutStmt `mapM` stmts - docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar - (docLit $ Text.pack "do") - (docSetBaseAndIndent $ docNonBottomSpacing $ docLines stmtDocs) + docSetParSpacing + $ docAddBaseY BrIndentRegular + $ docPar + (docLit $ Text.pack "do") + (docSetBaseAndIndent $ docNonBottomSpacing $ docLines stmtDocs) MDoExpr _ -> do stmtDocs <- docSharedWrapper layoutStmt `mapM` stmts - docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar - (docLit $ Text.pack "mdo") - (docSetBaseAndIndent $ docNonBottomSpacing $ docLines stmtDocs) - x - | case x of - ListComp -> True - MonadComp -> True - _ -> False - -> do - stmtDocs <- docSharedWrapper layoutStmt `mapM` stmts - hasComments <- hasAnyCommentsBelow lexpr - runFilteredAlternative $ do - addAlternativeCond (not hasComments) $ docSeq - [ docNodeAnnKW lexpr Nothing $ appSep $ docLit $ Text.pack "[" - , docNodeAnnKW lexpr (Just AnnOpenS) - $ appSep - $ docForceSingleline - $ List.last stmtDocs - , appSep $ docLit $ Text.pack "|" - , docSeq - $ List.intersperse docCommaSep - $ docForceSingleline - <$> List.init stmtDocs - , docLit $ Text.pack " ]" - ] - addAlternative - $ let - start = docCols - ColListComp - [ docNodeAnnKW lexpr Nothing $ appSep $ docLit $ Text.pack - "[" - , docSetBaseY - $ docNodeAnnKW lexpr (Just AnnOpenS) - $ List.last stmtDocs - ] - (s1 : sM) = List.init stmtDocs - line1 = - docCols ColListComp [appSep $ docLit $ Text.pack "|", s1] - lineM = sM <&> \d -> docCols ColListComp [docCommaSep, d] - end = docLit $ Text.pack "]" - in docSetBaseY $ docLines $ [start, line1] ++ lineM ++ [end] + docSetParSpacing + $ docAddBaseY BrIndentRegular + $ docPar + (docLit $ Text.pack "mdo") + (docSetBaseAndIndent $ docNonBottomSpacing $ docLines stmtDocs) + x | case x of { ListComp -> True + ; MonadComp -> True + ; _ -> False } -> do + stmtDocs <- docSharedWrapper layoutStmt `mapM` stmts + hasComments <- hasAnyCommentsBelow lexpr + runFilteredAlternative $ do + addAlternativeCond (not hasComments) + $ docSeq + [ docNodeAnnKW lexpr Nothing + $ appSep + $ docLit + $ Text.pack "[" + , docNodeAnnKW lexpr (Just AnnOpenS) + $ appSep + $ docForceSingleline + $ List.last stmtDocs + , appSep $ docLit $ Text.pack "|" + , docSeq $ List.intersperse docCommaSep + $ docForceSingleline <$> List.init stmtDocs + , docLit $ Text.pack " ]" + ] + addAlternative $ + let + start = docCols ColListComp + [ docNodeAnnKW lexpr Nothing + $ appSep $ docLit $ Text.pack "[" + , docSetBaseY + $ docNodeAnnKW lexpr (Just AnnOpenS) + $ List.last stmtDocs + ] + (s1:sM) = List.init stmtDocs + line1 = docCols ColListComp + [appSep $ docLit $ Text.pack "|", s1] + lineM = sM <&> \d -> + docCols ColListComp [docCommaSep, d] + end = docLit $ Text.pack "]" + in docSetBaseY $ docLines $ [start, line1] ++ lineM ++ [end] _ -> do -- TODO unknownNodeError "HsDo{} unknown stmtCtx" lexpr - ExplicitList _ _ elems@(_ : _) -> do - elemDocs <- elems `forM` docSharedWrapper layoutExpr + ExplicitList _ _ elems@(_:_) -> do + elemDocs <- elems `forM` docSharedWrapper layoutExpr hasComments <- hasAnyCommentsBelow lexpr case splitFirstLast elemDocs of FirstLastEmpty -> docSeq @@ -787,106 +777,109 @@ layoutExpr lexpr@(L _ expr) = do ] FirstLast e1 ems eN -> runFilteredAlternative $ do addAlternativeCond (not hasComments) - $ docSeq - $ [docLit $ Text.pack "["] - ++ List.intersperse - docCommaSep - (docForceSingleline - <$> (e1 : ems ++ [docNodeAnnKW lexpr (Just AnnOpenS) eN]) - ) + $ docSeq + $ [docLit $ Text.pack "["] + ++ List.intersperse docCommaSep (docForceSingleline <$> (e1:ems ++ [docNodeAnnKW lexpr (Just AnnOpenS) eN])) ++ [docLit $ Text.pack "]"] - addAlternative - $ let - start = docCols ColList [appSep $ docLit $ Text.pack "[", e1] - linesM = ems <&> \d -> docCols ColList [docCommaSep, d] - lineN = docCols - ColList - [docCommaSep, docNodeAnnKW lexpr (Just AnnOpenS) eN] - end = docLit $ Text.pack "]" - in docSetBaseY $ docLines $ [start] ++ linesM ++ [lineN] ++ [end] - ExplicitList _ _ [] -> docLit $ Text.pack "[]" - RecordCon _ lname fields -> case fields of - HsRecFields fs Nothing -> do - let nameDoc = docWrapNode lname $ docLit $ lrdrNameToText lname - rFs <- - fs `forM` \lfield@(L _ (HsRecField (L _ fieldOcc) rFExpr pun)) -> do - let FieldOcc _ lnameF = fieldOcc - rFExpDoc <- if pun - then return Nothing - else Just <$> docSharedWrapper layoutExpr rFExpr - return $ (lfield, lrdrNameToText lnameF, rFExpDoc) - recordExpression False indentPolicy lexpr nameDoc rFs - HsRecFields [] (Just (L _ 0)) -> do - let t = lrdrNameToText lname - docWrapNode lname $ docLit $ t <> Text.pack " { .. }" - HsRecFields fs@(_ : _) (Just (L _ dotdoti)) | dotdoti == length fs -> do - let nameDoc = docWrapNode lname $ docLit $ lrdrNameToText lname - fieldDocs <- - fs `forM` \fieldl@(L _ (HsRecField (L _ fieldOcc) fExpr pun)) -> do + addAlternative $ + let + start = docCols ColList + [appSep $ docLit $ Text.pack "[", e1] + linesM = ems <&> \d -> + docCols ColList [docCommaSep, d] + lineN = docCols ColList [docCommaSep, docNodeAnnKW lexpr (Just AnnOpenS) eN] + end = docLit $ Text.pack "]" + in docSetBaseY $ docLines $ [start] ++ linesM ++ [lineN] ++ [end] + ExplicitList _ _ [] -> + docLit $ Text.pack "[]" + RecordCon _ lname fields -> + case fields of + HsRecFields fs Nothing -> do + let nameDoc = docWrapNode lname $ docLit $ lrdrNameToText lname + rFs <- fs + `forM` \lfield@(L _ (HsRecField (L _ fieldOcc) rFExpr pun)) -> do + let FieldOcc _ lnameF = fieldOcc + rFExpDoc <- if pun + then return Nothing + else Just <$> docSharedWrapper layoutExpr rFExpr + return $ (lfield, lrdrNameToText lnameF, rFExpDoc) + recordExpression False indentPolicy lexpr nameDoc rFs + HsRecFields [] (Just (L _ 0)) -> do + let t = lrdrNameToText lname + docWrapNode lname $ docLit $ t <> Text.pack " { .. }" + HsRecFields fs@(_:_) (Just (L _ dotdoti)) | dotdoti == length fs -> do + let nameDoc = docWrapNode lname $ docLit $ lrdrNameToText lname + fieldDocs <- fs `forM` \fieldl@(L _ (HsRecField (L _ fieldOcc) fExpr pun)) -> do let FieldOcc _ lnameF = fieldOcc fExpDoc <- if pun then return Nothing else Just <$> docSharedWrapper layoutExpr fExpr return (fieldl, lrdrNameToText lnameF, fExpDoc) - recordExpression True indentPolicy lexpr nameDoc fieldDocs - _ -> unknownNodeError "RecordCon with puns" lexpr + recordExpression True indentPolicy lexpr nameDoc fieldDocs + _ -> unknownNodeError "RecordCon with puns" lexpr RecordUpd _ rExpr fields -> do rExprDoc <- docSharedWrapper layoutExpr rExpr - rFs <- - fields `forM` \lfield@(L _ (HsRecField (L _ ambName) rFExpr pun)) -> do + rFs <- fields + `forM` \lfield@(L _ (HsRecField (L _ ambName) rFExpr pun)) -> do rFExpDoc <- if pun then return Nothing else Just <$> docSharedWrapper layoutExpr rFExpr return $ case ambName of Unambiguous _ n -> (lfield, lrdrNameToText n, rFExpDoc) - Ambiguous _ n -> (lfield, lrdrNameToText n, rFExpDoc) + Ambiguous _ n -> (lfield, lrdrNameToText n, rFExpDoc) recordExpression False indentPolicy lexpr rExprDoc rFs ExprWithTySig _ exp1 (HsWC _ (HsIB _ typ1)) -> do expDoc <- docSharedWrapper layoutExpr exp1 typDoc <- docSharedWrapper layoutType typ1 - docSeq [appSep expDoc, appSep $ docLit $ Text.pack "::", typDoc] - ArithSeq _ Nothing info -> case info of - From e1 -> do - e1Doc <- docSharedWrapper layoutExpr e1 - docSeq - [ docLit $ Text.pack "[" - , appSep $ docForceSingleline e1Doc - , docLit $ Text.pack "..]" - ] - FromThen e1 e2 -> do - e1Doc <- docSharedWrapper layoutExpr e1 - e2Doc <- docSharedWrapper layoutExpr e2 - docSeq - [ docLit $ Text.pack "[" - , docForceSingleline e1Doc - , appSep $ docLit $ Text.pack "," - , appSep $ docForceSingleline e2Doc - , docLit $ Text.pack "..]" - ] - FromTo e1 eN -> do - e1Doc <- docSharedWrapper layoutExpr e1 - eNDoc <- docSharedWrapper layoutExpr eN - docSeq - [ docLit $ Text.pack "[" - , appSep $ docForceSingleline e1Doc - , appSep $ docLit $ Text.pack ".." - , docForceSingleline eNDoc - , docLit $ Text.pack "]" - ] - FromThenTo e1 e2 eN -> do - e1Doc <- docSharedWrapper layoutExpr e1 - e2Doc <- docSharedWrapper layoutExpr e2 - eNDoc <- docSharedWrapper layoutExpr eN - docSeq - [ docLit $ Text.pack "[" - , docForceSingleline e1Doc - , appSep $ docLit $ Text.pack "," - , appSep $ docForceSingleline e2Doc - , appSep $ docLit $ Text.pack ".." - , docForceSingleline eNDoc - , docLit $ Text.pack "]" - ] - ArithSeq{} -> briDocByExactInlineOnly "ArithSeq" lexpr + docSeq + [ appSep expDoc + , appSep $ docLit $ Text.pack "::" + , typDoc + ] + ArithSeq _ Nothing info -> + case info of + From e1 -> do + e1Doc <- docSharedWrapper layoutExpr e1 + docSeq + [ docLit $ Text.pack "[" + , appSep $ docForceSingleline e1Doc + , docLit $ Text.pack "..]" + ] + FromThen e1 e2 -> do + e1Doc <- docSharedWrapper layoutExpr e1 + e2Doc <- docSharedWrapper layoutExpr e2 + docSeq + [ docLit $ Text.pack "[" + , docForceSingleline e1Doc + , appSep $ docLit $ Text.pack "," + , appSep $ docForceSingleline e2Doc + , docLit $ Text.pack "..]" + ] + FromTo e1 eN -> do + e1Doc <- docSharedWrapper layoutExpr e1 + eNDoc <- docSharedWrapper layoutExpr eN + docSeq + [ docLit $ Text.pack "[" + , appSep $ docForceSingleline e1Doc + , appSep $ docLit $ Text.pack ".." + , docForceSingleline eNDoc + , docLit $ Text.pack "]" + ] + FromThenTo e1 e2 eN -> do + e1Doc <- docSharedWrapper layoutExpr e1 + e2Doc <- docSharedWrapper layoutExpr e2 + eNDoc <- docSharedWrapper layoutExpr eN + docSeq + [ docLit $ Text.pack "[" + , docForceSingleline e1Doc + , appSep $ docLit $ Text.pack "," + , appSep $ docForceSingleline e2Doc + , appSep $ docLit $ Text.pack ".." + , docForceSingleline eNDoc + , docLit $ Text.pack "]" + ] + ArithSeq{} -> + briDocByExactInlineOnly "ArithSeq" lexpr HsBracket{} -> do -- TODO briDocByExactInlineOnly "HsBracket{}" lexpr @@ -899,12 +892,11 @@ layoutExpr lexpr@(L _ expr) = do HsSpliceE _ (HsQuasiQuote _ _ quoter _loc content) -> do allocateNode $ BDFPlain (Text.pack - $ "[" - ++ showOutputable quoter - ++ "|" - ++ showOutputable content - ++ "|]" - ) + $ "[" + ++ showOutputable quoter + ++ "|" + ++ showOutputable content + ++ "|]") HsSpliceE{} -> do -- TODO briDocByExactInlineOnly "HsSpliceE{}" lexpr @@ -936,79 +928,78 @@ recordExpression -> IndentPolicy -> GenLocated SrcSpan lExpr -> ToBriDocM BriDocNumbered - -> [ ( GenLocated SrcSpan name - , Text - , Maybe (ToBriDocM BriDocNumbered) - ) - ] + -> [(GenLocated SrcSpan name, Text, Maybe (ToBriDocM BriDocNumbered))] -> ToBriDocM BriDocNumbered -recordExpression False _ lexpr nameDoc [] = docSeq - [ docNodeAnnKW lexpr (Just AnnOpenC) - $ docSeq [nameDoc, docLit $ Text.pack "{"] - , docLit $ Text.pack "}" - ] -recordExpression True _ lexpr nameDoc [] = docSeq -- this case might still be incomplete, and is probably not used +recordExpression False _ lexpr nameDoc [] = + docSeq + [ docNodeAnnKW lexpr (Just AnnOpenC) $ docSeq [nameDoc, docLit $ Text.pack "{"] + , docLit $ Text.pack "}" + ] +recordExpression True _ lexpr nameDoc [] = + docSeq -- this case might still be incomplete, and is probably not used -- atm anyway. - [ docNodeAnnKW lexpr (Just AnnOpenC) - $ docSeq [nameDoc, docLit $ Text.pack "{"] - , docLit $ Text.pack " .. }" - ] -recordExpression dotdot indentPolicy lexpr nameDoc rFs@(rF1 : rFr) = do + [ docNodeAnnKW lexpr (Just AnnOpenC) $ docSeq [nameDoc, docLit $ Text.pack "{"] + , docLit $ Text.pack " .. }" + ] +recordExpression dotdot indentPolicy lexpr nameDoc rFs@(rF1:rFr) = do let (rF1f, rF1n, rF1e) = rF1 runFilteredAlternative $ do -- container { fieldA = blub, fieldB = blub } - addAlternative $ docSeq + addAlternative + $ docSeq [ docNodeAnnKW lexpr Nothing $ appSep $ docForceSingleline nameDoc , appSep $ docLit $ Text.pack "{" - , docSeq $ List.intersperse docCommaSep $ rFs <&> \case - (lfield, fieldStr, Just fieldDoc) -> docWrapNode lfield $ docSeq - [ appSep $ docLit fieldStr - , appSep $ docLit $ Text.pack "=" - , docForceSingleline fieldDoc - ] - (lfield, fieldStr, Nothing) -> docWrapNode lfield $ docLit fieldStr + , docSeq $ List.intersperse docCommaSep + $ rFs <&> \case + (lfield, fieldStr, Just fieldDoc) -> + docWrapNode lfield $ docSeq + [ appSep $ docLit fieldStr + , appSep $ docLit $ Text.pack "=" + , docForceSingleline fieldDoc + ] + (lfield, fieldStr, Nothing) -> + docWrapNode lfield $ docLit fieldStr , if dotdot - then docSeq [docCommaSep, docLit $ Text.pack "..", docSeparator] - else docSeparator + then docSeq [ docCommaSep, docLit $ Text.pack "..", docSeparator] + else docSeparator , docLit $ Text.pack "}" ] -- hanging single-line fields -- container { fieldA = blub -- , fieldB = blub -- } - addAlternativeCond (indentPolicy == IndentPolicyFree) $ docSeq + addAlternativeCond (indentPolicy == IndentPolicyFree) + $ docSeq [ docNodeAnnKW lexpr Nothing $ docForceSingleline $ appSep nameDoc - , docSetBaseY - $ docLines - $ let - line1 = docCols - ColRec + , docSetBaseY $ docLines $ let + line1 = docCols ColRec [ appSep $ docLit $ Text.pack "{" , docWrapNodePrior rF1f $ appSep $ docLit rF1n , case rF1e of - Just x -> docWrapNodeRest rF1f $ docSeq - [appSep $ docLit $ Text.pack "=", docForceSingleline x] - Nothing -> docEmpty - ] - lineR = rFr <&> \(lfield, fText, fDoc) -> - docWrapNode lfield $ docCols - ColRec - [ docCommaSep - , appSep $ docLit fText - , case fDoc of - Just x -> docSeq - [appSep $ docLit $ Text.pack "=", docForceSingleline x] + Just x -> docWrapNodeRest rF1f $ docSeq + [ appSep $ docLit $ Text.pack "=" + , docForceSingleline x + ] Nothing -> docEmpty - ] + ] + lineR = rFr <&> \(lfield, fText, fDoc) -> docWrapNode lfield $ docCols ColRec + [ docCommaSep + , appSep $ docLit fText + , case fDoc of + Just x -> docSeq [ appSep $ docLit $ Text.pack "=" + , docForceSingleline x + ] + Nothing -> docEmpty + ] dotdotLine = if dotdot - then docCols - ColRec - [ docNodeAnnKW lexpr (Just AnnOpenC) docCommaSep - , docNodeAnnKW lexpr (Just AnnDotdot) $ docLit $ Text.pack ".." - ] + then docCols ColRec + [ docNodeAnnKW lexpr (Just AnnOpenC) docCommaSep + , docNodeAnnKW lexpr (Just AnnDotdot) + $ docLit $ Text.pack ".." + ] else docNodeAnnKW lexpr (Just AnnOpenC) docEmpty lineN = docLit $ Text.pack "}" - in [line1] ++ lineR ++ [dotdotLine, lineN] + in [line1] ++ lineR ++ [dotdotLine, lineN] ] -- non-hanging with expressions placed to the right of the names -- container @@ -1016,75 +1007,77 @@ recordExpression dotdot indentPolicy lexpr nameDoc rFs@(rF1 : rFr) = do -- , fieldB = potentially -- multiline -- } - addAlternative $ docSetParSpacing $ docAddBaseY BrIndentRegular $ docPar - (docNodeAnnKW lexpr Nothing nameDoc) - (docNonBottomSpacing - $ docLines - $ let - line1 = docCols - ColRec - [ appSep $ docLit $ Text.pack "{" - , docWrapNodePrior rF1f $ appSep $ docLit rF1n - , docWrapNodeRest rF1f $ case rF1e of - Just x -> runFilteredAlternative $ do - addAlternativeCond (indentPolicy == IndentPolicyFree) $ do - docSeq [appSep $ docLit $ Text.pack "=", docSetBaseY x] - addAlternative $ do - docSeq - [appSep $ docLit $ Text.pack "=", docForceParSpacing x] - addAlternative $ do - docAddBaseY BrIndentRegular - $ docPar (docLit $ Text.pack "=") x - Nothing -> docEmpty - ] - lineR = rFr <&> \(lfield, fText, fDoc) -> - docWrapNode lfield $ docCols - ColRec + addAlternative + $ docSetParSpacing + $ docAddBaseY BrIndentRegular + $ docPar + (docNodeAnnKW lexpr Nothing nameDoc) + (docNonBottomSpacing $ docLines $ let + line1 = docCols ColRec + [ appSep $ docLit $ Text.pack "{" + , docWrapNodePrior rF1f $ appSep $ docLit rF1n + , docWrapNodeRest rF1f $ case rF1e of + Just x -> runFilteredAlternative $ do + addAlternativeCond (indentPolicy == IndentPolicyFree) $ do + docSeq + [appSep $ docLit $ Text.pack "=", docSetBaseY x] + addAlternative $ do + docSeq + [appSep $ docLit $ Text.pack "=", docForceParSpacing x] + addAlternative $ do + docAddBaseY BrIndentRegular + $ docPar (docLit $ Text.pack "=") x + Nothing -> docEmpty + ] + lineR = rFr <&> \(lfield, fText, fDoc) -> docWrapNode lfield + $ docCols ColRec [ docCommaSep , appSep $ docLit fText , case fDoc of - Just x -> runFilteredAlternative $ do - addAlternativeCond (indentPolicy == IndentPolicyFree) $ do - docSeq [appSep $ docLit $ Text.pack "=", docSetBaseY x] - addAlternative $ do - docSeq - [appSep $ docLit $ Text.pack "=", docForceParSpacing x] - addAlternative $ do - docAddBaseY BrIndentRegular - $ docPar (docLit $ Text.pack "=") x - Nothing -> docEmpty + Just x -> runFilteredAlternative $ do + addAlternativeCond (indentPolicy == IndentPolicyFree) $ do + docSeq + [appSep $ docLit $ Text.pack "=", docSetBaseY x] + addAlternative $ do + docSeq [ appSep $ docLit $ Text.pack "=" + , docForceParSpacing x + ] + addAlternative $ do + docAddBaseY BrIndentRegular + $ docPar (docLit $ Text.pack "=") x + Nothing -> docEmpty ] - dotdotLine = if dotdot - then docCols - ColRec - [ docNodeAnnKW lexpr (Just AnnOpenC) docCommaSep - , docNodeAnnKW lexpr (Just AnnDotdot) $ docLit $ Text.pack ".." - ] - else docNodeAnnKW lexpr (Just AnnOpenC) docEmpty - lineN = docLit $ Text.pack "}" - in [line1] ++ lineR ++ [dotdotLine, lineN] - ) + dotdotLine = if dotdot + then docCols ColRec + [ docNodeAnnKW lexpr (Just AnnOpenC) docCommaSep + , docNodeAnnKW lexpr (Just AnnDotdot) + $ docLit $ Text.pack ".." + ] + else docNodeAnnKW lexpr (Just AnnOpenC) docEmpty + lineN = docLit $ Text.pack "}" + in [line1] ++ lineR ++ [dotdotLine, lineN] + ) litBriDoc :: HsLit GhcPs -> BriDocFInt litBriDoc = \case - HsChar (SourceText t) _c -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ ['\'', c, '\''] - HsCharPrim (SourceText t) _c -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ ['\'', c, '\''] - HsString (SourceText t) _fastString -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ FastString.unpackFS fastString - HsStringPrim (SourceText t) _byteString -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ Data.ByteString.Char8.unpack byteString - HsInt _ (IL (SourceText t) _ _) -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i - HsIntPrim (SourceText t) _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i - HsWordPrim (SourceText t) _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i - HsInt64Prim (SourceText t) _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i - HsWord64Prim (SourceText t) _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i - HsInteger (SourceText t) _i _type -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i - HsRat _ (FL (SourceText t) _ _) _type -> BDFLit $ Text.pack t - HsFloatPrim _ (FL (SourceText t) _ _) -> BDFLit $ Text.pack t - HsDoublePrim _ (FL (SourceText t) _ _) -> BDFLit $ Text.pack t + HsChar (SourceText t) _c -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ ['\'', c, '\''] + HsCharPrim (SourceText t) _c -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ ['\'', c, '\''] + HsString (SourceText t) _fastString -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ FastString.unpackFS fastString + HsStringPrim (SourceText t) _byteString -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ Data.ByteString.Char8.unpack byteString + HsInt _ (IL (SourceText t) _ _) -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i + HsIntPrim (SourceText t) _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i + HsWordPrim (SourceText t) _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i + HsInt64Prim (SourceText t) _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i + HsWord64Prim (SourceText t) _i -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i + HsInteger (SourceText t) _i _type -> BDFLit $ Text.pack t -- BDFLit $ Text.pack $ show i + HsRat _ (FL (SourceText t) _ _) _type -> BDFLit $ Text.pack t + HsFloatPrim _ (FL (SourceText t) _ _) -> BDFLit $ Text.pack t + HsDoublePrim _ (FL (SourceText t) _ _) -> BDFLit $ Text.pack t _ -> error "litBriDoc: literal with no SourceText" overLitValBriDoc :: OverLitVal -> BriDocFInt overLitValBriDoc = \case - HsIntegral (IL (SourceText t) _ _) -> BDFLit $ Text.pack t + HsIntegral (IL (SourceText t) _ _) -> BDFLit $ Text.pack t HsFractional (FL (SourceText t) _ _) -> BDFLit $ Text.pack t HsIsString (SourceText t) _ -> BDFLit $ Text.pack t _ -> error "overLitValBriDoc: literal with no SourceText" diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot b/source/library/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot index 27256ef..8fb094b 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot @@ -2,11 +2,20 @@ module Language.Haskell.Brittany.Internal.Layouters.Expr where -import GHC.Hs -import Language.Haskell.Brittany.Internal.Types + + +import Language.Haskell.Brittany.Internal.Prelude + +import Language.Haskell.Brittany.Internal.Types + +import GHC.Hs + + layoutExpr :: ToBriDoc HsExpr +-- layoutStmt :: ToBriDoc' (StmtLR GhcPs GhcPs (LHsExpr GhcPs)) + litBriDoc :: HsLit GhcPs -> BriDocFInt overLitValBriDoc :: OverLitVal -> BriDocFInt diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/IE.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/IE.hs index dc1fafe..39b7a49 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/IE.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/IE.hs @@ -4,22 +4,26 @@ module Language.Haskell.Brittany.Internal.Layouters.IE where +import Language.Haskell.Brittany.Internal.Prelude import qualified Data.List.Extra import qualified Data.Text as Text -import GHC - ( AnnKeywordId(..) - , GenLocated(L) - , Located - , ModuleName - , moduleNameString - , unLoc - ) -import GHC.Hs import qualified GHC.OldList as List -import Language.Haskell.Brittany.Internal.LayouterBasics -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.Utils + +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.LayouterBasics + +import GHC ( unLoc + , GenLocated(L) + , moduleNameString + , AnnKeywordId(..) + , Located + , ModuleName + ) +import GHC.Hs + +import Language.Haskell.Brittany.Internal.Utils + + prepareName :: LIEWrappedName name -> Located name prepareName = ieLWrappedName @@ -33,41 +37,36 @@ layoutIE lie@(L _ ie) = docWrapNode lie $ case ie of docSeq [layoutWrapped lie x, docLit $ Text.pack "(..)"] IEThingWith _ x _ ns _ -> do hasComments <- orM - (hasCommentsBetween lie AnnOpenP AnnCloseP + ( hasCommentsBetween lie AnnOpenP AnnCloseP : hasAnyCommentsBelow x : map hasAnyCommentsBelow ns ) let sortedNs = List.sortOn wrappedNameToText ns runFilteredAlternative $ do addAlternativeCond (not hasComments) - $ docSeq - $ [layoutWrapped lie x, docLit $ Text.pack "("] + $ docSeq + $ [layoutWrapped lie x, docLit $ Text.pack "("] ++ intersperse docCommaSep (map nameDoc sortedNs) ++ [docParenR] addAlternative $ docWrapNodeRest lie $ docAddBaseY BrIndentRegular - $ docPar (layoutWrapped lie x) (layoutItems (splitFirstLast sortedNs)) + $ docPar + (layoutWrapped lie x) + (layoutItems (splitFirstLast sortedNs)) where nameDoc = docLit <=< lrdrNameToTextAnn . prepareName layoutItem n = docSeq [docCommaSep, docWrapNode n $ nameDoc n] layoutItems FirstLastEmpty = docSetBaseY $ docLines - [ docSeq [docParenLSep, docNodeAnnKW lie (Just AnnOpenP) docEmpty] - , docParenR - ] + [docSeq [docParenLSep, docNodeAnnKW lie (Just AnnOpenP) docEmpty], docParenR] layoutItems (FirstLastSingleton n) = docSetBaseY $ docLines - [ docSeq [docParenLSep, docNodeAnnKW lie (Just AnnOpenP) $ nameDoc n] - , docParenR - ] + [docSeq [docParenLSep, docNodeAnnKW lie (Just AnnOpenP) $ nameDoc n], docParenR] layoutItems (FirstLast n1 nMs nN) = docSetBaseY - $ docLines - $ [docSeq [docParenLSep, docWrapNode n1 $ nameDoc n1]] + $ docLines + $ [docSeq [docParenLSep, docWrapNode n1 $ nameDoc n1]] ++ map layoutItem nMs - ++ [ docSeq - [docCommaSep, docNodeAnnKW lie (Just AnnOpenP) $ nameDoc nN] - , docParenR - ] + ++ [docSeq [docCommaSep, docNodeAnnKW lie (Just AnnOpenP) $ nameDoc nN], docParenR] IEModuleContents _ n -> docSeq [ docLit $ Text.pack "module" , docSeparator @@ -76,7 +75,7 @@ layoutIE lie@(L _ ie) = docWrapNode lie $ case ie of _ -> docEmpty where layoutWrapped _ = \case - L _ (IEName n) -> docLit =<< lrdrNameToTextAnn n + L _ (IEName n) -> docLit =<< lrdrNameToTextAnn n L _ (IEPattern n) -> do name <- lrdrNameToTextAnn n docLit $ Text.pack "pattern " <> name @@ -93,36 +92,33 @@ data SortItemsFlag = ShouldSortItems | KeepItemsUnsorted -- handling of the resulting list. Adding parens is -- left to the caller since that is context sensitive layoutAnnAndSepLLIEs - :: SortItemsFlag - -> Located [LIE GhcPs] - -> ToBriDocM [ToBriDocM BriDocNumbered] + :: SortItemsFlag -> Located [LIE GhcPs] -> ToBriDocM [ToBriDocM BriDocNumbered] layoutAnnAndSepLLIEs shouldSort llies@(L _ lies) = do let makeIENode ie = docSeq [docCommaSep, ie] - let - sortedLies = - [ items - | group <- Data.List.Extra.groupOn lieToText $ List.sortOn lieToText lies - , items <- mergeGroup group - ] - let - ieDocs = fmap layoutIE $ case shouldSort of - ShouldSortItems -> sortedLies - KeepItemsUnsorted -> lies + let sortedLies = + [ items + | group <- Data.List.Extra.groupOn lieToText + $ List.sortOn lieToText lies + , items <- mergeGroup group + ] + let ieDocs = fmap layoutIE $ case shouldSort of + ShouldSortItems -> sortedLies + KeepItemsUnsorted -> lies ieCommaDocs <- docWrapNodeRest llies $ sequence $ case splitFirstLast ieDocs of - FirstLastEmpty -> [] + FirstLastEmpty -> [] FirstLastSingleton ie -> [ie] FirstLast ie1 ieMs ieN -> [ie1] ++ map makeIENode ieMs ++ [makeIENode ieN] pure $ fmap pure ieCommaDocs -- returned shared nodes where mergeGroup :: [LIE GhcPs] -> [LIE GhcPs] - mergeGroup [] = [] + mergeGroup [] = [] mergeGroup items@[_] = items - mergeGroup items = if + mergeGroup items = if | all isProperIEThing items -> [List.foldl1' thingFolder items] - | all isIEVar items -> [List.foldl1' thingFolder items] - | otherwise -> items + | all isIEVar items -> [List.foldl1' thingFolder items] + | otherwise -> items -- proper means that if it is a ThingWith, it does not contain a wildcard -- (because I don't know what a wildcard means if it is not already a -- IEThingAll). @@ -135,22 +131,21 @@ layoutAnnAndSepLLIEs shouldSort llies@(L _ lies) = do isIEVar :: LIE GhcPs -> Bool isIEVar = \case L _ IEVar{} -> True - _ -> False + _ -> False thingFolder :: LIE GhcPs -> LIE GhcPs -> LIE GhcPs - thingFolder l1@(L _ IEVar{}) _ = l1 - thingFolder l1@(L _ IEThingAll{}) _ = l1 - thingFolder _ l2@(L _ IEThingAll{}) = l2 - thingFolder l1 (L _ IEThingAbs{}) = l1 - thingFolder (L _ IEThingAbs{}) l2 = l2 + thingFolder l1@(L _ IEVar{} ) _ = l1 + thingFolder l1@(L _ IEThingAll{}) _ = l1 + thingFolder _ l2@(L _ IEThingAll{}) = l2 + thingFolder l1 ( L _ IEThingAbs{}) = l1 + thingFolder (L _ IEThingAbs{}) l2 = l2 thingFolder (L l (IEThingWith x wn _ consItems1 fieldLbls1)) (L _ (IEThingWith _ _ _ consItems2 fieldLbls2)) = L l - (IEThingWith - x - wn - NoIEWildcard - (consItems1 ++ consItems2) - (fieldLbls1 ++ fieldLbls2) + (IEThingWith x + wn + NoIEWildcard + (consItems1 ++ consItems2) + (fieldLbls1 ++ fieldLbls2) ) thingFolder _ _ = error "thingFolder should be exhaustive because we have a guard above" @@ -169,10 +164,9 @@ layoutAnnAndSepLLIEs shouldSort llies@(L _ lies) = do -- () -- no comments -- ( -- a comment -- ) -layoutLLIEs - :: Bool -> SortItemsFlag -> Located [LIE GhcPs] -> ToBriDocM BriDocNumbered +layoutLLIEs :: Bool -> SortItemsFlag -> Located [LIE GhcPs] -> ToBriDocM BriDocNumbered layoutLLIEs enableSingleline shouldSort llies = do - ieDs <- layoutAnnAndSepLLIEs shouldSort llies + ieDs <- layoutAnnAndSepLLIEs shouldSort llies hasComments <- hasAnyCommentsBelow llies runFilteredAlternative $ case ieDs of [] -> do @@ -182,14 +176,14 @@ layoutLLIEs enableSingleline shouldSort llies = do docParenR (ieDsH : ieDsT) -> do addAlternativeCond (not hasComments && enableSingleline) - $ docSeq - $ [docLit (Text.pack "(")] + $ docSeq + $ [docLit (Text.pack "(")] ++ (docForceSingleline <$> ieDs) ++ [docParenR] addAlternative - $ docPar (docSetBaseY $ docSeq [docParenLSep, ieDsH]) - $ docLines - $ ieDsT + $ docPar (docSetBaseY $ docSeq [docParenLSep, ieDsH]) + $ docLines + $ ieDsT ++ [docParenR] -- | Returns a "fingerprint string", not a full text representation, nor even @@ -197,27 +191,26 @@ layoutLLIEs enableSingleline shouldSort llies = do -- Used for sorting, not for printing the formatter's output source code. wrappedNameToText :: LIEWrappedName RdrName -> Text wrappedNameToText = \case - L _ (IEName n) -> lrdrNameToText n + L _ (IEName n) -> lrdrNameToText n L _ (IEPattern n) -> lrdrNameToText n - L _ (IEType n) -> lrdrNameToText n + L _ (IEType n) -> lrdrNameToText n -- | Returns a "fingerprint string", not a full text representation, nor even -- a source code representation of this syntax node. -- Used for sorting, not for printing the formatter's output source code. lieToText :: LIE GhcPs -> Text lieToText = \case - L _ (IEVar _ wn) -> wrappedNameToText wn - L _ (IEThingAbs _ wn) -> wrappedNameToText wn - L _ (IEThingAll _ wn) -> wrappedNameToText wn + L _ (IEVar _ wn ) -> wrappedNameToText wn + L _ (IEThingAbs _ wn ) -> wrappedNameToText wn + L _ (IEThingAll _ wn ) -> wrappedNameToText wn L _ (IEThingWith _ wn _ _ _) -> wrappedNameToText wn -- TODO: These _may_ appear in exports! -- Need to check, and either put them at the top (for module) or do some -- other clever thing. L _ (IEModuleContents _ n) -> moduleNameToText n - L _ IEGroup{} -> Text.pack "@IEGroup" - L _ IEDoc{} -> Text.pack "@IEDoc" - L _ IEDocNamed{} -> Text.pack "@IEDocNamed" + L _ IEGroup{} -> Text.pack "@IEGroup" + L _ IEDoc{} -> Text.pack "@IEDoc" + L _ IEDocNamed{} -> Text.pack "@IEDocNamed" where moduleNameToText :: Located ModuleName -> Text - moduleNameToText (L _ name) = - Text.pack ("@IEModuleContents" ++ moduleNameString name) + moduleNameToText (L _ name) = Text.pack ("@IEModuleContents" ++ moduleNameString name) diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/Import.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/Import.hs index df9d00f..1b19145 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/Import.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/Import.hs @@ -2,18 +2,26 @@ module Language.Haskell.Brittany.Internal.Layouters.Import where -import qualified Data.Semigroup as Semigroup -import qualified Data.Text as Text -import GHC (GenLocated(L), Located, moduleNameString, unLoc) -import GHC.Hs -import GHC.Types.Basic -import GHC.Unit.Types (IsBootInterface(..)) -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.LayouterBasics -import Language.Haskell.Brittany.Internal.Layouters.IE import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import Language.Haskell.Brittany.Internal.Types +import qualified Data.Semigroup as Semigroup +import qualified Data.Text as Text + +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.LayouterBasics +import Language.Haskell.Brittany.Internal.Layouters.IE +import Language.Haskell.Brittany.Internal.Config.Types + +import GHC ( unLoc + , GenLocated(L) + , moduleNameString + , Located + ) +import GHC.Hs +import GHC.Types.Basic +import GHC.Unit.Types (IsBootInterface(..)) + + prepPkg :: SourceText -> String prepPkg rawN = case rawN of @@ -28,132 +36,111 @@ layoutImport :: ImportDecl GhcPs -> ToBriDocM BriDocNumbered layoutImport importD = case importD of ImportDecl _ _ (L _ modName) pkg src safe q False mas mllies -> do importCol <- mAsk <&> _conf_layout .> _lconfig_importColumn .> confUnpack - importAsCol <- - mAsk <&> _conf_layout .> _lconfig_importAsColumn .> confUnpack - indentPolicy <- - mAsk <&> _conf_layout .> _lconfig_indentPolicy .> confUnpack + importAsCol <- mAsk <&> _conf_layout .> _lconfig_importAsColumn .> confUnpack + indentPolicy <- mAsk <&> _conf_layout .> _lconfig_indentPolicy .> confUnpack let - compact = indentPolicy /= IndentPolicyFree + compact = indentPolicy /= IndentPolicyFree modNameT = Text.pack $ moduleNameString modName pkgNameT = Text.pack . prepPkg . sl_st <$> pkg - masT = Text.pack . moduleNameString . prepModName <$> mas - hiding = maybe False fst mllies + masT = Text.pack . moduleNameString . prepModName <$> mas + hiding = maybe False fst mllies minQLength = length "import qualified " qLengthReal = - let - qualifiedPart = if q /= NotQualified then length "qualified " else 0 - safePart = if safe then length "safe " else 0 - pkgPart = maybe 0 ((+ 1) . Text.length) pkgNameT - srcPart = case src of - IsBoot -> length "{-# SOURCE #-} " - NotBoot -> 0 - in length "import " + srcPart + safePart + qualifiedPart + pkgPart - qLength = max minQLength qLengthReal + let qualifiedPart = if q /= NotQualified then length "qualified " else 0 + safePart = if safe then length "safe " else 0 + pkgPart = maybe 0 ((+ 1) . Text.length) pkgNameT + srcPart = case src of { IsBoot -> length "{-# SOURCE #-} "; NotBoot -> 0 } + in length "import " + srcPart + safePart + qualifiedPart + pkgPart + qLength = max minQLength qLengthReal -- Cost in columns of importColumn - asCost = length "as " - hidingParenCost = if hiding then length "hiding ( " else length "( " - nameCost = Text.length modNameT + qLength + asCost = length "as " + hidingParenCost = if hiding then length "hiding ( " else length "( " + nameCost = Text.length modNameT + qLength importQualifiers = docSeq [ appSep $ docLit $ Text.pack "import" - , case src of - IsBoot -> appSep $ docLit $ Text.pack "{-# SOURCE #-}" - NotBoot -> docEmpty + , case src of { IsBoot -> appSep $ docLit $ Text.pack "{-# SOURCE #-}"; NotBoot -> docEmpty } , if safe then appSep $ docLit $ Text.pack "safe" else docEmpty - , if q /= NotQualified - then appSep $ docLit $ Text.pack "qualified" - else docEmpty + , if q /= NotQualified then appSep $ docLit $ Text.pack "qualified" else docEmpty , maybe docEmpty (appSep . docLit) pkgNameT ] indentName = if compact then id else docEnsureIndent (BrIndentSpecial qLength) - modNameD = indentName $ appSep $ docLit modNameT - hidDocCol = - if hiding then importCol - hidingParenCost else importCol - 2 + modNameD = + indentName $ appSep $ docLit modNameT + hidDocCol = if hiding then importCol - hidingParenCost else importCol - 2 hidDocColDiff = importCol - 2 - hidDocCol - hidDoc = - if hiding then appSep $ docLit $ Text.pack "hiding" else docEmpty + hidDoc = if hiding + then appSep $ docLit $ Text.pack "hiding" + else docEmpty importHead = docSeq [importQualifiers, modNameD] - bindingsD = case mllies of + bindingsD = case mllies of Nothing -> docEmpty Just (_, llies) -> do hasComments <- hasAnyCommentsBelow llies if compact - then docAlt - [ docSeq - [ hidDoc - , docForceSingleline $ layoutLLIEs True ShouldSortItems llies - ] - , let - makeParIfHiding = if hiding + then docAlt + [ docSeq [hidDoc, docForceSingleline $ layoutLLIEs True ShouldSortItems llies] + , let makeParIfHiding = if hiding then docAddBaseY BrIndentRegular . docPar hidDoc else id - in makeParIfHiding (layoutLLIEs True ShouldSortItems llies) - ] - else do - ieDs <- layoutAnnAndSepLLIEs ShouldSortItems llies - docWrapNodeRest llies - $ docEnsureIndent (BrIndentSpecial hidDocCol) - $ case ieDs of - -- ..[hiding].( ) - [] -> if hasComments - then docPar - (docSeq - [hidDoc, docParenLSep, docWrapNode llies docEmpty] - ) - (docEnsureIndent - (BrIndentSpecial hidDocColDiff) - docParenR - ) - else docSeq - [hidDoc, docParenLSep, docSeparator, docParenR] - -- ..[hiding].( b ) - [ieD] -> runFilteredAlternative $ do - addAlternativeCond (not hasComments) - $ docSeq - [ hidDoc - , docParenLSep - , docForceSingleline ieD - , docSeparator - , docParenR - ] - addAlternative $ docPar - (docSeq [hidDoc, docParenLSep, docNonBottomSpacing ieD] - ) - (docEnsureIndent - (BrIndentSpecial hidDocColDiff) - docParenR - ) - -- ..[hiding].( b - -- , b' - -- ) - (ieD : ieDs') -> docPar - (docSeq - [hidDoc, docSetBaseY $ docSeq [docParenLSep, ieD]] - ) - (docEnsureIndent (BrIndentSpecial hidDocColDiff) - $ docLines - $ ieDs' - ++ [docParenR] - ) + in makeParIfHiding (layoutLLIEs True ShouldSortItems llies) + ] + else do + ieDs <- layoutAnnAndSepLLIEs ShouldSortItems llies + docWrapNodeRest llies + $ docEnsureIndent (BrIndentSpecial hidDocCol) + $ case ieDs of + -- ..[hiding].( ) + [] -> if hasComments + then docPar + (docSeq [hidDoc, docParenLSep, docWrapNode llies docEmpty]) + (docEnsureIndent (BrIndentSpecial hidDocColDiff) docParenR) + else docSeq [hidDoc, docParenLSep, docSeparator, docParenR] + -- ..[hiding].( b ) + [ieD] -> runFilteredAlternative $ do + addAlternativeCond (not hasComments) + $ docSeq + [ hidDoc + , docParenLSep + , docForceSingleline ieD + , docSeparator + , docParenR + ] + addAlternative $ docPar + (docSeq [hidDoc, docParenLSep, docNonBottomSpacing ieD]) + (docEnsureIndent (BrIndentSpecial hidDocColDiff) docParenR) + -- ..[hiding].( b + -- , b' + -- ) + (ieD:ieDs') -> + docPar + (docSeq [hidDoc, docSetBaseY $ docSeq [docParenLSep, ieD]]) + ( docEnsureIndent (BrIndentSpecial hidDocColDiff) + $ docLines + $ ieDs' + ++ [docParenR] + ) makeAsDoc asT = docSeq [appSep $ docLit $ Text.pack "as", appSep $ docLit asT] if compact - then - let asDoc = maybe docEmpty makeAsDoc masT - in - docAlt - [ docForceSingleline $ docSeq [importHead, asDoc, bindingsD] - , docAddBaseY BrIndentRegular - $ docPar (docSeq [importHead, asDoc]) bindingsD - ] - else case masT of + then + let asDoc = maybe docEmpty makeAsDoc masT + in docAlt + [ docForceSingleline $ docSeq [importHead, asDoc, bindingsD] + , docAddBaseY BrIndentRegular $ + docPar (docSeq [importHead, asDoc]) bindingsD + ] + else + case masT of Just n -> if enoughRoom - then docLines [docSeq [importHead, asDoc], bindingsD] + then docLines + [ docSeq [importHead, asDoc], bindingsD] else docLines [importHead, asDoc, bindingsD] where enoughRoom = nameCost < importAsCol - asCost - asDoc = docEnsureIndent (BrIndentSpecial (importAsCol - asCost)) - $ makeAsDoc n + asDoc = + docEnsureIndent (BrIndentSpecial (importAsCol - asCost)) + $ makeAsDoc n Nothing -> if enoughRoom then docSeq [importHead, bindingsD] else docLines [importHead, bindingsD] diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/Module.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/Module.hs index efae541..52c2cd1 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/Module.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/Module.hs @@ -3,27 +3,34 @@ module Language.Haskell.Brittany.Internal.Layouters.Module where +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Data.Maybe import qualified Data.Semigroup as Semigroup import qualified Data.Text as Text -import GHC (AnnKeywordId(..), GenLocated(L), moduleNameString, unLoc) -import GHC.Hs import qualified GHC.OldList as List -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.LayouterBasics -import Language.Haskell.Brittany.Internal.Layouters.IE -import Language.Haskell.Brittany.Internal.Layouters.Import -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.GHC.ExactPrint as ExactPrint -import Language.Haskell.GHC.ExactPrint.Types - (DeltaPos(..), commentContents, deltaRow) + +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.LayouterBasics +import Language.Haskell.Brittany.Internal.Layouters.IE +import Language.Haskell.Brittany.Internal.Layouters.Import +import Language.Haskell.Brittany.Internal.Config.Types + +import GHC (unLoc, GenLocated(L), moduleNameString, AnnKeywordId(..)) +import GHC.Hs +import Language.Haskell.GHC.ExactPrint as ExactPrint +import Language.Haskell.GHC.ExactPrint.Types + ( DeltaPos(..) + , deltaRow + , commentContents + ) + + layoutModule :: ToBriDoc' HsModule layoutModule lmod@(L _ mod') = case mod' of -- Implicit module Main - HsModule _ Nothing _ imports _ _ _ -> do + HsModule _ Nothing _ imports _ _ _ -> do commentedImports <- transformToCommentedImport imports -- groupify commentedImports `forM_` tellDebugMessShow docLines (commentedImportsToDoc <$> sortCommentedImports commentedImports) @@ -34,38 +41,43 @@ layoutModule lmod@(L _ mod') = case mod' of -- groupify commentedImports `forM_` tellDebugMessShow -- sortedImports <- sortImports imports let tn = Text.pack $ moduleNameString $ unLoc n - allowSingleLineExportList <- - mAsk <&> _conf_layout .> _lconfig_allowSingleLineExportList .> confUnpack + allowSingleLineExportList <- mAsk + <&> _conf_layout + .> _lconfig_allowSingleLineExportList + .> confUnpack -- the config should not prevent single-line layout when there is no -- export list - let - allowSingleLine = allowSingleLineExportList || Data.Maybe.isNothing les + let allowSingleLine = allowSingleLineExportList || Data.Maybe.isNothing les docLines $ docSeq [ docNodeAnnKW lmod Nothing docEmpty -- A pseudo node that serves merely to force documentation -- before the node , docNodeMoveToKWDP lmod AnnModule True $ runFilteredAlternative $ do - addAlternativeCond allowSingleLine $ docForceSingleline $ docSeq - [ appSep $ docLit $ Text.pack "module" - , appSep $ docLit tn - , docWrapNode lmod $ appSep $ case les of - Nothing -> docEmpty - Just x -> layoutLLIEs True KeepItemsUnsorted x - , docSeparator - , docLit $ Text.pack "where" - ] - addAlternative $ docLines + addAlternativeCond allowSingleLine $ + docForceSingleline + $ docSeq + [ appSep $ docLit $ Text.pack "module" + , appSep $ docLit tn + , docWrapNode lmod $ appSep $ case les of + Nothing -> docEmpty + Just x -> layoutLLIEs True KeepItemsUnsorted x + , docSeparator + , docLit $ Text.pack "where" + ] + addAlternative + $ docLines [ docAddBaseY BrIndentRegular $ docPar - (docSeq [appSep $ docLit $ Text.pack "module", docLit tn]) - (docSeq - [ docWrapNode lmod $ case les of - Nothing -> docEmpty - Just x -> layoutLLIEs False KeepItemsUnsorted x - , docSeparator - , docLit $ Text.pack "where" - ] - ) + (docSeq [appSep $ docLit $ Text.pack "module", docLit tn] + ) + (docSeq [ + docWrapNode lmod $ case les of + Nothing -> docEmpty + Just x -> layoutLLIEs False KeepItemsUnsorted x + , docSeparator + , docLit $ Text.pack "where" + ] + ) ] ] : (commentedImportsToDoc <$> sortCommentedImports commentedImports) -- [layoutImport y i | (y, i) <- sortedImports] @@ -77,7 +89,7 @@ data CommentedImport instance Show CommentedImport where show = \case - EmptyLine -> "EmptyLine" + EmptyLine -> "EmptyLine" IndependentComment _ -> "IndependentComment" ImportStatement r -> "ImportStatement " ++ show (length $ commentsBefore r) ++ " " ++ show @@ -90,9 +102,8 @@ data ImportStatementRecord = ImportStatementRecord } instance Show ImportStatementRecord where - show r = - "ImportStatement " ++ show (length $ commentsBefore r) ++ " " ++ show - (length $ commentsAfter r) + show r = "ImportStatement " ++ show (length $ commentsBefore r) ++ " " ++ show + (length $ commentsAfter r) transformToCommentedImport :: [LImportDecl GhcPs] -> ToBriDocM [CommentedImport] @@ -110,11 +121,10 @@ transformToCommentedImport is = do accumF accConnectedComm (annMay, decl) = case annMay of Nothing -> ( [] - , [ ImportStatement ImportStatementRecord - { commentsBefore = [] - , commentsAfter = [] - , importStatement = decl - } + , [ ImportStatement ImportStatementRecord { commentsBefore = [] + , commentsAfter = [] + , importStatement = decl + } ] ) Just ann -> @@ -126,7 +136,7 @@ transformToCommentedImport is = do :: [(Comment, DeltaPos)] -> [(Comment, DeltaPos)] -> ([CommentedImport], [(Comment, DeltaPos)], Int) - go acc [] = ([], acc, 0) + go acc [] = ([], acc, 0) go acc [c1@(_, DP (y, _))] = ([], c1 : acc, y - 1) go acc (c1@(_, DP (1, _)) : xs) = go (c1 : acc) xs go acc ((c1, DP (y, x)) : xs) = @@ -143,8 +153,8 @@ transformToCommentedImport is = do , convertedIndependentComments ++ replicate (blanksBeforeImportDecl + initialBlanks) EmptyLine ++ [ ImportStatement ImportStatementRecord - { commentsBefore = beforeComments - , commentsAfter = accConnectedComm + { commentsBefore = beforeComments + , commentsAfter = accConnectedComm , importStatement = decl } ] @@ -158,14 +168,14 @@ sortCommentedImports = where unpackImports :: [CommentedImport] -> [CommentedImport] unpackImports xs = xs >>= \case - l@EmptyLine -> [l] + l@EmptyLine -> [l] l@IndependentComment{} -> [l] ImportStatement r -> map IndependentComment (commentsBefore r) ++ [ImportStatement r] mergeGroups :: [Either CommentedImport [ImportStatementRecord]] -> [CommentedImport] mergeGroups xs = xs >>= \case - Left x -> [x] + Left x -> [x] Right y -> ImportStatement <$> y sortGroups :: [ImportStatementRecord] -> [ImportStatementRecord] sortGroups = @@ -175,23 +185,25 @@ sortCommentedImports = groupify cs = go [] cs where go [] = \case - (l@EmptyLine : rest) -> Left l : go [] rest + (l@EmptyLine : rest) -> Left l : go [] rest (l@IndependentComment{} : rest) -> Left l : go [] rest - (ImportStatement r : rest) -> go [r] rest - [] -> [] + (ImportStatement r : rest) -> go [r] rest + [] -> [] go acc = \case (l@EmptyLine : rest) -> Right (reverse acc) : Left l : go [] rest (l@IndependentComment{} : rest) -> Left l : Right (reverse acc) : go [] rest (ImportStatement r : rest) -> go (r : acc) rest - [] -> [Right (reverse acc)] + [] -> [Right (reverse acc)] commentedImportsToDoc :: CommentedImport -> ToBriDocM BriDocNumbered commentedImportsToDoc = \case EmptyLine -> docLitS "" IndependentComment c -> commentToDoc c - ImportStatement r -> docSeq - (layoutImport (importStatement r) : map commentToDoc (commentsAfter r)) + ImportStatement r -> + docSeq + ( layoutImport (importStatement r) + : map commentToDoc (commentsAfter r) + ) where - commentToDoc (c, DP (_y, x)) = - docLitS (replicate x ' ' ++ commentContents c) + commentToDoc (c, DP (_y, x)) = docLitS (replicate x ' ' ++ commentContents c) diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs index 88a10e4..4b99bca 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs @@ -3,19 +3,28 @@ module Language.Haskell.Brittany.Internal.Layouters.Pattern where + + +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Data.Foldable as Foldable import qualified Data.Sequence as Seq import qualified Data.Text as Text -import GHC (GenLocated(L), ol_val) -import GHC.Hs import qualified GHC.OldList as List -import GHC.Types.Basic -import Language.Haskell.Brittany.Internal.LayouterBasics + +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.LayouterBasics + +import GHC ( GenLocated(L) + , ol_val + ) +import GHC.Hs +import GHC.Types.Basic + import {-# SOURCE #-} Language.Haskell.Brittany.Internal.Layouters.Expr -import Language.Haskell.Brittany.Internal.Layouters.Type -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.Layouters.Type + + -- | layouts patterns (inside function bindings, case alternatives, let -- bindings or do notation). E.g. for input @@ -29,15 +38,17 @@ import Language.Haskell.Brittany.Internal.Types -- the different cases below. layoutPat :: LPat GhcPs -> ToBriDocM (Seq BriDocNumbered) layoutPat lpat@(L _ pat) = docWrapNode lpat $ case pat of - WildPat _ -> fmap Seq.singleton $ docLit $ Text.pack "_" + WildPat _ -> fmap Seq.singleton $ docLit $ Text.pack "_" -- _ -> expr - VarPat _ n -> fmap Seq.singleton $ docLit $ lrdrNameToText n + VarPat _ n -> + fmap Seq.singleton $ docLit $ lrdrNameToText n -- abc -> expr - LitPat _ lit -> fmap Seq.singleton $ allocateNode $ litBriDoc lit + LitPat _ lit -> + fmap Seq.singleton $ allocateNode $ litBriDoc lit -- 0 -> expr ParPat _ inner -> do -- (nestedpat) -> expr - left <- docLit $ Text.pack "(" + left <- docLit $ Text.pack "(" right <- docLit $ Text.pack ")" innerDocs <- colsWrapPat =<< layoutPat inner return $ Seq.empty Seq.|> left Seq.|> innerDocs Seq.|> right @@ -63,9 +74,10 @@ layoutPat lpat@(L _ pat) = docWrapNode lpat $ case pat of then return <$> docLit nameDoc else do x1 <- appSep (docLit nameDoc) - xR <- fmap Seq.fromList $ sequence $ spacifyDocs $ fmap - colsWrapPat - argDocs + xR <- fmap Seq.fromList + $ sequence + $ spacifyDocs + $ fmap colsWrapPat argDocs return $ x1 Seq.<| xR ConPat _ lname (InfixCon left right) -> do -- a :< b -> expr @@ -78,7 +90,7 @@ layoutPat lpat@(L _ pat) = docWrapNode lpat $ case pat of -- Abc{} -> expr let t = lrdrNameToText lname fmap Seq.singleton $ docLit $ t <> Text.pack "{}" - ConPat _ lname (RecCon (HsRecFields fs@(_ : _) Nothing)) -> do + ConPat _ lname (RecCon (HsRecFields fs@(_:_) Nothing)) -> do -- Abc { a = locA, b = locB, c = locC } -> expr1 -- Abc { a, b, c } -> expr2 let t = lrdrNameToText lname @@ -91,34 +103,37 @@ layoutPat lpat@(L _ pat) = docWrapNode lpat $ case pat of Seq.singleton <$> docSeq [ appSep $ docLit t , appSep $ docLit $ Text.pack "{" - , docSeq $ List.intersperse docCommaSep $ fds <&> \case - (fieldName, Just fieldDoc) -> docSeq - [ appSep $ docLit fieldName - , appSep $ docLit $ Text.pack "=" - , fieldDoc >>= colsWrapPat - ] - (fieldName, Nothing) -> docLit fieldName + , docSeq $ List.intersperse docCommaSep + $ fds <&> \case + (fieldName, Just fieldDoc) -> docSeq + [ appSep $ docLit fieldName + , appSep $ docLit $ Text.pack "=" + , fieldDoc >>= colsWrapPat + ] + (fieldName, Nothing) -> docLit fieldName , docSeparator , docLit $ Text.pack "}" ] ConPat _ lname (RecCon (HsRecFields [] (Just (L _ 0)))) -> do -- Abc { .. } -> expr let t = lrdrNameToText lname - Seq.singleton <$> docSeq [appSep $ docLit t, docLit $ Text.pack "{..}"] - ConPat _ lname (RecCon (HsRecFields fs@(_ : _) (Just (L _ dotdoti)))) - | dotdoti == length fs -> do + Seq.singleton <$> docSeq + [ appSep $ docLit t + , docLit $ Text.pack "{..}" + ] + ConPat _ lname (RecCon (HsRecFields fs@(_:_) (Just (L _ dotdoti)))) | dotdoti == length fs -> do -- Abc { a = locA, .. } - let t = lrdrNameToText lname - fds <- fs `forM` \(L _ (HsRecField (L _ fieldOcc) fPat pun)) -> do - let FieldOcc _ lnameF = fieldOcc - fExpDoc <- if pun - then return Nothing - else Just <$> docSharedWrapper layoutPat fPat - return (lrdrNameToText lnameF, fExpDoc) - Seq.singleton <$> docSeq - [ appSep $ docLit t - , appSep $ docLit $ Text.pack "{" - , docSeq $ fds >>= \case + let t = lrdrNameToText lname + fds <- fs `forM` \(L _ (HsRecField (L _ fieldOcc) fPat pun)) -> do + let FieldOcc _ lnameF = fieldOcc + fExpDoc <- if pun + then return Nothing + else Just <$> docSharedWrapper layoutPat fPat + return (lrdrNameToText lnameF, fExpDoc) + Seq.singleton <$> docSeq + [ appSep $ docLit t + , appSep $ docLit $ Text.pack "{" + , docSeq $ fds >>= \case (fieldName, Just fieldDoc) -> [ appSep $ docLit fieldName , appSep $ docLit $ Text.pack "=" @@ -126,13 +141,13 @@ layoutPat lpat@(L _ pat) = docWrapNode lpat $ case pat of , docCommaSep ] (fieldName, Nothing) -> [docLit fieldName, docCommaSep] - , docLit $ Text.pack "..}" - ] + , docLit $ Text.pack "..}" + ] TuplePat _ args boxity -> do -- (nestedpat1, nestedpat2, nestedpat3) -> expr -- (#nestedpat1, nestedpat2, nestedpat3#) -> expr case boxity of - Boxed -> wrapPatListy args "()" docParenL docParenR + Boxed -> wrapPatListy args "()" docParenL docParenR Unboxed -> wrapPatListy args "(##)" docParenHashLSep docParenHashRSep AsPat _ asName asPat -> do -- bind@nestedpat -> expr @@ -169,11 +184,10 @@ layoutPat lpat@(L _ pat) = docWrapNode lpat $ case pat of wrapPatPrepend pat1 (docLit $ Text.pack "~") NPat _ llit@(L _ ol) mNegative _ -> do -- -13 -> expr - litDoc <- docWrapNode llit $ allocateNode $ overLitValBriDoc $ GHC.ol_val - ol + litDoc <- docWrapNode llit $ allocateNode $ overLitValBriDoc $ GHC.ol_val ol negDoc <- docLit $ Text.pack "-" pure $ case mNegative of - Just{} -> Seq.fromList [negDoc, litDoc] + Just{} -> Seq.fromList [negDoc, litDoc] Nothing -> Seq.singleton litDoc _ -> return <$> briDocByExactInlineOnly "some unknown pattern" lpat @@ -182,7 +196,9 @@ colsWrapPat :: Seq BriDocNumbered -> ToBriDocM BriDocNumbered colsWrapPat = docCols ColPatterns . fmap return . Foldable.toList wrapPatPrepend - :: LPat GhcPs -> ToBriDocM BriDocNumbered -> ToBriDocM (Seq BriDocNumbered) + :: LPat GhcPs + -> ToBriDocM BriDocNumbered + -> ToBriDocM (Seq BriDocNumbered) wrapPatPrepend pat prepElem = do patDocs <- layoutPat pat case Seq.viewl patDocs of @@ -204,5 +220,8 @@ wrapPatListy elems both start end = do x1 Seq.:< rest -> do sDoc <- start eDoc <- end - rest' <- rest `forM` \bd -> docSeq [docCommaSep, return bd] + rest' <- rest `forM` \bd -> docSeq + [ docCommaSep + , return bd + ] return $ (sDoc Seq.<| x1 Seq.<| rest') Seq.|> eDoc diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs index 528853a..95f7273 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs @@ -4,19 +4,26 @@ module Language.Haskell.Brittany.Internal.Layouters.Stmt where -import qualified Data.Semigroup as Semigroup -import qualified Data.Text as Text -import GHC (GenLocated(L)) -import GHC.Hs -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.LayouterBasics + + import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import Language.Haskell.Brittany.Internal.Types +import qualified Data.Semigroup as Semigroup +import qualified Data.Text as Text -import Language.Haskell.Brittany.Internal.Layouters.Decl +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.LayouterBasics +import Language.Haskell.Brittany.Internal.Config.Types + +import GHC ( GenLocated(L) + ) +import GHC.Hs + +import Language.Haskell.Brittany.Internal.Layouters.Pattern +import Language.Haskell.Brittany.Internal.Layouters.Decl import {-# SOURCE #-} Language.Haskell.Brittany.Internal.Layouters.Expr -import Language.Haskell.Brittany.Internal.Layouters.Pattern + + layoutStmt :: ToBriDoc' (StmtLR GhcPs GhcPs (LHsExpr GhcPs)) layoutStmt lstmt@(L _ stmt) = do @@ -46,12 +53,12 @@ layoutStmt lstmt@(L _ stmt) = do ] ] LetStmt _ binds -> do - let isFree = indentPolicy == IndentPolicyFree + let isFree = indentPolicy == IndentPolicyFree let indentFourPlus = indentAmount >= 4 layoutLocalBinds binds >>= \case - Nothing -> docLit $ Text.pack "let" + Nothing -> docLit $ Text.pack "let" -- i just tested the above, and it is indeed allowed. heh. - Just [] -> docLit $ Text.pack "let" -- this probably never happens + Just [] -> docLit $ Text.pack "let" -- this probably never happens Just [bindDoc] -> docAlt [ -- let bind = expr docCols @@ -61,10 +68,9 @@ layoutStmt lstmt@(L _ stmt) = do f = case indentPolicy of IndentPolicyFree -> docSetBaseAndIndent IndentPolicyLeft -> docForceSingleline - IndentPolicyMultiple - | indentFourPlus -> docSetBaseAndIndent - | otherwise -> docForceSingleline - in f $ return bindDoc + IndentPolicyMultiple | indentFourPlus -> docSetBaseAndIndent + | otherwise -> docForceSingleline + in f $ return bindDoc ] , -- let -- bind = expr @@ -78,11 +84,10 @@ layoutStmt lstmt@(L _ stmt) = do -- ccc = exprc addAlternativeCond (isFree || indentFourPlus) $ docSeq [ appSep $ docLit $ Text.pack "let" - , let - f = if indentFourPlus - then docEnsureIndent BrIndentRegular - else docSetBaseAndIndent - in f $ docLines $ return <$> bindDocs + , let f = if indentFourPlus + then docEnsureIndent BrIndentRegular + else docSetBaseAndIndent + in f $ docLines $ return <$> bindDocs ] -- let -- aaa = expra @@ -90,9 +95,8 @@ layoutStmt lstmt@(L _ stmt) = do -- ccc = exprc addAlternativeCond (not indentFourPlus) $ docAddBaseY BrIndentRegular - $ docPar - (docLit $ Text.pack "let") - (docSetBaseAndIndent $ docLines $ return <$> bindDocs) + $ docPar (docLit $ Text.pack "let") + (docSetBaseAndIndent $ docLines $ return <$> bindDocs) RecStmt _ stmts _ _ _ _ _ -> runFilteredAlternative $ do -- rec stmt1 -- stmt2 diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot b/source/library/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot index fbba444..02b388c 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot @@ -2,7 +2,14 @@ module Language.Haskell.Brittany.Internal.Layouters.Stmt where -import GHC.Hs -import Language.Haskell.Brittany.Internal.Types + + +import Language.Haskell.Brittany.Internal.Prelude + +import Language.Haskell.Brittany.Internal.Types + +import GHC.Hs + + layoutStmt :: ToBriDoc' (StmtLR GhcPs GhcPs (LHsExpr GhcPs)) diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/Type.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/Type.hs index 7ccb461..ed0dd26 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/Type.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/Type.hs @@ -3,18 +3,28 @@ module Language.Haskell.Brittany.Internal.Layouters.Type where -import qualified Data.Text as Text -import GHC (AnnKeywordId(..), GenLocated(L)) -import GHC.Hs -import qualified GHC.OldList as List -import GHC.Types.Basic -import GHC.Utils.Outputable (ftext, showSDocUnsafe) -import Language.Haskell.Brittany.Internal.LayouterBasics + + import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.Utils - (FirstLastView(..), splitFirstLast) +import qualified Data.Text as Text +import qualified GHC.OldList as List + +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.LayouterBasics +import Language.Haskell.Brittany.Internal.Utils + ( splitFirstLast + , FirstLastView(..) + ) + +import GHC ( GenLocated(L) + , AnnKeywordId (..) + ) +import GHC.Hs +import GHC.Utils.Outputable ( ftext, showSDocUnsafe ) +import GHC.Types.Basic + + layoutType :: ToBriDoc HsType layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of @@ -22,66 +32,76 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of HsTyVar _ promoted name -> do t <- lrdrNameToTextAnnTypeEqualityIsSpecial name case promoted of - IsPromoted -> - docSeq [docSeparator, docTick, docWrapNode name $ docLit t] + IsPromoted -> docSeq + [ docSeparator + , docTick + , docWrapNode name $ docLit t + ] NotPromoted -> docWrapNode name $ docLit t HsForAllTy _ hsf (L _ (HsQualTy _ (L _ cntxts) typ2)) -> do let bndrs = getBinders hsf typeDoc <- docSharedWrapper layoutType typ2 tyVarDocs <- layoutTyVarBndrs bndrs cntxtDocs <- cntxts `forM` docSharedWrapper layoutType - let - maybeForceML = case typ2 of - (L _ HsFunTy{}) -> docForceMultiline - _ -> id + let maybeForceML = case typ2 of + (L _ HsFunTy{}) -> docForceMultiline + _ -> id let tyVarDocLineList = processTyVarBndrsSingleline tyVarDocs forallDoc = docAlt - [ let open = docLit $ Text.pack "forall" - in docSeq ([open] ++ tyVarDocLineList) + [ let + open = docLit $ Text.pack "forall" + in docSeq ([open]++tyVarDocLineList) , docPar - (docLit (Text.pack "forall")) - (docLines $ tyVarDocs <&> \case - (tname, Nothing) -> docEnsureIndent BrIndentRegular $ docLit tname - (tname, Just doc) -> docEnsureIndent BrIndentRegular $ docLines - [ docCols ColTyOpPrefix [docParenLSep, docLit tname] - , docCols ColTyOpPrefix [docLit $ Text.pack ":: ", doc] - , docLit $ Text.pack ")" - ] - ) + (docLit (Text.pack "forall")) + (docLines + $ tyVarDocs <&> \case + (tname, Nothing) -> docEnsureIndent BrIndentRegular $ docLit tname + (tname, Just doc) -> docEnsureIndent BrIndentRegular + $ docLines + [ docCols ColTyOpPrefix + [ docParenLSep + , docLit tname + ] + , docCols ColTyOpPrefix + [ docLit $ Text.pack ":: " + , doc + ] + , docLit $ Text.pack ")" + ]) ] contextDoc = case cntxtDocs of [] -> docLit $ Text.pack "()" [x] -> x _ -> docAlt [ let - open = docLit $ Text.pack "(" + open = docLit $ Text.pack "(" close = docLit $ Text.pack ")" - list = - List.intersperse docCommaSep $ docForceSingleline <$> cntxtDocs - in docSeq ([open] ++ list ++ [close]) + list = List.intersperse docCommaSep + $ docForceSingleline <$> cntxtDocs + in docSeq ([open]++list++[close]) , let - open = docCols - ColTyOpPrefix - [ docParenLSep - , docAddBaseY (BrIndentSpecial 2) $ head cntxtDocs - ] + open = docCols ColTyOpPrefix + [ docParenLSep + , docAddBaseY (BrIndentSpecial 2) $ head cntxtDocs + ] close = docLit $ Text.pack ")" - list = List.tail cntxtDocs <&> \cntxtDoc -> docCols - ColTyOpPrefix - [docCommaSep, docAddBaseY (BrIndentSpecial 2) cntxtDoc] + list = List.tail cntxtDocs <&> \cntxtDoc -> + docCols ColTyOpPrefix + [ docCommaSep + , docAddBaseY (BrIndentSpecial 2) cntxtDoc + ] in docPar open $ docLines $ list ++ [close] ] docAlt -- :: forall a b c . (Foo a b c) => a b -> c [ docSeq [ if null bndrs - then docEmpty - else - let + then docEmpty + else let open = docLit $ Text.pack "forall" close = docLit $ Text.pack " . " - in docSeq ([open, docSeparator] ++ tyVarDocLineList ++ [close]) + in docSeq ([open, docSeparator]++tyVarDocLineList++[close]) , docForceSingleline contextDoc , docLit $ Text.pack " => " , docForceSingleline typeDoc @@ -91,74 +111,75 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of -- => a b -- -> c , docPar - forallDoc - (docLines - [ docCols - ColTyOpPrefix - [ docWrapNodeRest ltype $ docLit $ Text.pack " . " - , docAddBaseY (BrIndentSpecial 3) $ contextDoc + forallDoc + ( docLines + [ docCols ColTyOpPrefix + [ docWrapNodeRest ltype $ docLit $ Text.pack " . " + , docAddBaseY (BrIndentSpecial 3) + $ contextDoc + ] + , docCols ColTyOpPrefix + [ docLit $ Text.pack "=> " + , docAddBaseY (BrIndentSpecial 3) $ maybeForceML $ typeDoc + ] ] - , docCols - ColTyOpPrefix - [ docLit $ Text.pack "=> " - , docAddBaseY (BrIndentSpecial 3) $ maybeForceML $ typeDoc - ] - ] - ) + ) ] HsForAllTy _ hsf typ2 -> do let bndrs = getBinders hsf typeDoc <- layoutType typ2 tyVarDocs <- layoutTyVarBndrs bndrs - let - maybeForceML = case typ2 of - (L _ HsFunTy{}) -> docForceMultiline - _ -> id + let maybeForceML = case typ2 of + (L _ HsFunTy{}) -> docForceMultiline + _ -> id let tyVarDocLineList = processTyVarBndrsSingleline tyVarDocs docAlt -- forall x . x [ docSeq [ if null bndrs - then docEmpty - else - let + then docEmpty + else let open = docLit $ Text.pack "forall" close = docLit $ Text.pack " . " - in docSeq ([open] ++ tyVarDocLineList ++ [close]) + in docSeq ([open]++tyVarDocLineList++[close]) , docForceSingleline $ return $ typeDoc ] -- :: forall x -- . x , docPar - (docSeq $ docLit (Text.pack "forall") : tyVarDocLineList) - (docCols - ColTyOpPrefix - [ docWrapNodeRest ltype $ docLit $ Text.pack " . " - , maybeForceML $ return typeDoc - ] - ) + (docSeq $ docLit (Text.pack "forall") : tyVarDocLineList) + ( docCols ColTyOpPrefix + [ docWrapNodeRest ltype $ docLit $ Text.pack " . " + , maybeForceML $ return typeDoc + ] + ) -- :: forall -- (x :: *) -- . x , docPar - (docLit (Text.pack "forall")) - (docLines - $ (tyVarDocs <&> \case - (tname, Nothing) -> - docEnsureIndent BrIndentRegular $ docLit tname - (tname, Just doc) -> docEnsureIndent BrIndentRegular $ docLines - [ docCols ColTyOpPrefix [docParenLSep, docLit tname] - , docCols ColTyOpPrefix [docLit $ Text.pack ":: ", doc] - , docLit $ Text.pack ")" + (docLit (Text.pack "forall")) + (docLines + $ (tyVarDocs <&> \case + (tname, Nothing) -> docEnsureIndent BrIndentRegular $ docLit tname + (tname, Just doc) -> docEnsureIndent BrIndentRegular + $ docLines + [ docCols ColTyOpPrefix + [ docParenLSep + , docLit tname + ] + , docCols ColTyOpPrefix + [ docLit $ Text.pack ":: " + , doc + ] + , docLit $ Text.pack ")" + ] + ) + ++[ docCols ColTyOpPrefix + [ docWrapNodeRest ltype $ docLit $ Text.pack " . " + , maybeForceML $ return typeDoc ] + ] ) - ++ [ docCols - ColTyOpPrefix - [ docWrapNodeRest ltype $ docLit $ Text.pack " . " - , maybeForceML $ return typeDoc - ] - ] - ) ] HsQualTy _ lcntxts@(L _ cntxts) typ1 -> do typeDoc <- docSharedWrapper layoutType typ1 @@ -169,27 +190,29 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of [x] -> x _ -> docAlt [ let - open = docLit $ Text.pack "(" + open = docLit $ Text.pack "(" close = docLit $ Text.pack ")" - list = - List.intersperse docCommaSep $ docForceSingleline <$> cntxtDocs - in docSeq ([open] ++ list ++ [close]) + list = List.intersperse docCommaSep + $ docForceSingleline <$> cntxtDocs + in docSeq ([open]++list++[close]) , let - open = docCols - ColTyOpPrefix - [ docParenLSep - , docAddBaseY (BrIndentSpecial 2) $ head cntxtDocs - ] + open = docCols ColTyOpPrefix + [ docParenLSep + , docAddBaseY (BrIndentSpecial 2) + $ head cntxtDocs + ] close = docLit $ Text.pack ")" - list = List.tail cntxtDocs <&> \cntxtDoc -> docCols - ColTyOpPrefix - [docCommaSep, docAddBaseY (BrIndentSpecial 2) $ cntxtDoc] + list = List.tail cntxtDocs <&> \cntxtDoc -> + docCols ColTyOpPrefix + [ docCommaSep + , docAddBaseY (BrIndentSpecial 2) + $ cntxtDoc + ] in docPar open $ docLines $ list ++ [close] ] - let - maybeForceML = case typ1 of - (L _ HsFunTy{}) -> docForceMultiline - _ -> id + let maybeForceML = case typ1 of + (L _ HsFunTy{}) -> docForceMultiline + _ -> id docAlt -- (Foo a b c) => a b -> c [ docSeq @@ -201,39 +224,37 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of -- => a b -- -> c , docPar - (docForceSingleline contextDoc) - (docCols - ColTyOpPrefix - [ docLit $ Text.pack "=> " - , docAddBaseY (BrIndentSpecial 3) $ maybeForceML typeDoc - ] - ) + (docForceSingleline contextDoc) + ( docCols ColTyOpPrefix + [ docLit $ Text.pack "=> " + , docAddBaseY (BrIndentSpecial 3) $ maybeForceML typeDoc + ] + ) ] HsFunTy _ _ typ1 typ2 -> do typeDoc1 <- docSharedWrapper layoutType typ1 typeDoc2 <- docSharedWrapper layoutType typ2 - let - maybeForceML = case typ2 of - (L _ HsFunTy{}) -> docForceMultiline - _ -> id + let maybeForceML = case typ2 of + (L _ HsFunTy{}) -> docForceMultiline + _ -> id hasComments <- hasAnyCommentsBelow ltype - docAlt - $ [ docSeq - [ appSep $ docForceSingleline typeDoc1 - , appSep $ docLit $ Text.pack "->" - , docForceSingleline typeDoc2 - ] - | not hasComments + docAlt $ + [ docSeq + [ appSep $ docForceSingleline typeDoc1 + , appSep $ docLit $ Text.pack "->" + , docForceSingleline typeDoc2 ] - ++ [ docPar - (docNodeAnnKW ltype Nothing typeDoc1) - (docCols - ColTyOpPrefix - [ docWrapNodeRest ltype $ appSep $ docLit $ Text.pack "->" - , docAddBaseY (BrIndentSpecial 3) $ maybeForceML typeDoc2 - ] - ) - ] + | not hasComments + ] ++ + [ docPar + (docNodeAnnKW ltype Nothing typeDoc1) + ( docCols ColTyOpPrefix + [ docWrapNodeRest ltype $ appSep $ docLit $ Text.pack "->" + , docAddBaseY (BrIndentSpecial 3) + $ maybeForceML typeDoc2 + ] + ) + ] HsParTy _ typ1 -> do typeDoc1 <- docSharedWrapper layoutType typ1 docAlt @@ -243,28 +264,24 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of , docLit $ Text.pack ")" ] , docPar - (docCols - ColTyOpPrefix - [ docWrapNodeRest ltype $ docParenLSep - , docAddBaseY (BrIndentSpecial 2) $ typeDoc1 - ] - ) - (docLit $ Text.pack ")") + ( docCols ColTyOpPrefix + [ docWrapNodeRest ltype $ docParenLSep + , docAddBaseY (BrIndentSpecial 2) $ typeDoc1 + ]) + (docLit $ Text.pack ")") ] HsAppTy _ typ1@(L _ HsAppTy{}) typ2 -> do - let - gather - :: [LHsType GhcPs] -> LHsType GhcPs -> (LHsType GhcPs, [LHsType GhcPs]) - gather list = \case - L _ (HsAppTy _ ty1 ty2) -> gather (ty2 : list) ty1 - final -> (final, list) + let gather :: [LHsType GhcPs] -> LHsType GhcPs -> (LHsType GhcPs, [LHsType GhcPs]) + gather list = \case + L _ (HsAppTy _ ty1 ty2) -> gather (ty2:list) ty1 + final -> (final, list) let (typHead, typRest) = gather [typ2] typ1 docHead <- docSharedWrapper layoutType typHead docRest <- docSharedWrapper layoutType `mapM` typRest docAlt [ docSeq - $ docForceSingleline docHead - : (docRest >>= \d -> [docSeparator, docForceSingleline d]) + $ docForceSingleline docHead : (docRest >>= \d -> + [ docSeparator, docForceSingleline d ]) , docPar docHead (docLines $ docEnsureIndent BrIndentRegular <$> docRest) ] HsAppTy _ typ1 typ2 -> do @@ -276,7 +293,9 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of , docSeparator , docForceSingleline typeDoc2 ] - , docPar typeDoc1 (docEnsureIndent BrIndentRegular typeDoc2) + , docPar + typeDoc1 + (docEnsureIndent BrIndentRegular typeDoc2) ] HsListTy _ typ1 -> do typeDoc1 <- docSharedWrapper layoutType typ1 @@ -287,61 +306,51 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of , docLit $ Text.pack "]" ] , docPar - (docCols - ColTyOpPrefix - [ docWrapNodeRest ltype $ docLit $ Text.pack "[ " - , docAddBaseY (BrIndentSpecial 2) $ typeDoc1 - ] - ) - (docLit $ Text.pack "]") + ( docCols ColTyOpPrefix + [ docWrapNodeRest ltype $ docLit $ Text.pack "[ " + , docAddBaseY (BrIndentSpecial 2) $ typeDoc1 + ]) + (docLit $ Text.pack "]") ] HsTupleTy _ tupleSort typs -> case tupleSort of - HsUnboxedTuple -> unboxed - HsBoxedTuple -> simple - HsConstraintTuple -> simple + HsUnboxedTuple -> unboxed + HsBoxedTuple -> simple + HsConstraintTuple -> simple HsBoxedOrConstraintTuple -> simple where - unboxed = if null typs - then error "brittany internal error: unboxed unit" - else unboxedL + unboxed = if null typs then error "brittany internal error: unboxed unit" + else unboxedL simple = if null typs then unitL else simpleL unitL = docLit $ Text.pack "()" simpleL = do docs <- docSharedWrapper layoutType `mapM` typs - let - end = docLit $ Text.pack ")" - lines = - List.tail docs - <&> \d -> docAddBaseY (BrIndentSpecial 2) - $ docCols ColTyOpPrefix [docCommaSep, d] - commaDocs = List.intersperse docCommaSep (docForceSingleline <$> docs) + let end = docLit $ Text.pack ")" + lines = List.tail docs <&> \d -> + docAddBaseY (BrIndentSpecial 2) + $ docCols ColTyOpPrefix [docCommaSep, d] + commaDocs = List.intersperse docCommaSep (docForceSingleline <$> docs) docAlt - [ docSeq - $ [docLit $ Text.pack "("] - ++ docWrapNodeRest ltype commaDocs - ++ [end] + [ docSeq $ [docLit $ Text.pack "("] + ++ docWrapNodeRest ltype commaDocs + ++ [end] , let line1 = docCols ColTyOpPrefix [docParenLSep, head docs] - in - docPar - (docAddBaseY (BrIndentSpecial 2) $ line1) - (docLines $ docWrapNodeRest ltype lines ++ [end]) + in docPar + (docAddBaseY (BrIndentSpecial 2) $ line1) + (docLines $ docWrapNodeRest ltype lines ++ [end]) ] unboxedL = do docs <- docSharedWrapper layoutType `mapM` typs - let - start = docParenHashLSep - end = docParenHashRSep + let start = docParenHashLSep + end = docParenHashRSep docAlt - [ docSeq - $ [start] - ++ docWrapNodeRest ltype (List.intersperse docCommaSep docs) - ++ [end] + [ docSeq $ [start] + ++ docWrapNodeRest ltype (List.intersperse docCommaSep docs) + ++ [end] , let line1 = docCols ColTyOpPrefix [start, head docs] - lines = - List.tail docs - <&> \d -> docAddBaseY (BrIndentSpecial 2) - $ docCols ColTyOpPrefix [docCommaSep, d] + lines = List.tail docs <&> \d -> + docAddBaseY (BrIndentSpecial 2) + $ docCols ColTyOpPrefix [docCommaSep, d] in docPar (docAddBaseY (BrIndentSpecial 2) line1) (docLines $ lines ++ [end]) @@ -410,18 +419,20 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of typeDoc1 <- docSharedWrapper layoutType typ1 docAlt [ docSeq - [ docWrapNodeRest ltype $ docLit $ Text.pack - ("?" ++ showSDocUnsafe (ftext ipName) ++ "::") + [ docWrapNodeRest ltype + $ docLit + $ Text.pack ("?" ++ showSDocUnsafe (ftext ipName) ++ "::") , docForceSingleline typeDoc1 ] , docPar - (docLit $ Text.pack ("?" ++ showSDocUnsafe (ftext ipName))) - (docCols - ColTyOpPrefix - [ docWrapNodeRest ltype $ docLit $ Text.pack ":: " - , docAddBaseY (BrIndentSpecial 2) typeDoc1 - ] - ) + ( docLit + $ Text.pack ("?" ++ showSDocUnsafe (ftext ipName)) + ) + (docCols ColTyOpPrefix + [ docWrapNodeRest ltype + $ docLit $ Text.pack ":: " + , docAddBaseY (BrIndentSpecial 2) typeDoc1 + ]) ] -- TODO: test KindSig HsKindSig _ typ1 kind1 -> do @@ -462,7 +473,7 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of ] else docPar typeDoc1 - (docCols + ( docCols ColTyOpPrefix [ docWrapNodeRest ltype $ docLit $ Text.pack ":: " , docAddBaseY (BrIndentSpecial 3) kindDoc1 @@ -533,7 +544,7 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of let specialCommaSep = appSep $ docLit $ Text.pack " ," docAlt [ docSeq - $ [docLit $ Text.pack "'["] + $ [docLit $ Text.pack "'["] ++ List.intersperse specialCommaSep (docForceSingleline <$> typDocs) ++ [docLit $ Text.pack "]"] , case splitFirstLast typDocs of @@ -558,23 +569,19 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of ] FirstLast e1 ems eN -> runFilteredAlternative $ do addAlternativeCond (not hasComments) - $ docSeq - $ [docLit $ Text.pack "'["] - ++ List.intersperse - specialCommaSep - (docForceSingleline - <$> (e1 : ems ++ [docNodeAnnKW ltype (Just AnnOpenS) eN]) - ) + $ docSeq + $ [docLit $ Text.pack "'["] + ++ List.intersperse specialCommaSep (docForceSingleline <$> (e1:ems ++ [docNodeAnnKW ltype (Just AnnOpenS) eN])) ++ [docLit $ Text.pack " ]"] - addAlternative - $ let - start = docCols ColList [appSep $ docLit $ Text.pack "'[", e1] - linesM = ems <&> \d -> docCols ColList [specialCommaSep, d] - lineN = docCols - ColList - [specialCommaSep, docNodeAnnKW ltype (Just AnnOpenS) eN] - end = docLit $ Text.pack " ]" - in docSetBaseY $ docLines $ [start] ++ linesM ++ [lineN] ++ [end] + addAlternative $ + let + start = docCols ColList + [appSep $ docLit $ Text.pack "'[", e1] + linesM = ems <&> \d -> + docCols ColList [specialCommaSep, d] + lineN = docCols ColList [specialCommaSep, docNodeAnnKW ltype (Just AnnOpenS) eN] + end = docLit $ Text.pack " ]" + in docSetBaseY $ docLines $ [start] ++ linesM ++ [lineN] ++ [end] ] HsExplicitTupleTy{} -> -- TODO briDocByExactInlineOnly "HsExplicitTupleTy{}" ltype @@ -585,7 +592,8 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of HsStrTy (SourceText srctext) _ -> docLit $ Text.pack srctext HsStrTy NoSourceText _ -> error "overLitValBriDoc: literal with no SourceText" - HsWildCardTy _ -> docLit $ Text.pack "_" + HsWildCardTy _ -> + docLit $ Text.pack "_" HsSumTy{} -> -- TODO briDocByExactInlineOnly "HsSumTy{}" ltype HsStarTy _ isUnicode -> do @@ -598,12 +606,14 @@ layoutType ltype@(L _ typ) = docWrapNode ltype $ case typ of k <- docSharedWrapper layoutType kind docAlt [ docSeq - [ docForceSingleline t - , docSeparator - , docLit $ Text.pack "@" - , docForceSingleline k - ] - , docPar t (docSeq [docLit $ Text.pack "@", k]) + [ docForceSingleline t + , docSeparator + , docLit $ Text.pack "@" + , docForceSingleline k + ] + , docPar + t + (docSeq [docLit $ Text.pack "@", k ]) ] layoutTyVarBndrs diff --git a/source/library/Language/Haskell/Brittany/Internal/Obfuscation.hs b/source/library/Language/Haskell/Brittany/Internal/Obfuscation.hs index b4785a5..29dc13c 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Obfuscation.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Obfuscation.hs @@ -2,24 +2,28 @@ module Language.Haskell.Brittany.Internal.Obfuscation where -import Data.Char + + +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Data.Map as Map import qualified Data.Set as Set import qualified Data.Text as Text import qualified GHC.OldList as List -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -import System.Random + +import Data.Char +import System.Random + + obfuscate :: Text -> IO Text obfuscate input = do let predi x = isAlphaNum x || x `elem` "_'" let groups = List.groupBy (\a b -> predi a && predi b) (Text.unpack input) let idents = Set.toList $ Set.fromList $ filter (all predi) groups - let - exceptionFilter x | x `elem` keywords = False - exceptionFilter x | x `elem` extraKWs = False - exceptionFilter x = not $ null $ drop 1 x + let exceptionFilter x | x `elem` keywords = False + exceptionFilter x | x `elem` extraKWs = False + exceptionFilter x = not $ null $ drop 1 x let filtered = filter exceptionFilter idents mappings <- fmap Map.fromList $ filtered `forM` \x -> do r <- createAlias x @@ -71,14 +75,14 @@ extraKWs = ["return", "pure", "Int", "True", "False", "otherwise"] createAlias :: String -> IO String createAlias xs = go NoHint xs where - go _hint "" = pure "" - go hint (c : cr) = do + go _hint "" = pure "" + go hint (c : cr) = do c' <- case hint of VocalHint | isUpper c -> randomFrom $ "AAAEEEOOOIIIUUU" ++ ['A' .. 'Z'] - _ | isUpper c -> randomFrom ['A' .. 'Z'] + _ | isUpper c -> randomFrom ['A' .. 'Z'] VocalHint | isLower c -> randomFrom $ "aaaeeeoooiiiuuu" ++ ['a' .. 'z'] - _ | isLower c -> randomFrom ['a' .. 'z'] - _ -> pure c + _ | isLower c -> randomFrom ['a' .. 'z'] + _ -> pure c cr' <- go (if c' `elem` "aeuioAEUIO" then NoVocalHint else VocalHint) cr pure (c' : cr') diff --git a/source/library/Language/Haskell/Brittany/Internal/Prelude.hs b/source/library/Language/Haskell/Brittany/Internal/Prelude.hs index 0790989..87a0c0a 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Prelude.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Prelude.hs @@ -1,195 +1,346 @@ -module Language.Haskell.Brittany.Internal.Prelude - ( module E - ) where +module Language.Haskell.Brittany.Internal.Prelude ( module E ) where -import GHC.Hs.Extension as E (GhcPs) -import GHC.Types.Name.Reader as E (RdrName) -import Control.Applicative as E (Alternative(..), Applicative(..)) -import Control.Arrow as E ((&&&), (***), (<<<), (>>>), first, second) -import Control.Concurrent as E (forkIO, forkOS, threadDelay) -import Control.Concurrent.Chan as E (Chan) -import Control.Concurrent.MVar as E - (MVar, newEmptyMVar, newMVar, putMVar, readMVar, swapMVar, takeMVar) -import Control.Exception as E (assert, bracket, evaluate) -import Control.Monad as E - ( (<$!>) - , (<=<) - , (=<<) - , (>=>) - , Functor(..) - , Monad(..) - , MonadPlus(..) - , filterM - , forM - , forM_ - , forever - , guard - , join - , liftM - , liftM2 - , liftM3 - , liftM4 - , liftM5 - , mapM - , mapM_ - , replicateM - , replicateM_ - , sequence - , sequence_ - , unless - , void - , when - ) -import Control.Monad.Extra as E - (allM, andM, anyM, ifM, notM, orM, unlessM, whenM) -import Control.Monad.IO.Class as E (MonadIO(..)) -import Control.Monad.ST as E (ST) -import Control.Monad.Trans.Class as E (lift) -import Control.Monad.Trans.Maybe as E (MaybeT(..)) -import Control.Monad.Trans.MultiRWS as E - (MonadMultiReader(..), MonadMultiState(..), MonadMultiWriter(..), mGet) -import Data.Bifunctor as E (bimap) -import Data.Bool as E (Bool(..)) -import Data.Char as E (Char, chr, ord) -import Data.Data as E (toConstr) -import Data.Either as E (Either(..), either) -import Data.Foldable as E (asum, fold, foldl', foldr') -import Data.Function as E ((&), fix) -import Data.Functor as E (($>)) -import Data.Functor.Identity as E (Identity(..)) -import Data.IORef as E (IORef) -import Data.Int as E (Int) -import Data.List as E - ( all - , break - , drop - , dropWhile - , elem - , filter - , find - , intercalate - , intersperse - , isPrefixOf - , isSuffixOf - , iterate - , length - , mapAccumL - , mapAccumR - , maximum - , minimum - , notElem - , nub - , null - , partition - , repeat - , replicate - , sortBy - , sum - , take - , takeWhile - , transpose - , uncons - , unzip - , zip - , zip3 - , zipWith - ) -import Data.List.Extra as E (nubOrd, stripSuffix) -import Data.List.NonEmpty as E (NonEmpty(..), nonEmpty) -import Data.Map as E (Map) -import Data.Maybe as E - (Maybe(..), catMaybes, fromMaybe, listToMaybe, maybe, maybeToList) -import Data.Monoid as E - ( All(..) - , Alt(..) - , Any(..) - , Endo(..) - , Monoid(..) - , Product(..) - , Sum(..) - , mconcat - ) -import Data.Ord as E (Down(..), Ordering(..), comparing) -import Data.Proxy as E (Proxy(..)) -import Data.Ratio as E ((%), Ratio, Rational, denominator, numerator) -import Data.Semigroup as E ((<>), Semigroup(..)) -import Data.Sequence as E (Seq) -import Data.Set as E (Set) -import Data.String as E (String) -import Data.Text as E (Text) -import Data.Tree as E (Tree(..)) -import Data.Tuple as E (swap) -import Data.Typeable as E (Typeable) -import Data.Version as E (showVersion) -import Data.Void as E (Void) -import Data.Word as E (Word, Word32) -import Debug.Trace as E - ( trace - , traceIO - , traceId - , traceM - , traceShow - , traceShowId - , traceShowM - , traceStack - ) -import Foreign.ForeignPtr as E (ForeignPtr) -import Foreign.Storable as E (Storable) -import GHC.Exts as E (Constraint) -import Prelude as E - ( ($) - , ($!) - , (&&) - , (++) - , (.) - , (<$>) - , Bounded(..) - , Double - , Enum(..) - , Eq(..) - , Float - , Floating(..) - , Foldable - , Fractional(..) - , Integer - , Integral(..) - , Num(..) - , Ord(..) - , RealFloat(..) - , RealFrac(..) - , Show(..) - , Traversable - , (^) - , and - , any - , const - , curry - , error - , flip - , foldl - , foldr - , foldr1 - , fromIntegral - , fst - , head - , id - , map - , not - , or - , otherwise - , print - , putStr - , putStrLn - , realToFrac - , reverse - , seq - , snd - , subtract - , traverse - , uncurry - , undefined - , (||) - ) -import System.IO as E (IO, hFlush, stdout) -import Text.Read as E (readMaybe) + +-- rather project-specific stuff: +--------------------------------- +import GHC.Hs.Extension as E ( GhcPs ) + +import GHC.Types.Name.Reader as E ( RdrName ) + + +-- more general: +---------------- + +import Data.Functor.Identity as E ( Identity(..) ) +import Control.Concurrent.Chan as E ( Chan ) +import Control.Concurrent.MVar as E ( MVar + , newEmptyMVar + , newMVar + , putMVar + , readMVar + , takeMVar + , swapMVar + ) +import Data.Int as E ( Int ) +import Data.Word as E ( Word + , Word32 + ) +import Prelude as E ( Integer + , Float + , Double + , undefined + , Eq (..) + , Ord (..) + , Enum (..) + , Bounded (..) + , (<$>) + , (.) + , ($) + , ($!) + , Num (..) + , Integral (..) + , Fractional (..) + , Floating (..) + , RealFrac (..) + , RealFloat (..) + , fromIntegral + , error + , foldr + , foldl + , foldr1 + , id + , map + , subtract + , putStrLn + , putStr + , Show (..) + , print + , fst + , snd + , (++) + , not + , (&&) + , (||) + , curry + , uncurry + , flip + , const + , seq + , reverse + , otherwise + , traverse + , realToFrac + , or + , and + , head + , any + , (^) + , Foldable + , Traversable + ) +import Control.Monad.ST as E ( ST ) +import Data.Bool as E ( Bool(..) ) +import Data.Char as E ( Char + , ord + , chr + ) +import Data.Either as E ( Either(..) + , either + ) +import Data.IORef as E ( IORef ) +import Data.Maybe as E ( Maybe(..) + , fromMaybe + , maybe + , listToMaybe + , maybeToList + , catMaybes + ) +import Data.Monoid as E ( Endo(..) + , All(..) + , Any(..) + , Sum(..) + , Product(..) + , Alt(..) + , mconcat + , Monoid (..) + ) +import Data.Ord as E ( Ordering(..) + , Down(..) + , comparing + ) +import Data.Ratio as E ( Ratio + , Rational + , (%) + , numerator + , denominator + ) +import Data.String as E ( String ) +import Data.Void as E ( Void ) +import System.IO as E ( IO + , hFlush + , stdout + ) +import Data.Proxy as E ( Proxy(..) ) +import Data.Sequence as E ( Seq ) + +import Data.Map as E ( Map ) +import Data.Set as E ( Set ) + +import Data.Text as E ( Text ) + +import Data.Function as E ( fix + , (&) + ) + +import Data.Foldable as E ( foldl' + , foldr' + , fold + , asum + ) + +import Data.List as E ( partition + , null + , elem + , notElem + , minimum + , maximum + , length + , all + , take + , drop + , find + , sum + , zip + , zip3 + , zipWith + , repeat + , replicate + , iterate + , nub + , filter + , intersperse + , intercalate + , isSuffixOf + , isPrefixOf + , dropWhile + , takeWhile + , unzip + , break + , transpose + , sortBy + , mapAccumL + , mapAccumR + , uncons + ) + +import Data.List.NonEmpty as E ( NonEmpty(..) + , nonEmpty + ) + +import Data.Tuple as E ( swap + ) + +import Text.Read as E ( readMaybe + ) + +import Control.Monad as E ( Functor (..) + , Monad (..) + , MonadPlus (..) + , mapM + , mapM_ + , forM + , forM_ + , sequence + , sequence_ + , (=<<) + , (>=>) + , (<=<) + , forever + , void + , join + , replicateM + , replicateM_ + , guard + , when + , unless + , liftM + , liftM2 + , liftM3 + , liftM4 + , liftM5 + , filterM + , (<$!>) + ) + +import Control.Applicative as E ( Applicative (..) + , Alternative (..) + ) + +import Foreign.Storable as E ( Storable ) +import GHC.Exts as E ( Constraint ) + +import Control.Concurrent as E ( threadDelay + , forkIO + , forkOS + ) + +import Control.Exception as E ( evaluate + , bracket + , assert + ) + +import Debug.Trace as E ( trace + , traceId + , traceShowId + , traceShow + , traceStack + , traceShowId + , traceIO + , traceM + , traceShowM + ) + +import Foreign.ForeignPtr as E ( ForeignPtr + ) + +import Data.Bifunctor as E ( bimap ) +import Data.Functor as E ( ($>) ) +import Data.Semigroup as E ( (<>) + , Semigroup(..) + ) + +import Data.Typeable as E ( Typeable + ) + +import Control.Arrow as E ( first + , second + , (***) + , (&&&) + , (>>>) + , (<<<) + ) + +import Data.Version as E ( showVersion + ) + +import Data.List.Extra as E ( nubOrd + , stripSuffix + ) +import Control.Monad.Extra as E ( whenM + , unlessM + , ifM + , notM + , orM + , andM + , anyM + , allM + ) + +import Data.Tree as E ( Tree(..) + ) + +import Control.Monad.Trans.MultiRWS as E ( -- MultiRWST (..) + -- , MultiRWSTNull + -- , MultiRWS + -- , + MonadMultiReader(..) + , MonadMultiWriter(..) + , MonadMultiState(..) + , mGet + -- , runMultiRWST + -- , runMultiRWSTASW + -- , runMultiRWSTW + -- , runMultiRWSTAW + -- , runMultiRWSTSW + -- , runMultiRWSTNil + -- , runMultiRWSTNil_ + -- , withMultiReader + -- , withMultiReader_ + -- , withMultiReaders + -- , withMultiReaders_ + -- , withMultiWriter + -- , withMultiWriterAW + -- , withMultiWriterWA + -- , withMultiWriterW + -- , withMultiWriters + -- , withMultiWritersAW + -- , withMultiWritersWA + -- , withMultiWritersW + -- , withMultiState + -- , withMultiStateAS + -- , withMultiStateSA + -- , withMultiStateA + -- , withMultiStateS + -- , withMultiState_ + -- , withMultiStates + -- , withMultiStatesAS + -- , withMultiStatesSA + -- , withMultiStatesA + -- , withMultiStatesS + -- , withMultiStates_ + -- , inflateReader + -- , inflateMultiReader + -- , inflateWriter + -- , inflateMultiWriter + -- , inflateState + -- , inflateMultiState + -- , mapMultiRWST + -- , mGetRawR + -- , mGetRawW + -- , mGetRawS + -- , mPutRawR + -- , mPutRawW + -- , mPutRawS + ) + +import Control.Monad.IO.Class as E ( MonadIO (..) + ) + +import Control.Monad.Trans.Class as E ( lift + ) +import Control.Monad.Trans.Maybe as E ( MaybeT (..) + ) + +import Data.Data as E ( toConstr + ) diff --git a/source/library/Language/Haskell/Brittany/Internal/PreludeUtils.hs b/source/library/Language/Haskell/Brittany/Internal/PreludeUtils.hs index fcfe303..cfaed43 100644 --- a/source/library/Language/Haskell/Brittany/Internal/PreludeUtils.hs +++ b/source/library/Language/Haskell/Brittany/Internal/PreludeUtils.hs @@ -1,15 +1,21 @@ {-# OPTIONS_GHC -fno-warn-orphans #-} module Language.Haskell.Brittany.Internal.PreludeUtils where -import Control.Applicative -import Control.DeepSeq (NFData, force) -import Control.Exception.Base (evaluate) -import Control.Monad + + +import Prelude import qualified Data.Strict.Maybe as Strict import Debug.Trace -import Prelude +import Control.Monad import System.IO +import Control.DeepSeq ( NFData, force ) +import Control.Exception.Base ( evaluate ) + +import Control.Applicative + + + instance Applicative Strict.Maybe where pure = Strict.Just Strict.Just f <*> Strict.Just x = Strict.Just (f x) @@ -24,12 +30,12 @@ instance Alternative Strict.Maybe where x <|> Strict.Nothing = x _ <|> x = x -traceFunctionWith - :: String -> (a -> String) -> (b -> String) -> (a -> b) -> (a -> b) +traceFunctionWith :: String -> (a -> String) -> (b -> String) -> (a -> b) -> (a -> b) traceFunctionWith name s1 s2 f x = trace traceStr y where y = f x - traceStr = name ++ "\nBEFORE:\n" ++ s1 x ++ "\nAFTER:\n" ++ s2 y + traceStr = + name ++ "\nBEFORE:\n" ++ s1 x ++ "\nAFTER:\n" ++ s2 y (<&!>) :: Monad m => m a -> (a -> b) -> m b (<&!>) = flip (<$!>) @@ -45,10 +51,10 @@ printErr = putStrErrLn . show errorIf :: Bool -> a -> a errorIf False = id -errorIf True = error "errorIf" +errorIf True = error "errorIf" errorIfNote :: Maybe String -> a -> a -errorIfNote Nothing = id +errorIfNote Nothing = id errorIfNote (Just x) = error x (<&>) :: Functor f => f a -> (a -> b) -> f b diff --git a/source/library/Language/Haskell/Brittany/Internal/Transformations/Alt.hs b/source/library/Language/Haskell/Brittany/Internal/Transformations/Alt.hs index 1fd3eb7..ca79995 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Transformations/Alt.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Transformations/Alt.hs @@ -9,18 +9,25 @@ module Language.Haskell.Brittany.Internal.Transformations.Alt where -import qualified Control.Monad.Memo as Memo + + +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS -import Data.HList.ContainsType import qualified Data.List.Extra import qualified Data.Semigroup as Semigroup import qualified Data.Text as Text import qualified GHC.OldList as List -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.Utils + +import Data.HList.ContainsType + +import Language.Haskell.Brittany.Internal.Utils +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Types + +import qualified Control.Monad.Memo as Memo + + data AltCurPos = AltCurPos { _acp_line :: Int -- chars in the current line @@ -28,7 +35,7 @@ data AltCurPos = AltCurPos , _acp_indentPrep :: Int -- indentChange affecting the next Par , _acp_forceMLFlag :: AltLineModeState } - deriving Show + deriving (Show) data AltLineModeState = AltLineModeStateNone @@ -39,19 +46,17 @@ data AltLineModeState deriving (Show) altLineModeRefresh :: AltLineModeState -> AltLineModeState -altLineModeRefresh AltLineModeStateNone = AltLineModeStateNone -altLineModeRefresh AltLineModeStateForceML{} = AltLineModeStateForceML False -altLineModeRefresh AltLineModeStateForceSL = AltLineModeStateForceSL -altLineModeRefresh AltLineModeStateContradiction = - AltLineModeStateContradiction +altLineModeRefresh AltLineModeStateNone = AltLineModeStateNone +altLineModeRefresh AltLineModeStateForceML{} = AltLineModeStateForceML False +altLineModeRefresh AltLineModeStateForceSL = AltLineModeStateForceSL +altLineModeRefresh AltLineModeStateContradiction = AltLineModeStateContradiction altLineModeDecay :: AltLineModeState -> AltLineModeState -altLineModeDecay AltLineModeStateNone = AltLineModeStateNone -altLineModeDecay (AltLineModeStateForceML False) = - AltLineModeStateForceML True -altLineModeDecay (AltLineModeStateForceML True) = AltLineModeStateNone -altLineModeDecay AltLineModeStateForceSL = AltLineModeStateForceSL -altLineModeDecay AltLineModeStateContradiction = AltLineModeStateContradiction +altLineModeDecay AltLineModeStateNone = AltLineModeStateNone +altLineModeDecay (AltLineModeStateForceML False) = AltLineModeStateForceML True +altLineModeDecay (AltLineModeStateForceML True ) = AltLineModeStateNone +altLineModeDecay AltLineModeStateForceSL = AltLineModeStateForceSL +altLineModeDecay AltLineModeStateContradiction = AltLineModeStateContradiction mergeLineMode :: AltCurPos -> AltLineModeState -> AltCurPos mergeLineMode acp s = case (_acp_forceMLFlag acp, s) of @@ -76,7 +81,7 @@ transformAlts = . Memo.startEvalMemoT . fmap unwrapBriDocNumbered . rec - where + where -- this function is exponential by nature and cannot be improved in any -- way i can think of, and i've tried. (stupid StableNames.) -- transWrap :: BriDoc -> BriDocNumbered @@ -114,246 +119,224 @@ transformAlts = - rec - :: BriDocNumbered - -> Memo.MemoT - Int - [VerticalSpacing] - (MultiRWSS.MultiRWS r w (AltCurPos ': s)) - BriDocNumbered - rec bdX@(brDcId, brDc) = do - let reWrap = (,) brDcId - -- debugAcp :: AltCurPos <- mGet - case brDc of - -- BDWrapAnnKey annKey bd -> do - -- acp <- mGet - -- mSet $ acp { _acp_forceMLFlag = altLineModeDecay $ _acp_forceMLFlag acp } - -- BDWrapAnnKey annKey <$> rec bd - BDFEmpty{} -> processSpacingSimple bdX $> bdX - BDFLit{} -> processSpacingSimple bdX $> bdX - BDFSeq list -> reWrap . BDFSeq <$> list `forM` rec - BDFCols sig list -> reWrap . BDFCols sig <$> list `forM` rec - BDFSeparator -> processSpacingSimple bdX $> bdX - BDFAddBaseY indent bd -> do - acp <- mGet - indAdd <- fixIndentationForMultiple acp indent - mSet $ acp { _acp_indentPrep = max (_acp_indentPrep acp) indAdd } - r <- rec bd - acp' <- mGet - mSet $ acp' { _acp_indent = _acp_indent acp } - return $ case indent of - BrIndentNone -> r - BrIndentRegular -> reWrap $ BDFAddBaseY (BrIndentSpecial indAdd) r - BrIndentSpecial i -> reWrap $ BDFAddBaseY (BrIndentSpecial i) r - BDFBaseYPushCur bd -> do - acp <- mGet - mSet $ acp { _acp_indent = _acp_line acp } - r <- rec bd - return $ reWrap $ BDFBaseYPushCur r - BDFBaseYPop bd -> do - acp <- mGet - r <- rec bd - acp' <- mGet - mSet $ acp' { _acp_indent = _acp_indentPrep acp } - return $ reWrap $ BDFBaseYPop r - BDFIndentLevelPushCur bd -> do - reWrap . BDFIndentLevelPushCur <$> rec bd - BDFIndentLevelPop bd -> do - reWrap . BDFIndentLevelPop <$> rec bd - BDFPar indent sameLine indented -> do - indAmount <- - mAsk <&> _conf_layout .> _lconfig_indentAmount .> confUnpack - let - indAdd = case indent of - BrIndentNone -> 0 - BrIndentRegular -> indAmount - BrIndentSpecial i -> i - acp <- mGet - let ind = _acp_indent acp + _acp_indentPrep acp + indAdd - mSet $ acp { _acp_indent = ind, _acp_indentPrep = 0 } - sameLine' <- rec sameLine - mModify $ \acp' -> acp' { _acp_line = ind, _acp_indent = ind } - indented' <- rec indented - return $ reWrap $ BDFPar indent sameLine' indented' - BDFAlt [] -> error "empty BDAlt" -- returning BDEmpty instead is a - -- possibility, but i will prefer a - -- fail-early approach; BDEmpty does not - -- make sense semantically for Alt[]. - BDFAlt alts -> do - altChooser <- - mAsk <&> _conf_layout .> _lconfig_altChooser .> confUnpack - case altChooser of - AltChooserSimpleQuick -> do - rec $ head alts - AltChooserShallowBest -> do - spacings <- alts `forM` getSpacing - acp <- mGet - let - lineCheck LineModeInvalid = False - lineCheck (LineModeValid (VerticalSpacing _ p _)) = - case _acp_forceMLFlag acp of - AltLineModeStateNone -> True - AltLineModeStateForceSL{} -> p == VerticalSpacingParNone - AltLineModeStateForceML{} -> p /= VerticalSpacingParNone - AltLineModeStateContradiction -> False - -- TODO: use COMPLETE pragma instead? - lineCheck _ = error "ghc exhaustive check is insufficient" - lconf <- _conf_layout <$> mAsk - let - options = -- trace ("considering options:" ++ show (length alts, acp)) $ - (zip spacings alts - <&> \(vs, bd) -> -- trace ("spacing=" ++ show vs ++ ",hasSpace=" ++ show (hasSpace lconf acp vs) ++ ",lineCheck=" ++ show (lineCheck vs)) - (hasSpace1 lconf acp vs && lineCheck vs, bd) - ) - rec - $ fromMaybe (-- trace ("choosing last") $ - List.last alts) - $ Data.List.Extra.firstJust - (\(_i :: Int, (b, x)) -> - [ -- traceShow ("choosing option " ++ show i) $ - x - | b - ] - ) - $ zip [1 ..] options - AltChooserBoundedSearch limit -> do - spacings <- alts `forM` getSpacings limit - acp <- mGet - let - lineCheck (VerticalSpacing _ p _) = case _acp_forceMLFlag acp of - AltLineModeStateNone -> True - AltLineModeStateForceSL{} -> p == VerticalSpacingParNone - AltLineModeStateForceML{} -> p /= VerticalSpacingParNone - AltLineModeStateContradiction -> False - lconf <- _conf_layout <$> mAsk - let - options = -- trace ("considering options:" ++ show (length alts, acp)) $ - (zip spacings alts - <&> \(vs, bd) -> -- trace ("spacing=" ++ show vs ++ ",hasSpace=" ++ show (hasSpace lconf acp vs) ++ ",lineCheck=" ++ show (lineCheck vs)) - (any (hasSpace2 lconf acp) vs && any lineCheck vs, bd) - ) - let - checkedOptions :: [Maybe (Int, BriDocNumbered)] = - zip [1 ..] options <&> (\(i, (b, x)) -> [ (i, x) | b ]) - rec - $ fromMaybe (-- trace ("choosing last") $ - List.last alts) - $ Data.List.Extra.firstJust (fmap snd) checkedOptions - BDFForceMultiline bd -> do - acp <- mGet - x <- do - mSet $ mergeLineMode acp (AltLineModeStateForceML False) - rec bd - acp' <- mGet - mSet $ acp' { _acp_forceMLFlag = _acp_forceMLFlag acp } - return $ x - BDFForceSingleline bd -> do - acp <- mGet - x <- do - mSet $ mergeLineMode acp AltLineModeStateForceSL - rec bd - acp' <- mGet - mSet $ acp' { _acp_forceMLFlag = _acp_forceMLFlag acp } - return $ x - BDFForwardLineMode bd -> do - acp <- mGet - x <- do + rec :: BriDocNumbered -> Memo.MemoT Int [VerticalSpacing] (MultiRWSS.MultiRWS r w (AltCurPos ': s)) BriDocNumbered + rec bdX@(brDcId, brDc) = do + let reWrap = (,) brDcId + -- debugAcp :: AltCurPos <- mGet + case brDc of + -- BDWrapAnnKey annKey bd -> do + -- acp <- mGet + -- mSet $ acp { _acp_forceMLFlag = altLineModeDecay $ _acp_forceMLFlag acp } + -- BDWrapAnnKey annKey <$> rec bd + BDFEmpty{} -> processSpacingSimple bdX $> bdX + BDFLit{} -> processSpacingSimple bdX $> bdX + BDFSeq list -> + reWrap . BDFSeq <$> list `forM` rec + BDFCols sig list -> + reWrap . BDFCols sig <$> list `forM` rec + BDFSeparator -> processSpacingSimple bdX $> bdX + BDFAddBaseY indent bd -> do + acp <- mGet + indAdd <- fixIndentationForMultiple acp indent + mSet $ acp { _acp_indentPrep = max (_acp_indentPrep acp) indAdd } + r <- rec bd + acp' <- mGet + mSet $ acp' { _acp_indent = _acp_indent acp } + return $ case indent of + BrIndentNone -> r + BrIndentRegular -> reWrap $ BDFAddBaseY (BrIndentSpecial indAdd) r + BrIndentSpecial i -> reWrap $ BDFAddBaseY (BrIndentSpecial i) r + BDFBaseYPushCur bd -> do + acp <- mGet + mSet $ acp { _acp_indent = _acp_line acp } + r <- rec bd + return $ reWrap $ BDFBaseYPushCur r + BDFBaseYPop bd -> do + acp <- mGet + r <- rec bd + acp' <- mGet + mSet $ acp' { _acp_indent = _acp_indentPrep acp } + return $ reWrap $ BDFBaseYPop r + BDFIndentLevelPushCur bd -> do + reWrap . BDFIndentLevelPushCur <$> rec bd + BDFIndentLevelPop bd -> do + reWrap . BDFIndentLevelPop <$> rec bd + BDFPar indent sameLine indented -> do + indAmount <- mAsk <&> _conf_layout .> _lconfig_indentAmount .> confUnpack + let indAdd = case indent of + BrIndentNone -> 0 + BrIndentRegular -> indAmount + BrIndentSpecial i -> i + acp <- mGet + let ind = _acp_indent acp + _acp_indentPrep acp + indAdd mSet $ acp - { _acp_forceMLFlag = altLineModeRefresh $ _acp_forceMLFlag acp + { _acp_indent = ind + , _acp_indentPrep = 0 } - rec bd - acp' <- mGet - mSet $ acp' { _acp_forceMLFlag = _acp_forceMLFlag acp } - return $ x - BDFExternal{} -> processSpacingSimple bdX $> bdX - BDFPlain{} -> processSpacingSimple bdX $> bdX - BDFAnnotationPrior annKey bd -> do + sameLine' <- rec sameLine + mModify $ \acp' -> acp' + { _acp_line = ind + , _acp_indent = ind + } + indented' <- rec indented + return $ reWrap $ BDFPar indent sameLine' indented' + BDFAlt [] -> error "empty BDAlt" -- returning BDEmpty instead is a + -- possibility, but i will prefer a + -- fail-early approach; BDEmpty does not + -- make sense semantically for Alt[]. + BDFAlt alts -> do + altChooser <- mAsk <&> _conf_layout .> _lconfig_altChooser .> confUnpack + case altChooser of + AltChooserSimpleQuick -> do + rec $ head alts + AltChooserShallowBest -> do + spacings <- alts `forM` getSpacing + acp <- mGet + let lineCheck LineModeInvalid = False + lineCheck (LineModeValid (VerticalSpacing _ p _)) = + case _acp_forceMLFlag acp of + AltLineModeStateNone -> True + AltLineModeStateForceSL{} -> p == VerticalSpacingParNone + AltLineModeStateForceML{} -> p /= VerticalSpacingParNone + AltLineModeStateContradiction -> False + -- TODO: use COMPLETE pragma instead? + lineCheck _ = error "ghc exhaustive check is insufficient" + lconf <- _conf_layout <$> mAsk + let options = -- trace ("considering options:" ++ show (length alts, acp)) $ + (zip spacings alts + <&> \(vs, bd) -> -- trace ("spacing=" ++ show vs ++ ",hasSpace=" ++ show (hasSpace lconf acp vs) ++ ",lineCheck=" ++ show (lineCheck vs)) + ( hasSpace1 lconf acp vs && lineCheck vs, bd)) + rec + $ fromMaybe (-- trace ("choosing last") $ + List.last alts) + $ Data.List.Extra.firstJust (\(_i::Int, (b,x)) -> + [ -- traceShow ("choosing option " ++ show i) $ + x + | b + ]) + $ zip [1..] options + AltChooserBoundedSearch limit -> do + spacings <- alts `forM` getSpacings limit + acp <- mGet + let lineCheck (VerticalSpacing _ p _) = + case _acp_forceMLFlag acp of + AltLineModeStateNone -> True + AltLineModeStateForceSL{} -> p == VerticalSpacingParNone + AltLineModeStateForceML{} -> p /= VerticalSpacingParNone + AltLineModeStateContradiction -> False + lconf <- _conf_layout <$> mAsk + let options = -- trace ("considering options:" ++ show (length alts, acp)) $ + (zip spacings alts + <&> \(vs, bd) -> -- trace ("spacing=" ++ show vs ++ ",hasSpace=" ++ show (hasSpace lconf acp vs) ++ ",lineCheck=" ++ show (lineCheck vs)) + ( any (hasSpace2 lconf acp) vs + && any lineCheck vs, bd)) + let checkedOptions :: [Maybe (Int, BriDocNumbered)] = + zip [1..] options <&> (\(i, (b,x)) -> [ (i, x) | b ]) + rec + $ fromMaybe (-- trace ("choosing last") $ + List.last alts) + $ Data.List.Extra.firstJust (fmap snd) checkedOptions + BDFForceMultiline bd -> do + acp <- mGet + x <- do + mSet $ mergeLineMode acp (AltLineModeStateForceML False) + rec bd + acp' <- mGet + mSet $ acp' { _acp_forceMLFlag = _acp_forceMLFlag acp } + return $ x + BDFForceSingleline bd -> do + acp <- mGet + x <- do + mSet $ mergeLineMode acp AltLineModeStateForceSL + rec bd + acp' <- mGet + mSet $ acp' { _acp_forceMLFlag = _acp_forceMLFlag acp } + return $ x + BDFForwardLineMode bd -> do + acp <- mGet + x <- do + mSet $ acp { _acp_forceMLFlag = altLineModeRefresh $ _acp_forceMLFlag acp } + rec bd + acp' <- mGet + mSet $ acp' { _acp_forceMLFlag = _acp_forceMLFlag acp } + return $ x + BDFExternal{} -> processSpacingSimple bdX $> bdX + BDFPlain{} -> processSpacingSimple bdX $> bdX + BDFAnnotationPrior annKey bd -> do + acp <- mGet + mSet $ acp { _acp_forceMLFlag = altLineModeDecay $ _acp_forceMLFlag acp } + bd' <- rec bd + return $ reWrap $ BDFAnnotationPrior annKey bd' + BDFAnnotationRest annKey bd -> + reWrap . BDFAnnotationRest annKey <$> rec bd + BDFAnnotationKW annKey kw bd -> + reWrap . BDFAnnotationKW annKey kw <$> rec bd + BDFMoveToKWDP annKey kw b bd -> + reWrap . BDFMoveToKWDP annKey kw b <$> rec bd + BDFLines [] -> return $ reWrap BDFEmpty -- evil transformation. or harmless. + BDFLines (l:lr) -> do + ind <- _acp_indent <$> mGet + l' <- rec l + lr' <- lr `forM` \x -> do + mModify $ \acp -> acp + { _acp_line = ind + , _acp_indent = ind + } + rec x + return $ reWrap $ BDFLines (l':lr') + BDFEnsureIndent indent bd -> do + acp <- mGet + indAdd <- fixIndentationForMultiple acp indent + mSet $ acp + { _acp_indentPrep = 0 + -- TODO: i am not sure this is valid, in general. + , _acp_indent = _acp_indent acp + indAdd + , _acp_line = max (_acp_line acp) (_acp_indent acp + indAdd) + -- we cannot use just _acp_line acp + indAdd because of the case + -- where there are multiple BDFEnsureIndents in the same line. + -- Then, the actual indentation is relative to the current + -- indentation, not the current cursor position. + } + r <- rec bd + acp' <- mGet + mSet $ acp' { _acp_indent = _acp_indent acp } + return $ case indent of + BrIndentNone -> r + BrIndentRegular -> reWrap $ BDFEnsureIndent (BrIndentSpecial indAdd) r + BrIndentSpecial i -> reWrap $ BDFEnsureIndent (BrIndentSpecial i) r + BDFNonBottomSpacing _ bd -> rec bd + BDFSetParSpacing bd -> rec bd + BDFForceParSpacing bd -> rec bd + BDFDebug s bd -> do + acp :: AltCurPos <- mGet + tellDebugMess $ "transformAlts: BDFDEBUG " ++ s ++ " (node-id=" ++ show brDcId ++ "): acp=" ++ show acp + reWrap . BDFDebug s <$> rec bd + processSpacingSimple + :: ( MonadMultiReader Config m + , MonadMultiState AltCurPos m + , MonadMultiWriter (Seq String) m + ) + => BriDocNumbered + -> m () + processSpacingSimple bd = getSpacing bd >>= \case + LineModeInvalid -> error "processSpacingSimple inv" + LineModeValid (VerticalSpacing i VerticalSpacingParNone _) -> do acp <- mGet - mSet $ acp - { _acp_forceMLFlag = altLineModeDecay $ _acp_forceMLFlag acp - } - bd' <- rec bd - return $ reWrap $ BDFAnnotationPrior annKey bd' - BDFAnnotationRest annKey bd -> - reWrap . BDFAnnotationRest annKey <$> rec bd - BDFAnnotationKW annKey kw bd -> - reWrap . BDFAnnotationKW annKey kw <$> rec bd - BDFMoveToKWDP annKey kw b bd -> - reWrap . BDFMoveToKWDP annKey kw b <$> rec bd - BDFLines [] -> return $ reWrap BDFEmpty -- evil transformation. or harmless. - BDFLines (l : lr) -> do - ind <- _acp_indent <$> mGet - l' <- rec l - lr' <- lr `forM` \x -> do - mModify $ \acp -> acp { _acp_line = ind, _acp_indent = ind } - rec x - return $ reWrap $ BDFLines (l' : lr') - BDFEnsureIndent indent bd -> do - acp <- mGet - indAdd <- fixIndentationForMultiple acp indent - mSet $ acp - { _acp_indentPrep = 0 - -- TODO: i am not sure this is valid, in general. - , _acp_indent = _acp_indent acp + indAdd - , _acp_line = max (_acp_line acp) (_acp_indent acp + indAdd) - -- we cannot use just _acp_line acp + indAdd because of the case - -- where there are multiple BDFEnsureIndents in the same line. - -- Then, the actual indentation is relative to the current - -- indentation, not the current cursor position. - } - r <- rec bd - acp' <- mGet - mSet $ acp' { _acp_indent = _acp_indent acp } - return $ case indent of - BrIndentNone -> r - BrIndentRegular -> - reWrap $ BDFEnsureIndent (BrIndentSpecial indAdd) r - BrIndentSpecial i -> reWrap $ BDFEnsureIndent (BrIndentSpecial i) r - BDFNonBottomSpacing _ bd -> rec bd - BDFSetParSpacing bd -> rec bd - BDFForceParSpacing bd -> rec bd - BDFDebug s bd -> do - acp :: AltCurPos <- mGet - tellDebugMess - $ "transformAlts: BDFDEBUG " - ++ s - ++ " (node-id=" - ++ show brDcId - ++ "): acp=" - ++ show acp - reWrap . BDFDebug s <$> rec bd - processSpacingSimple - :: ( MonadMultiReader Config m - , MonadMultiState AltCurPos m - , MonadMultiWriter (Seq String) m - ) - => BriDocNumbered - -> m () - processSpacingSimple bd = getSpacing bd >>= \case - LineModeInvalid -> error "processSpacingSimple inv" - LineModeValid (VerticalSpacing i VerticalSpacingParNone _) -> do - acp <- mGet - mSet $ acp { _acp_line = _acp_line acp + i } - LineModeValid VerticalSpacing{} -> error "processSpacingSimple par" - _ -> error "ghc exhaustive check is insufficient" - hasSpace1 - :: LayoutConfig -> AltCurPos -> LineModeValidity VerticalSpacing -> Bool - hasSpace1 _ _ LineModeInvalid = False - hasSpace1 lconf acp (LineModeValid vs) = hasSpace2 lconf acp vs - hasSpace1 _ _ _ = error "ghc exhaustive check is insufficient" - hasSpace2 :: LayoutConfig -> AltCurPos -> VerticalSpacing -> Bool - hasSpace2 lconf (AltCurPos line _indent _ _) (VerticalSpacing sameLine VerticalSpacingParNone _) - = line + sameLine <= confUnpack (_lconfig_cols lconf) - hasSpace2 lconf (AltCurPos line indent indentPrep _) (VerticalSpacing sameLine (VerticalSpacingParSome par) _) - = line - + sameLine - <= confUnpack (_lconfig_cols lconf) - && indent - + indentPrep - + par - <= confUnpack (_lconfig_cols lconf) - hasSpace2 lconf (AltCurPos line _indent _ _) (VerticalSpacing sameLine VerticalSpacingParAlways{} _) - = line + sameLine <= confUnpack (_lconfig_cols lconf) + mSet $ acp { _acp_line = _acp_line acp + i } + LineModeValid VerticalSpacing{} -> error "processSpacingSimple par" + _ -> error "ghc exhaustive check is insufficient" + hasSpace1 :: LayoutConfig -> AltCurPos -> LineModeValidity VerticalSpacing -> Bool + hasSpace1 _ _ LineModeInvalid = False + hasSpace1 lconf acp (LineModeValid vs) = hasSpace2 lconf acp vs + hasSpace1 _ _ _ = error "ghc exhaustive check is insufficient" + hasSpace2 :: LayoutConfig -> AltCurPos -> VerticalSpacing -> Bool + hasSpace2 lconf (AltCurPos line _indent _ _) (VerticalSpacing sameLine VerticalSpacingParNone _) + = line + sameLine <= confUnpack (_lconfig_cols lconf) + hasSpace2 lconf (AltCurPos line indent indentPrep _) (VerticalSpacing sameLine (VerticalSpacingParSome par) _) + = line + sameLine <= confUnpack (_lconfig_cols lconf) + && indent + indentPrep + par <= confUnpack (_lconfig_cols lconf) + hasSpace2 lconf (AltCurPos line _indent _ _) (VerticalSpacing sameLine VerticalSpacingParAlways{} _) + = line + sameLine <= confUnpack (_lconfig_cols lconf) getSpacing :: forall m @@ -370,11 +353,10 @@ getSpacing !bridoc = rec bridoc -- BDWrapAnnKey _annKey bd -> rec bd BDFEmpty -> return $ LineModeValid $ VerticalSpacing 0 VerticalSpacingParNone False - BDFLit t -> return $ LineModeValid $ VerticalSpacing - (Text.length t) - VerticalSpacingParNone - False - BDFSeq list -> sumVs <$> rec `mapM` list + BDFLit t -> + return $ LineModeValid $ VerticalSpacing (Text.length t) VerticalSpacingParNone False + BDFSeq list -> + sumVs <$> rec `mapM` list BDFCols _sig list -> sumVs <$> rec `mapM` list BDFSeparator -> return $ LineModeValid $ VerticalSpacing 1 VerticalSpacingParNone False @@ -382,28 +364,22 @@ getSpacing !bridoc = rec bridoc mVs <- rec bd return $ mVs <&> \vs -> vs { _vs_paragraph = case _vs_paragraph vs of - VerticalSpacingParNone -> VerticalSpacingParNone - VerticalSpacingParAlways i -> - VerticalSpacingParAlways $ case indent of - BrIndentNone -> i - BrIndentRegular -> - i - + (confUnpack - $ _lconfig_indentAmount - $ _conf_layout - $ config - ) + VerticalSpacingParNone -> VerticalSpacingParNone + VerticalSpacingParAlways i -> VerticalSpacingParAlways $ case indent of + BrIndentNone -> i + BrIndentRegular -> i + ( confUnpack + $ _lconfig_indentAmount + $ _conf_layout + $ config + ) BrIndentSpecial j -> i + j - VerticalSpacingParSome i -> - VerticalSpacingParSome $ case indent of - BrIndentNone -> i - BrIndentRegular -> - i - + (confUnpack - $ _lconfig_indentAmount - $ _conf_layout - $ config - ) + VerticalSpacingParSome i -> VerticalSpacingParSome $ case indent of + BrIndentNone -> i + BrIndentRegular -> i + ( confUnpack + $ _lconfig_indentAmount + $ _conf_layout + $ config + ) BrIndentSpecial j -> i + j } BDFBaseYPushCur bd -> do @@ -414,13 +390,11 @@ getSpacing !bridoc = rec bridoc -- the reason is that we really want to _keep_ it Just if it is -- just so we properly communicate the is-multiline fact. -- An alternative would be setting to (Just 0). - { _vs_sameLine = max - (_vs_sameLine vs) - (case _vs_paragraph vs of - VerticalSpacingParNone -> 0 - VerticalSpacingParSome i -> i - VerticalSpacingParAlways i -> min colMax i - ) + { _vs_sameLine = max (_vs_sameLine vs) + (case _vs_paragraph vs of + VerticalSpacingParNone -> 0 + VerticalSpacingParSome i -> i + VerticalSpacingParAlways i -> min colMax i) , _vs_paragraph = VerticalSpacingParSome 0 } BDFBaseYPop bd -> rec bd @@ -434,104 +408,86 @@ getSpacing !bridoc = rec bridoc | VerticalSpacing lsp mPsp _ <- mVs , indSp <- mIndSp , lineMax <- getMaxVS $ mIndSp - , let - pspResult = case mPsp of - VerticalSpacingParSome psp -> - VerticalSpacingParSome $ max psp lineMax - VerticalSpacingParNone -> VerticalSpacingParSome $ lineMax - VerticalSpacingParAlways psp -> - VerticalSpacingParAlways $ max psp lineMax - , let - parFlagResult = - mPsp - == VerticalSpacingParNone - && _vs_paragraph indSp - == VerticalSpacingParNone - && _vs_parFlag indSp + , let pspResult = case mPsp of + VerticalSpacingParSome psp -> VerticalSpacingParSome $ max psp lineMax + VerticalSpacingParNone -> VerticalSpacingParSome $ lineMax + VerticalSpacingParAlways psp -> VerticalSpacingParAlways $ max psp lineMax + , let parFlagResult = mPsp == VerticalSpacingParNone + && _vs_paragraph indSp == VerticalSpacingParNone + && _vs_parFlag indSp ] BDFPar{} -> error "BDPar with indent in getSpacing" BDFAlt [] -> error "empty BDAlt" - BDFAlt (alt : _) -> rec alt - BDFForceMultiline bd -> do + BDFAlt (alt:_) -> rec alt + BDFForceMultiline bd -> do mVs <- rec bd return $ mVs >>= _vs_paragraph .> \case VerticalSpacingParNone -> LineModeInvalid - _ -> mVs + _ -> mVs BDFForceSingleline bd -> do mVs <- rec bd return $ mVs >>= _vs_paragraph .> \case VerticalSpacingParNone -> mVs - _ -> LineModeInvalid + _ -> LineModeInvalid BDFForwardLineMode bd -> rec bd BDFExternal _ _ _ txt -> return $ LineModeValid $ case Text.lines txt of [t] -> VerticalSpacing (Text.length t) VerticalSpacingParNone False - _ -> VerticalSpacing 999 VerticalSpacingParNone False + _ -> VerticalSpacing 999 VerticalSpacingParNone False BDFPlain txt -> return $ LineModeValid $ case Text.lines txt of [t] -> VerticalSpacing (Text.length t) VerticalSpacingParNone False - _ -> VerticalSpacing 999 VerticalSpacingParNone False + _ -> VerticalSpacing 999 VerticalSpacingParNone False BDFAnnotationPrior _annKey bd -> rec bd BDFAnnotationKW _annKey _kw bd -> rec bd - BDFAnnotationRest _annKey bd -> rec bd + BDFAnnotationRest _annKey bd -> rec bd BDFMoveToKWDP _annKey _kw _b bd -> rec bd - BDFLines [] -> - return $ LineModeValid $ VerticalSpacing 0 VerticalSpacingParNone False - BDFLines ls@(_ : _) -> do + BDFLines [] -> return + $ LineModeValid + $ VerticalSpacing 0 VerticalSpacingParNone False + BDFLines ls@(_:_) -> do lSps <- rec `mapM` ls - let (mVs : _) = lSps -- separated into let to avoid MonadFail - return - $ [ VerticalSpacing lsp (VerticalSpacingParSome $ lineMax) False - | VerticalSpacing lsp _ _ <- mVs - , lineMax <- getMaxVS $ maxVs $ lSps - ] + let (mVs:_) = lSps -- separated into let to avoid MonadFail + return $ [ VerticalSpacing lsp (VerticalSpacingParSome $ lineMax) False + | VerticalSpacing lsp _ _ <- mVs + , lineMax <- getMaxVS $ maxVs $ lSps + ] BDFEnsureIndent indent bd -> do mVs <- rec bd - let - addInd = case indent of - BrIndentNone -> 0 - BrIndentRegular -> - confUnpack $ _lconfig_indentAmount $ _conf_layout $ config - BrIndentSpecial i -> i + let addInd = case indent of + BrIndentNone -> 0 + BrIndentRegular -> confUnpack + $ _lconfig_indentAmount + $ _conf_layout + $ config + BrIndentSpecial i -> i return $ mVs <&> \(VerticalSpacing lsp psp pf) -> VerticalSpacing (lsp + addInd) psp pf BDFNonBottomSpacing b bd -> do mVs <- rec bd - return $ mVs <|> LineModeValid - (VerticalSpacing - 0 - (if b - then VerticalSpacingParSome 0 - else VerticalSpacingParAlways colMax - ) - False - ) + return + $ mVs + <|> LineModeValid + (VerticalSpacing + 0 + (if b then VerticalSpacingParSome 0 + else VerticalSpacingParAlways colMax + ) + False + ) BDFSetParSpacing bd -> do mVs <- rec bd return $ mVs <&> \vs -> vs { _vs_parFlag = True } BDFForceParSpacing bd -> do mVs <- rec bd - return - $ [ vs - | vs <- mVs - , _vs_parFlag vs || _vs_paragraph vs == VerticalSpacingParNone - ] + return $ [ vs | vs <- mVs, _vs_parFlag vs || _vs_paragraph vs == VerticalSpacingParNone ] BDFDebug s bd -> do r <- rec bd - tellDebugMess - $ "getSpacing: BDFDebug " - ++ show s - ++ " (node-id=" - ++ show brDcId - ++ "): mVs=" - ++ show r + tellDebugMess $ "getSpacing: BDFDebug " ++ show s ++ " (node-id=" ++ show brDcId ++ "): mVs=" ++ show r return r return result - maxVs - :: [LineModeValidity VerticalSpacing] -> LineModeValidity VerticalSpacing + maxVs :: [LineModeValidity VerticalSpacing] -> LineModeValidity VerticalSpacing maxVs = foldl' - (liftM2 - (\(VerticalSpacing x1 x2 _) (VerticalSpacing y1 y2 _) -> VerticalSpacing - (max x1 y1) - (case (x2, y2) of + (liftM2 (\(VerticalSpacing x1 x2 _) (VerticalSpacing y1 y2 _) -> + VerticalSpacing (max x1 y1) (case (x2, y2) of (x, VerticalSpacingParNone) -> x (VerticalSpacingParNone, x) -> x (VerticalSpacingParAlways i, VerticalSpacingParAlways j) -> @@ -541,14 +497,9 @@ getSpacing !bridoc = rec bridoc (VerticalSpacingParSome j, VerticalSpacingParAlways i) -> VerticalSpacingParAlways $ max i j (VerticalSpacingParSome x, VerticalSpacingParSome y) -> - VerticalSpacingParSome $ max x y - ) - False - ) - ) + VerticalSpacingParSome $ max x y) False)) (LineModeValid $ VerticalSpacing 0 VerticalSpacingParNone False) - sumVs - :: [LineModeValidity VerticalSpacing] -> LineModeValidity VerticalSpacing + sumVs :: [LineModeValidity VerticalSpacing] -> LineModeValidity VerticalSpacing sumVs sps = foldl' (liftM2 go) initial sps where go (VerticalSpacing x1 x2 x3) (VerticalSpacing y1 y2 _) = VerticalSpacing @@ -557,19 +508,18 @@ getSpacing !bridoc = rec bridoc (x, VerticalSpacingParNone) -> x (VerticalSpacingParNone, x) -> x (VerticalSpacingParAlways i, VerticalSpacingParAlways j) -> - VerticalSpacingParAlways $ i + j + VerticalSpacingParAlways $ i+j (VerticalSpacingParAlways i, VerticalSpacingParSome j) -> - VerticalSpacingParAlways $ i + j + VerticalSpacingParAlways $ i+j (VerticalSpacingParSome i, VerticalSpacingParAlways j) -> - VerticalSpacingParAlways $ i + j + VerticalSpacingParAlways $ i+j (VerticalSpacingParSome x, VerticalSpacingParSome y) -> - VerticalSpacingParSome $ x + y - ) + VerticalSpacingParSome $ x + y) x3 singleline (LineModeValid x) = _vs_paragraph x == VerticalSpacingParNone - singleline _ = False + singleline _ = False isPar (LineModeValid x) = _vs_parFlag x - isPar _ = False + isPar _ = False parFlag = case sps of [] -> True _ -> all singleline (List.init sps) && isPar (List.last sps) @@ -589,395 +539,374 @@ getSpacings -> BriDocNumbered -> Memo.MemoT Int [VerticalSpacing] m [VerticalSpacing] getSpacings limit bridoc = preFilterLimit <$> rec bridoc - where + where -- when we do `take K . filter someCondition` on a list of spacings, we -- need to first (also) limit the size of the input list, otherwise a -- _large_ input with a similarly _large_ prefix not passing our filtering -- process could lead to exponential runtime behaviour. -- TODO: 3 is arbitrary. - preFilterLimit :: [VerticalSpacing] -> [VerticalSpacing] - preFilterLimit = take (3 * limit) - memoWithKey :: Memo.MonadMemo k v m1 => k -> m1 v -> m1 v - memoWithKey k v = Memo.memo (const v) k - rec - :: BriDocNumbered -> Memo.MemoT Int [VerticalSpacing] m [VerticalSpacing] - rec (brDcId, brdc) = memoWithKey brDcId $ do - config <- mAsk - let colMax = config & _conf_layout & _lconfig_cols & confUnpack - let - hasOkColCount (VerticalSpacing lsp psp _) = - lsp <= colMax && case psp of - VerticalSpacingParNone -> True - VerticalSpacingParSome i -> i <= colMax - VerticalSpacingParAlways{} -> True - let - specialCompare vs1 vs2 = - if ((_vs_sameLine vs1 == _vs_sameLine vs2) - && (_vs_parFlag vs1 == _vs_parFlag vs2) - ) - then case (_vs_paragraph vs1, _vs_paragraph vs2) of - (VerticalSpacingParAlways i1, VerticalSpacingParAlways i2) -> - if i1 < i2 then Smaller else Bigger - (p1, p2) -> if p1 == p2 then Smaller else Unequal - else Unequal - let - allowHangingQuasiQuotes = - config & _conf_layout & _lconfig_allowHangingQuasiQuotes & confUnpack - let -- this is like List.nub, with one difference: if two elements - -- are unequal only in _vs_paragraph, with both ParAlways, we - -- treat them like equals and replace the first occurence with the - -- smallest member of this "equal group". - specialNub :: [VerticalSpacing] -> [VerticalSpacing] - specialNub [] = [] - specialNub (x1 : xr) = case go x1 xr of - (r, xs') -> r : specialNub xs' - where - go y1 [] = (y1, []) - go y1 (y2 : yr) = case specialCompare y1 y2 of - Unequal -> let (r, yr') = go y1 yr in (r, y2 : yr') - Smaller -> go y1 yr - Bigger -> go y2 yr - let -- the standard function used to enforce a constant upper bound - -- on the number of elements returned for each node. Should be - -- applied whenever in a parent the combination of spacings from - -- its children might cause excess of the upper bound. - filterAndLimit :: [VerticalSpacing] -> [VerticalSpacing] - filterAndLimit = - take limit - -- prune so we always consider a constant - -- amount of spacings per node of the BriDoc. - . specialNub - -- In the end we want to know if there is at least - -- one valid spacing for any alternative. - -- If there are duplicates in the list, then these - -- will either all be valid (so having more than the - -- first is pointless) or all invalid (in which - -- case having any of them is pointless). - -- Nonetheless I think the order of spacings should - -- be preserved as it provides a deterministic - -- choice for which spacings to prune (which is - -- an argument against simply using a Set). - -- I have also considered `fmap head . group` which - -- seems to work similarly well for common cases - -- and which might behave even better when it comes - -- to determinism of the algorithm. But determinism - -- should not be overrated here either - in the end - -- this is about deterministic behaviour of the - -- pruning we do that potentially results in - -- non-optimal layouts, and we'd rather take optimal - -- layouts when we can than take non-optimal layouts - -- just to be consistent with other cases where - -- we'd choose non-optimal layouts. - . filter hasOkColCount - -- throw out any spacings (i.e. children) that - -- already use more columns than available in - -- total. - . preFilterLimit - result <- case brdc of - -- BDWrapAnnKey _annKey bd -> rec bd - BDFEmpty -> return $ [VerticalSpacing 0 VerticalSpacingParNone False] - BDFLit t -> - return - $ [VerticalSpacing (Text.length t) VerticalSpacingParNone False] - BDFSeq list -> fmap sumVs . mapM filterAndLimit <$> rec `mapM` list - BDFCols _sig list -> - fmap sumVs . mapM filterAndLimit <$> rec `mapM` list - BDFSeparator -> - return $ [VerticalSpacing 1 VerticalSpacingParNone False] - BDFAddBaseY indent bd -> do - mVs <- rec bd - return $ mVs <&> \vs -> vs - { _vs_paragraph = case _vs_paragraph vs of - VerticalSpacingParNone -> VerticalSpacingParNone - VerticalSpacingParAlways i -> - VerticalSpacingParAlways $ case indent of - BrIndentNone -> i - BrIndentRegular -> - i - + (confUnpack - $ _lconfig_indentAmount - $ _conf_layout - $ config - ) - BrIndentSpecial j -> i + j - VerticalSpacingParSome i -> - VerticalSpacingParSome $ case indent of - BrIndentNone -> i - BrIndentRegular -> - i - + (confUnpack - $ _lconfig_indentAmount - $ _conf_layout - $ config - ) - BrIndentSpecial j -> i + j - } - BDFBaseYPushCur bd -> do - mVs <- rec bd - return $ mVs <&> \vs -> vs - -- We leave par as-is, even though it technically is not - -- accurate (in general). - -- the reason is that we really want to _keep_ it Just if it is - -- just so we properly communicate the is-multiline fact. - -- An alternative would be setting to (Just 0). - { _vs_sameLine = max - (_vs_sameLine vs) - (case _vs_paragraph vs of - VerticalSpacingParNone -> 0 - VerticalSpacingParSome i -> i - VerticalSpacingParAlways i -> min colMax i - ) - , _vs_paragraph = case _vs_paragraph vs of - VerticalSpacingParNone -> VerticalSpacingParNone - VerticalSpacingParSome i -> VerticalSpacingParSome i - VerticalSpacingParAlways i -> VerticalSpacingParAlways i - } - BDFBaseYPop bd -> rec bd - BDFIndentLevelPushCur bd -> rec bd - BDFIndentLevelPop bd -> rec bd - BDFPar BrIndentNone sameLine indented -> do - mVss <- filterAndLimit <$> rec sameLine - indSps <- filterAndLimit <$> rec indented - let mVsIndSp = take limit $ [ (x, y) | x <- mVss, y <- indSps ] - return $ mVsIndSp <&> \(VerticalSpacing lsp mPsp _, indSp) -> - VerticalSpacing - lsp - (case mPsp of - VerticalSpacingParSome psp -> - VerticalSpacingParSome $ max psp $ getMaxVS indSp -- TODO - VerticalSpacingParNone -> spMakePar indSp - VerticalSpacingParAlways psp -> - VerticalSpacingParAlways $ max psp $ getMaxVS indSp - ) - (mPsp - == VerticalSpacingParNone - && _vs_paragraph indSp - == VerticalSpacingParNone - && _vs_parFlag indSp - ) - - BDFPar{} -> error "BDPar with indent in getSpacing" - BDFAlt [] -> error "empty BDAlt" - -- BDAlt (alt:_) -> rec alt - BDFAlt alts -> do - r <- rec `mapM` alts - return $ filterAndLimit =<< r - BDFForceMultiline bd -> do - mVs <- filterAndLimit <$> rec bd - return $ filter ((/= VerticalSpacingParNone) . _vs_paragraph) mVs - BDFForceSingleline bd -> do - mVs <- filterAndLimit <$> rec bd - return $ filter ((== VerticalSpacingParNone) . _vs_paragraph) mVs - BDFForwardLineMode bd -> rec bd - BDFExternal _ _ _ txt | [t] <- Text.lines txt -> - return - $ [VerticalSpacing (Text.length t) VerticalSpacingParNone False] - BDFExternal{} -> return $ [] -- yes, we just assume that we cannot properly layout - -- this. - BDFPlain t -> return - [ case Text.lines t of - [] -> VerticalSpacing 0 VerticalSpacingParNone False - [t1] -> - VerticalSpacing (Text.length t1) VerticalSpacingParNone False - (t1 : _) -> VerticalSpacing - (Text.length t1) - (VerticalSpacingParAlways 0) - True - | allowHangingQuasiQuotes - ] - BDFAnnotationPrior _annKey bd -> rec bd - BDFAnnotationKW _annKey _kw bd -> rec bd - BDFAnnotationRest _annKey bd -> rec bd - BDFMoveToKWDP _annKey _kw _b bd -> rec bd - BDFLines [] -> - return $ [VerticalSpacing 0 VerticalSpacingParNone False] - BDFLines ls@(_ : _) -> do - -- we simply assume that lines is only used "properly", i.e. in - -- such a way that the first line can be treated "as a part of the - -- paragraph". That most importantly means that Lines should never - -- be inserted anywhere but at the start of the line. A - -- counterexample would be anything like Seq[Lit "foo", Lines]. - lSpss <- map filterAndLimit <$> rec `mapM` ls - let - worbled = fmap reverse $ sequence $ reverse $ lSpss - sumF lSps@(lSp1 : _) = - VerticalSpacing (_vs_sameLine lSp1) (spMakePar $ maxVs lSps) False - sumF [] = - error - $ "should not happen. if my logic does not fail" - ++ "me, this follows from not (null ls)." - return $ sumF <$> worbled - -- lSpss@(mVs:_) <- rec `mapM` ls - -- return $ case Control.Lens.transposeOf traverse lSpss of -- TODO: we currently only - -- -- consider the first alternative for the - -- -- line's spacings. - -- -- also i am not sure if always including - -- -- the first line length in the paragraph - -- -- length gives the desired results. - -- -- it is the safe path though, for now. - -- [] -> [] - -- (lSps:_) -> mVs <&> \(VerticalSpacing lsp _) -> - -- VerticalSpacing lsp $ VerticalSpacingParSome $ getMaxVS $ maxVs lSps - BDFEnsureIndent indent bd -> do - mVs <- rec bd - let - addInd = case indent of - BrIndentNone -> 0 - BrIndentRegular -> - confUnpack $ _lconfig_indentAmount $ _conf_layout $ config - BrIndentSpecial i -> i - return $ mVs <&> \(VerticalSpacing lsp psp parFlag) -> - VerticalSpacing (lsp + addInd) psp parFlag - BDFNonBottomSpacing b bd -> do - -- TODO: the `b` flag is an ugly hack, but I was not able to make - -- all tests work without it. It should be possible to have - -- `spMakePar` map VSPAlways{} to VSPSome x1, which fixes this - -- problem but breaks certain other cases. - mVs <- rec bd - return $ if null mVs - then - [ VerticalSpacing - 0 - (if b - then VerticalSpacingParSome 0 - else VerticalSpacingParAlways colMax - ) - False - ] - else mVs <&> \vs -> vs - { _vs_sameLine = min colMax (_vs_sameLine vs) - , _vs_paragraph = case _vs_paragraph vs of - VerticalSpacingParNone -> VerticalSpacingParNone - VerticalSpacingParAlways i - | b -> VerticalSpacingParSome 0 - | otherwise -> VerticalSpacingParAlways i - VerticalSpacingParSome i - | b -> VerticalSpacingParSome 0 - | otherwise -> VerticalSpacingParAlways i + preFilterLimit :: [VerticalSpacing] -> [VerticalSpacing] + preFilterLimit = take (3*limit) + memoWithKey :: Memo.MonadMemo k v m1 => k -> m1 v -> m1 v + memoWithKey k v = Memo.memo (const v) k + rec :: BriDocNumbered -> Memo.MemoT Int [VerticalSpacing] m [VerticalSpacing] + rec (brDcId, brdc) = memoWithKey brDcId $ do + config <- mAsk + let colMax = config & _conf_layout & _lconfig_cols & confUnpack + let hasOkColCount (VerticalSpacing lsp psp _) = + lsp <= colMax && case psp of + VerticalSpacingParNone -> True + VerticalSpacingParSome i -> i <= colMax + VerticalSpacingParAlways{} -> True + let specialCompare vs1 vs2 = + if ( (_vs_sameLine vs1 == _vs_sameLine vs2) + && (_vs_parFlag vs1 == _vs_parFlag vs2) + ) + then case (_vs_paragraph vs1, _vs_paragraph vs2) of + (VerticalSpacingParAlways i1, VerticalSpacingParAlways i2) -> + if i1 < i2 then Smaller else Bigger + (p1, p2) -> if p1 == p2 then Smaller else Unequal + else Unequal + let allowHangingQuasiQuotes = + config + & _conf_layout + & _lconfig_allowHangingQuasiQuotes + & confUnpack + let -- this is like List.nub, with one difference: if two elements + -- are unequal only in _vs_paragraph, with both ParAlways, we + -- treat them like equals and replace the first occurence with the + -- smallest member of this "equal group". + specialNub :: [VerticalSpacing] -> [VerticalSpacing] + specialNub [] = [] + specialNub (x1 : xr) = case go x1 xr of + (r, xs') -> r : specialNub xs' + where + go y1 [] = (y1, []) + go y1 (y2 : yr) = case specialCompare y1 y2 of + Unequal -> let (r, yr') = go y1 yr in (r, y2 : yr') + Smaller -> go y1 yr + Bigger -> go y2 yr + let -- the standard function used to enforce a constant upper bound + -- on the number of elements returned for each node. Should be + -- applied whenever in a parent the combination of spacings from + -- its children might cause excess of the upper bound. + filterAndLimit :: [VerticalSpacing] -> [VerticalSpacing] + filterAndLimit = take limit + -- prune so we always consider a constant + -- amount of spacings per node of the BriDoc. + . specialNub + -- In the end we want to know if there is at least + -- one valid spacing for any alternative. + -- If there are duplicates in the list, then these + -- will either all be valid (so having more than the + -- first is pointless) or all invalid (in which + -- case having any of them is pointless). + -- Nonetheless I think the order of spacings should + -- be preserved as it provides a deterministic + -- choice for which spacings to prune (which is + -- an argument against simply using a Set). + -- I have also considered `fmap head . group` which + -- seems to work similarly well for common cases + -- and which might behave even better when it comes + -- to determinism of the algorithm. But determinism + -- should not be overrated here either - in the end + -- this is about deterministic behaviour of the + -- pruning we do that potentially results in + -- non-optimal layouts, and we'd rather take optimal + -- layouts when we can than take non-optimal layouts + -- just to be consistent with other cases where + -- we'd choose non-optimal layouts. + . filter hasOkColCount + -- throw out any spacings (i.e. children) that + -- already use more columns than available in + -- total. + . preFilterLimit + result <- case brdc of + -- BDWrapAnnKey _annKey bd -> rec bd + BDFEmpty -> + return $ [VerticalSpacing 0 VerticalSpacingParNone False] + BDFLit t -> + return $ [VerticalSpacing (Text.length t) VerticalSpacingParNone False] + BDFSeq list -> + fmap sumVs . mapM filterAndLimit <$> rec `mapM` list + BDFCols _sig list -> + fmap sumVs . mapM filterAndLimit <$> rec `mapM` list + BDFSeparator -> + return $ [VerticalSpacing 1 VerticalSpacingParNone False] + BDFAddBaseY indent bd -> do + mVs <- rec bd + return $ mVs <&> \vs -> vs + { _vs_paragraph = case _vs_paragraph vs of + VerticalSpacingParNone -> VerticalSpacingParNone + VerticalSpacingParAlways i -> VerticalSpacingParAlways $ case indent of + BrIndentNone -> i + BrIndentRegular -> i + ( confUnpack + $ _lconfig_indentAmount + $ _conf_layout + $ config + ) + BrIndentSpecial j -> i + j + VerticalSpacingParSome i -> VerticalSpacingParSome $ case indent of + BrIndentNone -> i + BrIndentRegular -> i + ( confUnpack + $ _lconfig_indentAmount + $ _conf_layout + $ config + ) + BrIndentSpecial j -> i + j } - -- the version below is an alternative idea: fold the input - -- spacings into a single spacing. This was hoped to improve in - -- certain cases where non-bottom alternatives took up "too much - -- explored search space"; the downside is that it also cuts - -- the search-space short in other cases where it is not necessary, - -- leading to unnecessary new-lines. Disabled for now. A better - -- solution would require conditionally folding the search-space - -- only in appropriate locations (i.e. a new BriDoc node type - -- for this purpose, perhaps "BDFNonBottomSpacing1"). - -- else - -- [ Foldable.foldl1 - -- (\(VerticalSpacing x1 x2 _) (VerticalSpacing y1 y2 _) -> - -- VerticalSpacing - -- (min x1 y1) - -- (case (x2, y2) of - -- (x, VerticalSpacingParNone) -> x - -- (VerticalSpacingParNone, x) -> x - -- (VerticalSpacingParAlways i, VerticalSpacingParAlways j) -> - -- VerticalSpacingParAlways $ min i j - -- (VerticalSpacingParAlways i, VerticalSpacingParSome j) -> - -- VerticalSpacingParAlways $ min i j - -- (VerticalSpacingParSome i, VerticalSpacingParAlways j) -> - -- VerticalSpacingParAlways $ min i j - -- (VerticalSpacingParSome x, VerticalSpacingParSome y) -> - -- VerticalSpacingParSome $ min x y) - -- False) - -- mVs - -- ] - BDFSetParSpacing bd -> do - mVs <- rec bd - return $ mVs <&> \vs -> vs { _vs_parFlag = True } - BDFForceParSpacing bd -> do - mVs <- preFilterLimit <$> rec bd - return - $ [ vs - | vs <- mVs - , _vs_parFlag vs || _vs_paragraph vs == VerticalSpacingParNone - ] - BDFDebug s bd -> do - r <- rec bd - tellDebugMess - $ "getSpacings: BDFDebug " - ++ show s - ++ " (node-id=" - ++ show brDcId - ++ "): vs=" - ++ show (take 9 r) - return r - return result - maxVs :: [VerticalSpacing] -> VerticalSpacing - maxVs = foldl' - (\(VerticalSpacing x1 x2 _) (VerticalSpacing y1 y2 _) -> VerticalSpacing - (max x1 y1) - (case (x2, y2) of - (x, VerticalSpacingParNone) -> x - (VerticalSpacingParNone, x) -> x - (VerticalSpacingParAlways i, VerticalSpacingParAlways j) -> - VerticalSpacingParAlways $ max i j - (VerticalSpacingParAlways i, VerticalSpacingParSome j) -> - VerticalSpacingParAlways $ max i j - (VerticalSpacingParSome i, VerticalSpacingParAlways j) -> - VerticalSpacingParAlways $ max i j - (VerticalSpacingParSome x, VerticalSpacingParSome y) -> - VerticalSpacingParSome $ max x y - ) - False - ) - (VerticalSpacing 0 VerticalSpacingParNone False) - sumVs :: [VerticalSpacing] -> VerticalSpacing - sumVs sps = foldl' go initial sps - where - go (VerticalSpacing x1 x2 x3) (VerticalSpacing y1 y2 _) = VerticalSpacing - (x1 + y1) - (case (x2, y2) of - (x, VerticalSpacingParNone) -> x - (VerticalSpacingParNone, x) -> x - (VerticalSpacingParAlways i, VerticalSpacingParAlways j) -> - VerticalSpacingParAlways $ i + j - (VerticalSpacingParAlways i, VerticalSpacingParSome j) -> - VerticalSpacingParAlways $ i + j - (VerticalSpacingParSome i, VerticalSpacingParAlways j) -> - VerticalSpacingParAlways $ i + j - (VerticalSpacingParSome x, VerticalSpacingParSome y) -> - VerticalSpacingParSome $ x + y - ) - x3 - singleline x = _vs_paragraph x == VerticalSpacingParNone - isPar x = _vs_parFlag x - parFlag = case sps of - [] -> True - _ -> all singleline (List.init sps) && isPar (List.last sps) - initial = VerticalSpacing 0 VerticalSpacingParNone parFlag - getMaxVS :: VerticalSpacing -> Int - getMaxVS (VerticalSpacing x1 x2 _) = x1 `max` case x2 of - VerticalSpacingParSome i -> i - VerticalSpacingParNone -> 0 - VerticalSpacingParAlways i -> i - spMakePar :: VerticalSpacing -> VerticalSpacingPar - spMakePar (VerticalSpacing x1 x2 _) = case x2 of - VerticalSpacingParSome i -> VerticalSpacingParSome $ x1 `max` i - VerticalSpacingParNone -> VerticalSpacingParSome $ x1 - VerticalSpacingParAlways i -> VerticalSpacingParAlways $ x1 `max` i + BDFBaseYPushCur bd -> do + mVs <- rec bd + return $ mVs <&> \vs -> vs + -- We leave par as-is, even though it technically is not + -- accurate (in general). + -- the reason is that we really want to _keep_ it Just if it is + -- just so we properly communicate the is-multiline fact. + -- An alternative would be setting to (Just 0). + { _vs_sameLine = max (_vs_sameLine vs) + (case _vs_paragraph vs of + VerticalSpacingParNone -> 0 + VerticalSpacingParSome i -> i + VerticalSpacingParAlways i -> min colMax i) + , _vs_paragraph = case _vs_paragraph vs of + VerticalSpacingParNone -> VerticalSpacingParNone + VerticalSpacingParSome i -> VerticalSpacingParSome i + VerticalSpacingParAlways i -> VerticalSpacingParAlways i + } + BDFBaseYPop bd -> rec bd + BDFIndentLevelPushCur bd -> rec bd + BDFIndentLevelPop bd -> rec bd + BDFPar BrIndentNone sameLine indented -> do + mVss <- filterAndLimit <$> rec sameLine + indSps <- filterAndLimit <$> rec indented + let mVsIndSp = take limit + $ [ (x,y) + | x<-mVss + , y<-indSps + ] + return $ mVsIndSp <&> + \(VerticalSpacing lsp mPsp _, indSp) -> + VerticalSpacing + lsp + (case mPsp of + VerticalSpacingParSome psp -> + VerticalSpacingParSome $ max psp $ getMaxVS indSp -- TODO + VerticalSpacingParNone -> spMakePar indSp + VerticalSpacingParAlways psp -> + VerticalSpacingParAlways $ max psp $ getMaxVS indSp) + ( mPsp == VerticalSpacingParNone + && _vs_paragraph indSp == VerticalSpacingParNone + && _vs_parFlag indSp + ) + + BDFPar{} -> error "BDPar with indent in getSpacing" + BDFAlt [] -> error "empty BDAlt" + -- BDAlt (alt:_) -> rec alt + BDFAlt alts -> do + r <- rec `mapM` alts + return $ filterAndLimit =<< r + BDFForceMultiline bd -> do + mVs <- filterAndLimit <$> rec bd + return $ filter ((/=VerticalSpacingParNone) . _vs_paragraph) mVs + BDFForceSingleline bd -> do + mVs <- filterAndLimit <$> rec bd + return $ filter ((==VerticalSpacingParNone) . _vs_paragraph) mVs + BDFForwardLineMode bd -> rec bd + BDFExternal _ _ _ txt | [t] <- Text.lines txt -> + return $ [VerticalSpacing (Text.length t) VerticalSpacingParNone False] + BDFExternal{} -> + return $ [] -- yes, we just assume that we cannot properly layout + -- this. + BDFPlain t -> return + [ case Text.lines t of + [] -> VerticalSpacing 0 VerticalSpacingParNone False + [t1 ] -> VerticalSpacing + (Text.length t1) + VerticalSpacingParNone + False + (t1 : _) -> VerticalSpacing + (Text.length t1) + (VerticalSpacingParAlways 0) + True + | allowHangingQuasiQuotes + ] + BDFAnnotationPrior _annKey bd -> rec bd + BDFAnnotationKW _annKey _kw bd -> rec bd + BDFAnnotationRest _annKey bd -> rec bd + BDFMoveToKWDP _annKey _kw _b bd -> rec bd + BDFLines [] -> return $ [VerticalSpacing 0 VerticalSpacingParNone False] + BDFLines ls@(_:_) -> do + -- we simply assume that lines is only used "properly", i.e. in + -- such a way that the first line can be treated "as a part of the + -- paragraph". That most importantly means that Lines should never + -- be inserted anywhere but at the start of the line. A + -- counterexample would be anything like Seq[Lit "foo", Lines]. + lSpss <- map filterAndLimit <$> rec `mapM` ls + let worbled = fmap reverse + $ sequence + $ reverse + $ lSpss + sumF lSps@(lSp1:_) = VerticalSpacing (_vs_sameLine lSp1) + (spMakePar $ maxVs lSps) + False + sumF [] = error $ "should not happen. if my logic does not fail" + ++ "me, this follows from not (null ls)." + return $ sumF <$> worbled + -- lSpss@(mVs:_) <- rec `mapM` ls + -- return $ case Control.Lens.transposeOf traverse lSpss of -- TODO: we currently only + -- -- consider the first alternative for the + -- -- line's spacings. + -- -- also i am not sure if always including + -- -- the first line length in the paragraph + -- -- length gives the desired results. + -- -- it is the safe path though, for now. + -- [] -> [] + -- (lSps:_) -> mVs <&> \(VerticalSpacing lsp _) -> + -- VerticalSpacing lsp $ VerticalSpacingParSome $ getMaxVS $ maxVs lSps + BDFEnsureIndent indent bd -> do + mVs <- rec bd + let addInd = case indent of + BrIndentNone -> 0 + BrIndentRegular -> confUnpack + $ _lconfig_indentAmount + $ _conf_layout + $ config + BrIndentSpecial i -> i + return $ mVs <&> \(VerticalSpacing lsp psp parFlag) -> + VerticalSpacing (lsp + addInd) psp parFlag + BDFNonBottomSpacing b bd -> do + -- TODO: the `b` flag is an ugly hack, but I was not able to make + -- all tests work without it. It should be possible to have + -- `spMakePar` map VSPAlways{} to VSPSome x1, which fixes this + -- problem but breaks certain other cases. + mVs <- rec bd + return $ if null mVs + then [VerticalSpacing + 0 + (if b then VerticalSpacingParSome 0 + else VerticalSpacingParAlways colMax + ) + False + ] + else mVs <&> \vs -> vs + { _vs_sameLine = min colMax (_vs_sameLine vs) + , _vs_paragraph = case _vs_paragraph vs of + VerticalSpacingParNone -> VerticalSpacingParNone + VerticalSpacingParAlways i + | b -> VerticalSpacingParSome 0 + | otherwise -> VerticalSpacingParAlways i + VerticalSpacingParSome i + | b -> VerticalSpacingParSome 0 + | otherwise -> VerticalSpacingParAlways i + } + -- the version below is an alternative idea: fold the input + -- spacings into a single spacing. This was hoped to improve in + -- certain cases where non-bottom alternatives took up "too much + -- explored search space"; the downside is that it also cuts + -- the search-space short in other cases where it is not necessary, + -- leading to unnecessary new-lines. Disabled for now. A better + -- solution would require conditionally folding the search-space + -- only in appropriate locations (i.e. a new BriDoc node type + -- for this purpose, perhaps "BDFNonBottomSpacing1"). + -- else + -- [ Foldable.foldl1 + -- (\(VerticalSpacing x1 x2 _) (VerticalSpacing y1 y2 _) -> + -- VerticalSpacing + -- (min x1 y1) + -- (case (x2, y2) of + -- (x, VerticalSpacingParNone) -> x + -- (VerticalSpacingParNone, x) -> x + -- (VerticalSpacingParAlways i, VerticalSpacingParAlways j) -> + -- VerticalSpacingParAlways $ min i j + -- (VerticalSpacingParAlways i, VerticalSpacingParSome j) -> + -- VerticalSpacingParAlways $ min i j + -- (VerticalSpacingParSome i, VerticalSpacingParAlways j) -> + -- VerticalSpacingParAlways $ min i j + -- (VerticalSpacingParSome x, VerticalSpacingParSome y) -> + -- VerticalSpacingParSome $ min x y) + -- False) + -- mVs + -- ] + BDFSetParSpacing bd -> do + mVs <- rec bd + return $ mVs <&> \vs -> vs { _vs_parFlag = True } + BDFForceParSpacing bd -> do + mVs <- preFilterLimit <$> rec bd + return $ [ vs | vs <- mVs, _vs_parFlag vs || _vs_paragraph vs == VerticalSpacingParNone ] + BDFDebug s bd -> do + r <- rec bd + tellDebugMess $ "getSpacings: BDFDebug " ++ show s ++ " (node-id=" ++ show brDcId ++ "): vs=" ++ show (take 9 r) + return r + return result + maxVs :: [VerticalSpacing] -> VerticalSpacing + maxVs = foldl' + (\(VerticalSpacing x1 x2 _) (VerticalSpacing y1 y2 _) -> + VerticalSpacing + (max x1 y1) + (case (x2, y2) of + (x, VerticalSpacingParNone) -> x + (VerticalSpacingParNone, x) -> x + (VerticalSpacingParAlways i, VerticalSpacingParAlways j) -> + VerticalSpacingParAlways $ max i j + (VerticalSpacingParAlways i, VerticalSpacingParSome j) -> + VerticalSpacingParAlways $ max i j + (VerticalSpacingParSome i, VerticalSpacingParAlways j) -> + VerticalSpacingParAlways $ max i j + (VerticalSpacingParSome x, VerticalSpacingParSome y) -> + VerticalSpacingParSome $ max x y) + False) + (VerticalSpacing 0 VerticalSpacingParNone False) + sumVs :: [VerticalSpacing] -> VerticalSpacing + sumVs sps = foldl' go initial sps + where + go (VerticalSpacing x1 x2 x3) (VerticalSpacing y1 y2 _) = VerticalSpacing + (x1 + y1) + (case (x2, y2) of + (x, VerticalSpacingParNone) -> x + (VerticalSpacingParNone, x) -> x + (VerticalSpacingParAlways i, VerticalSpacingParAlways j) -> + VerticalSpacingParAlways $ i+j + (VerticalSpacingParAlways i, VerticalSpacingParSome j) -> + VerticalSpacingParAlways $ i+j + (VerticalSpacingParSome i, VerticalSpacingParAlways j) -> + VerticalSpacingParAlways $ i+j + (VerticalSpacingParSome x, VerticalSpacingParSome y) -> VerticalSpacingParSome $ x + y) + x3 + singleline x = _vs_paragraph x == VerticalSpacingParNone + isPar x = _vs_parFlag x + parFlag = case sps of + [] -> True + _ -> all singleline (List.init sps) && isPar (List.last sps) + initial = VerticalSpacing 0 VerticalSpacingParNone parFlag + getMaxVS :: VerticalSpacing -> Int + getMaxVS (VerticalSpacing x1 x2 _) = x1 `max` case x2 of + VerticalSpacingParSome i -> i + VerticalSpacingParNone -> 0 + VerticalSpacingParAlways i -> i + spMakePar :: VerticalSpacing -> VerticalSpacingPar + spMakePar (VerticalSpacing x1 x2 _) = case x2 of + VerticalSpacingParSome i -> VerticalSpacingParSome $ x1 `max` i + VerticalSpacingParNone -> VerticalSpacingParSome $ x1 + VerticalSpacingParAlways i -> VerticalSpacingParAlways $ x1 `max` i fixIndentationForMultiple :: (MonadMultiReader (CConfig Identity) m) => AltCurPos -> BrIndent -> m Int fixIndentationForMultiple acp indent = do indAmount <- mAsk <&> _conf_layout .> _lconfig_indentAmount .> confUnpack - let - indAddRaw = case indent of - BrIndentNone -> 0 - BrIndentRegular -> indAmount - BrIndentSpecial i -> i + let indAddRaw = case indent of + BrIndentNone -> 0 + BrIndentRegular -> indAmount + BrIndentSpecial i -> i -- for IndentPolicyMultiple, we restrict the amount of added -- indentation in such a manner that we end up on a multiple of the -- base indentation. indPolicy <- mAsk <&> _conf_layout .> _lconfig_indentPolicy .> confUnpack pure $ if indPolicy == IndentPolicyMultiple then - let - indAddMultiple1 = - indAddRaw - ((_acp_indent acp + indAddRaw) `mod` indAmount) - indAddMultiple2 = if indAddMultiple1 <= 0 - then indAddMultiple1 + indAmount - else indAddMultiple1 - in indAddMultiple2 + let indAddMultiple1 = + indAddRaw - ((_acp_indent acp + indAddRaw) `mod` indAmount) + indAddMultiple2 = if indAddMultiple1 <= 0 + then indAddMultiple1 + indAmount + else indAddMultiple1 + in indAddMultiple2 else indAddRaw diff --git a/source/library/Language/Haskell/Brittany/Internal/Transformations/Columns.hs b/source/library/Language/Haskell/Brittany/Internal/Transformations/Columns.hs index 5229134..89a2c6f 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Transformations/Columns.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Transformations/Columns.hs @@ -3,10 +3,16 @@ module Language.Haskell.Brittany.Internal.Transformations.Columns where -import qualified Data.Generics.Uniplate.Direct as Uniplate -import qualified GHC.OldList as List + + import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.Types +import qualified GHC.OldList as List + +import Language.Haskell.Brittany.Internal.Types + +import qualified Data.Generics.Uniplate.Direct as Uniplate + + transformSimplifyColumns :: BriDoc -> BriDoc transformSimplifyColumns = Uniplate.rewrite $ \case @@ -14,150 +20,118 @@ transformSimplifyColumns = Uniplate.rewrite $ \case -- BDWrapAnnKey annKey $ transformSimplify bd BDEmpty -> Nothing BDLit{} -> Nothing - BDSeq list - | any - (\case - BDSeq{} -> True - BDEmpty{} -> True - _ -> False - ) - list - -> Just $ BDSeq $ list >>= \case - BDEmpty -> [] - BDSeq l -> l - x -> [x] - BDSeq (BDCols sig1 cols1@(_ : _) : rest) - | all - (\case - BDSeparator -> True - _ -> False - ) - rest - -> Just $ BDCols sig1 (List.init cols1 ++ [BDSeq (List.last cols1 : rest)]) - BDLines lines - | any - (\case - BDLines{} -> True - BDEmpty{} -> True - _ -> False - ) - lines - -> Just $ BDLines $ filter isNotEmpty $ lines >>= \case + BDSeq list | any (\case BDSeq{} -> True + BDEmpty{} -> True + _ -> False) list -> Just $ BDSeq $ list >>= \case + BDEmpty -> [] + BDSeq l -> l + x -> [x] + BDSeq (BDCols sig1 cols1@(_:_):rest) + | all (\case BDSeparator -> True; _ -> False) rest -> + Just $ BDCols sig1 (List.init cols1 ++ [BDSeq (List.last cols1:rest)]) + BDLines lines | any (\case BDLines{} -> True + BDEmpty{} -> True + _ -> False) lines -> + Just $ BDLines $ filter isNotEmpty $ lines >>= \case BDLines l -> l x -> [x] -- prior floating in - BDAnnotationPrior annKey1 (BDSeq (l : lr)) -> - Just $ BDSeq (BDAnnotationPrior annKey1 l : lr) - BDAnnotationPrior annKey1 (BDLines (l : lr)) -> - Just $ BDLines (BDAnnotationPrior annKey1 l : lr) - BDAnnotationPrior annKey1 (BDCols sig (l : lr)) -> - Just $ BDCols sig (BDAnnotationPrior annKey1 l : lr) + BDAnnotationPrior annKey1 (BDSeq (l:lr)) -> + Just $ BDSeq (BDAnnotationPrior annKey1 l:lr) + BDAnnotationPrior annKey1 (BDLines (l:lr)) -> + Just $ BDLines (BDAnnotationPrior annKey1 l:lr) + BDAnnotationPrior annKey1 (BDCols sig (l:lr)) -> + Just $ BDCols sig (BDAnnotationPrior annKey1 l:lr) -- post floating in BDAnnotationRest annKey1 (BDSeq list) -> - Just - $ BDSeq - $ List.init list - ++ [BDAnnotationRest annKey1 $ List.last list] + Just $ BDSeq $ List.init list ++ [BDAnnotationRest annKey1 $ List.last list] BDAnnotationRest annKey1 (BDLines list) -> - Just - $ BDLines - $ List.init list - ++ [BDAnnotationRest annKey1 $ List.last list] + Just $ BDLines $ List.init list ++ [BDAnnotationRest annKey1 $ List.last list] BDAnnotationRest annKey1 (BDCols sig cols) -> - Just - $ BDCols sig - $ List.init cols - ++ [BDAnnotationRest annKey1 $ List.last cols] + Just $ BDCols sig $ List.init cols ++ [BDAnnotationRest annKey1 $ List.last cols] BDAnnotationKW annKey1 kw (BDSeq list) -> - Just - $ BDSeq - $ List.init list - ++ [BDAnnotationKW annKey1 kw $ List.last list] + Just $ BDSeq $ List.init list ++ [BDAnnotationKW annKey1 kw $ List.last list] BDAnnotationKW annKey1 kw (BDLines list) -> - Just - $ BDLines - $ List.init list - ++ [BDAnnotationKW annKey1 kw $ List.last list] + Just $ BDLines $ List.init list ++ [BDAnnotationKW annKey1 kw $ List.last list] BDAnnotationKW annKey1 kw (BDCols sig cols) -> - Just - $ BDCols sig - $ List.init cols - ++ [BDAnnotationKW annKey1 kw $ List.last cols] + Just $ BDCols sig $ List.init cols ++ [BDAnnotationKW annKey1 kw $ List.last cols] -- ensureIndent float-in -- not sure if the following rule is necessary; tests currently are -- unaffected. -- BDEnsureIndent indent (BDLines lines) -> -- Just $ BDLines $ BDEnsureIndent indent <$> lines -- matching col special transformation - BDCols sig1 cols1@(_ : _) - | BDLines lines@(_ : _ : _) <- List.last cols1 + BDCols sig1 cols1@(_:_) + | BDLines lines@(_:_:_) <- List.last cols1 , BDCols sig2 cols2 <- List.last lines - , sig1 == sig2 - -> Just $ BDLines - [ BDCols sig1 $ List.init cols1 ++ [BDLines $ List.init lines] - , BDCols sig2 cols2 - ] - BDCols sig1 cols1@(_ : _) - | BDLines lines@(_ : _ : _) <- List.last cols1 + , sig1==sig2 -> + Just $ BDLines + [ BDCols sig1 $ List.init cols1 ++ [BDLines $ List.init lines] + , BDCols sig2 cols2 + ] + BDCols sig1 cols1@(_:_) + | BDLines lines@(_:_:_) <- List.last cols1 , BDEnsureIndent _ (BDCols sig2 cols2) <- List.last lines - , sig1 == sig2 - -> Just $ BDLines - [ BDCols sig1 $ List.init cols1 ++ [BDLines $ List.init lines] - , BDCols sig2 cols2 - ] - BDPar ind col1@(BDCols sig1 _) col2@(BDCols sig2 _) | sig1 == sig2 -> + , sig1==sig2 -> + Just $ BDLines + [ BDCols sig1 $ List.init cols1 ++ [BDLines $ List.init lines] + , BDCols sig2 cols2 + ] + BDPar ind col1@(BDCols sig1 _) col2@(BDCols sig2 _) | sig1==sig2 -> Just $ BDAddBaseY ind (BDLines [col1, col2]) - BDPar ind col1@(BDCols sig1 _) (BDLines (col2@(BDCols sig2 _) : rest)) - | sig1 == sig2 -> Just $ BDPar ind (BDLines [col1, col2]) (BDLines rest) + BDPar ind col1@(BDCols sig1 _) (BDLines (col2@(BDCols sig2 _):rest)) + | sig1==sig2 -> + Just $ BDPar ind (BDLines [col1, col2]) (BDLines rest) BDPar ind (BDLines lines1) col2@(BDCols sig2 _) - | BDCols sig1 _ <- List.last lines1, sig1 == sig2 -> Just - $ BDAddBaseY ind (BDLines $ lines1 ++ [col2]) - BDPar ind (BDLines lines1) (BDLines (col2@(BDCols sig2 _) : rest)) - | BDCols sig1 _ <- List.last lines1, sig1 == sig2 -> Just - $ BDPar ind (BDLines $ lines1 ++ [col2]) (BDLines rest) + | BDCols sig1 _ <- List.last lines1 + , sig1==sig2 -> + Just $ BDAddBaseY ind (BDLines $ lines1 ++ [col2]) + BDPar ind (BDLines lines1) (BDLines (col2@(BDCols sig2 _):rest)) + | BDCols sig1 _ <- List.last lines1 + , sig1==sig2 -> + Just $ BDPar ind (BDLines $ lines1 ++ [col2]) (BDLines rest) -- BDPar ind1 (BDCols sig1 cols1) (BDPar ind2 line (BDCols sig2 cols2)) -- | sig1==sig2 -> -- Just $ BDPar -- ind1 -- (BDLines [BDCols sig1 cols1, BDCols sig]) - BDCols sig1 cols - | BDPar _ind line (BDCols sig2 cols2) <- List.last cols, sig1 == sig2 - -> Just - $ BDLines [BDCols sig1 (List.init cols ++ [line]), BDCols sig2 cols2] - BDCols sig1 cols - | BDPar ind line (BDLines lines) <- List.last cols - , BDCols sig2 cols2 <- List.last lines - , sig1 == sig2 - -> Just $ BDLines - [ BDCols sig1 - $ List.init cols - ++ [BDPar ind line (BDLines $ List.init lines)] + BDCols sig1 cols | BDPar _ind line (BDCols sig2 cols2) <- List.last cols + , sig1==sig2 -> + Just $ BDLines + [ BDCols sig1 (List.init cols ++ [line]) , BDCols sig2 cols2 ] - BDLines [x] -> Just $ x - BDLines [] -> Just $ BDEmpty - BDSeq{} -> Nothing - BDCols{} -> Nothing - BDSeparator -> Nothing - BDAddBaseY{} -> Nothing - BDBaseYPushCur{} -> Nothing - BDBaseYPop{} -> Nothing + BDCols sig1 cols | BDPar ind line (BDLines lines) <- List.last cols + , BDCols sig2 cols2 <- List.last lines + , sig1==sig2 -> + Just $ BDLines + [ BDCols sig1 $ List.init cols ++ [BDPar ind line (BDLines $ List.init lines)] + , BDCols sig2 cols2 + ] + BDLines [x] -> Just $ x + BDLines [] -> Just $ BDEmpty + BDSeq{} -> Nothing + BDCols{} -> Nothing + BDSeparator -> Nothing + BDAddBaseY{} -> Nothing + BDBaseYPushCur{} -> Nothing + BDBaseYPop{} -> Nothing BDIndentLevelPushCur{} -> Nothing - BDIndentLevelPop{} -> Nothing - BDPar{} -> Nothing - BDAlt{} -> Nothing - BDForceMultiline{} -> Nothing + BDIndentLevelPop{} -> Nothing + BDPar{} -> Nothing + BDAlt{} -> Nothing + BDForceMultiline{} -> Nothing BDForceSingleline{} -> Nothing BDForwardLineMode{} -> Nothing - BDExternal{} -> Nothing - BDPlain{} -> Nothing - BDLines{} -> Nothing + BDExternal{} -> Nothing + BDPlain{} -> Nothing + BDLines{} -> Nothing BDAnnotationPrior{} -> Nothing - BDAnnotationKW{} -> Nothing - BDAnnotationRest{} -> Nothing - BDMoveToKWDP{} -> Nothing - BDEnsureIndent{} -> Nothing - BDSetParSpacing{} -> Nothing + BDAnnotationKW{} -> Nothing + BDAnnotationRest{} -> Nothing + BDMoveToKWDP{} -> Nothing + BDEnsureIndent{} -> Nothing + BDSetParSpacing{} -> Nothing BDForceParSpacing{} -> Nothing - BDDebug{} -> Nothing + BDDebug{} -> Nothing BDNonBottomSpacing _ x -> Just x diff --git a/source/library/Language/Haskell/Brittany/Internal/Transformations/Floating.hs b/source/library/Language/Haskell/Brittany/Internal/Transformations/Floating.hs index c320dbf..0231306 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Transformations/Floating.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Transformations/Floating.hs @@ -3,20 +3,25 @@ module Language.Haskell.Brittany.Internal.Transformations.Floating where -import qualified Data.Generics.Uniplate.Direct as Uniplate -import qualified GHC.OldList as List + + import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.Utils +import qualified GHC.OldList as List + +import Language.Haskell.Brittany.Internal.Utils +import Language.Haskell.Brittany.Internal.Types + +import qualified Data.Generics.Uniplate.Direct as Uniplate + + -- note that this is not total, and cannot be with that exact signature. mergeIndents :: BrIndent -> BrIndent -> BrIndent -mergeIndents BrIndentNone x = x -mergeIndents x BrIndentNone = x -mergeIndents (BrIndentSpecial i) (BrIndentSpecial j) = - BrIndentSpecial (max i j) -mergeIndents _ _ = error "mergeIndents" +mergeIndents BrIndentNone x = x +mergeIndents x BrIndentNone = x +mergeIndents (BrIndentSpecial i) (BrIndentSpecial j) = BrIndentSpecial (max i j) +mergeIndents _ _ = error "mergeIndents" transformSimplifyFloating :: BriDoc -> BriDoc @@ -26,192 +31,169 @@ transformSimplifyFloating = stepBO .> stepFull -- better complexity. -- UPDATE: by now, stepBO does more than stepFull; for semantic equivalence -- the push/pop cases would need to be copied over - where - descendPrior = transformDownMay $ \case - -- prior floating in - BDAnnotationPrior annKey1 (BDPar ind line indented) -> - Just $ BDPar ind (BDAnnotationPrior annKey1 line) indented - BDAnnotationPrior annKey1 (BDSeq (l : lr)) -> - Just $ BDSeq (BDAnnotationPrior annKey1 l : lr) - BDAnnotationPrior annKey1 (BDLines (l : lr)) -> - Just $ BDLines (BDAnnotationPrior annKey1 l : lr) - BDAnnotationPrior annKey1 (BDCols sig (l : lr)) -> - Just $ BDCols sig (BDAnnotationPrior annKey1 l : lr) - BDAnnotationPrior annKey1 (BDAddBaseY indent x) -> - Just $ BDAddBaseY indent $ BDAnnotationPrior annKey1 x - BDAnnotationPrior annKey1 (BDDebug s x) -> - Just $ BDDebug s $ BDAnnotationPrior annKey1 x - _ -> Nothing - descendRest = transformDownMay $ \case - -- post floating in - BDAnnotationRest annKey1 (BDPar ind line indented) -> - Just $ BDPar ind line $ BDAnnotationRest annKey1 indented - BDAnnotationRest annKey1 (BDSeq list) -> - Just - $ BDSeq - $ List.init list - ++ [BDAnnotationRest annKey1 $ List.last list] - BDAnnotationRest annKey1 (BDLines list) -> - Just - $ BDLines - $ List.init list - ++ [BDAnnotationRest annKey1 $ List.last list] - BDAnnotationRest annKey1 (BDCols sig cols) -> - Just - $ BDCols sig - $ List.init cols - ++ [BDAnnotationRest annKey1 $ List.last cols] - BDAnnotationRest annKey1 (BDAddBaseY indent x) -> - Just $ BDAddBaseY indent $ BDAnnotationRest annKey1 x - BDAnnotationRest annKey1 (BDDebug s x) -> - Just $ BDDebug s $ BDAnnotationRest annKey1 x - _ -> Nothing - descendKW = transformDownMay $ \case - -- post floating in - BDAnnotationKW annKey1 kw (BDPar ind line indented) -> - Just $ BDPar ind line $ BDAnnotationKW annKey1 kw indented - BDAnnotationKW annKey1 kw (BDSeq list) -> - Just - $ BDSeq - $ List.init list - ++ [BDAnnotationKW annKey1 kw $ List.last list] - BDAnnotationKW annKey1 kw (BDLines list) -> - Just - $ BDLines - $ List.init list - ++ [BDAnnotationKW annKey1 kw $ List.last list] - BDAnnotationKW annKey1 kw (BDCols sig cols) -> - Just - $ BDCols sig - $ List.init cols - ++ [BDAnnotationKW annKey1 kw $ List.last cols] - BDAnnotationKW annKey1 kw (BDAddBaseY indent x) -> - Just $ BDAddBaseY indent $ BDAnnotationKW annKey1 kw x - BDAnnotationKW annKey1 kw (BDDebug s x) -> - Just $ BDDebug s $ BDAnnotationKW annKey1 kw x - _ -> Nothing - descendBYPush = transformDownMay $ \case - BDBaseYPushCur (BDCols sig cols@(_ : _)) -> - Just $ BDCols sig (BDBaseYPushCur (List.head cols) : List.tail cols) - BDBaseYPushCur (BDDebug s x) -> Just $ BDDebug s (BDBaseYPushCur x) - _ -> Nothing - descendBYPop = transformDownMay $ \case - BDBaseYPop (BDCols sig cols@(_ : _)) -> - Just $ BDCols sig (List.init cols ++ [BDBaseYPop (List.last cols)]) - BDBaseYPop (BDDebug s x) -> Just $ BDDebug s (BDBaseYPop x) - _ -> Nothing - descendILPush = transformDownMay $ \case - BDIndentLevelPushCur (BDCols sig cols@(_ : _)) -> Just - $ BDCols sig (BDIndentLevelPushCur (List.head cols) : List.tail cols) - BDIndentLevelPushCur (BDDebug s x) -> - Just $ BDDebug s (BDIndentLevelPushCur x) - _ -> Nothing - descendILPop = transformDownMay $ \case - BDIndentLevelPop (BDCols sig cols@(_ : _)) -> - Just $ BDCols sig (List.init cols ++ [BDIndentLevelPop (List.last cols)]) - BDIndentLevelPop (BDDebug s x) -> Just $ BDDebug s (BDIndentLevelPop x) - _ -> Nothing - descendAddB = transformDownMay $ \case - BDAddBaseY BrIndentNone x -> Just x - -- AddIndent floats into Lines. - BDAddBaseY indent (BDLines lines) -> - Just $ BDLines $ BDAddBaseY indent <$> lines - -- AddIndent floats into last column - BDAddBaseY indent (BDCols sig cols) -> - Just - $ BDCols sig - $ List.init cols - ++ [BDAddBaseY indent $ List.last cols] - -- merge AddIndent and Par - BDAddBaseY ind1 (BDPar ind2 line indented) -> - Just $ BDPar (mergeIndents ind1 ind2) line indented - BDAddBaseY ind (BDAnnotationPrior annKey1 x) -> - Just $ BDAnnotationPrior annKey1 (BDAddBaseY ind x) - BDAddBaseY ind (BDAnnotationRest annKey1 x) -> - Just $ BDAnnotationRest annKey1 (BDAddBaseY ind x) - BDAddBaseY ind (BDAnnotationKW annKey1 kw x) -> - Just $ BDAnnotationKW annKey1 kw (BDAddBaseY ind x) - BDAddBaseY ind (BDSeq list) -> - Just $ BDSeq $ List.init list ++ [BDAddBaseY ind (List.last list)] - BDAddBaseY _ lit@BDLit{} -> Just $ lit - BDAddBaseY ind (BDBaseYPushCur x) -> - Just $ BDBaseYPushCur (BDAddBaseY ind x) - BDAddBaseY ind (BDBaseYPop x) -> Just $ BDBaseYPop (BDAddBaseY ind x) - BDAddBaseY ind (BDDebug s x) -> Just $ BDDebug s (BDAddBaseY ind x) - BDAddBaseY ind (BDIndentLevelPop x) -> - Just $ BDIndentLevelPop (BDAddBaseY ind x) - BDAddBaseY ind (BDIndentLevelPushCur x) -> - Just $ BDIndentLevelPushCur (BDAddBaseY ind x) - BDAddBaseY ind (BDEnsureIndent ind2 x) -> - Just $ BDEnsureIndent (mergeIndents ind ind2) x - _ -> Nothing - stepBO :: BriDoc -> BriDoc - stepBO = -- traceFunctionWith "stepBO" (show . briDocToDocWithAnns) (show . briDocToDocWithAnns) $ - transformUp f - where - f = \case - x@BDAnnotationPrior{} -> descendPrior x - x@BDAnnotationKW{} -> descendKW x - x@BDAnnotationRest{} -> descendRest x - x@BDAddBaseY{} -> descendAddB x - x@BDBaseYPushCur{} -> descendBYPush x - x@BDBaseYPop{} -> descendBYPop x - x@BDIndentLevelPushCur{} -> descendILPush x - x@BDIndentLevelPop{} -> descendILPop x - x -> x - stepFull = -- traceFunctionWith "stepFull" (show . briDocToDocWithAnns) (show . briDocToDocWithAnns) $ - Uniplate.rewrite $ \case - BDAddBaseY BrIndentNone x -> Just $ x - -- AddIndent floats into Lines. - BDAddBaseY indent (BDLines lines) -> - Just $ BDLines $ BDAddBaseY indent <$> lines - -- AddIndent floats into last column - BDAddBaseY indent (BDCols sig cols) -> - Just - $ BDCols sig - $ List.init cols - ++ [BDAddBaseY indent $ List.last cols] - BDAddBaseY ind (BDSeq list) -> - Just $ BDSeq $ List.init list ++ [BDAddBaseY ind (List.last list)] - -- merge AddIndent and Par - BDAddBaseY ind1 (BDPar ind2 line indented) -> - Just $ BDPar (mergeIndents ind1 ind2) line indented - BDAddBaseY _ lit@BDLit{} -> Just $ lit - BDAddBaseY ind (BDBaseYPushCur x) -> - Just $ BDBaseYPushCur (BDAddBaseY ind x) - BDAddBaseY ind (BDBaseYPop x) -> Just $ BDBaseYPop (BDAddBaseY ind x) - -- prior floating in - BDAnnotationPrior annKey1 (BDPar ind line indented) -> - Just $ BDPar ind (BDAnnotationPrior annKey1 line) indented - BDAnnotationPrior annKey1 (BDSeq (l : lr)) -> - Just $ BDSeq ((BDAnnotationPrior annKey1 l) : lr) - BDAnnotationPrior annKey1 (BDLines (l : lr)) -> - Just $ BDLines ((BDAnnotationPrior annKey1 l) : lr) - BDAnnotationPrior annKey1 (BDCols sig (l : lr)) -> - Just $ BDCols sig ((BDAnnotationPrior annKey1 l) : lr) - -- EnsureIndent float-in - -- BDEnsureIndent indent (BDCols sig (col:colr)) -> - -- Just $ BDCols sig (BDEnsureIndent indent col : (BDAddBaseY indent <$> colr)) - -- not sure if the following rule is necessary; tests currently are - -- unaffected. - -- BDEnsureIndent indent (BDLines lines) -> - -- Just $ BDLines $ BDEnsureIndent indent <$> lines - -- post floating in - BDAnnotationRest annKey1 (BDPar ind line indented) -> - Just $ BDPar ind line $ BDAnnotationRest annKey1 indented - BDAnnotationRest annKey1 (BDSeq list) -> - Just - $ BDSeq - $ List.init list - ++ [BDAnnotationRest annKey1 $ List.last list] - BDAnnotationRest annKey1 (BDLines list) -> - Just - $ BDLines - $ List.init list - ++ [BDAnnotationRest annKey1 $ List.last list] - BDAnnotationRest annKey1 (BDCols sig cols) -> - Just - $ BDCols sig - $ List.init cols - ++ [BDAnnotationRest annKey1 $ List.last cols] - _ -> Nothing + where + descendPrior = transformDownMay $ \case + -- prior floating in + BDAnnotationPrior annKey1 (BDPar ind line indented) -> + Just $ BDPar ind (BDAnnotationPrior annKey1 line) indented + BDAnnotationPrior annKey1 (BDSeq (l:lr)) -> + Just $ BDSeq (BDAnnotationPrior annKey1 l:lr) + BDAnnotationPrior annKey1 (BDLines (l:lr)) -> + Just $ BDLines (BDAnnotationPrior annKey1 l:lr) + BDAnnotationPrior annKey1 (BDCols sig (l:lr)) -> + Just $ BDCols sig (BDAnnotationPrior annKey1 l:lr) + BDAnnotationPrior annKey1 (BDAddBaseY indent x) -> + Just $ BDAddBaseY indent $ BDAnnotationPrior annKey1 x + BDAnnotationPrior annKey1 (BDDebug s x) -> + Just $ BDDebug s $ BDAnnotationPrior annKey1 x + _ -> Nothing + descendRest = transformDownMay $ \case + -- post floating in + BDAnnotationRest annKey1 (BDPar ind line indented) -> + Just $ BDPar ind line $ BDAnnotationRest annKey1 indented + BDAnnotationRest annKey1 (BDSeq list) -> + Just $ BDSeq $ List.init list ++ [BDAnnotationRest annKey1 $ List.last list] + BDAnnotationRest annKey1 (BDLines list) -> + Just $ BDLines $ List.init list ++ [BDAnnotationRest annKey1 $ List.last list] + BDAnnotationRest annKey1 (BDCols sig cols) -> + Just $ BDCols sig $ List.init cols ++ [BDAnnotationRest annKey1 $ List.last cols] + BDAnnotationRest annKey1 (BDAddBaseY indent x) -> + Just $ BDAddBaseY indent $ BDAnnotationRest annKey1 x + BDAnnotationRest annKey1 (BDDebug s x) -> + Just $ BDDebug s $ BDAnnotationRest annKey1 x + _ -> Nothing + descendKW = transformDownMay $ \case + -- post floating in + BDAnnotationKW annKey1 kw (BDPar ind line indented) -> + Just $ BDPar ind line $ BDAnnotationKW annKey1 kw indented + BDAnnotationKW annKey1 kw (BDSeq list) -> + Just $ BDSeq $ List.init list ++ [BDAnnotationKW annKey1 kw $ List.last list] + BDAnnotationKW annKey1 kw (BDLines list) -> + Just $ BDLines $ List.init list ++ [BDAnnotationKW annKey1 kw $ List.last list] + BDAnnotationKW annKey1 kw (BDCols sig cols) -> + Just $ BDCols sig $ List.init cols ++ [BDAnnotationKW annKey1 kw $ List.last cols] + BDAnnotationKW annKey1 kw (BDAddBaseY indent x) -> + Just $ BDAddBaseY indent $ BDAnnotationKW annKey1 kw x + BDAnnotationKW annKey1 kw (BDDebug s x) -> + Just $ BDDebug s $ BDAnnotationKW annKey1 kw x + _ -> Nothing + descendBYPush = transformDownMay $ \case + BDBaseYPushCur (BDCols sig cols@(_:_)) -> + Just $ BDCols sig (BDBaseYPushCur (List.head cols) : List.tail cols) + BDBaseYPushCur (BDDebug s x) -> + Just $ BDDebug s (BDBaseYPushCur x) + _ -> Nothing + descendBYPop = transformDownMay $ \case + BDBaseYPop (BDCols sig cols@(_:_)) -> + Just $ BDCols sig (List.init cols ++ [BDBaseYPop (List.last cols)]) + BDBaseYPop (BDDebug s x) -> + Just $ BDDebug s (BDBaseYPop x) + _ -> Nothing + descendILPush = transformDownMay $ \case + BDIndentLevelPushCur (BDCols sig cols@(_:_)) -> + Just $ BDCols sig (BDIndentLevelPushCur (List.head cols) : List.tail cols) + BDIndentLevelPushCur (BDDebug s x) -> + Just $ BDDebug s (BDIndentLevelPushCur x) + _ -> Nothing + descendILPop = transformDownMay $ \case + BDIndentLevelPop (BDCols sig cols@(_:_)) -> + Just $ BDCols sig (List.init cols ++ [BDIndentLevelPop (List.last cols)]) + BDIndentLevelPop (BDDebug s x) -> + Just $ BDDebug s (BDIndentLevelPop x) + _ -> Nothing + descendAddB = transformDownMay $ \case + BDAddBaseY BrIndentNone x -> + Just x + -- AddIndent floats into Lines. + BDAddBaseY indent (BDLines lines) -> + Just $ BDLines $ BDAddBaseY indent <$> lines + -- AddIndent floats into last column + BDAddBaseY indent (BDCols sig cols) -> + Just $ BDCols sig $ List.init cols ++ [BDAddBaseY indent $ List.last cols] + -- merge AddIndent and Par + BDAddBaseY ind1 (BDPar ind2 line indented) -> + Just $ BDPar (mergeIndents ind1 ind2) line indented + BDAddBaseY ind (BDAnnotationPrior annKey1 x) -> + Just $ BDAnnotationPrior annKey1 (BDAddBaseY ind x) + BDAddBaseY ind (BDAnnotationRest annKey1 x) -> + Just $ BDAnnotationRest annKey1 (BDAddBaseY ind x) + BDAddBaseY ind (BDAnnotationKW annKey1 kw x) -> + Just $ BDAnnotationKW annKey1 kw (BDAddBaseY ind x) + BDAddBaseY ind (BDSeq list) -> + Just $ BDSeq $ List.init list ++ [BDAddBaseY ind (List.last list)] + BDAddBaseY _ lit@BDLit{} -> + Just $ lit + BDAddBaseY ind (BDBaseYPushCur x) -> + Just $ BDBaseYPushCur (BDAddBaseY ind x) + BDAddBaseY ind (BDBaseYPop x) -> + Just $ BDBaseYPop (BDAddBaseY ind x) + BDAddBaseY ind (BDDebug s x) -> + Just $ BDDebug s (BDAddBaseY ind x) + BDAddBaseY ind (BDIndentLevelPop x) -> + Just $ BDIndentLevelPop (BDAddBaseY ind x) + BDAddBaseY ind (BDIndentLevelPushCur x) -> + Just $ BDIndentLevelPushCur (BDAddBaseY ind x) + BDAddBaseY ind (BDEnsureIndent ind2 x) -> + Just $ BDEnsureIndent (mergeIndents ind ind2) x + _ -> Nothing + stepBO :: BriDoc -> BriDoc + stepBO = -- traceFunctionWith "stepBO" (show . briDocToDocWithAnns) (show . briDocToDocWithAnns) $ + transformUp f + where + f = \case + x@BDAnnotationPrior{} -> descendPrior x + x@BDAnnotationKW{} -> descendKW x + x@BDAnnotationRest{} -> descendRest x + x@BDAddBaseY{} -> descendAddB x + x@BDBaseYPushCur{} -> descendBYPush x + x@BDBaseYPop{} -> descendBYPop x + x@BDIndentLevelPushCur{} -> descendILPush x + x@BDIndentLevelPop{} -> descendILPop x + x -> x + stepFull = -- traceFunctionWith "stepFull" (show . briDocToDocWithAnns) (show . briDocToDocWithAnns) $ + Uniplate.rewrite $ \case + BDAddBaseY BrIndentNone x -> + Just $ x + -- AddIndent floats into Lines. + BDAddBaseY indent (BDLines lines) -> + Just $ BDLines $ BDAddBaseY indent <$> lines + -- AddIndent floats into last column + BDAddBaseY indent (BDCols sig cols) -> + Just $ BDCols sig $ List.init cols ++ [BDAddBaseY indent $ List.last cols] + BDAddBaseY ind (BDSeq list) -> + Just $ BDSeq $ List.init list ++ [BDAddBaseY ind (List.last list)] + -- merge AddIndent and Par + BDAddBaseY ind1 (BDPar ind2 line indented) -> + Just $ BDPar (mergeIndents ind1 ind2) line indented + BDAddBaseY _ lit@BDLit{} -> + Just $ lit + BDAddBaseY ind (BDBaseYPushCur x) -> + Just $ BDBaseYPushCur (BDAddBaseY ind x) + BDAddBaseY ind (BDBaseYPop x) -> + Just $ BDBaseYPop (BDAddBaseY ind x) + -- prior floating in + BDAnnotationPrior annKey1 (BDPar ind line indented) -> + Just $ BDPar ind (BDAnnotationPrior annKey1 line) indented + BDAnnotationPrior annKey1 (BDSeq (l:lr)) -> + Just $ BDSeq ((BDAnnotationPrior annKey1 l):lr) + BDAnnotationPrior annKey1 (BDLines (l:lr)) -> + Just $ BDLines ((BDAnnotationPrior annKey1 l):lr) + BDAnnotationPrior annKey1 (BDCols sig (l:lr)) -> + Just $ BDCols sig ((BDAnnotationPrior annKey1 l):lr) + -- EnsureIndent float-in + -- BDEnsureIndent indent (BDCols sig (col:colr)) -> + -- Just $ BDCols sig (BDEnsureIndent indent col : (BDAddBaseY indent <$> colr)) + -- not sure if the following rule is necessary; tests currently are + -- unaffected. + -- BDEnsureIndent indent (BDLines lines) -> + -- Just $ BDLines $ BDEnsureIndent indent <$> lines + -- post floating in + BDAnnotationRest annKey1 (BDPar ind line indented) -> + Just $ BDPar ind line $ BDAnnotationRest annKey1 indented + BDAnnotationRest annKey1 (BDSeq list) -> + Just $ BDSeq $ List.init list ++ [BDAnnotationRest annKey1 $ List.last list] + BDAnnotationRest annKey1 (BDLines list) -> + Just $ BDLines $ List.init list ++ [BDAnnotationRest annKey1 $ List.last list] + BDAnnotationRest annKey1 (BDCols sig cols) -> + Just $ BDCols sig $ List.init cols ++ [BDAnnotationRest annKey1 $ List.last cols] + _ -> Nothing diff --git a/source/library/Language/Haskell/Brittany/Internal/Transformations/Indent.hs b/source/library/Language/Haskell/Brittany/Internal/Transformations/Indent.hs index 9596e5b..7f7d7e5 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Transformations/Indent.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Transformations/Indent.hs @@ -3,10 +3,16 @@ module Language.Haskell.Brittany.Internal.Transformations.Indent where -import qualified Data.Generics.Uniplate.Direct as Uniplate -import qualified GHC.OldList as List + + import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.Types +import qualified GHC.OldList as List + +import Language.Haskell.Brittany.Internal.Types + +import qualified Data.Generics.Uniplate.Direct as Uniplate + + -- prepare layouting by translating BDPar's, replacing them with Indents and -- floating those in. This gives a more clear picture of what exactly is @@ -25,17 +31,15 @@ transformSimplifyIndent = Uniplate.rewrite $ \case -- [ BDAddBaseY ind x -- , BDEnsureIndent ind indented -- ] - BDLines lines - | any - (\case - BDLines{} -> True - BDEmpty{} -> True - _ -> False - ) - lines - -> Just $ BDLines $ filter isNotEmpty $ lines >>= \case + BDLines lines | any ( \case + BDLines{} -> True + BDEmpty{} -> True + _ -> False + ) + lines -> + Just $ BDLines $ filter isNotEmpty $ lines >>= \case BDLines l -> l - x -> [x] + x -> [x] BDLines [l] -> Just l BDAddBaseY i (BDAnnotationPrior k x) -> Just $ BDAnnotationPrior k (BDAddBaseY i x) @@ -49,4 +53,4 @@ transformSimplifyIndent = Uniplate.rewrite $ \case Just $ BDCols sig $ List.init l ++ [BDAddBaseY i $ List.last l] BDAddBaseY _ lit@BDLit{} -> Just lit - _ -> Nothing + _ -> Nothing diff --git a/source/library/Language/Haskell/Brittany/Internal/Transformations/Par.hs b/source/library/Language/Haskell/Brittany/Internal/Transformations/Par.hs index 7fb4aff..305ee08 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Transformations/Par.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Transformations/Par.hs @@ -3,9 +3,14 @@ module Language.Haskell.Brittany.Internal.Transformations.Par where + + import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.Utils + +import Language.Haskell.Brittany.Internal.Utils +import Language.Haskell.Brittany.Internal.Types + + transformSimplifyPar :: BriDoc -> BriDoc transformSimplifyPar = transformUp $ \case @@ -19,28 +24,25 @@ transformSimplifyPar = transformUp $ \case BDPar ind1 line (BDLines (BDEnsureIndent ind2 p1 : indenteds)) BDPar ind1 (BDPar ind2 line p1) p2 -> BDPar ind1 line (BDLines [BDEnsureIndent ind2 p1, p2]) - BDLines lines - | any - (\case - BDLines{} -> True - BDEmpty{} -> True - _ -> False - ) - lines - -> case go lines of - [] -> BDEmpty - [x] -> x - xs -> BDLines xs + BDLines lines | any ( \case + BDLines{} -> True + BDEmpty{} -> True + _ -> False + ) + lines -> case go lines of + [] -> BDEmpty + [x] -> x + xs -> BDLines xs where go = (=<<) $ \case BDLines l -> go l - BDEmpty -> [] - x -> [x] - BDLines [] -> BDEmpty - BDLines [x] -> x + BDEmpty -> [] + x -> [x] + BDLines [] -> BDEmpty + BDLines [x] -> x -- BDCols sig cols | BDPar ind line indented <- List.last cols -> -- Just $ BDPar ind (BDCols sig (List.init cols ++ [line])) indented -- BDPar BrIndentNone line indented -> -- Just $ BDLines [line, indented] BDEnsureIndent BrIndentNone x -> x - x -> x + x -> x diff --git a/source/library/Language/Haskell/Brittany/Internal/Types.hs b/source/library/Language/Haskell/Brittany/Internal/Types.hs index 41d809b..76b7735 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Types.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Types.hs @@ -12,47 +12,52 @@ module Language.Haskell.Brittany.Internal.Types where + + +import Language.Haskell.Brittany.Internal.Prelude import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS import qualified Data.Data -import Data.Generics.Uniplate.Direct as Uniplate -import qualified Data.Kind as Kind import qualified Data.Strict.Maybe as Strict -import qualified Data.Text.Lazy.Builder as Text.Builder -import GHC (AnnKeywordId, GenLocated, Located, SrcSpan) -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Prelude -import qualified Language.Haskell.GHC.ExactPrint as ExactPrint -import Language.Haskell.GHC.ExactPrint (AnnKey) -import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types -import Language.Haskell.GHC.ExactPrint.Types (Anns) import qualified Safe +import qualified Language.Haskell.GHC.ExactPrint as ExactPrint +import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types + +import qualified Data.Text.Lazy.Builder as Text.Builder + +import GHC ( Located, GenLocated, AnnKeywordId, SrcSpan ) + +import Language.Haskell.GHC.ExactPrint ( AnnKey ) +import Language.Haskell.GHC.ExactPrint.Types ( Anns ) + +import Language.Haskell.Brittany.Internal.Config.Types + +import Data.Generics.Uniplate.Direct as Uniplate + +import qualified Data.Kind as Kind + + + data PerItemConfig = PerItemConfig { _icd_perBinding :: Map String (CConfig Maybe) , _icd_perKey :: Map ExactPrint.Types.AnnKey (CConfig Maybe) } deriving Data.Data.Data -type PPM - = MultiRWSS.MultiRWS - '[ Map ExactPrint.AnnKey ExactPrint.Anns - , PerItemConfig - , Config - , ExactPrint.Anns - ] - '[Text.Builder.Builder , [BrittanyError] , Seq String] - '[] +type PPM = MultiRWSS.MultiRWS + '[Map ExactPrint.AnnKey ExactPrint.Anns, PerItemConfig, Config, ExactPrint.Anns] + '[Text.Builder.Builder, [BrittanyError], Seq String] + '[] -type PPMLocal - = MultiRWSS.MultiRWS - '[Config , ExactPrint.Anns] - '[Text.Builder.Builder , [BrittanyError] , Seq String] - '[] +type PPMLocal = MultiRWSS.MultiRWS + '[Config, ExactPrint.Anns] + '[Text.Builder.Builder, [BrittanyError], Seq String] + '[] newtype TopLevelDeclNameMap = TopLevelDeclNameMap (Map ExactPrint.AnnKey String) data LayoutState = LayoutState - { _lstate_baseYs :: [Int] + { _lstate_baseYs :: [Int] -- ^ stack of number of current indentation columns -- (not number of indentations). , _lstate_curYOrAddNewline :: Either Int Int @@ -60,7 +65,7 @@ data LayoutState = LayoutState -- 1) number of chars in the current line. -- 2) number of newlines to be inserted before inserting any -- non-space elements. - , _lstate_indLevels :: [Int] + , _lstate_indLevels :: [Int] -- ^ stack of current indentation levels. set for -- any layout-affected elements such as -- let/do/case/where elements. @@ -73,14 +78,14 @@ data LayoutState = LayoutState -- on the first indented element have an -- annotation offset relative to the last -- non-indented element, which is confusing. - , _lstate_comments :: Anns - , _lstate_commentCol :: Maybe Int -- this communicates two things: + , _lstate_comments :: Anns + , _lstate_commentCol :: Maybe Int -- this communicates two things: -- firstly, that cursor is currently -- at the end of a comment (so needs -- newline before any actual content). -- secondly, the column at which -- insertion of comments started. - , _lstate_addSepSpace :: Maybe Int -- number of spaces to insert if anyone + , _lstate_addSepSpace :: Maybe Int -- number of spaces to insert if anyone -- writes (any non-spaces) in the -- current line. -- , _lstate_isNewline :: NewLineState @@ -110,21 +115,14 @@ lstate_indLevel = Safe.headNote "lstate_baseY" . _lstate_indLevels instance Show LayoutState where show state = "LayoutState" - ++ "{baseYs=" - ++ show (_lstate_baseYs state) - ++ ",curYOrAddNewline=" - ++ show (_lstate_curYOrAddNewline state) - ++ ",indLevels=" - ++ show (_lstate_indLevels state) - ++ ",indLevelLinger=" - ++ show (_lstate_indLevelLinger state) - ++ ",commentCol=" - ++ show (_lstate_commentCol state) - ++ ",addSepSpace=" - ++ show (_lstate_addSepSpace state) - ++ ",commentNewlines=" - ++ show (_lstate_commentNewlines state) - ++ "}" + ++ "{baseYs=" ++ show (_lstate_baseYs state) + ++ ",curYOrAddNewline=" ++ show (_lstate_curYOrAddNewline state) + ++ ",indLevels=" ++ show (_lstate_indLevels state) + ++ ",indLevelLinger=" ++ show (_lstate_indLevelLinger state) + ++ ",commentCol=" ++ show (_lstate_commentCol state) + ++ ",addSepSpace=" ++ show (_lstate_addSepSpace state) + ++ ",commentNewlines=" ++ show (_lstate_commentNewlines state) + ++ "}" -- data NewLineState = NewLineStateInit -- initial state. we do not know if in a -- -- newline, really. by special-casing @@ -225,16 +223,14 @@ data BrIndent = BrIndentNone | BrIndentSpecial Int deriving (Eq, Ord, Data.Data.Data, Show) -type ToBriDocM - = MultiRWSS.MultiRWS - '[Config , Anns] -- reader - '[[BrittanyError] , Seq String] -- writer - '[NodeAllocIndex] -- state +type ToBriDocM = MultiRWSS.MultiRWS + '[Config, Anns] -- reader + '[[BrittanyError], Seq String] -- writer + '[NodeAllocIndex] -- state -type ToBriDoc (sym :: Kind.Type -> Kind.Type) - = Located (sym GhcPs) -> ToBriDocM BriDocNumbered -type ToBriDoc' sym = Located sym -> ToBriDocM BriDocNumbered -type ToBriDocC sym c = Located sym -> ToBriDocM c +type ToBriDoc (sym :: Kind.Type -> Kind.Type) = Located (sym GhcPs) -> ToBriDocM BriDocNumbered +type ToBriDoc' sym = Located sym -> ToBriDocM BriDocNumbered +type ToBriDocC sym c = Located sym -> ToBriDocM c data DocMultiLine = MultiLineNo @@ -342,21 +338,21 @@ type BriDocFInt = BriDocF ((,) Int) type BriDocNumbered = (Int, BriDocFInt) instance Uniplate.Uniplate BriDoc where - uniplate x@BDEmpty{} = plate x - uniplate x@BDLit{} = plate x - uniplate (BDSeq list) = plate BDSeq ||* list - uniplate (BDCols sig list) = plate BDCols |- sig ||* list - uniplate x@BDSeparator = plate x - uniplate (BDAddBaseY ind bd) = plate BDAddBaseY |- ind |* bd - uniplate (BDBaseYPushCur bd) = plate BDBaseYPushCur |* bd - uniplate (BDBaseYPop bd) = plate BDBaseYPop |* bd + uniplate x@BDEmpty{} = plate x + uniplate x@BDLit{} = plate x + uniplate (BDSeq list ) = plate BDSeq ||* list + uniplate (BDCols sig list) = plate BDCols |- sig ||* list + uniplate x@BDSeparator = plate x + uniplate (BDAddBaseY ind bd ) = plate BDAddBaseY |- ind |* bd + uniplate (BDBaseYPushCur bd) = plate BDBaseYPushCur |* bd + uniplate (BDBaseYPop bd) = plate BDBaseYPop |* bd uniplate (BDIndentLevelPushCur bd) = plate BDIndentLevelPushCur |* bd - uniplate (BDIndentLevelPop bd) = plate BDIndentLevelPop |* bd + uniplate (BDIndentLevelPop bd) = plate BDIndentLevelPop |* bd uniplate (BDPar ind line indented) = plate BDPar |- ind |* line |* indented - uniplate (BDAlt alts) = plate BDAlt ||* alts - uniplate (BDForwardLineMode bd) = plate BDForwardLineMode |* bd - uniplate x@BDExternal{} = plate x - uniplate x@BDPlain{} = plate x + uniplate (BDAlt alts ) = plate BDAlt ||* alts + uniplate (BDForwardLineMode bd ) = plate BDForwardLineMode |* bd + uniplate x@BDExternal{} = plate x + uniplate x@BDPlain{} = plate x uniplate (BDAnnotationPrior annKey bd) = plate BDAnnotationPrior |- annKey |* bd uniplate (BDAnnotationKW annKey kw bd) = @@ -365,84 +361,83 @@ instance Uniplate.Uniplate BriDoc where plate BDAnnotationRest |- annKey |* bd uniplate (BDMoveToKWDP annKey kw b bd) = plate BDMoveToKWDP |- annKey |- kw |- b |* bd - uniplate (BDLines lines) = plate BDLines ||* lines - uniplate (BDEnsureIndent ind bd) = plate BDEnsureIndent |- ind |* bd - uniplate (BDForceMultiline bd) = plate BDForceMultiline |* bd - uniplate (BDForceSingleline bd) = plate BDForceSingleline |* bd + uniplate (BDLines lines ) = plate BDLines ||* lines + uniplate (BDEnsureIndent ind bd ) = plate BDEnsureIndent |- ind |* bd + uniplate (BDForceMultiline bd ) = plate BDForceMultiline |* bd + uniplate (BDForceSingleline bd ) = plate BDForceSingleline |* bd uniplate (BDNonBottomSpacing b bd) = plate BDNonBottomSpacing |- b |* bd - uniplate (BDSetParSpacing bd) = plate BDSetParSpacing |* bd - uniplate (BDForceParSpacing bd) = plate BDForceParSpacing |* bd - uniplate (BDDebug s bd) = plate BDDebug |- s |* bd + uniplate (BDSetParSpacing bd ) = plate BDSetParSpacing |* bd + uniplate (BDForceParSpacing bd ) = plate BDForceParSpacing |* bd + uniplate (BDDebug s bd ) = plate BDDebug |- s |* bd newtype NodeAllocIndex = NodeAllocIndex Int -- TODO: rename to "dropLabels" ? unwrapBriDocNumbered :: BriDocNumbered -> BriDoc unwrapBriDocNumbered tpl = case snd tpl of - BDFEmpty -> BDEmpty - BDFLit t -> BDLit t - BDFSeq list -> BDSeq $ rec <$> list - BDFCols sig list -> BDCols sig $ rec <$> list - BDFSeparator -> BDSeparator - BDFAddBaseY ind bd -> BDAddBaseY ind $ rec bd - BDFBaseYPushCur bd -> BDBaseYPushCur $ rec bd - BDFBaseYPop bd -> BDBaseYPop $ rec bd - BDFIndentLevelPushCur bd -> BDIndentLevelPushCur $ rec bd - BDFIndentLevelPop bd -> BDIndentLevelPop $ rec bd - BDFPar ind line indented -> BDPar ind (rec line) (rec indented) - BDFAlt alts -> BDAlt $ rec <$> alts -- not that this will happen - BDFForwardLineMode bd -> BDForwardLineMode $ rec bd - BDFExternal k ks c t -> BDExternal k ks c t - BDFPlain t -> BDPlain t + BDFEmpty -> BDEmpty + BDFLit t -> BDLit t + BDFSeq list -> BDSeq $ rec <$> list + BDFCols sig list -> BDCols sig $ rec <$> list + BDFSeparator -> BDSeparator + BDFAddBaseY ind bd -> BDAddBaseY ind $ rec bd + BDFBaseYPushCur bd -> BDBaseYPushCur $ rec bd + BDFBaseYPop bd -> BDBaseYPop $ rec bd + BDFIndentLevelPushCur bd -> BDIndentLevelPushCur $ rec bd + BDFIndentLevelPop bd -> BDIndentLevelPop $ rec bd + BDFPar ind line indented -> BDPar ind (rec line) (rec indented) + BDFAlt alts -> BDAlt $ rec <$> alts -- not that this will happen + BDFForwardLineMode bd -> BDForwardLineMode $ rec bd + BDFExternal k ks c t -> BDExternal k ks c t + BDFPlain t -> BDPlain t BDFAnnotationPrior annKey bd -> BDAnnotationPrior annKey $ rec bd BDFAnnotationKW annKey kw bd -> BDAnnotationKW annKey kw $ rec bd - BDFAnnotationRest annKey bd -> BDAnnotationRest annKey $ rec bd + BDFAnnotationRest annKey bd -> BDAnnotationRest annKey $ rec bd BDFMoveToKWDP annKey kw b bd -> BDMoveToKWDP annKey kw b $ rec bd - BDFLines lines -> BDLines $ rec <$> lines - BDFEnsureIndent ind bd -> BDEnsureIndent ind $ rec bd - BDFForceMultiline bd -> BDForceMultiline $ rec bd - BDFForceSingleline bd -> BDForceSingleline $ rec bd - BDFNonBottomSpacing b bd -> BDNonBottomSpacing b $ rec bd - BDFSetParSpacing bd -> BDSetParSpacing $ rec bd - BDFForceParSpacing bd -> BDForceParSpacing $ rec bd - BDFDebug s bd -> BDDebug (s ++ "@" ++ show (fst tpl)) $ rec bd + BDFLines lines -> BDLines $ rec <$> lines + BDFEnsureIndent ind bd -> BDEnsureIndent ind $ rec bd + BDFForceMultiline bd -> BDForceMultiline $ rec bd + BDFForceSingleline bd -> BDForceSingleline $ rec bd + BDFNonBottomSpacing b bd -> BDNonBottomSpacing b $ rec bd + BDFSetParSpacing bd -> BDSetParSpacing $ rec bd + BDFForceParSpacing bd -> BDForceParSpacing $ rec bd + BDFDebug s bd -> BDDebug (s ++ "@" ++ show (fst tpl)) $ rec bd where rec = unwrapBriDocNumbered isNotEmpty :: BriDoc -> Bool isNotEmpty BDEmpty = False -isNotEmpty _ = True +isNotEmpty _ = True -- this might not work. is not used anywhere either. briDocSeqSpine :: BriDoc -> () briDocSeqSpine = \case - BDEmpty -> () - BDLit _t -> () - BDSeq list -> foldl' ((briDocSeqSpine .) . seq) () list - BDCols _sig list -> foldl' ((briDocSeqSpine .) . seq) () list - BDSeparator -> () - BDAddBaseY _ind bd -> briDocSeqSpine bd - BDBaseYPushCur bd -> briDocSeqSpine bd - BDBaseYPop bd -> briDocSeqSpine bd - BDIndentLevelPushCur bd -> briDocSeqSpine bd - BDIndentLevelPop bd -> briDocSeqSpine bd - BDPar _ind line indented -> - briDocSeqSpine line `seq` briDocSeqSpine indented - BDAlt alts -> foldl' (\() -> briDocSeqSpine) () alts - BDForwardLineMode bd -> briDocSeqSpine bd - BDExternal{} -> () - BDPlain{} -> () - BDAnnotationPrior _annKey bd -> briDocSeqSpine bd - BDAnnotationKW _annKey _kw bd -> briDocSeqSpine bd - BDAnnotationRest _annKey bd -> briDocSeqSpine bd + BDEmpty -> () + BDLit _t -> () + BDSeq list -> foldl' ((briDocSeqSpine .) . seq) () list + BDCols _sig list -> foldl' ((briDocSeqSpine .) . seq) () list + BDSeparator -> () + BDAddBaseY _ind bd -> briDocSeqSpine bd + BDBaseYPushCur bd -> briDocSeqSpine bd + BDBaseYPop bd -> briDocSeqSpine bd + BDIndentLevelPushCur bd -> briDocSeqSpine bd + BDIndentLevelPop bd -> briDocSeqSpine bd + BDPar _ind line indented -> briDocSeqSpine line `seq` briDocSeqSpine indented + BDAlt alts -> foldl' (\() -> briDocSeqSpine) () alts + BDForwardLineMode bd -> briDocSeqSpine bd + BDExternal{} -> () + BDPlain{} -> () + BDAnnotationPrior _annKey bd -> briDocSeqSpine bd + BDAnnotationKW _annKey _kw bd -> briDocSeqSpine bd + BDAnnotationRest _annKey bd -> briDocSeqSpine bd BDMoveToKWDP _annKey _kw _b bd -> briDocSeqSpine bd - BDLines lines -> foldl' (\() -> briDocSeqSpine) () lines - BDEnsureIndent _ind bd -> briDocSeqSpine bd - BDForceMultiline bd -> briDocSeqSpine bd - BDForceSingleline bd -> briDocSeqSpine bd - BDNonBottomSpacing _ bd -> briDocSeqSpine bd - BDSetParSpacing bd -> briDocSeqSpine bd - BDForceParSpacing bd -> briDocSeqSpine bd - BDDebug _s bd -> briDocSeqSpine bd + BDLines lines -> foldl' (\() -> briDocSeqSpine) () lines + BDEnsureIndent _ind bd -> briDocSeqSpine bd + BDForceMultiline bd -> briDocSeqSpine bd + BDForceSingleline bd -> briDocSeqSpine bd + BDNonBottomSpacing _ bd -> briDocSeqSpine bd + BDSetParSpacing bd -> briDocSeqSpine bd + BDForceParSpacing bd -> briDocSeqSpine bd + BDDebug _s bd -> briDocSeqSpine bd briDocForceSpine :: BriDoc -> BriDoc briDocForceSpine bd = briDocSeqSpine bd `seq` bd @@ -461,19 +456,18 @@ data VerticalSpacingPar -- product like (Normal|Always, None|Some Int). deriving (Eq, Show) -data VerticalSpacing = VerticalSpacing - { _vs_sameLine :: !Int - , _vs_paragraph :: !VerticalSpacingPar - , _vs_parFlag :: !Bool - } +data VerticalSpacing + = VerticalSpacing + { _vs_sameLine :: !Int + , _vs_paragraph :: !VerticalSpacingPar + , _vs_parFlag :: !Bool + } deriving (Eq, Show) newtype LineModeValidity a = LineModeValidity (Strict.Maybe a) deriving (Functor, Applicative, Monad, Show, Alternative) -pattern LineModeValid :: forall t . t -> LineModeValidity t -pattern LineModeValid x = - LineModeValidity (Strict.Just x) :: LineModeValidity t -pattern LineModeInvalid :: forall t . LineModeValidity t -pattern LineModeInvalid = - LineModeValidity Strict.Nothing :: LineModeValidity t +pattern LineModeValid :: forall t. t -> LineModeValidity t +pattern LineModeValid x = LineModeValidity (Strict.Just x) :: LineModeValidity t +pattern LineModeInvalid :: forall t. LineModeValidity t +pattern LineModeInvalid = LineModeValidity Strict.Nothing :: LineModeValidity t diff --git a/source/library/Language/Haskell/Brittany/Internal/Utils.hs b/source/library/Language/Haskell/Brittany/Internal/Utils.hs index a52caa4..a12f7ea 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Utils.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Utils.hs @@ -7,29 +7,40 @@ module Language.Haskell.Brittany.Internal.Utils where -import qualified Data.ByteString as B -import qualified Data.Coerce -import Data.Data -import Data.Generics.Aliases -import qualified Data.Generics.Uniplate.Direct as Uniplate -import qualified Data.Semigroup as Semigroup -import qualified Data.Sequence as Seq -import DataTreePrint -import qualified GHC.Data.FastString as GHC -import qualified GHC.Driver.Session as GHC -import qualified GHC.Hs.Extension as HsExtension -import qualified GHC.OldList as List -import GHC.Types.Name.Occurrence as OccName (occNameString) -import qualified GHC.Types.SrcLoc as GHC -import qualified GHC.Utils.Outputable as GHC -import Language.Haskell.Brittany.Internal.Config.Types + + import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import Language.Haskell.Brittany.Internal.Types +import qualified Data.Coerce +import qualified Data.Semigroup as Semigroup +import qualified Data.Sequence as Seq +import qualified GHC.OldList as List + import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types import qualified Language.Haskell.GHC.ExactPrint.Utils as ExactPrint.Utils + +import Data.Data +import Data.Generics.Aliases + import qualified Text.PrettyPrint as PP +import qualified GHC.Utils.Outputable as GHC +import qualified GHC.Driver.Session as GHC +import qualified GHC.Data.FastString as GHC +import qualified GHC.Types.SrcLoc as GHC +import GHC.Types.Name.Occurrence as OccName ( occNameString ) +import qualified Data.ByteString as B + +import DataTreePrint + +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Types + +import qualified Data.Generics.Uniplate.Direct as Uniplate +import qualified GHC.Hs.Extension as HsExtension + + + parDoc :: String -> PP.Doc parDoc = PP.fsep . fmap PP.text . List.words @@ -44,8 +55,7 @@ showOutputable :: (GHC.Outputable a) => a -> String showOutputable = GHC.showPpr GHC.unsafeGlobalDynFlags fromMaybeIdentity :: Identity a -> Maybe a -> Identity a -fromMaybeIdentity x y = - Data.Coerce.coerce $ fromMaybe (Data.Coerce.coerce x) y +fromMaybeIdentity x y = Data.Coerce.coerce $ fromMaybe (Data.Coerce.coerce x) y fromOptionIdentity :: Identity a -> Maybe a -> Identity a fromOptionIdentity x y = @@ -60,26 +70,24 @@ instance (Num a, Ord a) => Semigroup (Max a) where (<>) = Data.Coerce.coerce (max :: a -> a -> a) instance (Num a, Ord a) => Monoid (Max a) where - mempty = Max 0 + mempty = Max 0 mappend = (<>) newtype ShowIsId = ShowIsId String deriving Data -instance Show ShowIsId where - show (ShowIsId x) = x +instance Show ShowIsId where show (ShowIsId x) = x -data A x = A ShowIsId x - deriving Data +data A x = A ShowIsId x deriving Data customLayouterF :: ExactPrint.Types.Anns -> LayouterF customLayouterF anns layoutF = DataToLayouter - $ f - `extQ` showIsId - `extQ` fastString - `extQ` bytestring - `extQ` occName - `extQ` srcSpan + $ f + `extQ` showIsId + `extQ` fastString + `extQ` bytestring + `extQ` occName + `extQ` srcSpan `ext2Q` located where DataToLayouter f = defaultLayouterF layoutF @@ -87,22 +95,18 @@ customLayouterF anns layoutF = simpleLayouter s = NodeLayouter (length s) False (const $ PP.text s) showIsId :: ShowIsId -> NodeLayouter showIsId (ShowIsId s) = NodeLayouter (length s + 2) True $ \case - Left True -> PP.parens $ PP.text s - Left False -> PP.text s - Right _ -> PP.text s + Left True -> PP.parens $ PP.text s + Left False -> PP.text s + Right _ -> PP.text s fastString = - simpleLayouter . ("{FastString: " ++) . (++ "}") . show :: GHC.FastString + simpleLayouter . ("{FastString: "++) . (++"}") . show :: GHC.FastString -> NodeLayouter bytestring = simpleLayouter . show :: B.ByteString -> NodeLayouter - occName = - simpleLayouter . ("{OccName: " ++) . (++ "}") . OccName.occNameString + occName = simpleLayouter . ("{OccName: "++) . (++"}") . OccName.occNameString srcSpan :: GHC.SrcSpan -> NodeLayouter - srcSpan ss = - simpleLayouter + srcSpan ss = simpleLayouter -- - $ "{"++ showSDoc_ (GHC.ppr ss)++"}" - $ "{" - ++ showOutputable ss - ++ "}" + $ "{" ++ showOutputable ss ++ "}" located :: (Data b, Data loc) => GHC.GenLocated loc b -> NodeLayouter located (GHC.L ss a) = runDataToLayouter layoutF $ A annStr a where @@ -114,12 +118,12 @@ customLayouterF anns layoutF = customLayouterNoAnnsF :: LayouterF customLayouterNoAnnsF layoutF = DataToLayouter - $ f - `extQ` showIsId - `extQ` fastString - `extQ` bytestring - `extQ` occName - `extQ` srcSpan + $ f + `extQ` showIsId + `extQ` fastString + `extQ` bytestring + `extQ` occName + `extQ` srcSpan `ext2Q` located where DataToLayouter f = defaultLayouterF layoutF @@ -127,15 +131,14 @@ customLayouterNoAnnsF layoutF = simpleLayouter s = NodeLayouter (length s) False (const $ PP.text s) showIsId :: ShowIsId -> NodeLayouter showIsId (ShowIsId s) = NodeLayouter (length s + 2) True $ \case - Left True -> PP.parens $ PP.text s - Left False -> PP.text s - Right _ -> PP.text s + Left True -> PP.parens $ PP.text s + Left False -> PP.text s + Right _ -> PP.text s fastString = - simpleLayouter . ("{FastString: " ++) . (++ "}") . show :: GHC.FastString + simpleLayouter . ("{FastString: "++) . (++"}") . show :: GHC.FastString -> NodeLayouter bytestring = simpleLayouter . show :: B.ByteString -> NodeLayouter - occName = - simpleLayouter . ("{OccName: " ++) . (++ "}") . OccName.occNameString + occName = simpleLayouter . ("{OccName: "++) . (++"}") . OccName.occNameString srcSpan :: GHC.SrcSpan -> NodeLayouter srcSpan ss = simpleLayouter $ "{" ++ showSDoc_ (GHC.ppr ss) ++ "}" located :: (Data b) => GHC.GenLocated loc b -> NodeLayouter @@ -199,11 +202,12 @@ traceIfDumpConf s accessor val = do whenM (mAsk <&> _conf_debug .> accessor .> confUnpack) $ do trace ("---- " ++ s ++ " ----\n" ++ show val) $ return () -tellDebugMess :: MonadMultiWriter (Seq String) m => String -> m () +tellDebugMess :: MonadMultiWriter + (Seq String) m => String -> m () tellDebugMess s = mTell $ Seq.singleton s -tellDebugMessShow - :: forall a m . (MonadMultiWriter (Seq String) m, Show a) => a -> m () +tellDebugMessShow :: forall a m . (MonadMultiWriter + (Seq String) m, Show a) => a -> m () tellDebugMessShow = tellDebugMess . show -- i should really put that into multistate.. @@ -218,28 +222,29 @@ briDocToDoc = astToDoc . removeAnnotations where removeAnnotations = Uniplate.transform $ \case BDAnnotationPrior _ x -> x - BDAnnotationKW _ _ x -> x - BDAnnotationRest _ x -> x - x -> x + BDAnnotationKW _ _ x -> x + BDAnnotationRest _ x -> x + x -> x briDocToDocWithAnns :: BriDoc -> PP.Doc briDocToDocWithAnns = astToDoc annsDoc :: ExactPrint.Types.Anns -> PP.Doc -annsDoc = - printTreeWithCustom 100 customLayouterNoAnnsF . fmap (ShowIsId . show) +annsDoc = printTreeWithCustom 100 customLayouterNoAnnsF . fmap (ShowIsId . show) breakEither :: (a -> Either b c) -> [a] -> ([b], [c]) -breakEither _ [] = ([], []) -breakEither fn (a1 : aR) = case fn a1 of - Left b -> (b : bs, cs) +breakEither _ [] = ([], []) +breakEither fn (a1:aR) = case fn a1 of + Left b -> (b : bs, cs) Right c -> (bs, c : cs) - where (bs, cs) = breakEither fn aR + where + (bs, cs) = breakEither fn aR spanMaybe :: (a -> Maybe b) -> [a] -> ([b], [a]) -spanMaybe f (x1 : xR) | Just y <- f x1 = (y : ys, xs) - where (ys, xs) = spanMaybe f xR -spanMaybe _ xs = ([], xs) +spanMaybe f (x1:xR) | Just y <- f x1 = (y : ys, xs) + where + (ys, xs) = spanMaybe f xR +spanMaybe _ xs = ([], xs) data FirstLastView a = FirstLastEmpty @@ -249,7 +254,7 @@ data FirstLastView a splitFirstLast :: [a] -> FirstLastView a splitFirstLast [] = FirstLastEmpty splitFirstLast [x] = FirstLastSingleton x -splitFirstLast (x1 : xr) = FirstLast x1 (List.init xr) (List.last xr) +splitFirstLast (x1:xr) = FirstLast x1 (List.init xr) (List.last xr) -- TODO: move to uniplate upstream? -- aka `transform` @@ -268,7 +273,7 @@ lines' :: String -> [String] lines' s = case break (== '\n') s of (s1, []) -> [s1] (s1, [_]) -> [s1, ""] - (s1, (_ : r)) -> s1 : lines' r + (s1, (_:r)) -> s1 : lines' r absurdExt :: HsExtension.NoExtCon -> a absurdExt = HsExtension.noExtCon diff --git a/source/library/Language/Haskell/Brittany/Main.hs b/source/library/Language/Haskell/Brittany/Main.hs index 7f22f11..87ebe66 100644 --- a/source/library/Language/Haskell/Brittany/Main.hs +++ b/source/library/Language/Haskell/Brittany/Main.hs @@ -4,41 +4,58 @@ module Language.Haskell.Brittany.Main where -import Control.Monad (zipWithM) + + +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Control.Monad.Trans.Except as ExceptT -import Data.CZipWith import qualified Data.Either import qualified Data.List.Extra -import qualified Data.Monoid import qualified Data.Semigroup as Semigroup import qualified Data.Text as Text import qualified Data.Text.IO as Text.IO import qualified Data.Text.Lazy as TextL -import DataTreePrint -import GHC (GenLocated(L)) -import qualified GHC.Driver.Session as GHC -import qualified GHC.LanguageExtensions.Type as GHC import qualified GHC.OldList as List -import GHC.Utils.Outputable (Outputable(..), showSDocUnsafe) -import Language.Haskell.Brittany.Internal -import Language.Haskell.Brittany.Internal.Config -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Obfuscation -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.Utils -import qualified Language.Haskell.GHC.ExactPrint as ExactPrint -import Paths_brittany -import qualified System.Directory as Directory -import qualified System.Exit -import qualified System.FilePath.Posix as FilePath import qualified System.IO -import qualified Text.ParserCombinators.ReadP as ReadP -import qualified Text.ParserCombinators.ReadPrec as ReadPrec -import qualified Text.PrettyPrint as PP -import Text.Read (Read(..)) -import UI.Butcher.Monadic + +-- brittany { lconfig_importAsColumn: 60, lconfig_importColumn: 60 } +import qualified Language.Haskell.GHC.ExactPrint as ExactPrint +import qualified Data.Monoid + +import GHC ( GenLocated(L) ) +import GHC.Utils.Outputable ( Outputable(..) + , showSDocUnsafe + ) + +import Text.Read ( Read(..) ) +import qualified Text.ParserCombinators.ReadP as ReadP +import qualified Text.ParserCombinators.ReadPrec as ReadPrec + +import Control.Monad ( zipWithM ) +import Data.CZipWith + +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal +import Language.Haskell.Brittany.Internal.Config +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Utils +import Language.Haskell.Brittany.Internal.Obfuscation + +import qualified Text.PrettyPrint as PP + +import DataTreePrint +import UI.Butcher.Monadic + +import qualified System.Exit +import qualified System.Directory as Directory +import qualified System.FilePath.Posix as FilePath + +import qualified GHC.Driver.Session as GHC +import qualified GHC.LanguageExtensions.Type as GHC + +import Paths_brittany + + data WriteMode = Display | Inplace @@ -93,7 +110,7 @@ helpDoc = PP.vcat $ List.intersperse ] , parDoc $ "See https://github.com/lspitzner/brittany" , parDoc - $ "Please report bugs at" + $ "Please report bugs at" ++ " https://github.com/lspitzner/brittany/issues" ] @@ -130,16 +147,15 @@ mainCmdParser helpDesc = do addCmd "license" $ addCmdImpl $ print $ licenseDoc -- addButcherDebugCommand reorderStart - printHelp <- addSimpleBoolFlag "h" ["help"] mempty + printHelp <- addSimpleBoolFlag "h" ["help"] mempty printVersion <- addSimpleBoolFlag "" ["version"] mempty printLicense <- addSimpleBoolFlag "" ["license"] mempty noUserConfig <- addSimpleBoolFlag "" ["no-user-config"] mempty - configPaths <- addFlagStringParams - "" - ["config-file"] - "PATH" - (flagHelpStr "path to config file") -- TODO: allow default on addFlagStringParam ? - cmdlineConfig <- cmdlineConfigParser + configPaths <- addFlagStringParams "" + ["config-file"] + "PATH" + (flagHelpStr "path to config file") -- TODO: allow default on addFlagStringParam ? + cmdlineConfig <- cmdlineConfigParser suppressOutput <- addSimpleBoolFlag "" ["suppress-output"] @@ -165,7 +181,7 @@ mainCmdParser helpDesc = do "" ["write-mode"] "(display|inplace)" - (flagHelp + ( flagHelp (PP.vcat [ PP.text "display: output for any input(s) goes to stdout" , PP.text "inplace: override respective input file (without backup!)" @@ -195,13 +211,11 @@ mainCmdParser helpDesc = do $ ppHelpShallow helpDesc System.Exit.exitSuccess - let - inputPaths = - if null inputParams then [Nothing] else map Just inputParams - let - outputPaths = case writeMode of - Display -> repeat Nothing - Inplace -> inputPaths + let inputPaths = + if null inputParams then [Nothing] else map Just inputParams + let outputPaths = case writeMode of + Display -> repeat Nothing + Inplace -> inputPaths configsToLoad <- liftIO $ if null configPaths then @@ -216,15 +230,14 @@ mainCmdParser helpDesc = do ) >>= \case Nothing -> System.Exit.exitWith (System.Exit.ExitFailure 53) - Just x -> return x + Just x -> return x when (config & _conf_debug & _dconf_dump_config & confUnpack) $ trace (showConfigYaml config) $ return () - results <- zipWithM - (coreIO putStrErrLn config suppressOutput checkMode) - inputPaths - outputPaths + results <- zipWithM (coreIO putStrErrLn config suppressOutput checkMode) + inputPaths + outputPaths if checkMode then when (Changes `elem` (Data.Either.rights results)) @@ -253,65 +266,58 @@ coreIO -> IO (Either Int ChangeStatus) -- ^ Either an errorNo, or the change status. coreIO putErrorLnIO config suppressOutput checkMode inputPathM outputPathM = ExceptT.runExceptT $ do - let - putErrorLn = liftIO . putErrorLnIO :: String -> ExceptT.ExceptT e IO () + let putErrorLn = liftIO . putErrorLnIO :: String -> ExceptT.ExceptT e IO () let ghcOptions = config & _conf_forward & _options_ghc & runIdentity -- there is a good of code duplication between the following code and the -- `pureModuleTransform` function. Unfortunately, there are also a good -- amount of slight differences: This module is a bit more verbose, and -- it tries to use the full-blown `parseModule` function which supports -- CPP (but requires the input to be a file..). - let cppMode = config & _conf_preprocessor & _ppconf_CPPMode & confUnpack + let cppMode = config & _conf_preprocessor & _ppconf_CPPMode & confUnpack -- the flag will do the following: insert a marker string -- ("-- BRITANY_INCLUDE_HACK ") right before any lines starting with -- "#include" before processing (parsing) input; and remove that marker -- string from the transformation output. -- The flag is intentionally misspelled to prevent clashing with -- inline-config stuff. - let - hackAroundIncludes = - config & _conf_preprocessor & _ppconf_hackAroundIncludes & confUnpack - let - exactprintOnly = viaGlobal || viaDebug - where - viaGlobal = config & _conf_roundtrip_exactprint_only & confUnpack - viaDebug = - config & _conf_debug & _dconf_roundtrip_exactprint_only & confUnpack + let hackAroundIncludes = + config & _conf_preprocessor & _ppconf_hackAroundIncludes & confUnpack + let exactprintOnly = viaGlobal || viaDebug + where + viaGlobal = config & _conf_roundtrip_exactprint_only & confUnpack + viaDebug = + config & _conf_debug & _dconf_roundtrip_exactprint_only & confUnpack - let - cppCheckFunc dynFlags = if GHC.xopt GHC.Cpp dynFlags - then case cppMode of - CPPModeAbort -> do - return $ Left "Encountered -XCPP. Aborting." - CPPModeWarn -> do - putErrorLnIO - $ "Warning: Encountered -XCPP." - ++ " Be warned that -XCPP is not supported and that" - ++ " brittany cannot check that its output is syntactically" - ++ " valid in its presence." - return $ Right True - CPPModeNowarn -> return $ Right True - else return $ Right False + let cppCheckFunc dynFlags = if GHC.xopt GHC.Cpp dynFlags + then case cppMode of + CPPModeAbort -> do + return $ Left "Encountered -XCPP. Aborting." + CPPModeWarn -> do + putErrorLnIO + $ "Warning: Encountered -XCPP." + ++ " Be warned that -XCPP is not supported and that" + ++ " brittany cannot check that its output is syntactically" + ++ " valid in its presence." + return $ Right True + CPPModeNowarn -> return $ Right True + else return $ Right False (parseResult, originalContents) <- case inputPathM of Nothing -> do -- TODO: refactor this hack to not be mixed into parsing logic - let - hackF s = if "#include" `isPrefixOf` s - then "-- BRITANY_INCLUDE_HACK " ++ s - else s - let - hackTransform = if hackAroundIncludes && not exactprintOnly - then List.intercalate "\n" . fmap hackF . lines' - else id + let hackF s = if "#include" `isPrefixOf` s + then "-- BRITANY_INCLUDE_HACK " ++ s + else s + let hackTransform = if hackAroundIncludes && not exactprintOnly + then List.intercalate "\n" . fmap hackF . lines' + else id inputString <- liftIO System.IO.getContents - parseRes <- liftIO $ parseModuleFromString - ghcOptions - "stdin" - cppCheckFunc - (hackTransform inputString) + parseRes <- liftIO $ parseModuleFromString ghcOptions + "stdin" + cppCheckFunc + (hackTransform inputString) return (parseRes, Text.pack inputString) Just p -> liftIO $ do - parseRes <- parseModule ghcOptions p cppCheckFunc + parseRes <- parseModule ghcOptions p cppCheckFunc inputText <- Text.IO.readFile p -- The above means we read the file twice, but the -- GHC API does not really expose the source it @@ -340,12 +346,10 @@ coreIO putErrorLnIO config suppressOutput checkMode inputPathM outputPathM = pure c let moduleConf = cZipWith fromOptionIdentity config inlineConf when (config & _conf_debug & _dconf_dump_ast_full & confUnpack) $ do - let - val = printTreeWithCustom 100 (customLayouterF anns) parsedSource + let val = printTreeWithCustom 100 (customLayouterF anns) parsedSource trace ("---- ast ----\n" ++ show val) $ return () - let - disableFormatting = - moduleConf & _conf_disable_formatting & confUnpack + let disableFormatting = + moduleConf & _conf_disable_formatting & confUnpack (errsWarns, outSText, hasChanges) <- do if | disableFormatting -> do @@ -354,52 +358,46 @@ coreIO putErrorLnIO config suppressOutput checkMode inputPathM outputPathM = let r = Text.pack $ ExactPrint.exactPrint parsedSource anns pure ([], r, r /= originalContents) | otherwise -> do - let - omitCheck = - moduleConf - & _conf_errorHandling - .> _econf_omit_output_valid_check - .> confUnpack + let omitCheck = + moduleConf + & _conf_errorHandling + .> _econf_omit_output_valid_check + .> confUnpack (ews, outRaw) <- if hasCPP || omitCheck then return $ pPrintModule moduleConf perItemConf anns parsedSource - else liftIO $ pPrintModuleAndCheck - moduleConf - perItemConf - anns - parsedSource - let - hackF s = fromMaybe s $ TextL.stripPrefix - (TextL.pack "-- BRITANY_INCLUDE_HACK ") - s - let - out = TextL.toStrict $ if hackAroundIncludes - then - TextL.intercalate (TextL.pack "\n") - $ hackF - <$> TextL.splitOn (TextL.pack "\n") outRaw - else outRaw + else liftIO $ pPrintModuleAndCheck moduleConf + perItemConf + anns + parsedSource + let hackF s = fromMaybe s $ TextL.stripPrefix + (TextL.pack "-- BRITANY_INCLUDE_HACK ") + s + let out = TextL.toStrict $ if hackAroundIncludes + then + TextL.intercalate (TextL.pack "\n") + $ hackF + <$> TextL.splitOn (TextL.pack "\n") outRaw + else outRaw out' <- if moduleConf & _conf_obfuscate & confUnpack then lift $ obfuscate out else pure out pure $ (ews, out', out' /= originalContents) - let - customErrOrder ErrorInput{} = 4 - customErrOrder LayoutWarning{} = -1 :: Int - customErrOrder ErrorOutputCheck{} = 1 - customErrOrder ErrorUnusedComment{} = 2 - customErrOrder ErrorUnknownNode{} = -2 :: Int - customErrOrder ErrorMacroConfig{} = 5 + let customErrOrder ErrorInput{} = 4 + customErrOrder LayoutWarning{} = -1 :: Int + customErrOrder ErrorOutputCheck{} = 1 + customErrOrder ErrorUnusedComment{} = 2 + customErrOrder ErrorUnknownNode{} = -2 :: Int + customErrOrder ErrorMacroConfig{} = 5 unless (null errsWarns) $ do - let - groupedErrsWarns = - Data.List.Extra.groupOn customErrOrder - $ List.sortOn customErrOrder - $ errsWarns + let groupedErrsWarns = + Data.List.Extra.groupOn customErrOrder + $ List.sortOn customErrOrder + $ errsWarns groupedErrsWarns `forM_` \case (ErrorOutputCheck{} : _) -> do putErrorLn - $ "ERROR: brittany pretty printer" + $ "ERROR: brittany pretty printer" ++ " returned syntactically invalid result." (ErrorInput str : _) -> do putErrorLn $ "ERROR: parse error: " ++ str @@ -408,10 +406,9 @@ coreIO putErrorLnIO config suppressOutput checkMode inputPathM outputPathM = $ "WARNING: encountered unknown syntactical constructs:" uns `forM_` \case ErrorUnknownNode str ast@(L loc _) -> do - putErrorLn $ " " <> str <> " at " <> showSDocUnsafe - (ppr loc) + putErrorLn $ " " <> str <> " at " <> showSDocUnsafe (ppr loc) when - (config + ( config & _conf_debug & _dconf_dump_ast_unknown & confUnpack @@ -425,17 +422,17 @@ coreIO putErrorLnIO config suppressOutput checkMode inputPathM outputPathM = putErrorLn $ "WARNINGS:" warns `forM_` \case LayoutWarning str -> putErrorLn str - _ -> error "cannot happen (TM)" + _ -> error "cannot happen (TM)" unused@(ErrorUnusedComment{} : _) -> do putErrorLn - $ "Error: detected unprocessed comments." + $ "Error: detected unprocessed comments." ++ " The transformation output will most likely" ++ " not contain some of the comments" ++ " present in the input haskell source file." putErrorLn $ "Affected are the following comments:" unused `forM_` \case ErrorUnusedComment str -> putErrorLn str - _ -> error "cannot happen (TM)" + _ -> error "cannot happen (TM)" (ErrorMacroConfig err input : _) -> do putErrorLn $ "Error: parse error in inline configuration:" putErrorLn err @@ -446,8 +443,8 @@ coreIO putErrorLnIO config suppressOutput checkMode inputPathM outputPathM = let hasErrors = if config & _conf_errorHandling & _econf_Werror & confUnpack - then not $ null errsWarns - else 0 < maximum (-1 : fmap customErrOrder errsWarns) + then not $ null errsWarns + else 0 < maximum (-1 : fmap customErrOrder errsWarns) outputOnErrs = config & _conf_errorHandling @@ -462,11 +459,10 @@ coreIO putErrorLnIO config suppressOutput checkMode inputPathM outputPathM = $ addTraceSep (_conf_debug config) $ case outputPathM of Nothing -> liftIO $ Text.IO.putStr $ outSText - Just p -> liftIO $ do - let - isIdentical = case inputPathM of - Nothing -> False - Just _ -> not hasChanges + Just p -> liftIO $ do + let isIdentical = case inputPathM of + Nothing -> False + Just _ -> not hasChanges unless isIdentical $ Text.IO.writeFile p $ outSText when (checkMode && hasChanges) $ case inputPathM of @@ -478,15 +474,15 @@ coreIO putErrorLnIO config suppressOutput checkMode inputPathM outputPathM = where addTraceSep conf = if or - [ confUnpack $ _dconf_dump_annotations conf - , confUnpack $ _dconf_dump_ast_unknown conf - , confUnpack $ _dconf_dump_ast_full conf - , confUnpack $ _dconf_dump_bridoc_raw conf - , confUnpack $ _dconf_dump_bridoc_simpl_alt conf - , confUnpack $ _dconf_dump_bridoc_simpl_floating conf - , confUnpack $ _dconf_dump_bridoc_simpl_columns conf - , confUnpack $ _dconf_dump_bridoc_simpl_indent conf - , confUnpack $ _dconf_dump_bridoc_final conf - ] + [ confUnpack $ _dconf_dump_annotations conf + , confUnpack $ _dconf_dump_ast_unknown conf + , confUnpack $ _dconf_dump_ast_full conf + , confUnpack $ _dconf_dump_bridoc_raw conf + , confUnpack $ _dconf_dump_bridoc_simpl_alt conf + , confUnpack $ _dconf_dump_bridoc_simpl_floating conf + , confUnpack $ _dconf_dump_bridoc_simpl_columns conf + , confUnpack $ _dconf_dump_bridoc_simpl_indent conf + , confUnpack $ _dconf_dump_bridoc_final conf + ] then trace "----" else id diff --git a/source/test-suite/Main.hs b/source/test-suite/Main.hs index a39eecf..774088f 100644 --- a/source/test-suite/Main.hs +++ b/source/test-suite/Main.hs @@ -2,24 +2,35 @@ {-# LANGUAGE MonadComprehensions #-} {-# LANGUAGE ScopedTypeVariables #-} -import Data.Coerce (coerce) -import Data.List (groupBy) +import Language.Haskell.Brittany.Internal.Prelude import qualified Data.Maybe import qualified Data.Semigroup as Semigroup import qualified Data.Text as Text -import qualified Data.Text.IO as Text.IO import qualified GHC.OldList as List -import Language.Haskell.Brittany.Internal -import Language.Haskell.Brittany.Internal.Config -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils import qualified System.Directory -import System.FilePath (()) -import System.Timeout (timeout) -import Test.Hspec -import qualified Text.Parsec as Parsec -import Text.Parsec.Text (Parser) + +import Test.Hspec + +import qualified Text.Parsec as Parsec +import Text.Parsec.Text ( Parser ) + +import Data.List ( groupBy ) + +import Language.Haskell.Brittany.Internal + +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Config + +import Data.Coerce ( coerce ) + +import qualified Data.Text.IO as Text.IO +import System.FilePath ( () ) + +import System.Timeout ( timeout ) + + + +import Language.Haskell.Brittany.Internal.PreludeUtils hush :: Either a b -> Maybe b hush = either (const Nothing) Just @@ -29,32 +40,32 @@ hush = either (const Nothing) Just asymptoticPerfTest :: Spec asymptoticPerfTest = do it "10 do statements" - $ roundTripEqualWithTimeout 1500000 - $ (Text.pack "func = do\n") + $ roundTripEqualWithTimeout 1500000 + $ (Text.pack "func = do\n") <> Text.replicate 10 (Text.pack " statement\n") it "10 do nestings" - $ roundTripEqualWithTimeout 4000000 - $ (Text.pack "func = ") + $ roundTripEqualWithTimeout 4000000 + $ (Text.pack "func = ") <> mconcat - ([1 .. 10] <&> \(i :: Int) -> - (Text.replicate (2 * i) (Text.pack " ") <> Text.pack "do\n") + ( [1 .. 10] + <&> \(i :: Int) -> + (Text.replicate (2 * i) (Text.pack " ") <> Text.pack "do\n") ) <> Text.replicate 2000 (Text.pack " ") <> Text.pack "return\n" <> Text.replicate 2002 (Text.pack " ") <> Text.pack "()" it "10 AppOps" - $ roundTripEqualWithTimeout 1000000 - $ (Text.pack "func = expr") + $ roundTripEqualWithTimeout 1000000 + $ (Text.pack "func = expr") <> Text.replicate 10 (Text.pack "\n . expr") --TODO roundTripEqualWithTimeout :: Int -> Text -> Expectation roundTripEqualWithTimeout time t = - timeout time (action >>= evaluate) >>= (`shouldSatisfy` Data.Maybe.isJust) + timeout time (action >>= evaluate) >>= (`shouldSatisfy`Data.Maybe.isJust) where - action = fmap - (fmap PPTextWrapper) - (parsePrintModuleTests defaultTestConfig "TestFakeFileName.hs" t) + action = fmap (fmap PPTextWrapper) + (parsePrintModuleTests defaultTestConfig "TestFakeFileName.hs" t) data InputLine @@ -74,11 +85,10 @@ data TestCase = TestCase main :: IO () main = do files <- System.Directory.listDirectory "data/" - let - blts = - List.sort - $ filter (\x -> not ("tests-context-free.blt" `isSuffixOf` x)) - $ filter (".blt" `isSuffixOf`) files + let blts = + List.sort + $ filter (\x -> not ("tests-context-free.blt" `isSuffixOf` x)) + $ filter (".blt" `isSuffixOf`) files inputs <- blts `forM` \blt -> Text.IO.readFile ("data" blt) let groups = createChunks =<< inputs inputCtxFree <- Text.IO.readFile "data/30-tests-context-free.blt" @@ -89,17 +99,15 @@ main = do it "gives properly formatted result for valid input" $ do let input = Text.pack $ unlines - [ "func = [00000000000000000000000, 00000000000000000000000, 00000000000000000000000, 00000000000000000000000]" - ] - let - expected = Text.pack $ unlines - [ "func =" - , " [ 00000000000000000000000" - , " , 00000000000000000000000" - , " , 00000000000000000000000" - , " , 00000000000000000000000" - , " ]" - ] + ["func = [00000000000000000000000, 00000000000000000000000, 00000000000000000000000, 00000000000000000000000]"] + let expected = Text.pack $ unlines + [ "func =" + , " [ 00000000000000000000000" + , " , 00000000000000000000000" + , " , 00000000000000000000000" + , " , 00000000000000000000000" + , " ]" + ] output <- liftIO $ parsePrintModule staticDefaultConfig input hush output `shouldBe` Just expected groups `forM_` \(groupname, tests) -> do @@ -146,33 +154,30 @@ main = do testProcessor = \case HeaderLine n : rest -> let normalLines = Data.Maybe.mapMaybe extractNormal rest - in - TestCase - { testName = n - , isPending = any isPendingLine rest - , content = Text.unlines normalLines - } + in TestCase + { testName = n + , isPending = any isPendingLine rest + , content = Text.unlines normalLines + } l -> - error - $ "first non-empty line must start with #test footest\n" - ++ show l + error $ "first non-empty line must start with #test footest\n" ++ show l extractNormal (NormalLine l) = Just l - extractNormal _ = Nothing + extractNormal _ = Nothing isPendingLine PendingLine{} = True - isPendingLine _ = False + isPendingLine _ = False specialLineParser :: Parser InputLine specialLineParser = Parsec.choice [ [ GroupLine $ Text.pack name - | _ <- Parsec.try $ Parsec.string "#group" - , _ <- Parsec.many1 $ Parsec.oneOf " \t" + | _ <- Parsec.try $ Parsec.string "#group" + , _ <- Parsec.many1 $ Parsec.oneOf " \t" , name <- Parsec.many1 $ Parsec.noneOf "\r\n:" - , _ <- Parsec.eof + , _ <- Parsec.eof ] , [ HeaderLine $ Text.pack name - | _ <- Parsec.try $ Parsec.string "#test" - , _ <- Parsec.many1 $ Parsec.oneOf " \t" + | _ <- Parsec.try $ Parsec.string "#test" + , _ <- Parsec.many1 $ Parsec.oneOf " \t" , name <- Parsec.many1 $ Parsec.noneOf "\r\n:" - , _ <- Parsec.eof + , _ <- Parsec.eof ] , [ PendingLine | _ <- Parsec.try $ Parsec.string "#pending" @@ -192,17 +197,17 @@ main = do ] lineMapper :: Text -> InputLine lineMapper line = case Parsec.runParser specialLineParser () "" line of - Left _e -> NormalLine line - Right l -> l + Left _e -> NormalLine line + Right l -> l lineIsSpace :: InputLine -> Bool lineIsSpace CommentLine = True - lineIsSpace _ = False + lineIsSpace _ = False grouperG :: InputLine -> InputLine -> Bool grouperG _ GroupLine{} = False - grouperG _ _ = True + grouperG _ _ = True grouperT :: InputLine -> InputLine -> Bool grouperT _ HeaderLine{} = False - grouperT _ _ = True + grouperT _ _ = True -------------------- @@ -220,42 +225,43 @@ instance Show PPTextWrapper where show (PPTextWrapper t) = "\n" ++ Text.unpack t -- brittany-next-binding --columns 160 +-- brittany-next-binding { lconfig_indentPolicy: IndentPolicyLeft } defaultTestConfig :: Config defaultTestConfig = Config - { _conf_version = _conf_version staticDefaultConfig - , _conf_debug = _conf_debug staticDefaultConfig - , _conf_layout = LayoutConfig - { _lconfig_cols = coerce (80 :: Int) - , _lconfig_indentPolicy = coerce IndentPolicyFree - , _lconfig_indentAmount = coerce (2 :: Int) - , _lconfig_indentWhereSpecial = coerce True - , _lconfig_indentListSpecial = coerce True - , _lconfig_importColumn = coerce (60 :: Int) - , _lconfig_importAsColumn = coerce (60 :: Int) - , _lconfig_altChooser = coerce $ AltChooserBoundedSearch 3 - , _lconfig_columnAlignMode = coerce (ColumnAlignModeMajority 0.7) - , _lconfig_alignmentLimit = coerce (30 :: Int) + { _conf_version = _conf_version staticDefaultConfig + , _conf_debug = _conf_debug staticDefaultConfig + , _conf_layout = LayoutConfig + { _lconfig_cols = coerce (80 :: Int) + , _lconfig_indentPolicy = coerce IndentPolicyFree + , _lconfig_indentAmount = coerce (2 :: Int) + , _lconfig_indentWhereSpecial = coerce True + , _lconfig_indentListSpecial = coerce True + , _lconfig_importColumn = coerce (60 :: Int) + , _lconfig_importAsColumn = coerce (60 :: Int) + , _lconfig_altChooser = coerce $ AltChooserBoundedSearch 3 + , _lconfig_columnAlignMode = coerce (ColumnAlignModeMajority 0.7) + , _lconfig_alignmentLimit = coerce (30 :: Int) , _lconfig_alignmentBreakOnMultiline = coerce True - , _lconfig_hangingTypeSignature = coerce False - , _lconfig_reformatModulePreamble = coerce True + , _lconfig_hangingTypeSignature = coerce False + , _lconfig_reformatModulePreamble = coerce True , _lconfig_allowSingleLineExportList = coerce True - , _lconfig_allowHangingQuasiQuotes = coerce True + , _lconfig_allowHangingQuasiQuotes = coerce True , _lconfig_experimentalSemicolonNewlines = coerce False -- , _lconfig_allowSinglelineRecord = coerce False } - , _conf_errorHandling = (_conf_errorHandling staticDefaultConfig) { _econf_omit_output_valid_check = coerce True } - , _conf_preprocessor = _conf_preprocessor staticDefaultConfig - , _conf_forward = ForwardOptions { _options_ghc = Identity [] } + , _conf_errorHandling = (_conf_errorHandling staticDefaultConfig) { _econf_omit_output_valid_check = coerce True } + , _conf_preprocessor = _conf_preprocessor staticDefaultConfig + , _conf_forward = ForwardOptions { _options_ghc = Identity [] } , _conf_roundtrip_exactprint_only = coerce False - , _conf_disable_formatting = coerce False - , _conf_obfuscate = coerce False + , _conf_disable_formatting = coerce False + , _conf_obfuscate = coerce False } contextFreeTestConfig :: Config contextFreeTestConfig = defaultTestConfig { _conf_layout = (_conf_layout defaultTestConfig) - { _lconfig_indentPolicy = coerce IndentPolicyLeft - , _lconfig_alignmentLimit = coerce (1 :: Int) - , _lconfig_columnAlignMode = coerce ColumnAlignModeDisabled - } + { _lconfig_indentPolicy = coerce IndentPolicyLeft + , _lconfig_alignmentLimit = coerce (1 :: Int) + , _lconfig_columnAlignMode = coerce ColumnAlignModeDisabled + } } -- 2.30.2 From 8d7b46b9e916de843aed5aeda47ecb6e6c3658de Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sun, 7 Nov 2021 13:01:54 +0000 Subject: [PATCH 63/74] Fix handling of comments --- data/10-tests.blt | 48 +++++++++++++++++++ .../Language/Haskell/Brittany/Internal.hs | 18 +++---- 2 files changed, 58 insertions(+), 8 deletions(-) diff --git a/data/10-tests.blt b/data/10-tests.blt index 75babb0..79d9a0a 100644 --- a/data/10-tests.blt +++ b/data/10-tests.blt @@ -1568,6 +1568,13 @@ type instance F Int = IO Int type family F a type instance F Int = IO Int -- x +#test type-instance-with-module-header + +{-# language TypeFamilies #-} +module M where +type family F a +type instance F Int = IO Int + #test newtype-instance-without-comment {-# language TypeFamilies #-} @@ -1580,6 +1587,13 @@ newtype instance F Int = N Int data family F a newtype instance F Int = N Int -- x +#test newtype-instance-with-module-header + +{-# language TypeFamilies #-} +module M where +data family F a +newtype instance F Int = N Int + #test data-instance-without-comment {-# language TypeFamilies #-} @@ -1592,6 +1606,13 @@ data instance F Int = D Int data family F a data instance F Int = D Int -- x +#test data-instance-with-module-header + +{-# language TypeFamilies #-} +module M where +data family F a +data instance F Int = D Int + #test instance-type-without-comment {-# language TypeFamilies #-} @@ -1608,6 +1629,15 @@ class C a where instance C Int where type F Int = IO Int -- x +#test instance-type-with-module-header + +{-# language TypeFamilies #-} +module M where +class C a where + type family F a +instance C Int where + type F Int = IO Int + #test instance-newtype-without-comment {-# language TypeFamilies #-} @@ -1624,6 +1654,15 @@ class C a where instance C Int where newtype F Int = N Int -- x +#test instance-newtype-with-module-header + +{-# language TypeFamilies #-} +module M where +class C a where + data family F a +instance C Int where + newtype F Int = N Int + #test instance-data-without-comment {-# language TypeFamilies #-} @@ -1640,6 +1679,15 @@ class C a where instance C Int where data F Int = D Int -- x +#test instance-data-with-module-header + +{-# language TypeFamilies #-} +module M where +class C a where + data family F a +instance C Int where + data F Int = D Int + ############################################################################### ############################################################################### ############################################################################### diff --git a/source/library/Language/Haskell/Brittany/Internal.hs b/source/library/Language/Haskell/Brittany/Internal.hs index 71e885b..8d3e72e 100644 --- a/source/library/Language/Haskell/Brittany/Internal.hs +++ b/source/library/Language/Haskell/Brittany/Internal.hs @@ -400,7 +400,7 @@ parsePrintModuleTests conf filename input = do then return $ pPrintModule moduleConf perItemConf anns parsedModule else lift $ pPrintModuleAndCheck moduleConf perItemConf anns parsedModule - if all isErrorUnusedComment errs + if null errs then pure $ TextL.toStrict $ ltext else let @@ -413,11 +413,6 @@ parsePrintModuleTests conf filename input = do ErrorOutputCheck -> "Output is not syntactically valid." in throwE $ "pretty printing error(s):\n" ++ List.unlines errStrs -isErrorUnusedComment :: BrittanyError -> Bool -isErrorUnusedComment x = case x of - ErrorUnusedComment _ -> True - _ -> False - -- this approach would for if there was a pure GHC.parseDynamicFilePragma. -- Unfortunately that does not exist yet, so we cannot provide a nominally -- pure interface. @@ -461,7 +456,14 @@ toLocal conf anns m = do ppModule :: GenLocated SrcSpan HsModule -> PPM () ppModule lmod@(L _loc _m@(HsModule _ _name _exports _ decls _ _)) = do - let annKey = ExactPrint.mkAnnKey lmod + defaultAnns <- do + anns <- mAsk + let annKey = ExactPrint.mkAnnKey lmod + let annMap = Map.findWithDefault Map.empty annKey anns + let isEof = (== ExactPrint.AnnEofPos) + let overAnnsDP f a = a { ExactPrint.annsDP = f $ ExactPrint.annsDP a } + pure $ fmap (overAnnsDP . filter $ isEof . fst) annMap + post <- ppPreamble lmod decls `forM_` \decl -> do let declAnnKey = ExactPrint.mkAnnKey decl @@ -472,7 +474,7 @@ ppModule lmod@(L _loc _m@(HsModule _ _name _exports _ decls _ _)) = do declBindingNames <&> \n -> Map.lookup n $ _icd_perBinding inlineConf filteredAnns <- mAsk <&> \annMap -> - Map.union (Map.findWithDefault Map.empty annKey annMap) $ + Map.union defaultAnns $ Map.findWithDefault Map.empty declAnnKey annMap traceIfDumpConf "bridoc annotations filtered/transformed" -- 2.30.2 From ccd09ba40a82012a43bc81981a62d8408d1cc867 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sun, 21 Nov 2021 13:28:15 +0000 Subject: [PATCH 64/74] Remove obsolete Stack configuration --- .gitignore | 2 -- README.md | 3 +-- stack.yaml | 13 --------- stack.yaml.lock | 72 ------------------------------------------------- 4 files changed, 1 insertion(+), 89 deletions(-) delete mode 100644 stack.yaml delete mode 100644 stack.yaml.lock diff --git a/.gitignore b/.gitignore index f04e47c..cdc020e 100644 --- a/.gitignore +++ b/.gitignore @@ -8,10 +8,8 @@ dist/ dist-newstyle/ local/ .cabal-sandbox/ -.stack-work/ cabal.sandbox.config cabal.project.local* cabal.project.freeze .ghc.environment.* result -.stack-work* diff --git a/README.md b/README.md index d88aed4..58119e9 100644 --- a/README.md +++ b/README.md @@ -65,8 +65,7 @@ log the size of the input, but _not_ the full input/output of requests.) ~~~~ If you use an lts that includes brittany this should just work; otherwise - you may want to clone the repo and try again (there are several stack.yamls - included). + you may want to clone the repo and try again. - via `cabal` diff --git a/stack.yaml b/stack.yaml deleted file mode 100644 index 647404b..0000000 --- a/stack.yaml +++ /dev/null @@ -1,13 +0,0 @@ -system-ghc: true -allow-newer: true -resolver: nightly-2021-11-06 -extra-deps: - - aeson-2.0.1.0 - - butcher-1.3.3.2 - - Cabal-3.6.2.0 - - data-tree-print-0.1.0.2 - - multistate-0.8.0.3 - - parsec-3.1.14.0 - - text-1.2.5.0 - - git: https://github.com/mithrandi/czipwith - commit: b6245884ae83e00dd2b5261762549b37390179f8 diff --git a/stack.yaml.lock b/stack.yaml.lock deleted file mode 100644 index 087338e..0000000 --- a/stack.yaml.lock +++ /dev/null @@ -1,72 +0,0 @@ -# This file was autogenerated by Stack. -# You should not edit this file by hand. -# For more information, please see the documentation at: -# https://docs.haskellstack.org/en/stable/lock_files - -packages: -- completed: - hackage: aeson-2.0.1.0@sha256:ee0847af4d1fb9ece3f24f443d8d8406431c32688a57880314ac36617da937eb,6229 - pantry-tree: - size: 37910 - sha256: e7a9eec09f1ea56548b07c7e82b53bf32a974827ffc402d852c667b5f5d89efd - original: - hackage: aeson-2.0.1.0 -- completed: - hackage: butcher-1.3.3.2@sha256:0be5b914f648ec9c63cb88730d983602aef829a7c8c31343952e4642e6b52a84,3150 - pantry-tree: - size: 1197 - sha256: 96fe696234de07e4d9253d80ddf189f8cfaf2e262e977438343a6069677a39d2 - original: - hackage: butcher-1.3.3.2 -- completed: - hackage: Cabal-3.6.2.0@sha256:e2266e14758c1f799220fad7f0d4b0b4ec567d81b7ba3faea17ff76d4c31de95,12437 - pantry-tree: - size: 19757 - sha256: 6650e54cbbcda6d05c4d8b8094fa61e5ffbda15a798a354d2dad5b35dc3b2859 - original: - hackage: Cabal-3.6.2.0 -- completed: - hackage: data-tree-print-0.1.0.2@sha256:d845e99f322df70e0c06d6743bf80336f5918d5423498528beb0593a2afc1703,1620 - pantry-tree: - size: 272 - sha256: b8778eb1b16fddb91b2eed2b25f33a89d1e4f7a533160de4ccbf226f82456135 - original: - hackage: data-tree-print-0.1.0.2 -- completed: - hackage: multistate-0.8.0.3@sha256:49d600399f3a4bfd8c8ba2e924c6592e84915b63c52970818982baa274cd9ac3,3588 - pantry-tree: - size: 2143 - sha256: 73b47c11a753963b033b79209a66490013da35854dd1064b3633dd23c3fa5650 - original: - hackage: multistate-0.8.0.3 -- completed: - hackage: text-1.2.5.0@sha256:791f0f6c97ed96113f17ab520cf0efe1a3a4f883a8c85910a5660567c8241c40,7895 - pantry-tree: - size: 7395 - sha256: f41504ec5c04a3f3358ef104362f02fdef29cbce4e5e4e6dbd6b6db70c40d4bf - original: - hackage: text-1.2.5.0 -- completed: - hackage: parsec-3.1.14.0@sha256:72d5c57e6e126adaa781ab97b19dc76f68490c0a3d88f14038219994cabe94e1,4356 - pantry-tree: - size: 2574 - sha256: 495a86688c6e89faf38b8804cc4c9216709e9a6a93cf56c2f07d5bef83f09a17 - original: - hackage: parsec-3.1.14.0 -- completed: - name: czipwith - version: 1.0.1.3 - git: https://github.com/mithrandi/czipwith - pantry-tree: - size: 964 - sha256: 239a37e26558e6272c07dc280ee07a83407ed6b86000047ddb979726c23818c4 - commit: b6245884ae83e00dd2b5261762549b37390179f8 - original: - git: https://github.com/mithrandi/czipwith - commit: b6245884ae83e00dd2b5261762549b37390179f8 -snapshots: -- completed: - size: 594850 - url: https://raw.githubusercontent.com/commercialhaskell/stackage-snapshots/master/nightly/2021/11/6.yaml - sha256: b5d7eef8b8b34d08a9604179e2594a9a5025d872146556b51f9d2f7bfead834b - original: nightly-2021-11-06 -- 2.30.2 From 8fadac8b2ead98714a15db0958401d83b826dcd9 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sun, 21 Nov 2021 13:44:06 +0000 Subject: [PATCH 65/74] Format imports --- .vscode/settings.json | 2 +- brittany.yaml | 4 + source/library/Language/Haskell/Brittany.hs | 14 +- .../Language/Haskell/Brittany/Internal.hs | 86 ++- .../Haskell/Brittany/Internal/Backend.hs | 22 +- .../Haskell/Brittany/Internal/BackendUtils.hs | 22 +- .../Haskell/Brittany/Internal/Config.hs | 40 +- .../Haskell/Brittany/Internal/Config/Types.hs | 21 +- .../Internal/Config/Types/Instances.hs | 8 +- .../Brittany/Internal/ExactPrintUtils.hs | 47 +- .../Brittany/Internal/LayouterBasics.hs | 47 +- .../Brittany/Internal/Layouters/DataDecl.hs | 23 +- .../Brittany/Internal/Layouters/Decl.hs | 56 +- .../Brittany/Internal/Layouters/Expr.hs | 35 +- .../Brittany/Internal/Layouters/Expr.hs-boot | 9 +- .../Haskell/Brittany/Internal/Layouters/IE.hs | 28 +- .../Brittany/Internal/Layouters/Import.hs | 24 +- .../Brittany/Internal/Layouters/Module.hs | 29 +- .../Brittany/Internal/Layouters/Pattern.hs | 23 +- .../Brittany/Internal/Layouters/Stmt.hs | 24 +- .../Brittany/Internal/Layouters/Stmt.hs-boot | 9 +- .../Brittany/Internal/Layouters/Type.hs | 28 +- .../Haskell/Brittany/Internal/Obfuscation.hs | 11 +- .../Haskell/Brittany/Internal/Prelude.hs | 538 +++++++----------- .../Haskell/Brittany/Internal/PreludeUtils.hs | 15 +- .../Brittany/Internal/Transformations/Alt.hs | 19 +- .../Internal/Transformations/Columns.hs | 10 +- .../Internal/Transformations/Floating.hs | 12 +- .../Internal/Transformations/Indent.hs | 10 +- .../Brittany/Internal/Transformations/Par.hs | 7 +- .../Haskell/Brittany/Internal/Types.hs | 32 +- .../Haskell/Brittany/Internal/Utils.hs | 39 +- .../library/Language/Haskell/Brittany/Main.hs | 67 +-- source/test-suite/Main.hs | 37 +- 34 files changed, 522 insertions(+), 876 deletions(-) create mode 100644 brittany.yaml diff --git a/.vscode/settings.json b/.vscode/settings.json index 0050442..8b52b40 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,5 @@ { - "purple-yolk.brittany.command": "false", + "purple-yolk.brittany.command": "cabal exec -- brittany --write-mode inplace", "purple-yolk.ghci.command": "cabal repl --repl-options -ddump-json", "purple-yolk.hlint.command": "false", "purple-yolk.hlint.onSave": false diff --git a/brittany.yaml b/brittany.yaml new file mode 100644 index 0000000..b85e4ad --- /dev/null +++ b/brittany.yaml @@ -0,0 +1,4 @@ +conf_layout: + lconfig_columnAlignMode: + tag: ColumnAlignModeDisabled + lconfig_indentPolicy: IndentPolicyLeft diff --git a/source/library/Language/Haskell/Brittany.hs b/source/library/Language/Haskell/Brittany.hs index 8c225c6..a2726c8 100644 --- a/source/library/Language/Haskell/Brittany.hs +++ b/source/library/Language/Haskell/Brittany.hs @@ -16,13 +16,9 @@ module Language.Haskell.Brittany , CForwardOptions(..) , CPreProcessorConfig(..) , BrittanyError(..) - ) -where + ) where - - - -import Language.Haskell.Brittany.Internal -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Config +import Language.Haskell.Brittany.Internal +import Language.Haskell.Brittany.Internal.Config +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Types diff --git a/source/library/Language/Haskell/Brittany/Internal.hs b/source/library/Language/Haskell/Brittany/Internal.hs index 8d3e72e..b8940b1 100644 --- a/source/library/Language/Haskell/Brittany/Internal.hs +++ b/source/library/Language/Haskell/Brittany/Internal.hs @@ -12,66 +12,52 @@ module Language.Haskell.Brittany.Internal , parseModuleFromString , extractCommentConfigs , getTopLevelDeclNameMap - ) -where + ) where - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils +import Control.Monad.Trans.Except import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS import qualified Data.ByteString.Char8 +import Data.CZipWith +import Data.Char (isSpace) +import Data.HList.HList import qualified Data.Map as Map import qualified Data.Maybe import qualified Data.Semigroup as Semigroup import qualified Data.Sequence as Seq import qualified Data.Text as Text import qualified Data.Text.Lazy as TextL -import qualified GHC.OldList as List - --- brittany { lconfig_importAsColumn: 60, lconfig_importColumn: 60 } -import qualified Language.Haskell.GHC.ExactPrint as ExactPrint -import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint -import qualified Language.Haskell.GHC.ExactPrint.Parsers as ExactPrint.Parsers - -import Control.Monad.Trans.Except -import Data.HList.HList +import qualified Data.Text.Lazy.Builder as Text.Builder import qualified Data.Yaml -import Data.CZipWith -import qualified UI.Butcher.Monadic as Butcher - -import qualified Data.Text.Lazy.Builder as Text.Builder - -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Config -import Language.Haskell.Brittany.Internal.LayouterBasics - -import Language.Haskell.Brittany.Internal.Layouters.Decl -import Language.Haskell.Brittany.Internal.Layouters.Module -import Language.Haskell.Brittany.Internal.Utils -import Language.Haskell.Brittany.Internal.Backend -import Language.Haskell.Brittany.Internal.BackendUtils -import Language.Haskell.Brittany.Internal.ExactPrintUtils - -import Language.Haskell.Brittany.Internal.Transformations.Alt -import Language.Haskell.Brittany.Internal.Transformations.Floating -import Language.Haskell.Brittany.Internal.Transformations.Par -import Language.Haskell.Brittany.Internal.Transformations.Columns -import Language.Haskell.Brittany.Internal.Transformations.Indent - -import qualified GHC - hiding ( parseModule ) -import GHC.Parser.Annotation ( AnnKeywordId(..) ) -import GHC ( GenLocated(L) - ) -import GHC.Types.SrcLoc ( SrcSpan ) -import GHC.Hs -import GHC.Data.Bag -import qualified GHC.Driver.Session as GHC -import qualified GHC.LanguageExtensions.Type as GHC - -import Data.Char ( isSpace ) +import qualified GHC hiding (parseModule) +import GHC (GenLocated(L)) +import GHC.Data.Bag +import qualified GHC.Driver.Session as GHC +import GHC.Hs +import qualified GHC.LanguageExtensions.Type as GHC +import qualified GHC.OldList as List +import GHC.Parser.Annotation (AnnKeywordId(..)) +import GHC.Types.SrcLoc (SrcSpan) +import Language.Haskell.Brittany.Internal.Backend +import Language.Haskell.Brittany.Internal.BackendUtils +import Language.Haskell.Brittany.Internal.Config +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.ExactPrintUtils +import Language.Haskell.Brittany.Internal.LayouterBasics +import Language.Haskell.Brittany.Internal.Layouters.Decl +import Language.Haskell.Brittany.Internal.Layouters.Module +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Transformations.Alt +import Language.Haskell.Brittany.Internal.Transformations.Columns +import Language.Haskell.Brittany.Internal.Transformations.Floating +import Language.Haskell.Brittany.Internal.Transformations.Indent +import Language.Haskell.Brittany.Internal.Transformations.Par +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.Utils +import qualified Language.Haskell.GHC.ExactPrint as ExactPrint +import qualified Language.Haskell.GHC.ExactPrint.Parsers as ExactPrint.Parsers +import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint +import qualified UI.Butcher.Monadic as Butcher diff --git a/source/library/Language/Haskell/Brittany/Internal/Backend.hs b/source/library/Language/Haskell/Brittany/Internal/Backend.hs index 142fe2f..6cfbaf3 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Backend.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Backend.hs @@ -6,10 +6,6 @@ module Language.Haskell.Brittany.Internal.Backend where - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Control.Monad.Trans.State.Strict as StateS import qualified Data.Either as Either import qualified Data.Foldable as Foldable @@ -21,20 +17,18 @@ import qualified Data.Semigroup as Semigroup import qualified Data.Sequence as Seq import qualified Data.Set as Set import qualified Data.Text as Text +import qualified Data.Text.Lazy.Builder as Text.Builder import qualified GHC.OldList as List - +import Language.Haskell.Brittany.Internal.BackendUtils +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.LayouterBasics +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.Utils import qualified Language.Haskell.GHC.ExactPrint as ExactPrint import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types -import Language.Haskell.Brittany.Internal.LayouterBasics -import Language.Haskell.Brittany.Internal.BackendUtils -import Language.Haskell.Brittany.Internal.Utils -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Types - - -import qualified Data.Text.Lazy.Builder as Text.Builder - type ColIndex = Int diff --git a/source/library/Language/Haskell/Brittany/Internal/BackendUtils.hs b/source/library/Language/Haskell/Brittany/Internal/BackendUtils.hs index 6c34ea9..919a323 100644 --- a/source/library/Language/Haskell/Brittany/Internal/BackendUtils.hs +++ b/source/library/Language/Haskell/Brittany/Internal/BackendUtils.hs @@ -3,28 +3,22 @@ module Language.Haskell.Brittany.Internal.BackendUtils where - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Data.Data import qualified Data.Either import qualified Data.Map as Map import qualified Data.Maybe import qualified Data.Semigroup as Semigroup import qualified Data.Text as Text -import qualified GHC.OldList as List - -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.GHC.ExactPrint.Types ( AnnKey - , Annotation - ) - import qualified Data.Text.Lazy.Builder as Text.Builder +import GHC (Located) +import qualified GHC.OldList as List +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.Utils +import Language.Haskell.GHC.ExactPrint.Types (AnnKey, Annotation) import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint -import Language.Haskell.Brittany.Internal.Utils - -import GHC ( Located ) diff --git a/source/library/Language/Haskell/Brittany/Internal/Config.hs b/source/library/Language/Haskell/Brittany/Internal/Config.hs index 66d6d7f..08d0fd4 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Config.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Config.hs @@ -3,36 +3,26 @@ module Language.Haskell.Brittany.Internal.Config where - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Data.Bool as Bool import qualified Data.ByteString as ByteString import qualified Data.ByteString.Char8 +import Data.CZipWith +import Data.Coerce (coerce) +import qualified Data.List.NonEmpty as NonEmpty import qualified Data.Semigroup as Semigroup -import qualified GHC.OldList as List -import qualified System.Directory -import qualified System.IO - import qualified Data.Yaml -import Data.CZipWith - -import UI.Butcher.Monadic - -import qualified System.Console.CmdArgs.Explicit - as CmdArgs - -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Config.Types.Instances () -import Language.Haskell.Brittany.Internal.Utils - -import Data.Coerce ( coerce - ) -import qualified Data.List.NonEmpty as NonEmpty - -import qualified System.Directory as Directory -import qualified System.FilePath.Posix as FilePath +import qualified GHC.OldList as List +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Config.Types.Instances () +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Utils +import qualified System.Console.CmdArgs.Explicit as CmdArgs +import qualified System.Directory +import qualified System.Directory as Directory +import qualified System.FilePath.Posix as FilePath +import qualified System.IO +import UI.Butcher.Monadic -- brittany-next-binding { lconfig_indentPolicy: IndentPolicyLeft } staticDefaultConfig :: Config diff --git a/source/library/Language/Haskell/Brittany/Internal/Config/Types.hs b/source/library/Language/Haskell/Brittany/Internal/Config/Types.hs index 929ac90..bb7148d 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Config/Types.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Config/Types.hs @@ -7,22 +7,15 @@ module Language.Haskell.Brittany.Internal.Config.Types where - - +import Data.CZipWith +import Data.Coerce (Coercible, coerce) +import Data.Data (Data) +import qualified Data.Semigroup as Semigroup +import Data.Semigroup (Last) +import Data.Semigroup.Generic +import GHC.Generics import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils () -import qualified Data.Semigroup as Semigroup - -import GHC.Generics - -import Data.Data ( Data ) - -import Data.Coerce ( Coercible, coerce ) - -import Data.Semigroup.Generic -import Data.Semigroup ( Last ) - -import Data.CZipWith diff --git a/source/library/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs b/source/library/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs index 2c0c78f..0c25537 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Config/Types/Instances.hs @@ -18,15 +18,11 @@ module Language.Haskell.Brittany.Internal.Config.Types.Instances where - - -import Language.Haskell.Brittany.Internal.Prelude - -import Data.Yaml import qualified Data.Aeson.Key as Key import qualified Data.Aeson.Types as Aeson - +import Data.Yaml import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Prelude diff --git a/source/library/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs b/source/library/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs index 46e1b6a..28a40b0 100644 --- a/source/library/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs +++ b/source/library/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs @@ -7,45 +7,34 @@ module Language.Haskell.Brittany.Internal.ExactPrintUtils where - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils +import Control.Exception import qualified Control.Monad.State.Class as State.Class import qualified Control.Monad.Trans.Except as ExceptT import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import Data.Data import qualified Data.Foldable as Foldable +import qualified Data.Generics as SYB +import Data.HList.HList import qualified Data.Map as Map import qualified Data.Maybe import qualified Data.Sequence as Seq import qualified Data.Set as Set -import qualified System.IO - -import Language.Haskell.Brittany.Internal.Config.Types -import Data.Data -import Data.HList.HList - -import GHC ( GenLocated(L) ) -import qualified GHC.Driver.Session as GHC +import GHC (GenLocated(L)) import qualified GHC hiding (parseModule) -import qualified GHC.Types.SrcLoc as GHC +import GHC.Data.Bag import qualified GHC.Driver.CmdLine as GHC - -import GHC.Hs -import GHC.Data.Bag - -import GHC.Types.SrcLoc ( SrcSpan, Located ) - - -import qualified Language.Haskell.GHC.ExactPrint as ExactPrint -import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint -import qualified Language.Haskell.GHC.ExactPrint.Parsers as ExactPrint -import qualified Language.Haskell.GHC.ExactPrint.Delta as ExactPrint - -import qualified Data.Generics as SYB - -import Control.Exception --- import Data.Generics.Schemes +import qualified GHC.Driver.Session as GHC +import GHC.Hs +import qualified GHC.Types.SrcLoc as GHC +import GHC.Types.SrcLoc (Located, SrcSpan) +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Language.Haskell.GHC.ExactPrint as ExactPrint +import qualified Language.Haskell.GHC.ExactPrint.Delta as ExactPrint +import qualified Language.Haskell.GHC.ExactPrint.Parsers as ExactPrint +import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint +import qualified System.IO diff --git a/source/library/Language/Haskell/Brittany/Internal/LayouterBasics.hs b/source/library/Language/Haskell/Brittany/Internal/LayouterBasics.hs index 422c7be..4606eac 100644 --- a/source/library/Language/Haskell/Brittany/Internal/LayouterBasics.hs +++ b/source/library/Language/Haskell/Brittany/Internal/LayouterBasics.hs @@ -6,48 +6,37 @@ module Language.Haskell.Brittany.Internal.LayouterBasics where - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import qualified Control.Monad.Writer.Strict as Writer +import qualified Data.Char as Char +import Data.Data import qualified Data.Map as Map import qualified Data.Semigroup as Semigroup import qualified Data.Sequence as Seq import qualified Data.Set as Set import qualified Data.Text as Text +import qualified Data.Text.Lazy.Builder as Text.Builder +import DataTreePrint +import GHC (GenLocated(L), Located, moduleName, moduleNameString) import qualified GHC.OldList as List - -import qualified Control.Monad.Writer.Strict as Writer - +import GHC.Parser.Annotation (AnnKeywordId(..)) +import GHC.Types.Name (getOccString) +import GHC.Types.Name.Occurrence (occNameString) +import GHC.Types.Name.Reader (RdrName(..)) +import qualified GHC.Types.SrcLoc as GHC +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.ExactPrintUtils +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.Utils import qualified Language.Haskell.GHC.ExactPrint as ExactPrint import qualified Language.Haskell.GHC.ExactPrint.Annotate as ExactPrint.Annotate import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint +import Language.Haskell.GHC.ExactPrint.Types (AnnKey, Annotation) import qualified Language.Haskell.GHC.ExactPrint.Utils as ExactPrint.Utils -import Language.Haskell.GHC.ExactPrint.Types ( AnnKey, Annotation ) - -import qualified Data.Text.Lazy.Builder as Text.Builder - -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.Utils -import Language.Haskell.Brittany.Internal.ExactPrintUtils - -import GHC.Types.Name.Reader ( RdrName(..) ) -import GHC ( Located, GenLocated(L), moduleName, moduleNameString ) -import qualified GHC.Types.SrcLoc as GHC -import GHC.Types.Name.Occurrence ( occNameString ) -import GHC.Types.Name ( getOccString ) -import GHC.Parser.Annotation ( AnnKeywordId(..) ) - -import Data.Data - -import qualified Data.Char as Char - -import DataTreePrint - processDefault diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs index acbe186..dc7d022 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/DataDecl.hs @@ -3,24 +3,19 @@ module Language.Haskell.Brittany.Internal.Layouters.DataDecl where - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Data.Data import qualified Data.Semigroup as Semigroup import qualified Data.Text as Text -import qualified GHC.OldList as List - -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.LayouterBasics -import Language.Haskell.Brittany.Internal.Config.Types - -import GHC ( Located, GenLocated(L) ) +import GHC (GenLocated(L), Located) import qualified GHC -import GHC.Hs - -import Language.Haskell.Brittany.Internal.Layouters.Type +import GHC.Hs +import qualified GHC.OldList as List +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.LayouterBasics +import Language.Haskell.Brittany.Internal.Layouters.Type +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Types diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/Decl.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/Decl.hs index a96ae47..db58abc 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/Decl.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/Decl.hs @@ -5,46 +5,38 @@ module Language.Haskell.Brittany.Internal.Layouters.Decl where - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Data.Data import qualified Data.Foldable import qualified Data.Maybe import qualified Data.Semigroup as Semigroup import qualified Data.Text as Text -import qualified GHC.OldList as List - -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.LayouterBasics -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Layouters.Type - -import qualified Language.Haskell.GHC.ExactPrint as ExactPrint -import qualified Language.Haskell.GHC.ExactPrint.Utils as ExactPrint -import Language.Haskell.Brittany.Internal.ExactPrintUtils - -import GHC ( GenLocated(L) - , AnnKeywordId(..) - ) -import GHC.Types.SrcLoc ( SrcSpan, Located , getLoc, unLoc ) +import GHC (AnnKeywordId(..), GenLocated(L)) +import GHC.Data.Bag (bagToList, emptyBag) import qualified GHC.Data.FastString as FastString -import GHC.Hs -import GHC.Types.Basic ( InlinePragma(..) - , Activation(..) - , InlineSpec(..) - , RuleMatchInfo(..) - , LexicalFixity(..) - ) -import Language.Haskell.GHC.ExactPrint.Types ( mkAnnKey ) - +import GHC.Hs +import qualified GHC.OldList as List +import GHC.Types.Basic + ( Activation(..) + , InlinePragma(..) + , InlineSpec(..) + , LexicalFixity(..) + , RuleMatchInfo(..) + ) +import GHC.Types.SrcLoc (Located, SrcSpan, getLoc, unLoc) +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.ExactPrintUtils +import Language.Haskell.Brittany.Internal.LayouterBasics +import Language.Haskell.Brittany.Internal.Layouters.DataDecl import {-# SOURCE #-} Language.Haskell.Brittany.Internal.Layouters.Expr +import Language.Haskell.Brittany.Internal.Layouters.Pattern import {-# SOURCE #-} Language.Haskell.Brittany.Internal.Layouters.Stmt -import Language.Haskell.Brittany.Internal.Layouters.Pattern -import Language.Haskell.Brittany.Internal.Layouters.DataDecl - -import GHC.Data.Bag ( bagToList, emptyBag ) +import Language.Haskell.Brittany.Internal.Layouters.Type +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Types +import qualified Language.Haskell.GHC.ExactPrint as ExactPrint +import Language.Haskell.GHC.ExactPrint.Types (mkAnnKey) +import qualified Language.Haskell.GHC.ExactPrint.Utils as ExactPrint diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/Expr.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/Expr.hs index 344454c..9a13adf 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/Expr.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/Expr.hs @@ -4,31 +4,26 @@ module Language.Haskell.Brittany.Internal.Layouters.Expr where - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Data.Data import qualified Data.Semigroup as Semigroup import qualified Data.Sequence as Seq import qualified Data.Text as Text -import qualified GHC.OldList as List - -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.LayouterBasics -import Language.Haskell.Brittany.Internal.Config.Types - -import GHC ( GenLocated(L), SrcSpan, AnnKeywordId(..), RdrName(..) ) -import GHC.Hs -import GHC.Types.Name +import GHC (AnnKeywordId(..), GenLocated(L), RdrName(..), SrcSpan) import qualified GHC.Data.FastString as FastString -import GHC.Types.Basic - -import Language.Haskell.Brittany.Internal.Utils -import Language.Haskell.Brittany.Internal.Layouters.Pattern -import Language.Haskell.Brittany.Internal.Layouters.Decl -import Language.Haskell.Brittany.Internal.Layouters.Stmt -import Language.Haskell.Brittany.Internal.Layouters.Type +import GHC.Hs +import qualified GHC.OldList as List +import GHC.Types.Basic +import GHC.Types.Name +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.LayouterBasics +import Language.Haskell.Brittany.Internal.Layouters.Decl +import Language.Haskell.Brittany.Internal.Layouters.Pattern +import Language.Haskell.Brittany.Internal.Layouters.Stmt +import Language.Haskell.Brittany.Internal.Layouters.Type +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.Utils diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot b/source/library/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot index 8fb094b..4f913c3 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/Expr.hs-boot @@ -2,13 +2,8 @@ module Language.Haskell.Brittany.Internal.Layouters.Expr where - - -import Language.Haskell.Brittany.Internal.Prelude - -import Language.Haskell.Brittany.Internal.Types - -import GHC.Hs +import GHC.Hs +import Language.Haskell.Brittany.Internal.Types diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/IE.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/IE.hs index 39b7a49..78c56e4 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/IE.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/IE.hs @@ -4,24 +4,22 @@ module Language.Haskell.Brittany.Internal.Layouters.IE where -import Language.Haskell.Brittany.Internal.Prelude import qualified Data.List.Extra import qualified Data.Text as Text +import GHC + ( AnnKeywordId(..) + , GenLocated(L) + , Located + , ModuleName + , moduleNameString + , unLoc + ) +import GHC.Hs import qualified GHC.OldList as List - -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.LayouterBasics - -import GHC ( unLoc - , GenLocated(L) - , moduleNameString - , AnnKeywordId(..) - , Located - , ModuleName - ) -import GHC.Hs - -import Language.Haskell.Brittany.Internal.Utils +import Language.Haskell.Brittany.Internal.LayouterBasics +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.Utils diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/Import.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/Import.hs index 1b19145..d8ff3ff 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/Import.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/Import.hs @@ -2,24 +2,18 @@ module Language.Haskell.Brittany.Internal.Layouters.Import where -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Data.Semigroup as Semigroup import qualified Data.Text as Text - -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.LayouterBasics -import Language.Haskell.Brittany.Internal.Layouters.IE -import Language.Haskell.Brittany.Internal.Config.Types - -import GHC ( unLoc - , GenLocated(L) - , moduleNameString - , Located - ) -import GHC.Hs -import GHC.Types.Basic +import GHC (GenLocated(L), Located, moduleNameString, unLoc) +import GHC.Hs +import GHC.Types.Basic import GHC.Unit.Types (IsBootInterface(..)) +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.LayouterBasics +import Language.Haskell.Brittany.Internal.Layouters.IE +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Types diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/Module.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/Module.hs index 52c2cd1..73090ce 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/Module.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/Module.hs @@ -3,27 +3,22 @@ module Language.Haskell.Brittany.Internal.Layouters.Module where -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Data.Maybe import qualified Data.Semigroup as Semigroup import qualified Data.Text as Text +import GHC (AnnKeywordId(..), GenLocated(L), moduleNameString, unLoc) +import GHC.Hs import qualified GHC.OldList as List - -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.LayouterBasics -import Language.Haskell.Brittany.Internal.Layouters.IE -import Language.Haskell.Brittany.Internal.Layouters.Import -import Language.Haskell.Brittany.Internal.Config.Types - -import GHC (unLoc, GenLocated(L), moduleNameString, AnnKeywordId(..)) -import GHC.Hs -import Language.Haskell.GHC.ExactPrint as ExactPrint -import Language.Haskell.GHC.ExactPrint.Types - ( DeltaPos(..) - , deltaRow - , commentContents - ) +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.LayouterBasics +import Language.Haskell.Brittany.Internal.Layouters.IE +import Language.Haskell.Brittany.Internal.Layouters.Import +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.GHC.ExactPrint as ExactPrint +import Language.Haskell.GHC.ExactPrint.Types + (DeltaPos(..), commentContents, deltaRow) diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs index 4b99bca..fd4025a 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/Pattern.hs @@ -3,26 +3,19 @@ module Language.Haskell.Brittany.Internal.Layouters.Pattern where - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Data.Foldable as Foldable import qualified Data.Sequence as Seq import qualified Data.Text as Text +import GHC (GenLocated(L), ol_val) +import GHC.Hs import qualified GHC.OldList as List - -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.LayouterBasics - -import GHC ( GenLocated(L) - , ol_val - ) -import GHC.Hs -import GHC.Types.Basic - +import GHC.Types.Basic +import Language.Haskell.Brittany.Internal.LayouterBasics import {-# SOURCE #-} Language.Haskell.Brittany.Internal.Layouters.Expr -import Language.Haskell.Brittany.Internal.Layouters.Type +import Language.Haskell.Brittany.Internal.Layouters.Type +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Types diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs index 95f7273..7f297fe 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs @@ -4,24 +4,18 @@ module Language.Haskell.Brittany.Internal.Layouters.Stmt where - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Data.Semigroup as Semigroup import qualified Data.Text as Text - -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.LayouterBasics -import Language.Haskell.Brittany.Internal.Config.Types - -import GHC ( GenLocated(L) - ) -import GHC.Hs - -import Language.Haskell.Brittany.Internal.Layouters.Pattern -import Language.Haskell.Brittany.Internal.Layouters.Decl +import GHC (GenLocated(L)) +import GHC.Hs +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.LayouterBasics +import Language.Haskell.Brittany.Internal.Layouters.Decl import {-# SOURCE #-} Language.Haskell.Brittany.Internal.Layouters.Expr +import Language.Haskell.Brittany.Internal.Layouters.Pattern +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Types diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot b/source/library/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot index 02b388c..6cfd5c8 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/Stmt.hs-boot @@ -2,13 +2,8 @@ module Language.Haskell.Brittany.Internal.Layouters.Stmt where - - -import Language.Haskell.Brittany.Internal.Prelude - -import Language.Haskell.Brittany.Internal.Types - -import GHC.Hs +import GHC.Hs +import Language.Haskell.Brittany.Internal.Types diff --git a/source/library/Language/Haskell/Brittany/Internal/Layouters/Type.hs b/source/library/Language/Haskell/Brittany/Internal/Layouters/Type.hs index ed0dd26..208f6b4 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Layouters/Type.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Layouters/Type.hs @@ -3,26 +3,18 @@ module Language.Haskell.Brittany.Internal.Layouters.Type where - - +import qualified Data.Text as Text +import GHC (AnnKeywordId(..), GenLocated(L)) +import GHC.Hs +import qualified GHC.OldList as List +import GHC.Types.Basic +import GHC.Utils.Outputable (ftext, showSDocUnsafe) +import Language.Haskell.Brittany.Internal.LayouterBasics import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified Data.Text as Text -import qualified GHC.OldList as List - -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal.LayouterBasics -import Language.Haskell.Brittany.Internal.Utils - ( splitFirstLast - , FirstLastView(..) - ) - -import GHC ( GenLocated(L) - , AnnKeywordId (..) - ) -import GHC.Hs -import GHC.Utils.Outputable ( ftext, showSDocUnsafe ) -import GHC.Types.Basic +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.Utils + (FirstLastView(..), splitFirstLast) diff --git a/source/library/Language/Haskell/Brittany/Internal/Obfuscation.hs b/source/library/Language/Haskell/Brittany/Internal/Obfuscation.hs index 29dc13c..8b09fa1 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Obfuscation.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Obfuscation.hs @@ -2,17 +2,14 @@ module Language.Haskell.Brittany.Internal.Obfuscation where - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils +import Data.Char import qualified Data.Map as Map import qualified Data.Set as Set import qualified Data.Text as Text import qualified GHC.OldList as List - -import Data.Char -import System.Random +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import System.Random diff --git a/source/library/Language/Haskell/Brittany/Internal/Prelude.hs b/source/library/Language/Haskell/Brittany/Internal/Prelude.hs index 87a0c0a..8198533 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Prelude.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Prelude.hs @@ -1,346 +1,194 @@ -module Language.Haskell.Brittany.Internal.Prelude ( module E ) where +module Language.Haskell.Brittany.Internal.Prelude + ( module E + ) where - - --- rather project-specific stuff: ---------------------------------- -import GHC.Hs.Extension as E ( GhcPs ) - -import GHC.Types.Name.Reader as E ( RdrName ) - - --- more general: ----------------- - -import Data.Functor.Identity as E ( Identity(..) ) -import Control.Concurrent.Chan as E ( Chan ) -import Control.Concurrent.MVar as E ( MVar - , newEmptyMVar - , newMVar - , putMVar - , readMVar - , takeMVar - , swapMVar - ) -import Data.Int as E ( Int ) -import Data.Word as E ( Word - , Word32 - ) -import Prelude as E ( Integer - , Float - , Double - , undefined - , Eq (..) - , Ord (..) - , Enum (..) - , Bounded (..) - , (<$>) - , (.) - , ($) - , ($!) - , Num (..) - , Integral (..) - , Fractional (..) - , Floating (..) - , RealFrac (..) - , RealFloat (..) - , fromIntegral - , error - , foldr - , foldl - , foldr1 - , id - , map - , subtract - , putStrLn - , putStr - , Show (..) - , print - , fst - , snd - , (++) - , not - , (&&) - , (||) - , curry - , uncurry - , flip - , const - , seq - , reverse - , otherwise - , traverse - , realToFrac - , or - , and - , head - , any - , (^) - , Foldable - , Traversable - ) -import Control.Monad.ST as E ( ST ) -import Data.Bool as E ( Bool(..) ) -import Data.Char as E ( Char - , ord - , chr - ) -import Data.Either as E ( Either(..) - , either - ) -import Data.IORef as E ( IORef ) -import Data.Maybe as E ( Maybe(..) - , fromMaybe - , maybe - , listToMaybe - , maybeToList - , catMaybes - ) -import Data.Monoid as E ( Endo(..) - , All(..) - , Any(..) - , Sum(..) - , Product(..) - , Alt(..) - , mconcat - , Monoid (..) - ) -import Data.Ord as E ( Ordering(..) - , Down(..) - , comparing - ) -import Data.Ratio as E ( Ratio - , Rational - , (%) - , numerator - , denominator - ) -import Data.String as E ( String ) -import Data.Void as E ( Void ) -import System.IO as E ( IO - , hFlush - , stdout - ) -import Data.Proxy as E ( Proxy(..) ) -import Data.Sequence as E ( Seq ) - -import Data.Map as E ( Map ) -import Data.Set as E ( Set ) - -import Data.Text as E ( Text ) - -import Data.Function as E ( fix - , (&) - ) - -import Data.Foldable as E ( foldl' - , foldr' - , fold - , asum - ) - -import Data.List as E ( partition - , null - , elem - , notElem - , minimum - , maximum - , length - , all - , take - , drop - , find - , sum - , zip - , zip3 - , zipWith - , repeat - , replicate - , iterate - , nub - , filter - , intersperse - , intercalate - , isSuffixOf - , isPrefixOf - , dropWhile - , takeWhile - , unzip - , break - , transpose - , sortBy - , mapAccumL - , mapAccumR - , uncons - ) - -import Data.List.NonEmpty as E ( NonEmpty(..) - , nonEmpty - ) - -import Data.Tuple as E ( swap - ) - -import Text.Read as E ( readMaybe - ) - -import Control.Monad as E ( Functor (..) - , Monad (..) - , MonadPlus (..) - , mapM - , mapM_ - , forM - , forM_ - , sequence - , sequence_ - , (=<<) - , (>=>) - , (<=<) - , forever - , void - , join - , replicateM - , replicateM_ - , guard - , when - , unless - , liftM - , liftM2 - , liftM3 - , liftM4 - , liftM5 - , filterM - , (<$!>) - ) - -import Control.Applicative as E ( Applicative (..) - , Alternative (..) - ) - -import Foreign.Storable as E ( Storable ) -import GHC.Exts as E ( Constraint ) - -import Control.Concurrent as E ( threadDelay - , forkIO - , forkOS - ) - -import Control.Exception as E ( evaluate - , bracket - , assert - ) - -import Debug.Trace as E ( trace - , traceId - , traceShowId - , traceShow - , traceStack - , traceShowId - , traceIO - , traceM - , traceShowM - ) - -import Foreign.ForeignPtr as E ( ForeignPtr - ) - -import Data.Bifunctor as E ( bimap ) -import Data.Functor as E ( ($>) ) -import Data.Semigroup as E ( (<>) - , Semigroup(..) - ) - -import Data.Typeable as E ( Typeable - ) - -import Control.Arrow as E ( first - , second - , (***) - , (&&&) - , (>>>) - , (<<<) - ) - -import Data.Version as E ( showVersion - ) - -import Data.List.Extra as E ( nubOrd - , stripSuffix - ) -import Control.Monad.Extra as E ( whenM - , unlessM - , ifM - , notM - , orM - , andM - , anyM - , allM - ) - -import Data.Tree as E ( Tree(..) - ) - -import Control.Monad.Trans.MultiRWS as E ( -- MultiRWST (..) - -- , MultiRWSTNull - -- , MultiRWS - -- , - MonadMultiReader(..) - , MonadMultiWriter(..) - , MonadMultiState(..) - , mGet - -- , runMultiRWST - -- , runMultiRWSTASW - -- , runMultiRWSTW - -- , runMultiRWSTAW - -- , runMultiRWSTSW - -- , runMultiRWSTNil - -- , runMultiRWSTNil_ - -- , withMultiReader - -- , withMultiReader_ - -- , withMultiReaders - -- , withMultiReaders_ - -- , withMultiWriter - -- , withMultiWriterAW - -- , withMultiWriterWA - -- , withMultiWriterW - -- , withMultiWriters - -- , withMultiWritersAW - -- , withMultiWritersWA - -- , withMultiWritersW - -- , withMultiState - -- , withMultiStateAS - -- , withMultiStateSA - -- , withMultiStateA - -- , withMultiStateS - -- , withMultiState_ - -- , withMultiStates - -- , withMultiStatesAS - -- , withMultiStatesSA - -- , withMultiStatesA - -- , withMultiStatesS - -- , withMultiStates_ - -- , inflateReader - -- , inflateMultiReader - -- , inflateWriter - -- , inflateMultiWriter - -- , inflateState - -- , inflateMultiState - -- , mapMultiRWST - -- , mGetRawR - -- , mGetRawW - -- , mGetRawS - -- , mPutRawR - -- , mPutRawW - -- , mPutRawS - ) - -import Control.Monad.IO.Class as E ( MonadIO (..) - ) - -import Control.Monad.Trans.Class as E ( lift - ) -import Control.Monad.Trans.Maybe as E ( MaybeT (..) - ) - -import Data.Data as E ( toConstr - ) +import Control.Applicative as E (Alternative(..), Applicative(..)) +import Control.Arrow as E ((&&&), (***), (<<<), (>>>), first, second) +import Control.Concurrent as E (forkIO, forkOS, threadDelay) +import Control.Concurrent.Chan as E (Chan) +import Control.Concurrent.MVar as E + (MVar, newEmptyMVar, newMVar, putMVar, readMVar, swapMVar, takeMVar) +import Control.Exception as E (assert, bracket, evaluate) +import Control.Monad as E + ( (<$!>) + , (<=<) + , (=<<) + , (>=>) + , Functor(..) + , Monad(..) + , MonadPlus(..) + , filterM + , forM + , forM_ + , forever + , guard + , join + , liftM + , liftM2 + , liftM3 + , liftM4 + , liftM5 + , mapM + , mapM_ + , replicateM + , replicateM_ + , sequence + , sequence_ + , unless + , void + , when + ) +import Control.Monad.Extra as E + (allM, andM, anyM, ifM, notM, orM, unlessM, whenM) +import Control.Monad.IO.Class as E (MonadIO(..)) +import Control.Monad.ST as E (ST) +import Control.Monad.Trans.Class as E (lift) +import Control.Monad.Trans.Maybe as E (MaybeT(..)) +import Control.Monad.Trans.MultiRWS as E + (MonadMultiReader(..), MonadMultiState(..), MonadMultiWriter(..), mGet) +import Data.Bifunctor as E (bimap) +import Data.Bool as E (Bool(..)) +import Data.Char as E (Char, chr, ord) +import Data.Data as E (toConstr) +import Data.Either as E (Either(..), either) +import Data.Foldable as E (asum, fold, foldl', foldr') +import Data.Function as E ((&), fix) +import Data.Functor as E (($>)) +import Data.Functor.Identity as E (Identity(..)) +import Data.IORef as E (IORef) +import Data.Int as E (Int) +import Data.List as E + ( all + , break + , drop + , dropWhile + , elem + , filter + , find + , intercalate + , intersperse + , isPrefixOf + , isSuffixOf + , iterate + , length + , mapAccumL + , mapAccumR + , maximum + , minimum + , notElem + , nub + , null + , partition + , repeat + , replicate + , sortBy + , sum + , take + , takeWhile + , transpose + , uncons + , unzip + , zip + , zip3 + , zipWith + ) +import Data.List.Extra as E (nubOrd, stripSuffix) +import Data.List.NonEmpty as E (NonEmpty(..), nonEmpty) +import Data.Map as E (Map) +import Data.Maybe as E + (Maybe(..), catMaybes, fromMaybe, listToMaybe, maybe, maybeToList) +import Data.Monoid as E + ( All(..) + , Alt(..) + , Any(..) + , Endo(..) + , Monoid(..) + , Product(..) + , Sum(..) + , mconcat + ) +import Data.Ord as E (Down(..), Ordering(..), comparing) +import Data.Proxy as E (Proxy(..)) +import Data.Ratio as E ((%), Ratio, Rational, denominator, numerator) +import Data.Semigroup as E ((<>), Semigroup(..)) +import Data.Sequence as E (Seq) +import Data.Set as E (Set) +import Data.String as E (String) +import Data.Text as E (Text) +import Data.Tree as E (Tree(..)) +import Data.Tuple as E (swap) +import Data.Typeable as E (Typeable) +import Data.Version as E (showVersion) +import Data.Void as E (Void) +import Data.Word as E (Word, Word32) +import Debug.Trace as E + ( trace + , traceIO + , traceId + , traceM + , traceShow + , traceShowId + , traceShowM + , traceStack + ) +import Foreign.ForeignPtr as E (ForeignPtr) +import Foreign.Storable as E (Storable) +import GHC.Exts as E (Constraint) +import GHC.Hs.Extension as E (GhcPs) +import GHC.Types.Name.Reader as E (RdrName) +import Prelude as E + ( ($) + , ($!) + , (&&) + , (++) + , (.) + , (<$>) + , Bounded(..) + , Double + , Enum(..) + , Eq(..) + , Float + , Floating(..) + , Foldable + , Fractional(..) + , Integer + , Integral(..) + , Num(..) + , Ord(..) + , RealFloat(..) + , RealFrac(..) + , Show(..) + , Traversable + , (^) + , and + , any + , const + , curry + , error + , flip + , foldl + , foldr + , foldr1 + , fromIntegral + , fst + , head + , id + , map + , not + , or + , otherwise + , print + , putStr + , putStrLn + , realToFrac + , reverse + , seq + , snd + , subtract + , traverse + , uncurry + , undefined + , (||) + ) +import System.IO as E (IO, hFlush, stdout) +import Text.Read as E (readMaybe) diff --git a/source/library/Language/Haskell/Brittany/Internal/PreludeUtils.hs b/source/library/Language/Haskell/Brittany/Internal/PreludeUtils.hs index cfaed43..d2527e9 100644 --- a/source/library/Language/Haskell/Brittany/Internal/PreludeUtils.hs +++ b/source/library/Language/Haskell/Brittany/Internal/PreludeUtils.hs @@ -1,19 +1,16 @@ {-# OPTIONS_GHC -fno-warn-orphans #-} + module Language.Haskell.Brittany.Internal.PreludeUtils where - - -import Prelude +import Control.Applicative +import Control.DeepSeq (NFData, force) +import Control.Exception.Base (evaluate) +import Control.Monad import qualified Data.Strict.Maybe as Strict import Debug.Trace -import Control.Monad +import Prelude import System.IO -import Control.DeepSeq ( NFData, force ) -import Control.Exception.Base ( evaluate ) - -import Control.Applicative - instance Applicative Strict.Maybe where diff --git a/source/library/Language/Haskell/Brittany/Internal/Transformations/Alt.hs b/source/library/Language/Haskell/Brittany/Internal/Transformations/Alt.hs index ca79995..0e5b85f 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Transformations/Alt.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Transformations/Alt.hs @@ -9,23 +9,18 @@ module Language.Haskell.Brittany.Internal.Transformations.Alt where - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Control.Monad.Memo as Memo import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS +import Data.HList.ContainsType import qualified Data.List.Extra import qualified Data.Semigroup as Semigroup import qualified Data.Text as Text import qualified GHC.OldList as List - -import Data.HList.ContainsType - -import Language.Haskell.Brittany.Internal.Utils -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Types - -import qualified Control.Monad.Memo as Memo +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.Utils diff --git a/source/library/Language/Haskell/Brittany/Internal/Transformations/Columns.hs b/source/library/Language/Haskell/Brittany/Internal/Transformations/Columns.hs index 89a2c6f..3dcdb46 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Transformations/Columns.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Transformations/Columns.hs @@ -3,14 +3,10 @@ module Language.Haskell.Brittany.Internal.Transformations.Columns where - - -import Language.Haskell.Brittany.Internal.Prelude -import qualified GHC.OldList as List - -import Language.Haskell.Brittany.Internal.Types - import qualified Data.Generics.Uniplate.Direct as Uniplate +import qualified GHC.OldList as List +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.Types diff --git a/source/library/Language/Haskell/Brittany/Internal/Transformations/Floating.hs b/source/library/Language/Haskell/Brittany/Internal/Transformations/Floating.hs index 0231306..5ba0ce5 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Transformations/Floating.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Transformations/Floating.hs @@ -3,16 +3,12 @@ module Language.Haskell.Brittany.Internal.Transformations.Floating where - - +import qualified Data.Generics.Uniplate.Direct as Uniplate +import qualified GHC.OldList as List import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified GHC.OldList as List - -import Language.Haskell.Brittany.Internal.Utils -import Language.Haskell.Brittany.Internal.Types - -import qualified Data.Generics.Uniplate.Direct as Uniplate +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.Utils diff --git a/source/library/Language/Haskell/Brittany/Internal/Transformations/Indent.hs b/source/library/Language/Haskell/Brittany/Internal/Transformations/Indent.hs index 7f7d7e5..648e7c7 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Transformations/Indent.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Transformations/Indent.hs @@ -3,14 +3,10 @@ module Language.Haskell.Brittany.Internal.Transformations.Indent where - - -import Language.Haskell.Brittany.Internal.Prelude -import qualified GHC.OldList as List - -import Language.Haskell.Brittany.Internal.Types - import qualified Data.Generics.Uniplate.Direct as Uniplate +import qualified GHC.OldList as List +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.Types diff --git a/source/library/Language/Haskell/Brittany/Internal/Transformations/Par.hs b/source/library/Language/Haskell/Brittany/Internal/Transformations/Par.hs index 305ee08..2d1abf1 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Transformations/Par.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Transformations/Par.hs @@ -3,12 +3,9 @@ module Language.Haskell.Brittany.Internal.Transformations.Par where - - import Language.Haskell.Brittany.Internal.Prelude - -import Language.Haskell.Brittany.Internal.Utils -import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.Utils diff --git a/source/library/Language/Haskell/Brittany/Internal/Types.hs b/source/library/Language/Haskell/Brittany/Internal/Types.hs index 76b7735..6a2c8af 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Types.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Types.hs @@ -12,30 +12,20 @@ module Language.Haskell.Brittany.Internal.Types where - - -import Language.Haskell.Brittany.Internal.Prelude import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS import qualified Data.Data -import qualified Data.Strict.Maybe as Strict -import qualified Safe - -import qualified Language.Haskell.GHC.ExactPrint as ExactPrint -import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types - -import qualified Data.Text.Lazy.Builder as Text.Builder - -import GHC ( Located, GenLocated, AnnKeywordId, SrcSpan ) - -import Language.Haskell.GHC.ExactPrint ( AnnKey ) -import Language.Haskell.GHC.ExactPrint.Types ( Anns ) - -import Language.Haskell.Brittany.Internal.Config.Types - -import Data.Generics.Uniplate.Direct as Uniplate - +import Data.Generics.Uniplate.Direct as Uniplate import qualified Data.Kind as Kind - +import qualified Data.Strict.Maybe as Strict +import qualified Data.Text.Lazy.Builder as Text.Builder +import GHC (AnnKeywordId, GenLocated, Located, SrcSpan) +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Prelude +import qualified Language.Haskell.GHC.ExactPrint as ExactPrint +import Language.Haskell.GHC.ExactPrint (AnnKey) +import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types +import Language.Haskell.GHC.ExactPrint.Types (Anns) +import qualified Safe data PerItemConfig = PerItemConfig diff --git a/source/library/Language/Haskell/Brittany/Internal/Utils.hs b/source/library/Language/Haskell/Brittany/Internal/Utils.hs index a12f7ea..38f9123 100644 --- a/source/library/Language/Haskell/Brittany/Internal/Utils.hs +++ b/source/library/Language/Haskell/Brittany/Internal/Utils.hs @@ -7,38 +7,29 @@ module Language.Haskell.Brittany.Internal.Utils where - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified Data.ByteString as B import qualified Data.Coerce +import Data.Data +import Data.Generics.Aliases +import qualified Data.Generics.Uniplate.Direct as Uniplate import qualified Data.Semigroup as Semigroup import qualified Data.Sequence as Seq +import DataTreePrint +import qualified GHC.Data.FastString as GHC +import qualified GHC.Driver.Session as GHC +import qualified GHC.Hs.Extension as HsExtension import qualified GHC.OldList as List - +import GHC.Types.Name.Occurrence as OccName (occNameString) +import qualified GHC.Types.SrcLoc as GHC +import qualified GHC.Utils.Outputable as GHC +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Types import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint.Types import qualified Language.Haskell.GHC.ExactPrint.Utils as ExactPrint.Utils - -import Data.Data -import Data.Generics.Aliases - import qualified Text.PrettyPrint as PP -import qualified GHC.Utils.Outputable as GHC -import qualified GHC.Driver.Session as GHC -import qualified GHC.Data.FastString as GHC -import qualified GHC.Types.SrcLoc as GHC -import GHC.Types.Name.Occurrence as OccName ( occNameString ) -import qualified Data.ByteString as B - -import DataTreePrint - -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Types - -import qualified Data.Generics.Uniplate.Direct as Uniplate -import qualified GHC.Hs.Extension as HsExtension - parDoc :: String -> PP.Doc diff --git a/source/library/Language/Haskell/Brittany/Main.hs b/source/library/Language/Haskell/Brittany/Main.hs index 87ebe66..c32f1f7 100644 --- a/source/library/Language/Haskell/Brittany/Main.hs +++ b/source/library/Language/Haskell/Brittany/Main.hs @@ -4,56 +4,41 @@ module Language.Haskell.Brittany.Main where - - -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils +import Control.Monad (zipWithM) import qualified Control.Monad.Trans.Except as ExceptT +import Data.CZipWith import qualified Data.Either import qualified Data.List.Extra +import qualified Data.Monoid import qualified Data.Semigroup as Semigroup import qualified Data.Text as Text import qualified Data.Text.IO as Text.IO import qualified Data.Text.Lazy as TextL +import DataTreePrint +import GHC (GenLocated(L)) +import qualified GHC.Driver.Session as GHC +import qualified GHC.LanguageExtensions.Type as GHC import qualified GHC.OldList as List -import qualified System.IO - --- brittany { lconfig_importAsColumn: 60, lconfig_importColumn: 60 } -import qualified Language.Haskell.GHC.ExactPrint as ExactPrint -import qualified Data.Monoid - -import GHC ( GenLocated(L) ) -import GHC.Utils.Outputable ( Outputable(..) - , showSDocUnsafe - ) - -import Text.Read ( Read(..) ) -import qualified Text.ParserCombinators.ReadP as ReadP -import qualified Text.ParserCombinators.ReadPrec as ReadPrec - -import Control.Monad ( zipWithM ) -import Data.CZipWith - -import Language.Haskell.Brittany.Internal.Types -import Language.Haskell.Brittany.Internal -import Language.Haskell.Brittany.Internal.Config -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Utils -import Language.Haskell.Brittany.Internal.Obfuscation - -import qualified Text.PrettyPrint as PP - -import DataTreePrint -import UI.Butcher.Monadic - +import GHC.Utils.Outputable (Outputable(..), showSDocUnsafe) +import Language.Haskell.Brittany.Internal +import Language.Haskell.Brittany.Internal.Config +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Obfuscation +import Language.Haskell.Brittany.Internal.Prelude +import Language.Haskell.Brittany.Internal.PreludeUtils +import Language.Haskell.Brittany.Internal.Types +import Language.Haskell.Brittany.Internal.Utils +import qualified Language.Haskell.GHC.ExactPrint as ExactPrint +import Paths_brittany +import qualified System.Directory as Directory import qualified System.Exit -import qualified System.Directory as Directory -import qualified System.FilePath.Posix as FilePath - -import qualified GHC.Driver.Session as GHC -import qualified GHC.LanguageExtensions.Type as GHC - -import Paths_brittany +import qualified System.FilePath.Posix as FilePath +import qualified System.IO +import qualified Text.ParserCombinators.ReadP as ReadP +import qualified Text.ParserCombinators.ReadPrec as ReadPrec +import qualified Text.PrettyPrint as PP +import Text.Read (Read(..)) +import UI.Butcher.Monadic diff --git a/source/test-suite/Main.hs b/source/test-suite/Main.hs index 774088f..36e79ef 100644 --- a/source/test-suite/Main.hs +++ b/source/test-suite/Main.hs @@ -2,35 +2,24 @@ {-# LANGUAGE MonadComprehensions #-} {-# LANGUAGE ScopedTypeVariables #-} -import Language.Haskell.Brittany.Internal.Prelude +import Data.Coerce (coerce) +import Data.List (groupBy) import qualified Data.Maybe import qualified Data.Semigroup as Semigroup import qualified Data.Text as Text +import qualified Data.Text.IO as Text.IO import qualified GHC.OldList as List -import qualified System.Directory - -import Test.Hspec - -import qualified Text.Parsec as Parsec -import Text.Parsec.Text ( Parser ) - -import Data.List ( groupBy ) - -import Language.Haskell.Brittany.Internal - -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Config - -import Data.Coerce ( coerce ) - -import qualified Data.Text.IO as Text.IO -import System.FilePath ( () ) - -import System.Timeout ( timeout ) - - - +import Language.Haskell.Brittany.Internal +import Language.Haskell.Brittany.Internal.Config +import Language.Haskell.Brittany.Internal.Config.Types +import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils +import qualified System.Directory +import System.FilePath (()) +import System.Timeout (timeout) +import Test.Hspec +import qualified Text.Parsec as Parsec +import Text.Parsec.Text (Parser) hush :: Either a b -> Maybe b hush = either (const Nothing) Just -- 2.30.2 From fa8365a7fa9372043d5a1018f2f7669ce3853edd Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sun, 21 Nov 2021 13:53:46 +0000 Subject: [PATCH 66/74] Set up release job --- .github/workflows/ci.yaml | 54 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index e3b50a2..a3ca188 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -6,6 +6,9 @@ on: push: branches: - main + release: + types: + - created jobs: build: strategy: @@ -47,3 +50,54 @@ jobs: with: path: artifact name: brittany-${{ github.sha }} + + release: + needs: ci + if: github.event_name == 'release' + runs-on: ubuntu-20.04 + steps: + + - uses: actions/checkout@v2 + + - uses: actions/download-artifact@v2 + with: + name: brittany-${{ github.sha }} + path: artifact + + - uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + asset_content_type: application/octet-stream + asset_name: brittany-${{ github.event.release.tag_name }}-ubuntu + asset_path: artifact/ubuntu-20.04/brittany + upload_url: ${{ github.event.release.upload_url }} + + - uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + asset_content_type: application/octet-stream + asset_name: brittany-${{ github.event.release.tag_name }}-macos + asset_path: artifact/macos-11/brittany + upload_url: ${{ github.event.release.upload_url }} + + - uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + asset_content_type: application/octet-stream + asset_name: brittany-${{ github.event.release.tag_name }}-windows.exe + asset_path: artifact/windows-2019/brittany.exe + upload_url: ${{ github.event.release.upload_url }} + + - uses: actions/upload-release-asset@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + asset_content_type: application/gzip + asset_name: brittany-${{ github.event.release.tag_name }}.tar.gz + asset_path: artifact/ubuntu-20.04/brittany-${{ github.event.release.tag_name }}.tar.gz + upload_url: ${{ github.event.release.upload_url }} + + - run: cabal upload --publish --username '${{ secrets.HACKAGE_USERNAME }}' --password '${{ secrets.HACKAGE_PASSWORD }}' artifact/ubuntu-20.04/brittany-${{ github.event.release.tag_name }}.tar.gz -- 2.30.2 From cdc8405b10350c2eb495ed8ee3af5fe03a47c9cb Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sun, 21 Nov 2021 13:59:35 +0000 Subject: [PATCH 67/74] Remove mentions of GHC 8.x --- README.md | 2 +- data/15-regressions.blt | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/README.md b/README.md index 58119e9..76ad1bf 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ log the size of the input, but _not_ the full input/output of requests.) # Other usage notes -- Supports GHC versions `8.6`, `8.8`, `8.10`. +- Supports GHC version `9.0.x`. - included in stackage with lts>=10.0 (or nightlies dating to >=2017-11-15) - config (file) documentation is lacking. - some config values can not be configured via commandline yet. diff --git a/data/15-regressions.blt b/data/15-regressions.blt index e288114..df2dada 100644 --- a/data/15-regressions.blt +++ b/data/15-regressions.blt @@ -497,15 +497,12 @@ v = A { .. } where b = 2 v = A { a = 1, b = 2, c = 3 } #test issue 63 a -#pending fix does not work on 8.0.2 test :: Proxy 'Int #test issue 63 b -#pending fix does not work on 8.0.2 test :: Proxy '[ 'True] #test issue 63 c -#pending fix does not work on 8.0.2 test :: Proxy '[Bool] #test issue 64 -- 2.30.2 From b8532ca631b11aa89469f6661b15e75d24dd83d4 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sun, 21 Nov 2021 14:05:37 +0000 Subject: [PATCH 68/74] Fix release job dependency --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index a3ca188..11b88e8 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -52,7 +52,7 @@ jobs: name: brittany-${{ github.sha }} release: - needs: ci + needs: build if: github.event_name == 'release' runs-on: ubuntu-20.04 steps: -- 2.30.2 From ab59e9acc3069551ac4132321b285d000f5f5691 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sun, 21 Nov 2021 22:58:07 +0000 Subject: [PATCH 69/74] Parse modules "purely", without ghc-paths --- brittany.cabal | 2 + data/10-tests.blt | 3 + .../Language/Haskell/Brittany/Internal.hs | 12 +- .../Brittany/Internal/ExactPrintUtils.hs | 73 +-- .../Haskell/Brittany/Internal/ParseModule.hs | 508 ++++++++++++++++++ 5 files changed, 525 insertions(+), 73 deletions(-) create mode 100644 source/library/Language/Haskell/Brittany/Internal/ParseModule.hs diff --git a/brittany.cabal b/brittany.cabal index 79d5b8b..84db13f 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -50,6 +50,7 @@ common library , extra ^>= 1.7.10 , filepath ^>= 1.4.2 , ghc ^>= 9.0.1 + , ghc-boot ^>= 9.0.1 , ghc-boot-th ^>= 9.0.1 , ghc-exactprint ^>= 0.6.4 , monad-memo ^>= 0.5.3 @@ -118,6 +119,7 @@ library Language.Haskell.Brittany.Internal.Layouters.Stmt Language.Haskell.Brittany.Internal.Layouters.Type Language.Haskell.Brittany.Internal.Obfuscation + Language.Haskell.Brittany.Internal.ParseModule Language.Haskell.Brittany.Internal.Prelude Language.Haskell.Brittany.Internal.PreludeUtils Language.Haskell.Brittany.Internal.Transformations.Alt diff --git a/data/10-tests.blt b/data/10-tests.blt index 79d9a0a..311c911 100644 --- a/data/10-tests.blt +++ b/data/10-tests.blt @@ -363,6 +363,7 @@ data MyRecord = MyConstructor } #test record with DataTypeContexts +#pending data type contexts are deprecated in ghc 9.0 {-# LANGUAGE DatatypeContexts #-} data ( LooooooooooooooooooooongConstraint a @@ -1349,6 +1350,8 @@ type MySynonym3 b a #test synonym-with-kind-sig +{-# LANGUAGE StarIsType #-} + type MySynonym (a :: * -> *) = MySynonym a b -> MySynonym a b diff --git a/source/library/Language/Haskell/Brittany/Internal.hs b/source/library/Language/Haskell/Brittany/Internal.hs index b8940b1..456ef4a 100644 --- a/source/library/Language/Haskell/Brittany/Internal.hs +++ b/source/library/Language/Haskell/Brittany/Internal.hs @@ -30,7 +30,6 @@ import qualified Data.Text.Lazy.Builder as Text.Builder import qualified Data.Yaml import qualified GHC hiding (parseModule) import GHC (GenLocated(L)) -import GHC.Data.Bag import qualified GHC.Driver.Session as GHC import GHC.Hs import qualified GHC.LanguageExtensions.Type as GHC @@ -55,7 +54,6 @@ import Language.Haskell.Brittany.Internal.Transformations.Par import Language.Haskell.Brittany.Internal.Types import Language.Haskell.Brittany.Internal.Utils import qualified Language.Haskell.GHC.ExactPrint as ExactPrint -import qualified Language.Haskell.GHC.ExactPrint.Parsers as ExactPrint.Parsers import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint import qualified UI.Butcher.Monadic as Butcher @@ -368,10 +366,14 @@ pPrintModuleAndCheck conf inlineConf anns parsedModule = do parsePrintModuleTests :: Config -> String -> Text -> IO (Either String Text) parsePrintModuleTests conf filename input = do let inputStr = Text.unpack input - parseResult <- ExactPrint.Parsers.parseModuleFromString filename inputStr + parseResult <- parseModuleFromString + (conf & _conf_forward & _options_ghc & runIdentity) + filename + (const . pure $ Right ()) + inputStr case parseResult of - Left err -> return $ Left $ "parsing error: " ++ show (bagToList (show <$> err)) - Right (anns, parsedModule) -> runExceptT $ do + Left err -> return $ Left err + Right (anns, parsedModule, _) -> runExceptT $ do (inlineConf, perItemConf) <- case extractCommentConfigs anns (getTopLevelDeclNameMap parsedModule) of Left err -> throwE $ "error in inline config: " ++ show err diff --git a/source/library/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs b/source/library/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs index 28a40b0..b93fbbc 100644 --- a/source/library/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs +++ b/source/library/Language/Haskell/Brittany/Internal/ExactPrintUtils.hs @@ -7,9 +7,7 @@ module Language.Haskell.Brittany.Internal.ExactPrintUtils where -import Control.Exception import qualified Control.Monad.State.Class as State.Class -import qualified Control.Monad.Trans.Except as ExceptT import qualified Control.Monad.Trans.MultiRWS.Strict as MultiRWSS import Data.Data import qualified Data.Foldable as Foldable @@ -21,18 +19,15 @@ import qualified Data.Sequence as Seq import qualified Data.Set as Set import GHC (GenLocated(L)) import qualified GHC hiding (parseModule) -import GHC.Data.Bag import qualified GHC.Driver.CmdLine as GHC -import qualified GHC.Driver.Session as GHC import GHC.Hs import qualified GHC.Types.SrcLoc as GHC import GHC.Types.SrcLoc (Located, SrcSpan) import Language.Haskell.Brittany.Internal.Config.Types +import qualified Language.Haskell.Brittany.Internal.ParseModule as ParseModule import Language.Haskell.Brittany.Internal.Prelude import Language.Haskell.Brittany.Internal.PreludeUtils import qualified Language.Haskell.GHC.ExactPrint as ExactPrint -import qualified Language.Haskell.GHC.ExactPrint.Delta as ExactPrint -import qualified Language.Haskell.GHC.ExactPrint.Parsers as ExactPrint import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint import qualified System.IO @@ -43,43 +38,9 @@ parseModule -> System.IO.FilePath -> (GHC.DynFlags -> IO (Either String a)) -> IO (Either String (ExactPrint.Anns, GHC.ParsedSource, a)) -parseModule = - parseModuleWithCpp ExactPrint.defaultCppOptions ExactPrint.normalLayout - --- | Parse a module with specific instructions for the C pre-processor. -parseModuleWithCpp - :: ExactPrint.CppOptions - -> ExactPrint.DeltaOptions - -> [String] - -> System.IO.FilePath - -> (GHC.DynFlags -> IO (Either String a)) - -> IO (Either String (ExactPrint.Anns, GHC.ParsedSource, a)) -parseModuleWithCpp cpp opts args fp dynCheck = - ExactPrint.ghcWrapper $ ExceptT.runExceptT $ do - dflags0 <- lift $ GHC.getSessionDynFlags - (dflags1, leftover, warnings) <- lift $ GHC.parseDynamicFlagsCmdLine - dflags0 - (GHC.noLoc <$> ("-hide-all-packages" : args)) - -- that we pass -hide-all-packages here is a duplication, because - -- ExactPrint.initDynFlags also does it, but necessary because of - -- stupid and careless GHC API design. We explicitly want to pass - -- our args before calling that, so this is what we do. Should be - -- harmless. See commit 1b7576dcd1823e1c685a44927b1fcaade1319063. - void $ lift $ GHC.setSessionDynFlags dflags1 - dflags2 <- lift $ ExactPrint.initDynFlags fp - unless (null leftover) - $ ExceptT.throwE - $ "when parsing ghc flags: leftover flags: " - ++ show (leftover <&> \(L _ s) -> s) - unless (null warnings) - $ ExceptT.throwE - $ "when parsing ghc flags: encountered warnings: " - ++ show (warnings <&> warnExtractorCompat) - x <- ExceptT.ExceptT $ liftIO $ dynCheck dflags2 - res <- lift $ ExactPrint.parseModuleApiAnnsWithCppInternal cpp dflags2 fp - either (\err -> ExceptT.throwE $ "transform error: " ++ show (bagToList (show <$> err))) - (\(a, m) -> pure (a, m, x)) - $ ExactPrint.postParseTransform res opts +parseModule args fp dynCheck = do + str <- System.IO.readFile fp + parseModuleFromString args fp dynCheck str parseModuleFromString :: [String] @@ -87,31 +48,7 @@ parseModuleFromString -> (GHC.DynFlags -> IO (Either String a)) -> String -> IO (Either String (ExactPrint.Anns, GHC.ParsedSource, a)) -parseModuleFromString args fp dynCheck str = - -- 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) - unless (null leftover) - $ ExceptT.throwE - $ "when parsing ghc flags: leftover flags: " - ++ show (leftover <&> \(L _ s) -> s) - unless (null warnings) - $ ExceptT.throwE - $ "when parsing ghc flags: encountered warnings: " - ++ show (warnings <&> warnExtractorCompat) - dynCheckRes <- ExceptT.ExceptT $ liftIO $ dynCheck dflags1 - let res = ExactPrint.parseModuleFromStringInternal dflags1 fp str - case res of - Left err -> ExceptT.throwE $ "parse error: " ++ show (bagToList (show <$> err)) - Right (a , m ) -> pure (a, m, dynCheckRes) +parseModuleFromString = ParseModule.parseModule commentAnnFixTransformGlob :: SYB.Data ast => ast -> ExactPrint.Transform () diff --git a/source/library/Language/Haskell/Brittany/Internal/ParseModule.hs b/source/library/Language/Haskell/Brittany/Internal/ParseModule.hs new file mode 100644 index 0000000..fa84f02 --- /dev/null +++ b/source/library/Language/Haskell/Brittany/Internal/ParseModule.hs @@ -0,0 +1,508 @@ +{-# OPTIONS_GHC -Wno-implicit-prelude #-} + +module Language.Haskell.Brittany.Internal.ParseModule where + +import qualified Control.Monad as Monad +import qualified Control.Monad.IO.Class as IO +import qualified Control.Monad.Trans.Except as Except +import qualified Data.Set as Set +import qualified GHC +import qualified GHC.ByteOrder +import qualified GHC.Data.Bag +import qualified GHC.Data.EnumSet +import qualified GHC.Data.StringBuffer +import qualified GHC.Driver.CmdLine +import qualified GHC.Driver.Session +import qualified GHC.Parser.Header +import qualified GHC.Platform +import qualified GHC.Settings +import qualified GHC.Types.Basic +import qualified GHC.Types.SrcLoc +import qualified GHC.Unit.Module.Name +import qualified GHC.Unit.State +import qualified GHC.Unit.Types +import qualified GHC.Utils.Error +import qualified GHC.Utils.Fingerprint +import qualified GHC.Utils.Misc +import qualified GHC.Utils.Ppr.Colour +import qualified Language.Haskell.GHC.ExactPrint.Parsers as ExactPrint +import qualified Language.Haskell.GHC.ExactPrint.Types as ExactPrint + +-- | Parses a Haskell module. Although this nominally requires IO, it is +-- morally pure. It should have no observable effects. +parseModule + :: IO.MonadIO io + => [String] + -> FilePath + -> (GHC.Driver.Session.DynFlags -> io (Either String a)) + -> String + -> io (Either String (ExactPrint.Anns, GHC.ParsedSource, a)) +parseModule arguments1 filePath checkDynFlags string = Except.runExceptT $ do + let + dynFlags1 = GHC.Driver.Session.gopt_set + -- It feels like this should be either @Sf_Ignore@ or @Sf_None@, but both + -- of those modes have trouble parsing safe imports (@import safe ...@). + -- Neither passing in @"-XUnsafe"@ as a command line argument nor having + -- @{-# LANGUAGE Unsafe #-}@ in the source file seem to help. + initialDynFlags + { GHC.Driver.Session.safeHaskell = GHC.Driver.Session.Sf_Unsafe + } + GHC.Driver.Session.Opt_KeepRawTokenStream + (dynFlags2, leftovers1, warnings1) <- + GHC.Driver.Session.parseDynamicFlagsCmdLine dynFlags1 + $ fmap GHC.Types.SrcLoc.noLoc arguments1 + handleLeftovers leftovers1 + handleWarnings warnings1 + let + stringBuffer = GHC.Data.StringBuffer.stringToStringBuffer string + arguments2 = GHC.Parser.Header.getOptions dynFlags2 stringBuffer filePath + (dynFlags3, leftovers2, warnings2) <- + GHC.Driver.Session.parseDynamicFilePragma dynFlags2 arguments2 + handleLeftovers leftovers2 + handleWarnings warnings2 + dynFlagsResult <- Except.ExceptT $ checkDynFlags dynFlags3 + let + parseResult = + ExactPrint.parseModuleFromStringInternal dynFlags3 filePath string + case parseResult of + Left errorMessages -> handleErrorMessages errorMessages + Right (anns, parsedSource) -> pure (anns, parsedSource, dynFlagsResult) + +handleLeftovers + :: Monad m => [GHC.Types.SrcLoc.Located String] -> Except.ExceptT String m () +handleLeftovers leftovers = + Monad.unless (null leftovers) . Except.throwE $ "leftovers: " <> show + (fmap GHC.Types.SrcLoc.unLoc leftovers) + +handleWarnings + :: Monad m => [GHC.Driver.CmdLine.Warn] -> Except.ExceptT String m () +handleWarnings warnings = + Monad.unless (null warnings) . Except.throwE $ "warnings: " <> show + (fmap (GHC.Types.SrcLoc.unLoc . GHC.Driver.CmdLine.warnMsg) warnings) + +handleErrorMessages + :: Monad m => GHC.Utils.Error.ErrorMessages -> Except.ExceptT String m a +handleErrorMessages = + Except.throwE . mappend "errorMessages: " . show . GHC.Data.Bag.bagToList + +initialCfgWeights :: GHC.Driver.Session.CfgWeights +initialCfgWeights = GHC.Driver.Session.CFGWeights + { GHC.Driver.Session.backEdgeBonus = 0 + , GHC.Driver.Session.callWeight = 0 + , GHC.Driver.Session.condBranchWeight = 0 + , GHC.Driver.Session.infoTablePenalty = 0 + , GHC.Driver.Session.likelyCondWeight = 0 + , GHC.Driver.Session.switchWeight = 0 + , GHC.Driver.Session.uncondWeight = 0 + , GHC.Driver.Session.unlikelyCondWeight = 0 + } + +initialDynFlags :: GHC.Driver.Session.DynFlags +initialDynFlags = GHC.Driver.Session.DynFlags + { GHC.Driver.Session.avx = False + , GHC.Driver.Session.avx2 = False + , GHC.Driver.Session.avx512cd = False + , GHC.Driver.Session.avx512er = False + , GHC.Driver.Session.avx512f = False + , GHC.Driver.Session.avx512pf = False + , GHC.Driver.Session.binBlobThreshold = 0 + , GHC.Driver.Session.bmiVersion = Nothing + , GHC.Driver.Session.cachedPlugins = [] + , GHC.Driver.Session.canGenerateDynamicToo = error "canGenerateDynamicToo" + , GHC.Driver.Session.canUseColor = False + , GHC.Driver.Session.cfgWeightInfo = initialCfgWeights + , GHC.Driver.Session.cmdlineFrameworks = [] + , GHC.Driver.Session.cmmProcAlignment = Nothing + , GHC.Driver.Session.colScheme = GHC.Utils.Ppr.Colour.defaultScheme + , GHC.Driver.Session.debugLevel = 0 + , GHC.Driver.Session.depExcludeMods = [] + , GHC.Driver.Session.depIncludeCppDeps = False + , GHC.Driver.Session.depIncludePkgDeps = False + , GHC.Driver.Session.depMakefile = "" + , GHC.Driver.Session.depSuffixes = [] + , GHC.Driver.Session.dirsToClean = error "dirsToClean" + , GHC.Driver.Session.dump_action = \_ _ _ _ _ _ -> pure () + , GHC.Driver.Session.dumpDir = Nothing + , GHC.Driver.Session.dumpFlags = GHC.Data.EnumSet.fromList [] + , GHC.Driver.Session.dumpPrefix = Nothing + , GHC.Driver.Session.dumpPrefixForce = Nothing + , GHC.Driver.Session.dylibInstallName = Nothing + , GHC.Driver.Session.dynHiSuf = "" + , GHC.Driver.Session.dynLibLoader = GHC.Driver.Session.Deployable + , GHC.Driver.Session.dynObjectSuf = "" + , GHC.Driver.Session.dynOutputFile = Nothing + , GHC.Driver.Session.enableTimeStats = False + , GHC.Driver.Session.extensionFlags = GHC.Data.EnumSet.fromList [] + , GHC.Driver.Session.extensions = [] + , GHC.Driver.Session.fatalWarningFlags = GHC.Data.EnumSet.fromList [] + , GHC.Driver.Session.fileSettings = initialFileSettings + , GHC.Driver.Session.filesToClean = error "filesToClean" + , GHC.Driver.Session.floatLamArgs = Nothing + , GHC.Driver.Session.flushErr = GHC.Driver.Session.defaultFlushErr + , GHC.Driver.Session.flushOut = GHC.Driver.Session.defaultFlushOut + , GHC.Driver.Session.frameworkPaths = [] + , GHC.Driver.Session.frontendPluginOpts = [] + , GHC.Driver.Session.generalFlags = GHC.Data.EnumSet.fromList [] + , GHC.Driver.Session.generatedDumps = error "generatedDumps" + , GHC.Driver.Session.ghcHeapSize = Nothing + , GHC.Driver.Session.ghciHistSize = 0 + , GHC.Driver.Session.ghciScripts = [] + , GHC.Driver.Session.ghcLink = GHC.Driver.Session.NoLink + , GHC.Driver.Session.ghcMode = GHC.Driver.Session.OneShot + , GHC.Driver.Session.ghcNameVersion = initialGhcNameVersion + , GHC.Driver.Session.ghcVersionFile = Nothing + , GHC.Driver.Session.haddockOptions = Nothing + , GHC.Driver.Session.hcSuf = "" + , GHC.Driver.Session.hiDir = Nothing + , GHC.Driver.Session.hieDir = Nothing + , GHC.Driver.Session.hieSuf = "" + , GHC.Driver.Session.historySize = 0 + , GHC.Driver.Session.hiSuf = "" + , GHC.Driver.Session.homeUnitId = GHC.Unit.Types.stringToUnitId "" + , GHC.Driver.Session.homeUnitInstanceOfId = Nothing + , GHC.Driver.Session.homeUnitInstantiations = [] + , GHC.Driver.Session.hooks = error "hooks" + , GHC.Driver.Session.hpcDir = "" + , GHC.Driver.Session.hscTarget = GHC.Driver.Session.HscNothing + , GHC.Driver.Session.ignorePackageFlags = [] + , GHC.Driver.Session.importPaths = [] + , GHC.Driver.Session.includePaths = initialIncludeSpecs + , GHC.Driver.Session.incoherentOnLoc = initialSrcSpan + , GHC.Driver.Session.initialUnique = 0 + , GHC.Driver.Session.inlineCheck = Nothing + , GHC.Driver.Session.interactivePrint = Nothing + , GHC.Driver.Session.language = Nothing + , GHC.Driver.Session.ldInputs = [] + , GHC.Driver.Session.liberateCaseThreshold = Nothing + , GHC.Driver.Session.libraryPaths = [] + , GHC.Driver.Session.liftLamsKnown = False + , GHC.Driver.Session.liftLamsNonRecArgs = Nothing + , GHC.Driver.Session.liftLamsRecArgs = Nothing + , GHC.Driver.Session.llvmConfig = initialLlvmConfig + , GHC.Driver.Session.log_action = \_ _ _ _ _ -> pure () + , GHC.Driver.Session.mainFunIs = Nothing + , GHC.Driver.Session.mainModIs = GHC.Unit.Types.mkModule + (GHC.Unit.Types.stringToUnit "") + (GHC.Unit.Module.Name.mkModuleName "") + , GHC.Driver.Session.maxErrors = Nothing + , GHC.Driver.Session.maxInlineAllocSize = 0 + , GHC.Driver.Session.maxInlineMemcpyInsns = 0 + , GHC.Driver.Session.maxInlineMemsetInsns = 0 + , GHC.Driver.Session.maxPmCheckModels = 0 + , GHC.Driver.Session.maxRefHoleFits = Nothing + , GHC.Driver.Session.maxRelevantBinds = Nothing + , GHC.Driver.Session.maxSimplIterations = 0 + , GHC.Driver.Session.maxUncoveredPatterns = 0 + , GHC.Driver.Session.maxValidHoleFits = Nothing + , GHC.Driver.Session.maxWorkerArgs = 0 + , GHC.Driver.Session.newDerivOnLoc = initialSrcSpan + , GHC.Driver.Session.nextTempSuffix = error "nextTempSuffix" + , GHC.Driver.Session.nextWrapperNum = error "nextWrapperNum" + , GHC.Driver.Session.objectDir = Nothing + , GHC.Driver.Session.objectSuf = "" + , GHC.Driver.Session.optLevel = 0 + , GHC.Driver.Session.outputFile = Nothing + , GHC.Driver.Session.outputHi = Nothing + , GHC.Driver.Session.overlapInstLoc = initialSrcSpan + , GHC.Driver.Session.packageDBFlags = [] + , GHC.Driver.Session.packageEnv = Nothing + , GHC.Driver.Session.packageFlags = [] + , GHC.Driver.Session.parMakeCount = Nothing + , GHC.Driver.Session.pkgTrustOnLoc = initialSrcSpan + , GHC.Driver.Session.platformConstants = initialPlatformConstants + , GHC.Driver.Session.platformMisc = initialPlatformMisc + , GHC.Driver.Session.pluginModNameOpts = [] + , GHC.Driver.Session.pluginModNames = [] + , GHC.Driver.Session.pluginPackageFlags = [] + , GHC.Driver.Session.pprCols = 80 + , GHC.Driver.Session.pprUserLength = 0 + , GHC.Driver.Session.profAuto = GHC.Driver.Session.NoProfAuto + , GHC.Driver.Session.rawSettings = [] + , GHC.Driver.Session.reductionDepth = GHC.Types.Basic.mkIntWithInf 0 + , GHC.Driver.Session.refLevelHoleFits = Nothing + , GHC.Driver.Session.reverseErrors = False + , GHC.Driver.Session.rtccInfo = error "rtccInfo" + , GHC.Driver.Session.rtldInfo = error "rtldInfo" + , GHC.Driver.Session.rtsOpts = Nothing + , GHC.Driver.Session.rtsOptsEnabled = GHC.Driver.Session.RtsOptsNone + , GHC.Driver.Session.rtsOptsSuggestions = False + , GHC.Driver.Session.ruleCheck = Nothing + , GHC.Driver.Session.safeHaskell = GHC.Driver.Session.Sf_Ignore + , GHC.Driver.Session.safeInfer = False + , GHC.Driver.Session.safeInferred = False + , GHC.Driver.Session.simplPhases = 0 + , GHC.Driver.Session.simplTickFactor = 0 + , GHC.Driver.Session.solverIterations = GHC.Types.Basic.mkIntWithInf 0 + , GHC.Driver.Session.specConstrCount = Nothing + , GHC.Driver.Session.specConstrRecursive = 0 + , GHC.Driver.Session.specConstrThreshold = Nothing + , GHC.Driver.Session.splitInfo = Nothing + , GHC.Driver.Session.sseVersion = Nothing + , GHC.Driver.Session.staticPlugins = [] + , GHC.Driver.Session.strictnessBefore = [] + , GHC.Driver.Session.stubDir = Nothing + , GHC.Driver.Session.targetPlatform = initialTargetPlatform + , GHC.Driver.Session.thOnLoc = initialSrcSpan + , GHC.Driver.Session.toolSettings = initialToolSettings + , GHC.Driver.Session.trace_action = \_ _ _ a -> a + , GHC.Driver.Session.trustFlags = [] + , GHC.Driver.Session.trustworthyOnLoc = initialSrcSpan + , GHC.Driver.Session.ufCreationThreshold = 0 + , GHC.Driver.Session.ufDearOp = 0 + , GHC.Driver.Session.ufDictDiscount = 0 + , GHC.Driver.Session.ufFunAppDiscount = 0 + , GHC.Driver.Session.ufUseThreshold = 0 + , GHC.Driver.Session.ufVeryAggressive = False + , GHC.Driver.Session.uniqueIncrement = 0 + , GHC.Driver.Session.unitDatabases = Nothing + , GHC.Driver.Session.unitState = GHC.Unit.State.emptyUnitState + , GHC.Driver.Session.useColor = GHC.Utils.Misc.Never + , GHC.Driver.Session.useUnicode = False + , GHC.Driver.Session.verbosity = 0 + , GHC.Driver.Session.warningFlags = GHC.Data.EnumSet.fromList [] + , GHC.Driver.Session.warnSafeOnLoc = initialSrcSpan + , GHC.Driver.Session.warnUnsafeOnLoc = initialSrcSpan + , GHC.Driver.Session.ways = Set.empty + } + +initialFileSettings :: GHC.Driver.Session.FileSettings +initialFileSettings = GHC.Driver.Session.FileSettings + { GHC.Driver.Session.fileSettings_ghciUsagePath = "" + , GHC.Driver.Session.fileSettings_ghcUsagePath = "" + , GHC.Driver.Session.fileSettings_globalPackageDatabase = "" + , GHC.Driver.Session.fileSettings_tmpDir = "" + , GHC.Driver.Session.fileSettings_toolDir = Nothing + , GHC.Driver.Session.fileSettings_topDir = "" + } + +initialGhcNameVersion :: GHC.Driver.Session.GhcNameVersion +initialGhcNameVersion = GHC.Driver.Session.GhcNameVersion + { GHC.Driver.Session.ghcNameVersion_programName = "" + , GHC.Driver.Session.ghcNameVersion_projectVersion = "" + } + +initialIncludeSpecs :: GHC.Driver.Session.IncludeSpecs +initialIncludeSpecs = GHC.Driver.Session.IncludeSpecs + { GHC.Driver.Session.includePathsGlobal = [] + , GHC.Driver.Session.includePathsQuote = [] + } + +initialLlvmConfig :: GHC.Driver.Session.LlvmConfig +initialLlvmConfig = GHC.Driver.Session.LlvmConfig + { GHC.Driver.Session.llvmPasses = [] + , GHC.Driver.Session.llvmTargets = [] + } + +initialPlatformConstants :: GHC.Settings.PlatformConstants +initialPlatformConstants = GHC.Settings.PlatformConstants + { GHC.Settings.pc_AP_STACK_SPLIM = 0 + , GHC.Settings.pc_BITMAP_BITS_SHIFT = 0 + , GHC.Settings.pc_BLOCK_SIZE = 0 + , GHC.Settings.pc_BLOCKS_PER_MBLOCK = 0 + , GHC.Settings.pc_CINT_SIZE = 0 + , GHC.Settings.pc_CLONG_LONG_SIZE = 0 + , GHC.Settings.pc_CLONG_SIZE = 0 + , GHC.Settings.pc_CONTROL_GROUP_CONST_291 = 0 + , GHC.Settings.pc_DYNAMIC_BY_DEFAULT = False + , GHC.Settings.pc_ILDV_CREATE_MASK = 0 + , GHC.Settings.pc_ILDV_STATE_CREATE = 0 + , GHC.Settings.pc_ILDV_STATE_USE = 0 + , GHC.Settings.pc_LDV_SHIFT = 0 + , GHC.Settings.pc_MAX_CHARLIKE = 0 + , GHC.Settings.pc_MAX_Double_REG = 0 + , GHC.Settings.pc_MAX_Float_REG = 0 + , GHC.Settings.pc_MAX_INTLIKE = 0 + , GHC.Settings.pc_MAX_Long_REG = 0 + , GHC.Settings.pc_MAX_Real_Double_REG = 0 + , GHC.Settings.pc_MAX_Real_Float_REG = 0 + , GHC.Settings.pc_MAX_Real_Long_REG = 0 + , GHC.Settings.pc_MAX_Real_Vanilla_REG = 0 + , GHC.Settings.pc_MAX_Real_XMM_REG = 0 + , GHC.Settings.pc_MAX_SPEC_AP_SIZE = 0 + , GHC.Settings.pc_MAX_SPEC_SELECTEE_SIZE = 0 + , GHC.Settings.pc_MAX_Vanilla_REG = 0 + , GHC.Settings.pc_MAX_XMM_REG = 0 + , GHC.Settings.pc_MIN_CHARLIKE = 0 + , GHC.Settings.pc_MIN_INTLIKE = 0 + , GHC.Settings.pc_MIN_PAYLOAD_SIZE = 0 + , GHC.Settings.pc_MUT_ARR_PTRS_CARD_BITS = 0 + , GHC.Settings.pc_OFFSET_bdescr_blocks = 0 + , GHC.Settings.pc_OFFSET_bdescr_flags = 0 + , GHC.Settings.pc_OFFSET_bdescr_free = 0 + , GHC.Settings.pc_OFFSET_bdescr_start = 0 + , GHC.Settings.pc_OFFSET_Capability_r = 0 + , GHC.Settings.pc_OFFSET_CostCentreStack_mem_alloc = 0 + , GHC.Settings.pc_OFFSET_CostCentreStack_scc_count = 0 + , GHC.Settings.pc_OFFSET_StgArrBytes_bytes = 0 + , GHC.Settings.pc_OFFSET_stgEagerBlackholeInfo = 0 + , GHC.Settings.pc_OFFSET_StgEntCounter_allocd = 0 + , GHC.Settings.pc_OFFSET_StgEntCounter_allocs = 0 + , GHC.Settings.pc_OFFSET_StgEntCounter_entry_count = 0 + , GHC.Settings.pc_OFFSET_StgEntCounter_link = 0 + , GHC.Settings.pc_OFFSET_StgEntCounter_registeredp = 0 + , GHC.Settings.pc_OFFSET_StgFunInfoExtraFwd_arity = 0 + , GHC.Settings.pc_OFFSET_StgFunInfoExtraRev_arity = 0 + , GHC.Settings.pc_OFFSET_stgGCEnter1 = 0 + , GHC.Settings.pc_OFFSET_stgGCFun = 0 + , GHC.Settings.pc_OFFSET_StgHeader_ccs = 0 + , GHC.Settings.pc_OFFSET_StgHeader_ldvw = 0 + , GHC.Settings.pc_OFFSET_StgMutArrPtrs_ptrs = 0 + , GHC.Settings.pc_OFFSET_StgMutArrPtrs_size = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rCCCS = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rCurrentNursery = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rCurrentTSO = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rD1 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rD2 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rD3 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rD4 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rD5 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rD6 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rF1 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rF2 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rF3 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rF4 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rF5 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rF6 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rHp = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rHpAlloc = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rHpLim = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rL1 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rR1 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rR10 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rR2 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rR3 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rR4 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rR5 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rR6 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rR7 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rR8 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rR9 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rSp = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rSpLim = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rXMM1 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rXMM2 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rXMM3 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rXMM4 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rXMM5 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rXMM6 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rYMM1 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rYMM2 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rYMM3 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rYMM4 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rYMM5 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rYMM6 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rZMM1 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rZMM2 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rZMM3 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rZMM4 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rZMM5 = 0 + , GHC.Settings.pc_OFFSET_StgRegTable_rZMM6 = 0 + , GHC.Settings.pc_OFFSET_StgSmallMutArrPtrs_ptrs = 0 + , GHC.Settings.pc_OFFSET_StgStack_sp = 0 + , GHC.Settings.pc_OFFSET_StgStack_stack = 0 + , GHC.Settings.pc_OFFSET_StgTSO_alloc_limit = 0 + , GHC.Settings.pc_OFFSET_StgTSO_cccs = 0 + , GHC.Settings.pc_OFFSET_StgTSO_stackobj = 0 + , GHC.Settings.pc_OFFSET_StgUpdateFrame_updatee = 0 + , GHC.Settings.pc_PROF_HDR_SIZE = 0 + , GHC.Settings.pc_REP_CostCentreStack_mem_alloc = 0 + , GHC.Settings.pc_REP_CostCentreStack_scc_count = 0 + , GHC.Settings.pc_REP_StgEntCounter_allocd = 0 + , GHC.Settings.pc_REP_StgEntCounter_allocs = 0 + , GHC.Settings.pc_REP_StgFunInfoExtraFwd_arity = 0 + , GHC.Settings.pc_REP_StgFunInfoExtraRev_arity = 0 + , GHC.Settings.pc_RESERVED_C_STACK_BYTES = 0 + , GHC.Settings.pc_RESERVED_STACK_WORDS = 0 + , GHC.Settings.pc_SIZEOF_CostCentreStack = 0 + , GHC.Settings.pc_SIZEOF_StgArrBytes_NoHdr = 0 + , GHC.Settings.pc_SIZEOF_StgFunInfoExtraRev = 0 + , GHC.Settings.pc_SIZEOF_StgMutArrPtrs_NoHdr = 0 + , GHC.Settings.pc_SIZEOF_StgSmallMutArrPtrs_NoHdr = 0 + , GHC.Settings.pc_SIZEOF_StgSMPThunkHeader = 0 + , GHC.Settings.pc_SIZEOF_StgUpdateFrame_NoHdr = 0 + , GHC.Settings.pc_STD_HDR_SIZE = 0 + , GHC.Settings.pc_TAG_BITS = 0 + , GHC.Settings.pc_TICKY_BIN_COUNT = 0 + , GHC.Settings.pc_WORD_SIZE = 0 + } + +initialPlatformMini :: GHC.Settings.PlatformMini +initialPlatformMini = GHC.Settings.PlatformMini + { GHC.Settings.platformMini_arch = GHC.Platform.ArchX86_64 + , GHC.Settings.platformMini_os = GHC.Platform.OSLinux + } + +initialPlatformMisc :: GHC.Driver.Session.PlatformMisc +initialPlatformMisc = GHC.Driver.Session.PlatformMisc + { GHC.Driver.Session.platformMisc_ghcDebugged = False + , GHC.Driver.Session.platformMisc_ghcRTSWays = "" + , GHC.Driver.Session.platformMisc_ghcRtsWithLibdw = False + , GHC.Driver.Session.platformMisc_ghcThreaded = False + , GHC.Driver.Session.platformMisc_ghcWithInterpreter = False + , GHC.Driver.Session.platformMisc_ghcWithSMP = False + , GHC.Driver.Session.platformMisc_libFFI = False + , GHC.Driver.Session.platformMisc_llvmTarget = "" + , GHC.Driver.Session.platformMisc_targetPlatformString = "" + } + +initialSrcSpan :: GHC.Types.SrcLoc.SrcSpan +initialSrcSpan = + GHC.Types.SrcLoc.UnhelpfulSpan GHC.Types.SrcLoc.UnhelpfulNoLocationInfo + +initialTargetPlatform :: GHC.Settings.Platform +initialTargetPlatform = GHC.Settings.Platform + { GHC.Settings.platformByteOrder = GHC.ByteOrder.LittleEndian + , GHC.Settings.platformHasGnuNonexecStack = False + , GHC.Settings.platformHasIdentDirective = False + , GHC.Settings.platformHasSubsectionsViaSymbols = False + , GHC.Settings.platformIsCrossCompiling = False + , GHC.Settings.platformLeadingUnderscore = False + , GHC.Settings.platformMini = initialPlatformMini + , GHC.Settings.platformTablesNextToCode = False + , GHC.Settings.platformUnregisterised = False + , GHC.Settings.platformWordSize = GHC.Platform.PW8 + } + +initialToolSettings :: GHC.Settings.ToolSettings +initialToolSettings = GHC.Settings.ToolSettings + { GHC.Settings.toolSettings_ccSupportsNoPie = False + , GHC.Settings.toolSettings_extraGccViaCFlags = [] + , GHC.Settings.toolSettings_ldIsGnuLd = False + , GHC.Settings.toolSettings_ldSupportsBuildId = False + , GHC.Settings.toolSettings_ldSupportsCompactUnwind = False + , GHC.Settings.toolSettings_ldSupportsFilelist = False + , GHC.Settings.toolSettings_opt_a = [] + , GHC.Settings.toolSettings_opt_c = [] + , GHC.Settings.toolSettings_opt_cxx = [] + , GHC.Settings.toolSettings_opt_F = [] + , GHC.Settings.toolSettings_opt_i = [] + , GHC.Settings.toolSettings_opt_l = [] + , GHC.Settings.toolSettings_opt_L = [] + , GHC.Settings.toolSettings_opt_lc = [] + , GHC.Settings.toolSettings_opt_lcc = [] + , GHC.Settings.toolSettings_opt_lm = [] + , GHC.Settings.toolSettings_opt_lo = [] + , GHC.Settings.toolSettings_opt_P = [] + , GHC.Settings.toolSettings_opt_P_fingerprint = + GHC.Utils.Fingerprint.fingerprint0 + , GHC.Settings.toolSettings_opt_windres = [] + , GHC.Settings.toolSettings_pgm_a = ("", []) + , GHC.Settings.toolSettings_pgm_ar = "" + , GHC.Settings.toolSettings_pgm_c = "" + , GHC.Settings.toolSettings_pgm_dll = ("", []) + , GHC.Settings.toolSettings_pgm_F = "" + , GHC.Settings.toolSettings_pgm_i = "" + , GHC.Settings.toolSettings_pgm_install_name_tool = "" + , GHC.Settings.toolSettings_pgm_l = ("", []) + , GHC.Settings.toolSettings_pgm_L = "" + , GHC.Settings.toolSettings_pgm_lc = ("", []) + , GHC.Settings.toolSettings_pgm_lcc = ("", []) + , GHC.Settings.toolSettings_pgm_libtool = "" + , GHC.Settings.toolSettings_pgm_lm = ("", []) + , GHC.Settings.toolSettings_pgm_lo = ("", []) + , GHC.Settings.toolSettings_pgm_otool = "" + , GHC.Settings.toolSettings_pgm_P = ("", []) + , GHC.Settings.toolSettings_pgm_ranlib = "" + , GHC.Settings.toolSettings_pgm_T = "" + , GHC.Settings.toolSettings_pgm_windres = "" + } -- 2.30.2 From 89a9f47b72a7d41cce19a49e8503440101cfb8ac Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sun, 21 Nov 2021 23:40:15 +0000 Subject: [PATCH 70/74] Ignore warnings when parsing modules --- data/10-tests.blt | 70 ++++++++----------- data/15-regressions.blt | 3 +- data/30-tests-context-free.blt | 66 ++++++++--------- .../Haskell/Brittany/Internal/ParseModule.hs | 16 ++--- 4 files changed, 62 insertions(+), 93 deletions(-) diff --git a/data/10-tests.blt b/data/10-tests.blt index 311c911..debf9aa 100644 --- a/data/10-tests.blt +++ b/data/10-tests.blt @@ -35,7 +35,7 @@ func :: (((((((((()))))))))) -- current output is.. funny. wonder if that can/needs to be improved.. #test give me more! -#pending +#pending nested tuples over line length func :: ((((((((((((((((((((((((((((((((((((((((((())))))))))))))))))))))))))))))))))))))))))) #test unit @@ -196,7 +196,7 @@ func ] ############################################################################### #test type operator stuff -#pending +#pending HsOpTy test050 :: a :+: b test051 :: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd :+: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd @@ -258,20 +258,18 @@ funcA :: a -> b -- comment A funcB :: a -> b -- comment B #test comments all -#pending -- a func -- b :: -- c - a -- d + a -- d -> -- e - ( -- f - c -- g - , -- h - d -- i - ) -- j + ( -- f + c -- g + , -- h + d -- i + ) -- j -- k - ############################################################################### ############################################################################### ############################################################################### @@ -303,10 +301,9 @@ func = f func :: Int #test inline pragma 4 -#pending this does not work with the compiler version we currently use yet (i think). should work with ghc-8.0.2. func = f where - {-# INLINE [~] f #-} + {-# INLINE [~1] f #-} f = id @@ -363,7 +360,6 @@ data MyRecord = MyConstructor } #test record with DataTypeContexts -#pending data type contexts are deprecated in ghc 9.0 {-# LANGUAGE DatatypeContexts #-} data ( LooooooooooooooooooooongConstraint a @@ -647,21 +643,15 @@ x *** y = x func _ = x #test simple long pattern -#pending -func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable - = x +func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable = + x #test simple multiline pattern -#pending -func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable - reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable +func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable = x #test another multiline pattern -#pending -func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable - a - b +func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable a b = x #test simple constructor @@ -671,7 +661,6 @@ func (A a) = a func (x : xr) = x #test some other constructor symbol -#pending func (x :+: xr) = x #test normal infix constructor @@ -738,21 +727,21 @@ describe "infix op" $ do func = x + x #test long -#pending -func = mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj - + mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj +func = + mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj + + mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj #test long keep linemode 1 -#pending -func = mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj - + mweroiuxlskdfjlksj - + mweroiuxlskdfjlksj +func = + mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj + + mweroiuxlskdfjlksj + + mweroiuxlskdfjlksj #test long keep linemode 2 -#pending -func = mweroiuxlskdfjlksj - + mweroiuxlskdfjlksj - + mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj +func = + mweroiuxlskdfjlksj + + mweroiuxlskdfjlksj + + mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj #test literals func = 1 @@ -816,9 +805,10 @@ myTupleSection = ) #test 2 -#pending -func = (lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd - , lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd) +func = + ( lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd + , lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd + ) #test comment-after-then foo = if True @@ -1400,12 +1390,10 @@ type Foo a -- fancy type comment Int #test synonym-type-operators -#pending - type (a :+: b) = (a, b) #test synonym-multi-parens -#pending +#pending loses extra parens type ((a :+: b) c) = (a, c) diff --git a/data/15-regressions.blt b/data/15-regressions.blt index df2dada..9a6b623 100644 --- a/data/15-regressions.blt +++ b/data/15-regressions.blt @@ -134,11 +134,10 @@ func = if x else Nothing #test qualified infix pattern -#pending "TODO" wrapPatPrepend pat prepElem = do patDocs <- layoutPat pat case Seq.viewl patDocs of - Seq.EmptyL -> return $ Seq.empty + Seq.EmptyL -> return $ Seq.empty x1 Seq.:< xR -> do x1' <- docSeq [prepElem, return x1] return $ x1' Seq.<| xR diff --git a/data/30-tests-context-free.blt b/data/30-tests-context-free.blt index 003a23d..d73e6d4 100644 --- a/data/30-tests-context-free.blt +++ b/data/30-tests-context-free.blt @@ -35,7 +35,7 @@ func :: (((((((((()))))))))) -- current output is.. funny. wonder if that can/needs to be improved.. #test give me more! -#pending +#pending nested tuples over line length func :: ((((((((((((((((((((((((((((((((((((((((((())))))))))))))))))))))))))))))))))))))))))) #test unit @@ -196,7 +196,7 @@ func ] ############################################################################### #test type operator stuff -#pending +#pending HsOpTy test050 :: a :+: b test051 :: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd @@ -249,18 +249,16 @@ funcA :: a -> b -- comment A funcB :: a -> b -- comment B #test comments all -#pending -- a func -- b :: -- c - a -- d + a -- d -> -- e - ( -- f - c -- g - , -- h - d -- i - ) -- j --- k + ( -- f + c -- g + , -- h + d -- i + ) -- j-- k ############################################################################### @@ -305,10 +303,9 @@ func = f f = id #test inline pragma 4 -#pending this does not work with the compiler version we currently use yet (i think). should work with ghc-8.0.2. func = f where - {-# INLINE [~] f #-} + {-# INLINE [~1] f #-} f = id @@ -390,21 +387,15 @@ x *** y = x func _ = x #test simple long pattern -#pending -func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable - = x +func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable = + x #test simple multiline pattern -#pending -func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable - reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable +func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable = x #test another multiline pattern -#pending -func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable - a - b +func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable a b = x #test simple constructor @@ -414,7 +405,6 @@ func (A a) = a func (x : xr) = x #test some other constructor symbol -#pending func (x :+: xr) = x @@ -479,21 +469,21 @@ describe "infix op" $ do func = x + x #test long -#pending -func = mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj - + mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj +func = + mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj + + mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj #test long keep linemode 1 -#pending -func = mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj - + mweroiuxlskdfjlksj - + mweroiuxlskdfjlksj +func = + mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj + + mweroiuxlskdfjlksj + + mweroiuxlskdfjlksj #test long keep linemode 2 -#pending -func = mweroiuxlskdfjlksj - + mweroiuxlskdfjlksj - + mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj +func = + mweroiuxlskdfjlksj + + mweroiuxlskdfjlksj + + mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj #test literals func = 1 @@ -551,9 +541,10 @@ func = (`abc` 1) func = (abc, def) #test 2 -#pending -func = (lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd - , lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd) +func = + ( lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd + , lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd + ) #test let in on single line foo = @@ -1082,7 +1073,6 @@ func = if x else Nothing #test qualified infix pattern -#pending "TODO" wrapPatPrepend pat prepElem = do patDocs <- layoutPat pat case Seq.viewl patDocs of diff --git a/source/library/Language/Haskell/Brittany/Internal/ParseModule.hs b/source/library/Language/Haskell/Brittany/Internal/ParseModule.hs index fa84f02..2cc259f 100644 --- a/source/library/Language/Haskell/Brittany/Internal/ParseModule.hs +++ b/source/library/Language/Haskell/Brittany/Internal/ParseModule.hs @@ -11,7 +11,6 @@ import qualified GHC.ByteOrder import qualified GHC.Data.Bag import qualified GHC.Data.EnumSet import qualified GHC.Data.StringBuffer -import qualified GHC.Driver.CmdLine import qualified GHC.Driver.Session import qualified GHC.Parser.Header import qualified GHC.Platform @@ -48,18 +47,17 @@ parseModule arguments1 filePath checkDynFlags string = Except.runExceptT $ do { GHC.Driver.Session.safeHaskell = GHC.Driver.Session.Sf_Unsafe } GHC.Driver.Session.Opt_KeepRawTokenStream - (dynFlags2, leftovers1, warnings1) <- + (dynFlags2, leftovers1, _) <- GHC.Driver.Session.parseDynamicFlagsCmdLine dynFlags1 $ fmap GHC.Types.SrcLoc.noLoc arguments1 handleLeftovers leftovers1 - handleWarnings warnings1 let stringBuffer = GHC.Data.StringBuffer.stringToStringBuffer string arguments2 = GHC.Parser.Header.getOptions dynFlags2 stringBuffer filePath - (dynFlags3, leftovers2, warnings2) <- - GHC.Driver.Session.parseDynamicFilePragma dynFlags2 arguments2 + (dynFlags3, leftovers2, _) <- GHC.Driver.Session.parseDynamicFilePragma + dynFlags2 + arguments2 handleLeftovers leftovers2 - handleWarnings warnings2 dynFlagsResult <- Except.ExceptT $ checkDynFlags dynFlags3 let parseResult = @@ -74,12 +72,6 @@ handleLeftovers leftovers = Monad.unless (null leftovers) . Except.throwE $ "leftovers: " <> show (fmap GHC.Types.SrcLoc.unLoc leftovers) -handleWarnings - :: Monad m => [GHC.Driver.CmdLine.Warn] -> Except.ExceptT String m () -handleWarnings warnings = - Monad.unless (null warnings) . Except.throwE $ "warnings: " <> show - (fmap (GHC.Types.SrcLoc.unLoc . GHC.Driver.CmdLine.warnMsg) warnings) - handleErrorMessages :: Monad m => GHC.Utils.Error.ErrorMessages -> Except.ExceptT String m a handleErrorMessages = -- 2.30.2 From 21e86adf6edaffe886b8e5311836a4d9657ec6ab Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Tue, 23 Nov 2021 22:41:01 +0000 Subject: [PATCH 71/74] Split tests into individual files --- brittany.cabal | 4 +- data/10-tests.blt | 1757 ----------------- data/14-extensions.blt | 241 --- data/15-regressions.blt | 874 -------- data/16-pending.blt | 35 - data/30-tests-context-free.blt | 1461 -------------- data/40-indent-policy-multiple.blt | 42 - data/Test1.hs | 1 + data/Test10.hs | 3 + data/Test100.hs | 1 + data/Test101.hs | 3 + data/Test102.hs | 3 + data/Test103.hs | 1 + data/Test104.hs | 1 + data/Test105.hs | 1 + data/Test106.hs | 1 + data/Test107.hs | 1 + data/Test108.hs | 1 + data/Test109.hs | 1 + data/Test11.hs | 3 + data/Test110.hs | 6 + data/Test111.hs | 4 + data/Test112.hs | 6 + data/Test113.hs | 5 + data/Test114.hs | 3 + data/Test115.hs | 7 + data/Test116.hs | 7 + data/Test117.hs | 1 + data/Test118.hs | 5 + data/Test119.hs | 5 + data/Test12.hs | 5 + data/Test120.hs | 3 + data/Test121.hs | 3 + data/Test122.hs | 3 + data/Test123.hs | 7 + data/Test124.hs | 4 + data/Test125.hs | 4 + data/Test126.hs | 3 + data/Test127.hs | 6 + data/Test128.hs | 6 + data/Test129.hs | 1 + data/Test13.hs | 5 + data/Test130.hs | 1 + data/Test131.hs | 1 + data/Test132.hs | 1 + data/Test133.hs | 12 + data/Test134.hs | 12 + data/Test135.hs | 1 + data/Test136.hs | 1 + data/Test137.hs | 1 + data/Test138.hs | 6 + data/Test139.hs | 1 + data/Test14.hs | 1 + data/Test140.hs | 1 + data/Test141.hs | 1 + data/Test142.hs | 1 + data/Test143.hs | 1 + data/Test144.hs | 1 + data/Test145.hs | 1 + data/Test146.hs | 1 + data/Test147.hs | 1 + data/Test148.hs | 1 + data/Test149.hs | 1 + data/Test15.hs | 5 + data/Test150.hs | 3 + data/Test151.hs | 1 + data/Test152.hs | 1 + data/Test153.hs | 4 + data/Test154.hs | 14 + data/Test155.hs | 11 + data/Test156.hs | 3 + data/Test157.hs | 13 + data/Test158.hs | 3 + data/Test159.hs | 3 + data/Test16.hs | 6 + data/Test160.hs | 3 + data/Test161.hs | 10 + data/Test162.hs | 11 + data/Test163.hs | 9 + data/Test164.hs | 7 + data/Test165.hs | 4 + data/Test166.hs | 3 + data/Test167.hs | 8 + data/Test168.hs | 2 + data/Test169.hs | 8 + data/Test17.hs | 6 + data/Test170.hs | 18 + data/Test171.hs | 2 + data/Test172.hs | 26 + data/Test173.hs | 2 + data/Test174.hs | 5 + data/Test175.hs | 2 + data/Test176.hs | 3 + data/Test177.hs | 2 + data/Test178.hs | 1 + data/Test179.hs | 1 + data/Test18.hs | 5 + data/Test180.hs | 3 + data/Test181.hs | 7 + data/Test182.hs | 7 + data/Test183.hs | 1 + data/Test184.hs | 5 + data/Test185.hs | 2 + data/Test186.hs | 1 + data/Test187.hs | 1 + data/Test188.hs | 1 + data/Test189.hs | 1 + data/Test19.hs | 7 + data/Test190.hs | 3 + data/Test191.hs | 1 + data/Test192.hs | 6 + data/Test193.hs | 2 + data/Test194.hs | 4 + data/Test195.hs | 3 + data/Test196.hs | 9 + data/Test197.hs | 3 + data/Test198.hs | 11 + data/Test199.hs | 4 + data/Test2.hs | 3 + data/Test20.hs | 7 + data/Test200.hs | 4 + data/Test201.hs | 5 + data/Test202.hs | 8 + data/Test203.hs | 11 + data/Test204.hs | 6 + data/Test205.hs | 4 + data/Test206.hs | 3 + data/Test207.hs | 3 + data/Test208.hs | 4 + data/Test209.hs | 3 + data/Test21.hs | 7 + data/Test210.hs | 3 + data/Test211.hs | 4 + data/Test212.hs | 3 + data/Test213.hs | 3 + data/Test214.hs | 4 + data/Test215.hs | 5 + data/Test216.hs | 5 + data/Test217.hs | 6 + data/Test218.hs | 5 + data/Test219.hs | 5 + data/Test22.hs | 7 + data/Test220.hs | 6 + data/Test221.hs | 5 + data/Test222.hs | 5 + data/Test223.hs | 6 + data/Test224.hs | 3 + data/Test225.hs | 10 + data/Test226.hs | 1 + data/Test227.hs | 1 + data/Test228.hs | 4 + data/Test229.hs | 3 + data/Test23.hs | 1 + data/Test230.hs | 4 + data/Test231.hs | 6 + data/Test232.hs | 4 + data/Test233.hs | 2 + data/Test234.hs | 7 + data/Test235.hs | 5 + data/Test236.hs | 6 + data/Test237.hs | 3 + data/Test238.hs | 7 + data/Test239.hs | 2 + data/Test24.hs | 4 + data/Test240.hs | 2 + data/Test241.hs | 3 + data/Test242.hs | 3 + data/Test243.hs | 2 + data/Test244.hs | 2 + data/Test245.hs | 3 + data/Test246.hs | 4 + data/Test247.hs | 3 + data/Test248.hs | 6 + data/Test249.hs | 7 + data/Test25.hs | 5 + data/Test250.hs | 6 + data/Test251.hs | 2 + data/Test252.hs | 7 + data/Test253.hs | 4 + data/Test254.hs | 4 + data/Test255.hs | 5 + data/Test256.hs | 4 + data/Test257.hs | 6 + data/Test258.hs | 9 + data/Test259.hs | 2 + data/Test26.hs | 1 + data/Test260.hs | 2 + data/Test261.hs | 2 + data/Test262.hs | 2 + data/Test263.hs | 3 + data/Test264.hs | 4 + data/Test265.hs | 1 + data/Test266.hs | 4 + data/Test267.hs | 3 + data/Test268.hs | 5 + data/Test269.hs | 6 + data/Test27.hs | 1 + data/Test270.hs | 1 + data/Test271.hs | 4 + data/Test272.hs | 4 + data/Test273.hs | 4 + data/Test274.hs | 6 + data/Test275.hs | 6 + data/Test276.hs | 7 + data/Test277.hs | 2 + data/Test278.hs | 4 + data/Test279.hs | 6 + data/Test28.hs | 5 + data/Test280.hs | 5 + data/Test281.hs | 5 + data/Test282.hs | 7 + data/Test283.hs | 6 + data/Test284.hs | 24 + data/Test285.hs | 12 + data/Test286.hs | 12 + data/Test287.hs | 35 + data/Test288.hs | 2 + data/Test289.hs | 6 + data/Test29.hs | 6 + data/Test290.hs | 2 + data/Test291.hs | 5 + data/Test292.hs | 7 + data/Test293.hs | 5 + data/Test294.hs | 2 + data/Test295.hs | 1 + data/Test296.hs | 5 + data/Test297.hs | 3 + data/Test298.hs | 14 + data/Test299.hs | 3 + data/Test3.hs | 4 + data/Test30.hs | 6 + data/Test300.hs | 4 + data/Test301.hs | 5 + data/Test302.hs | 18 + data/Test303.hs | 2 + data/Test304.hs | 9 + data/Test305.hs | 11 + data/Test306.hs | 7 + data/Test307.hs | 2 + data/Test308.hs | 50 + data/Test309.hs | 9 + data/Test31.hs | 2 + data/Test310.hs | 5 + data/Test311.hs | 5 + data/Test312.hs | 2 + data/Test313.hs | 2 + data/Test314.hs | 2 + data/Test315.hs | 1 + data/Test316.hs | 1 + data/Test317.hs | 1 + data/Test318.hs | 7 + data/Test319.hs | 13 + data/Test32.hs | 10 + data/Test320.hs | 2 + data/Test321.hs | 1 + data/Test322.hs | 2 + data/Test323.hs | 7 + data/Test324.hs | 9 + data/Test325.hs | 4 + data/Test326.hs | 4 + data/Test327.hs | 1 + data/Test328.hs | 3 + data/Test329.hs | 7 + data/Test33.hs | 10 + data/Test330.hs | 10 + data/Test331.hs | 5 + data/Test332.hs | 2 + data/Test333.hs | 18 + data/Test334.hs | 5 + data/Test335.hs | 12 + data/Test336.hs | 8 + data/Test337.hs | 4 + data/Test338.hs | 1 + data/Test339.hs | 5 + data/Test34.hs | 9 + data/Test340.hs | 2 + data/Test341.hs | 3 + data/Test342.hs | 50 + data/Test343.hs | 10 + data/Test344.hs | 7 + data/Test345.hs | 13 + data/Test346.hs | 2 + data/Test347.hs | 8 + data/Test348.hs | 8 + data/Test349.hs | 6 + data/Test35.hs | 2 + data/Test350.hs | 23 + data/Test351.hs | 7 + data/Test352.hs | 5 + data/Test353.hs | 4 + data/Test354.hs | 4 + data/Test355.hs | 5 + data/Test356.hs | 11 + data/Test357.hs | 7 + data/Test358.hs | 2 + data/Test359.hs | 4 + data/Test36.hs | 1 + data/Test360.hs | 5 + data/Test361.hs | 2 + data/Test362.hs | 2 + data/Test363.hs | 2 + data/Test364.hs | 3 + data/Test365.hs | 2 + data/Test366.hs | 6 + data/Test367.hs | 4 + data/Test368.hs | 4 + data/Test369.hs | 6 + data/Test37.hs | 2 + data/Test370.hs | 6 + data/Test371.hs | 2 + data/Test372.hs | 6 + data/Test373.hs | 7 + data/Test374.hs | 7 + data/Test375.hs | 6 + data/Test376.hs | 8 + data/Test377.hs | 8 + data/Test378.hs | 8 + data/Test379.hs | 8 + data/Test38.hs | 11 + data/Test380.hs | 2 + data/Test381.hs | 5 + data/Test382.hs | 6 + data/Test383.hs | 2 + data/Test384.hs | 2 + data/Test385.hs | 6 + data/Test386.hs | 7 + data/Test387.hs | 7 + data/Test388.hs | 3 + data/Test389.hs | 11 + data/Test39.hs | 4 + data/Test390.hs | 11 + data/Test391.hs | 3 + data/Test392.hs | 2 + data/Test393.hs | 3 + data/Test394.hs | 11 + data/Test395.hs | 3 + data/Test396.hs | 8 + data/Test397.hs | 5 + data/Test398.hs | 5 + data/Test399.hs | 5 + data/Test4.hs | 1 + data/Test40.hs | 4 + data/Test400.hs | 5 + data/Test401.hs | 4 + data/Test402.hs | 4 + data/Test403.hs | 5 + data/Test404.hs | 5 + data/Test405.hs | 6 + data/Test406.hs | 6 + data/Test407.hs | 2 + data/Test408.hs | 2 + data/Test409.hs | 2 + data/Test41.hs | 4 + data/Test410.hs | 2 + data/Test411.hs | 3 + data/Test412.hs | 3 + data/Test413.hs | 3 + data/Test414.hs | 2 + data/Test415.hs | 2 + data/Test416.hs | 2 + data/Test417.hs | 2 + data/Test418.hs | 4 + data/Test419.hs | 4 + data/Test42.hs | 2 + data/Test420.hs | 8 + data/Test421.hs | 6 + data/Test422.hs | 7 + data/Test423.hs | 3 + data/Test424.hs | 2 + data/Test425.hs | 4 + data/Test426.hs | 5 + data/Test427.hs | 5 + data/Test428.hs | 6 + data/Test429.hs | 5 + data/Test43.hs | 4 + data/Test430.hs | 3 + data/Test431.hs | 2 + data/Test432.hs | 4 + data/Test433.hs | 5 + data/Test434.hs | 2 + data/Test435.hs | 2 + data/Test436.hs | 2 + data/Test437.hs | 2 + data/Test438.hs | 2 + data/Test439.hs | 5 + data/Test44.hs | 2 + data/Test440.hs | 4 + data/Test441.hs | 4 + data/Test442.hs | 4 + data/Test443.hs | 4 + data/Test444.hs | 8 + data/Test445.hs | 5 + data/Test446.hs | 7 + data/Test447.hs | 7 + data/Test448.hs | 2 + data/Test449.hs | 2 + data/Test45.hs | 3 + data/Test450.hs | 2 + data/Test451.hs | 2 + data/Test452.hs | 13 + data/Test453.hs | 13 + data/Test454.hs | 2 + data/Test455.hs | 2 + data/Test456.hs | 2 + data/Test457.hs | 2 + data/Test458.hs | 2 + data/Test459.hs | 2 + data/Test46.hs | 3 + data/Test460.hs | 2 + data/Test461.hs | 2 + data/Test462.hs | 2 + data/Test463.hs | 2 + data/Test464.hs | 2 + data/Test465.hs | 2 + data/Test466.hs | 2 + data/Test467.hs | 2 + data/Test468.hs | 4 + data/Test469.hs | 2 + data/Test47.hs | 4 + data/Test470.hs | 2 + data/Test471.hs | 2 + data/Test472.hs | 16 + data/Test473.hs | 2 + data/Test474.hs | 3 + data/Test475.hs | 15 + data/Test476.hs | 5 + data/Test477.hs | 3 + data/Test478.hs | 3 + data/Test479.hs | 3 + data/Test48.hs | 4 + data/Test480.hs | 2 + data/Test481.hs | 5 + data/Test482.hs | 6 + data/Test483.hs | 5 + data/Test484.hs | 12 + data/Test485.hs | 4 + data/Test486.hs | 3 + data/Test487.hs | 27 + data/Test488.hs | 3 + data/Test489.hs | 25 + data/Test49.hs | 5 + data/Test490.hs | 5 + data/Test491.hs | 2 + data/Test492.hs | 6 + data/Test493.hs | 6 + data/Test494.hs | 6 + data/Test495.hs | 6 + data/Test496.hs | 4 + data/Test497.hs | 7 + data/Test498.hs | 7 + data/Test499.hs | 2 + data/Test5.hs | 1 + data/Test50.hs | 8 + data/Test500.hs | 5 + data/Test501.hs | 6 + data/Test502.hs | 5 + data/Test503.hs | 7 + data/Test504.hs | 7 + data/Test505.hs | 8 + data/Test506.hs | 3 + data/Test507.hs | 5 + data/Test508.hs | 8 + data/Test509.hs | 6 + data/Test51.hs | 13 + data/Test510.hs | 6 + data/Test511.hs | 8 + data/Test512.hs | 7 + data/Test513.hs | 25 + data/Test514.hs | 13 + data/Test515.hs | 13 + data/Test516.hs | 37 + data/Test517.hs | 4 + data/Test518.hs | 7 + data/Test519.hs | 4 + data/Test52.hs | 5 + data/Test520.hs | 3 + data/Test521.hs | 6 + data/Test522.hs | 8 + data/Test523.hs | 6 + data/Test524.hs | 3 + data/Test525.hs | 2 + data/Test526.hs | 6 + data/Test527.hs | 4 + data/Test528.hs | 15 + data/Test529.hs | 4 + data/Test53.hs | 7 + data/Test530.hs | 6 + data/Test531.hs | 6 + data/Test532.hs | 20 + data/Test533.hs | 3 + data/Test534.hs | 11 + data/Test535.hs | 3 + data/Test536.hs | 51 + data/Test537.hs | 11 + data/Test538.hs | 6 + data/Test539.hs | 7 + data/Test54.hs | 10 + data/Test540.hs | 14 + data/Test55.hs | 9 + data/Test56.hs | 14 + data/Test57.hs | 5 + data/Test58.hs | 12 + data/Test59.hs | 6 + data/Test6.hs | 1 + data/Test60.hs | 4 + data/Test61.hs | 5 + data/Test62.hs | 3 + data/Test63.hs | 5 + data/Test64.hs | 5 + data/Test65.hs | 9 + data/Test66.hs | 11 + data/Test67.hs | 13 + data/Test68.hs | 8 + data/Test69.hs | 4 + data/Test7.hs | 2 + data/Test70.hs | 3 + data/Test71.hs | 4 + data/Test72.hs | 3 + data/Test73.hs | 22 + data/Test74.hs | 1 + data/Test75.hs | 1 + data/Test76.hs | 1 + data/Test77.hs | 1 + data/Test78.hs | 4 + data/Test79.hs | 1 + data/Test8.hs | 1 + data/Test80.hs | 2 + data/Test81.hs | 2 + data/Test82.hs | 2 + data/Test83.hs | 1 + data/Test84.hs | 1 + data/Test85.hs | 1 + data/Test86.hs | 1 + data/Test87.hs | 1 + data/Test88.hs | 2 + data/Test89.hs | 3 + data/Test9.hs | 5 + data/Test90.hs | 7 + data/Test91.hs | 5 + data/Test92.hs | 6 + data/Test93.hs | 2 + data/Test94.hs | 1 + data/Test95.hs | 3 + data/Test96.hs | 4 + data/Test97.hs | 4 + data/Test98.hs | 5 + data/Test99.hs | 2 + data/brittany.yaml | 4 + .../library/Language/Haskell/Brittany/Main.hs | 12 +- source/test-suite/Main.hs | 294 +-- 550 files changed, 2918 insertions(+), 4663 deletions(-) delete mode 100644 data/10-tests.blt delete mode 100644 data/14-extensions.blt delete mode 100644 data/15-regressions.blt delete mode 100644 data/16-pending.blt delete mode 100644 data/30-tests-context-free.blt delete mode 100644 data/40-indent-policy-multiple.blt create mode 100644 data/Test1.hs create mode 100644 data/Test10.hs create mode 100644 data/Test100.hs create mode 100644 data/Test101.hs create mode 100644 data/Test102.hs create mode 100644 data/Test103.hs create mode 100644 data/Test104.hs create mode 100644 data/Test105.hs create mode 100644 data/Test106.hs create mode 100644 data/Test107.hs create mode 100644 data/Test108.hs create mode 100644 data/Test109.hs create mode 100644 data/Test11.hs create mode 100644 data/Test110.hs create mode 100644 data/Test111.hs create mode 100644 data/Test112.hs create mode 100644 data/Test113.hs create mode 100644 data/Test114.hs create mode 100644 data/Test115.hs create mode 100644 data/Test116.hs create mode 100644 data/Test117.hs create mode 100644 data/Test118.hs create mode 100644 data/Test119.hs create mode 100644 data/Test12.hs create mode 100644 data/Test120.hs create mode 100644 data/Test121.hs create mode 100644 data/Test122.hs create mode 100644 data/Test123.hs create mode 100644 data/Test124.hs create mode 100644 data/Test125.hs create mode 100644 data/Test126.hs create mode 100644 data/Test127.hs create mode 100644 data/Test128.hs create mode 100644 data/Test129.hs create mode 100644 data/Test13.hs create mode 100644 data/Test130.hs create mode 100644 data/Test131.hs create mode 100644 data/Test132.hs create mode 100644 data/Test133.hs create mode 100644 data/Test134.hs create mode 100644 data/Test135.hs create mode 100644 data/Test136.hs create mode 100644 data/Test137.hs create mode 100644 data/Test138.hs create mode 100644 data/Test139.hs create mode 100644 data/Test14.hs create mode 100644 data/Test140.hs create mode 100644 data/Test141.hs create mode 100644 data/Test142.hs create mode 100644 data/Test143.hs create mode 100644 data/Test144.hs create mode 100644 data/Test145.hs create mode 100644 data/Test146.hs create mode 100644 data/Test147.hs create mode 100644 data/Test148.hs create mode 100644 data/Test149.hs create mode 100644 data/Test15.hs create mode 100644 data/Test150.hs create mode 100644 data/Test151.hs create mode 100644 data/Test152.hs create mode 100644 data/Test153.hs create mode 100644 data/Test154.hs create mode 100644 data/Test155.hs create mode 100644 data/Test156.hs create mode 100644 data/Test157.hs create mode 100644 data/Test158.hs create mode 100644 data/Test159.hs create mode 100644 data/Test16.hs create mode 100644 data/Test160.hs create mode 100644 data/Test161.hs create mode 100644 data/Test162.hs create mode 100644 data/Test163.hs create mode 100644 data/Test164.hs create mode 100644 data/Test165.hs create mode 100644 data/Test166.hs create mode 100644 data/Test167.hs create mode 100644 data/Test168.hs create mode 100644 data/Test169.hs create mode 100644 data/Test17.hs create mode 100644 data/Test170.hs create mode 100644 data/Test171.hs create mode 100644 data/Test172.hs create mode 100644 data/Test173.hs create mode 100644 data/Test174.hs create mode 100644 data/Test175.hs create mode 100644 data/Test176.hs create mode 100644 data/Test177.hs create mode 100644 data/Test178.hs create mode 100644 data/Test179.hs create mode 100644 data/Test18.hs create mode 100644 data/Test180.hs create mode 100644 data/Test181.hs create mode 100644 data/Test182.hs create mode 100644 data/Test183.hs create mode 100644 data/Test184.hs create mode 100644 data/Test185.hs create mode 100644 data/Test186.hs create mode 100644 data/Test187.hs create mode 100644 data/Test188.hs create mode 100644 data/Test189.hs create mode 100644 data/Test19.hs create mode 100644 data/Test190.hs create mode 100644 data/Test191.hs create mode 100644 data/Test192.hs create mode 100644 data/Test193.hs create mode 100644 data/Test194.hs create mode 100644 data/Test195.hs create mode 100644 data/Test196.hs create mode 100644 data/Test197.hs create mode 100644 data/Test198.hs create mode 100644 data/Test199.hs create mode 100644 data/Test2.hs create mode 100644 data/Test20.hs create mode 100644 data/Test200.hs create mode 100644 data/Test201.hs create mode 100644 data/Test202.hs create mode 100644 data/Test203.hs create mode 100644 data/Test204.hs create mode 100644 data/Test205.hs create mode 100644 data/Test206.hs create mode 100644 data/Test207.hs create mode 100644 data/Test208.hs create mode 100644 data/Test209.hs create mode 100644 data/Test21.hs create mode 100644 data/Test210.hs create mode 100644 data/Test211.hs create mode 100644 data/Test212.hs create mode 100644 data/Test213.hs create mode 100644 data/Test214.hs create mode 100644 data/Test215.hs create mode 100644 data/Test216.hs create mode 100644 data/Test217.hs create mode 100644 data/Test218.hs create mode 100644 data/Test219.hs create mode 100644 data/Test22.hs create mode 100644 data/Test220.hs create mode 100644 data/Test221.hs create mode 100644 data/Test222.hs create mode 100644 data/Test223.hs create mode 100644 data/Test224.hs create mode 100644 data/Test225.hs create mode 100644 data/Test226.hs create mode 100644 data/Test227.hs create mode 100644 data/Test228.hs create mode 100644 data/Test229.hs create mode 100644 data/Test23.hs create mode 100644 data/Test230.hs create mode 100644 data/Test231.hs create mode 100644 data/Test232.hs create mode 100644 data/Test233.hs create mode 100644 data/Test234.hs create mode 100644 data/Test235.hs create mode 100644 data/Test236.hs create mode 100644 data/Test237.hs create mode 100644 data/Test238.hs create mode 100644 data/Test239.hs create mode 100644 data/Test24.hs create mode 100644 data/Test240.hs create mode 100644 data/Test241.hs create mode 100644 data/Test242.hs create mode 100644 data/Test243.hs create mode 100644 data/Test244.hs create mode 100644 data/Test245.hs create mode 100644 data/Test246.hs create mode 100644 data/Test247.hs create mode 100644 data/Test248.hs create mode 100644 data/Test249.hs create mode 100644 data/Test25.hs create mode 100644 data/Test250.hs create mode 100644 data/Test251.hs create mode 100644 data/Test252.hs create mode 100644 data/Test253.hs create mode 100644 data/Test254.hs create mode 100644 data/Test255.hs create mode 100644 data/Test256.hs create mode 100644 data/Test257.hs create mode 100644 data/Test258.hs create mode 100644 data/Test259.hs create mode 100644 data/Test26.hs create mode 100644 data/Test260.hs create mode 100644 data/Test261.hs create mode 100644 data/Test262.hs create mode 100644 data/Test263.hs create mode 100644 data/Test264.hs create mode 100644 data/Test265.hs create mode 100644 data/Test266.hs create mode 100644 data/Test267.hs create mode 100644 data/Test268.hs create mode 100644 data/Test269.hs create mode 100644 data/Test27.hs create mode 100644 data/Test270.hs create mode 100644 data/Test271.hs create mode 100644 data/Test272.hs create mode 100644 data/Test273.hs create mode 100644 data/Test274.hs create mode 100644 data/Test275.hs create mode 100644 data/Test276.hs create mode 100644 data/Test277.hs create mode 100644 data/Test278.hs create mode 100644 data/Test279.hs create mode 100644 data/Test28.hs create mode 100644 data/Test280.hs create mode 100644 data/Test281.hs create mode 100644 data/Test282.hs create mode 100644 data/Test283.hs create mode 100644 data/Test284.hs create mode 100644 data/Test285.hs create mode 100644 data/Test286.hs create mode 100644 data/Test287.hs create mode 100644 data/Test288.hs create mode 100644 data/Test289.hs create mode 100644 data/Test29.hs create mode 100644 data/Test290.hs create mode 100644 data/Test291.hs create mode 100644 data/Test292.hs create mode 100644 data/Test293.hs create mode 100644 data/Test294.hs create mode 100644 data/Test295.hs create mode 100644 data/Test296.hs create mode 100644 data/Test297.hs create mode 100644 data/Test298.hs create mode 100644 data/Test299.hs create mode 100644 data/Test3.hs create mode 100644 data/Test30.hs create mode 100644 data/Test300.hs create mode 100644 data/Test301.hs create mode 100644 data/Test302.hs create mode 100644 data/Test303.hs create mode 100644 data/Test304.hs create mode 100644 data/Test305.hs create mode 100644 data/Test306.hs create mode 100644 data/Test307.hs create mode 100644 data/Test308.hs create mode 100644 data/Test309.hs create mode 100644 data/Test31.hs create mode 100644 data/Test310.hs create mode 100644 data/Test311.hs create mode 100644 data/Test312.hs create mode 100644 data/Test313.hs create mode 100644 data/Test314.hs create mode 100644 data/Test315.hs create mode 100644 data/Test316.hs create mode 100644 data/Test317.hs create mode 100644 data/Test318.hs create mode 100644 data/Test319.hs create mode 100644 data/Test32.hs create mode 100644 data/Test320.hs create mode 100644 data/Test321.hs create mode 100644 data/Test322.hs create mode 100644 data/Test323.hs create mode 100644 data/Test324.hs create mode 100644 data/Test325.hs create mode 100644 data/Test326.hs create mode 100644 data/Test327.hs create mode 100644 data/Test328.hs create mode 100644 data/Test329.hs create mode 100644 data/Test33.hs create mode 100644 data/Test330.hs create mode 100644 data/Test331.hs create mode 100644 data/Test332.hs create mode 100644 data/Test333.hs create mode 100644 data/Test334.hs create mode 100644 data/Test335.hs create mode 100644 data/Test336.hs create mode 100644 data/Test337.hs create mode 100644 data/Test338.hs create mode 100644 data/Test339.hs create mode 100644 data/Test34.hs create mode 100644 data/Test340.hs create mode 100644 data/Test341.hs create mode 100644 data/Test342.hs create mode 100644 data/Test343.hs create mode 100644 data/Test344.hs create mode 100644 data/Test345.hs create mode 100644 data/Test346.hs create mode 100644 data/Test347.hs create mode 100644 data/Test348.hs create mode 100644 data/Test349.hs create mode 100644 data/Test35.hs create mode 100644 data/Test350.hs create mode 100644 data/Test351.hs create mode 100644 data/Test352.hs create mode 100644 data/Test353.hs create mode 100644 data/Test354.hs create mode 100644 data/Test355.hs create mode 100644 data/Test356.hs create mode 100644 data/Test357.hs create mode 100644 data/Test358.hs create mode 100644 data/Test359.hs create mode 100644 data/Test36.hs create mode 100644 data/Test360.hs create mode 100644 data/Test361.hs create mode 100644 data/Test362.hs create mode 100644 data/Test363.hs create mode 100644 data/Test364.hs create mode 100644 data/Test365.hs create mode 100644 data/Test366.hs create mode 100644 data/Test367.hs create mode 100644 data/Test368.hs create mode 100644 data/Test369.hs create mode 100644 data/Test37.hs create mode 100644 data/Test370.hs create mode 100644 data/Test371.hs create mode 100644 data/Test372.hs create mode 100644 data/Test373.hs create mode 100644 data/Test374.hs create mode 100644 data/Test375.hs create mode 100644 data/Test376.hs create mode 100644 data/Test377.hs create mode 100644 data/Test378.hs create mode 100644 data/Test379.hs create mode 100644 data/Test38.hs create mode 100644 data/Test380.hs create mode 100644 data/Test381.hs create mode 100644 data/Test382.hs create mode 100644 data/Test383.hs create mode 100644 data/Test384.hs create mode 100644 data/Test385.hs create mode 100644 data/Test386.hs create mode 100644 data/Test387.hs create mode 100644 data/Test388.hs create mode 100644 data/Test389.hs create mode 100644 data/Test39.hs create mode 100644 data/Test390.hs create mode 100644 data/Test391.hs create mode 100644 data/Test392.hs create mode 100644 data/Test393.hs create mode 100644 data/Test394.hs create mode 100644 data/Test395.hs create mode 100644 data/Test396.hs create mode 100644 data/Test397.hs create mode 100644 data/Test398.hs create mode 100644 data/Test399.hs create mode 100644 data/Test4.hs create mode 100644 data/Test40.hs create mode 100644 data/Test400.hs create mode 100644 data/Test401.hs create mode 100644 data/Test402.hs create mode 100644 data/Test403.hs create mode 100644 data/Test404.hs create mode 100644 data/Test405.hs create mode 100644 data/Test406.hs create mode 100644 data/Test407.hs create mode 100644 data/Test408.hs create mode 100644 data/Test409.hs create mode 100644 data/Test41.hs create mode 100644 data/Test410.hs create mode 100644 data/Test411.hs create mode 100644 data/Test412.hs create mode 100644 data/Test413.hs create mode 100644 data/Test414.hs create mode 100644 data/Test415.hs create mode 100644 data/Test416.hs create mode 100644 data/Test417.hs create mode 100644 data/Test418.hs create mode 100644 data/Test419.hs create mode 100644 data/Test42.hs create mode 100644 data/Test420.hs create mode 100644 data/Test421.hs create mode 100644 data/Test422.hs create mode 100644 data/Test423.hs create mode 100644 data/Test424.hs create mode 100644 data/Test425.hs create mode 100644 data/Test426.hs create mode 100644 data/Test427.hs create mode 100644 data/Test428.hs create mode 100644 data/Test429.hs create mode 100644 data/Test43.hs create mode 100644 data/Test430.hs create mode 100644 data/Test431.hs create mode 100644 data/Test432.hs create mode 100644 data/Test433.hs create mode 100644 data/Test434.hs create mode 100644 data/Test435.hs create mode 100644 data/Test436.hs create mode 100644 data/Test437.hs create mode 100644 data/Test438.hs create mode 100644 data/Test439.hs create mode 100644 data/Test44.hs create mode 100644 data/Test440.hs create mode 100644 data/Test441.hs create mode 100644 data/Test442.hs create mode 100644 data/Test443.hs create mode 100644 data/Test444.hs create mode 100644 data/Test445.hs create mode 100644 data/Test446.hs create mode 100644 data/Test447.hs create mode 100644 data/Test448.hs create mode 100644 data/Test449.hs create mode 100644 data/Test45.hs create mode 100644 data/Test450.hs create mode 100644 data/Test451.hs create mode 100644 data/Test452.hs create mode 100644 data/Test453.hs create mode 100644 data/Test454.hs create mode 100644 data/Test455.hs create mode 100644 data/Test456.hs create mode 100644 data/Test457.hs create mode 100644 data/Test458.hs create mode 100644 data/Test459.hs create mode 100644 data/Test46.hs create mode 100644 data/Test460.hs create mode 100644 data/Test461.hs create mode 100644 data/Test462.hs create mode 100644 data/Test463.hs create mode 100644 data/Test464.hs create mode 100644 data/Test465.hs create mode 100644 data/Test466.hs create mode 100644 data/Test467.hs create mode 100644 data/Test468.hs create mode 100644 data/Test469.hs create mode 100644 data/Test47.hs create mode 100644 data/Test470.hs create mode 100644 data/Test471.hs create mode 100644 data/Test472.hs create mode 100644 data/Test473.hs create mode 100644 data/Test474.hs create mode 100644 data/Test475.hs create mode 100644 data/Test476.hs create mode 100644 data/Test477.hs create mode 100644 data/Test478.hs create mode 100644 data/Test479.hs create mode 100644 data/Test48.hs create mode 100644 data/Test480.hs create mode 100644 data/Test481.hs create mode 100644 data/Test482.hs create mode 100644 data/Test483.hs create mode 100644 data/Test484.hs create mode 100644 data/Test485.hs create mode 100644 data/Test486.hs create mode 100644 data/Test487.hs create mode 100644 data/Test488.hs create mode 100644 data/Test489.hs create mode 100644 data/Test49.hs create mode 100644 data/Test490.hs create mode 100644 data/Test491.hs create mode 100644 data/Test492.hs create mode 100644 data/Test493.hs create mode 100644 data/Test494.hs create mode 100644 data/Test495.hs create mode 100644 data/Test496.hs create mode 100644 data/Test497.hs create mode 100644 data/Test498.hs create mode 100644 data/Test499.hs create mode 100644 data/Test5.hs create mode 100644 data/Test50.hs create mode 100644 data/Test500.hs create mode 100644 data/Test501.hs create mode 100644 data/Test502.hs create mode 100644 data/Test503.hs create mode 100644 data/Test504.hs create mode 100644 data/Test505.hs create mode 100644 data/Test506.hs create mode 100644 data/Test507.hs create mode 100644 data/Test508.hs create mode 100644 data/Test509.hs create mode 100644 data/Test51.hs create mode 100644 data/Test510.hs create mode 100644 data/Test511.hs create mode 100644 data/Test512.hs create mode 100644 data/Test513.hs create mode 100644 data/Test514.hs create mode 100644 data/Test515.hs create mode 100644 data/Test516.hs create mode 100644 data/Test517.hs create mode 100644 data/Test518.hs create mode 100644 data/Test519.hs create mode 100644 data/Test52.hs create mode 100644 data/Test520.hs create mode 100644 data/Test521.hs create mode 100644 data/Test522.hs create mode 100644 data/Test523.hs create mode 100644 data/Test524.hs create mode 100644 data/Test525.hs create mode 100644 data/Test526.hs create mode 100644 data/Test527.hs create mode 100644 data/Test528.hs create mode 100644 data/Test529.hs create mode 100644 data/Test53.hs create mode 100644 data/Test530.hs create mode 100644 data/Test531.hs create mode 100644 data/Test532.hs create mode 100644 data/Test533.hs create mode 100644 data/Test534.hs create mode 100644 data/Test535.hs create mode 100644 data/Test536.hs create mode 100644 data/Test537.hs create mode 100644 data/Test538.hs create mode 100644 data/Test539.hs create mode 100644 data/Test54.hs create mode 100644 data/Test540.hs create mode 100644 data/Test55.hs create mode 100644 data/Test56.hs create mode 100644 data/Test57.hs create mode 100644 data/Test58.hs create mode 100644 data/Test59.hs create mode 100644 data/Test6.hs create mode 100644 data/Test60.hs create mode 100644 data/Test61.hs create mode 100644 data/Test62.hs create mode 100644 data/Test63.hs create mode 100644 data/Test64.hs create mode 100644 data/Test65.hs create mode 100644 data/Test66.hs create mode 100644 data/Test67.hs create mode 100644 data/Test68.hs create mode 100644 data/Test69.hs create mode 100644 data/Test7.hs create mode 100644 data/Test70.hs create mode 100644 data/Test71.hs create mode 100644 data/Test72.hs create mode 100644 data/Test73.hs create mode 100644 data/Test74.hs create mode 100644 data/Test75.hs create mode 100644 data/Test76.hs create mode 100644 data/Test77.hs create mode 100644 data/Test78.hs create mode 100644 data/Test79.hs create mode 100644 data/Test8.hs create mode 100644 data/Test80.hs create mode 100644 data/Test81.hs create mode 100644 data/Test82.hs create mode 100644 data/Test83.hs create mode 100644 data/Test84.hs create mode 100644 data/Test85.hs create mode 100644 data/Test86.hs create mode 100644 data/Test87.hs create mode 100644 data/Test88.hs create mode 100644 data/Test89.hs create mode 100644 data/Test9.hs create mode 100644 data/Test90.hs create mode 100644 data/Test91.hs create mode 100644 data/Test92.hs create mode 100644 data/Test93.hs create mode 100644 data/Test94.hs create mode 100644 data/Test95.hs create mode 100644 data/Test96.hs create mode 100644 data/Test97.hs create mode 100644 data/Test98.hs create mode 100644 data/Test99.hs create mode 100644 data/brittany.yaml diff --git a/brittany.cabal b/brittany.cabal index 84db13f..33d760e 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -24,7 +24,8 @@ extra-doc-files: README.md doc/implementation/*.md extra-source-files: - data/*.blt + data/brittany.yaml + data/*.hs source-repository head type: git @@ -143,7 +144,6 @@ test-suite brittany-test-suite build-depends: , hspec ^>= 2.8.3 - , parsec ^>= 3.1.14 hs-source-dirs: source/test-suite main-is: Main.hs type: exitcode-stdio-1.0 diff --git a/data/10-tests.blt b/data/10-tests.blt deleted file mode 100644 index debf9aa..0000000 --- a/data/10-tests.blt +++ /dev/null @@ -1,1757 +0,0 @@ - -############################################################################### -############################################################################### -############################################################################### -#group type signatures -############################################################################### -############################################################################### -############################################################################### - -#test simple001 -func :: a -> a - -#test long typeVar -func - :: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -#test keep linebreak mode -func - :: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -> lakjsdlkjasldkj - -> lakjsdlkjasldkj - -#test simple parens 1 -func :: ((a)) - -#test simple parens 2 -func :: (a -> a) -> a - -#test simple parens 3 -func :: a -> (a -> a) - -#test did anyone say parentheses? -func :: (((((((((()))))))))) - --- current output is.. funny. wonder if that can/needs to be improved.. -#test give me more! -#pending nested tuples over line length -func :: ((((((((((((((((((((((((((((((((((((((((((())))))))))))))))))))))))))))))))))))))))))) - -#test unit -func :: () - - -############################################################################### - -#test paren'd func 1 -func - :: ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -> lakjsdlkjasldkj - -> lakjsdlkjasldkj - ) - -#test paren'd func 2 -func - :: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -> (lakjsdlkjasldkj -> lakjsdlkjasldkj) - -#test paren'd func 3 -func - :: (lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd -> lakjsdlkjasldkj) - -> lakjsdlkjasldkj - -#test paren'd func 4 -func - :: ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - ) - -> lakjsdlkjasldkj - -#test paren'd func 5 -func - :: ( ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - ) - ) - -############################################################################### - -#test type application 1 -func :: asd -> Either a b - -#test type application 2 -func - :: asd - -> Either - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -#test type application 3 -func - :: asd - -> Trither - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -#test type application 4 -func - :: Trither - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -> asd - -#test type application 5 -func - :: Trither - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - (lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd -> asd) - -#test type application 6 -func - :: Trither - asd - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - ) - -#test type application paren 1 -func - :: asd - -> ( Trither - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - ) - -#test type application paren 2 -func - :: asd - -> ( Trither - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - ) - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -#test type application paren 3 -func - :: ( Trither - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - ) - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -> asd - -############################################################################### - -#test list simple -func :: [a -> b] - -#test list func -func - :: [ lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - ] - -#test list paren -func - :: [ ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - ) - ] - -################################################################## -- ############# - -#test tuple type 1 -func :: (a, b, c) - -#test tuple type 2 -func :: ((a, b, c), (a, b, c), (a, b, c)) - -#test tuple type long -func - :: ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - , lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - , lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - ) - -#test tuple type nested -func - :: ( ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - , (lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd) - , lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - ) - ) - -#test tuple type function -func - :: [ ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - , lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - , lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - ) - ] -############################################################################### -#test type operator stuff -#pending HsOpTy -test050 :: a :+: b -test051 :: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - :+: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd -test052 :: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - :+: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -############################################################################### - -#test forall oneliner -{-# LANGUAGE ScopedTypeVariables #-} -func :: forall (a :: *) b . a -> b - -#test forall context multiline -{-# LANGUAGE ScopedTypeVariables #-} -func - :: forall m - . Foo - => ColMap2 - -> ColInfo - -> ColInfo - -> ColInfo - -> ColInfo - -> m () - -#test forall no-context multiline -{-# LANGUAGE ScopedTypeVariables #-} -func - :: forall m - . ColMap2 - -> ColInfo - -> ColInfo - -> ColInfo - -> ColInfo - -> ColInfo - -> m () - -#test forall context multiline with comments -{-# LANGUAGE RankNTypes #-} -addFlagStringParam - :: forall f out - . (Applicative f) - => String -- ^ short flag chars, i.e. "v" for -v - -> [String] -- ^ list of long names, i.e. ["verbose"] - -> String -- ^ param name - -> Flag String -- ^ properties - -> CmdParser f out String - -#test language pragma issue -{-# LANGUAGE ScopedTypeVariables #-} -func :: forall (a :: *) b . a -> b - -#test comments 1 -func :: a -> b -- comment - -#test comments 2 -funcA :: a -> b -- comment A -funcB :: a -> b -- comment B - -#test comments all --- a -func -- b - :: -- c - a -- d - -> -- e - ( -- f - c -- g - , -- h - d -- i - ) -- j --- k - -############################################################################### -############################################################################### -############################################################################### -#group type signatures pragmas -############################################################################### -############################################################################### -############################################################################### - -#test inline pragma 1 -func = f - where - {-# INLINE f #-} - f = id - -#test inline pragma 2 -func = ($) - where - {-# INLINE ($) #-} - ($) = id - -#test inline pragma 3 -func = f - where - {-# INLINE CONLIKE [1] f #-} - f = id - -#test noinline pragma 1 -{-# NOINLINE func #-} -func :: Int - -#test inline pragma 4 -func = f - where - {-# INLINE [~1] f #-} - f = id - - -############################################################################### -############################################################################### -############################################################################### -#group data type declarations -############################################################################### -############################################################################### -############################################################################### - -#test nullary data type -data Foo = Bar {} - -data Biz = Baz - -#test single record -data Foo = Bar - { foo :: Baz - } - -#test record multiple names -data Foo = Bar - { foo, bar :: Baz - } - -#test record multiple types -data Foo = Bar - { foo :: Baz - , bars :: Bizzz - } - -#test record multiple types and names -data Foo = Bar - { foo, biz :: Baz - , bar :: Bizzz - } - -#test record multiple types deriving -data Foo = Bar - { fooz :: Baz - , bar :: Bizzz - } - deriving Show - -#test record long field names -data MyRecord = MyConstructor - { bar1, bar2 - :: Loooooooooooooooooooooooooooooooong - -> Loooooooooooooooooooooooooooooooong - , foo1, foo2 - :: Loooooooooooooooooooooooooooooooonger - -> Loooooooooooooooooooooooooooooooonger - } - -#test record with DataTypeContexts -{-# LANGUAGE DatatypeContexts #-} -data - ( LooooooooooooooooooooongConstraint a - , LooooooooooooooooooooongConstraint b - ) => - MyRecord a b - = MyConstructor - { foo1, foo2 - :: loooooooooooooooooooooooooooooooong - -> loooooooooooooooooooooooooooooooong - , bar :: a - , bazz :: b - } - -#test record single line layout -#pending config flag is disabled for now -{-# LANGUAGE ScopedTypeVariables #-} --- brittany { lconfig_allowSinglelineRecord: true } -data MyRecord = forall a . Show a => MyCons { foo :: a -> a, i :: Int } - -#test record no matching single line layout -{-# LANGUAGE ScopedTypeVariables #-} --- brittany { lconfig_allowSinglelineRecord: true } -data MyRecord = forall a . Show a => Bar - { foo :: abittoolongbutnotvery -> abittoolongbutnotvery - } - -#test record forall constraint multiline -{-# LANGUAGE ScopedTypeVariables #-} -data MyRecord - = forall a - . LooooooooooooooooooooongConstraint a => - LoooooooooooongConstructor - { foo :: abittoolongbutnotvery -> abittoolongbutnotvery - } - -#test record forall constraint multiline more -{-# LANGUAGE ScopedTypeVariables #-} -data MyRecord - = forall a b - . ( Loooooooooooooooooooooooooooooooong a - , Loooooooooooooooooooooooooooooooong b - ) => - MyConstructor - { a :: a - , b :: b - } - -#test plain with forall and constraint -{-# LANGUAGE ScopedTypeVariables #-} -data MyStruct - = forall a b - . ( Loooooooooooooooooooooooooooooooong a - , Loooooooooooooooooooooooooooooooong b - ) => - MyConstructor (ToBriDocM BriDocNumbered) - (ToBriDocM BriDocNumbered) - (ToBriDocM BriDocNumbered) - -#test record with many features -{-# LANGUAGE ScopedTypeVariables #-} -data MyRecord - = forall a b - . ( Loooooooooooooooooooooooooooooooong a - , Loooooooooooooooooooooooooooooooong b - ) => - MyConstructor - { foo, foo2 - :: loooooooooooooooooooooooooooooooong - -> loooooooooooooooooooooooooooooooong - , bar :: a - , bazz :: b - } - deriving Show - -#test record multiple types deriving -data Foo = Bar - { foo :: Baz - , bars :: Bizzz - } - deriving (Show, Eq, Monad, Functor, Traversable, Foldable) - -#test record multiple deriving strategies -data Foo = Bar - { foo :: Baz - , bars :: Bizzz - } - deriving Show - deriving (Eq, Ord) - deriving stock Show - deriving stock (Eq, Ord) - deriving anyclass Show - deriving anyclass (Show, Eq, Monad, Functor) - deriving newtype Show - deriving newtype (Traversable, Foldable) - -#test record deriving via -data Foo = Bar - { foo :: Baz - , bars :: Bizzz - } - deriving ToJSON via (SomeType) - deriving (ToJSON, FromJSON) via (SomeType) - -#test single record existential -{-# LANGUAGE ExistentialQuantification #-} - -data Foo = forall a . Show a => Bar - { foo :: a - } - -#test record multiple types existential -{-# LANGUAGE ExistentialQuantification #-} - -data Foo = forall a b . (Show a, Eq b) => Bar - { foo :: a - , bars :: b - } - -#test plain comment simple --- before -data MyData = MyData Int --- after - -#test record newline comment -data MyRecord = MyRecord - { a :: Int - -- comment - , b :: Int - } - -#test record comments simple -data Foo = Bar -- a - { foo :: Baz -- b - , bars :: Bizzz -- c - } -- d - deriving (Show, Eq, Monad, Functor, Traversable, Foldable) -- e - -#test record comments strange inline -data Foo = Bar - { -- a - foo -- b - :: -- c - Baz -- d - , -- e - bars :: Bizzz - } - deriving (Show, Eq, Monad, Functor, Traversable, Foldable) - -#test record comments in deriving -## maybe we want to switch to a differnt layout when there are such comments. -## Don't hesitate to modify this testcase, it clearly is not the ideal layout -## for this. - -data Foo = Bar - { foo :: Baz - , bars :: Bizzz - } - -- a - deriving --b - ( -- c - ToJSON -- d - , -- e - FromJSON --f - ) -- g - -#test record comments in deriving via -## maybe we want to switch to a differnt layout when there are such comments. -## Don't hesitate to modify this testcase, it clearly is not the ideal layout -## for this. - -data Foo = Bar - { foo :: Baz - , bars :: Bizzz - } - -- a - deriving --a - ToJSON --b - via -- c - ( -- d - SomeType --e - , -- f - ABC --g - ) - -#test comment before equal sign -{-# LANGUAGE ExistentialQuantification #-} -data MyRecord - -- test comment - = forall a b - . ( Loooooooooooooooooooooooooooooooong a - , Loooooooooooooooooooooooooooooooong b - ) => - MyConstructor a b - -#test normal records on multi line indent policy left --- brittany {lconfig_indentPolicy: IndentPolicyLeft } -data EnterpriseGrantsForCompanyResponse = EnterpriseGrantsForCompanyResponse - Types.Company - [EnterpriseGrantResponse] - -#test normal records on multi line indent policy free --- brittany {lconfig_indentPolicy: IndentPolicyFree } -data GrantsForCompanyResp = GrantsForCompanyResp Types.Company - [EnterpriseGrantResponse] - -#test normal records on multi line indent policy free 2 --- brittany {lconfig_indentPolicy: IndentPolicyFree } -data EnterpriseGrantsForCompanyResponse = EnterpriseGrantsForCompanyResponse - Types.Company - [EnterpriseGrantResponse] - -#test normal records on multi line indent policy multiple --- brittany {lconfig_indentPolicy: IndentPolicyMultiple } -data GrantsForCompanyResp = GrantsForCompanyResp Types.Company - [EnterpriseGrantResponse] - -#test large record with a comment -data XIILqcacwiuNiu = XIILqcacwiuNiu - { oyyFtvbepgbOge_pebzVmuftEijwuj :: Jgtoyuh HessJvNlo - , wloQsiskdoxJop_xatiKrwedOxtu :: Jgtoyuh [Inotg] - , mmmJjcqtemyIyo_ovosDoreKeeoyamvove :: Jgtoyuh Eujo - , mbiIatelofxOzr_uluxNngiiMjah :: Jgtoyuh HessJvNlo - , obxIskfcxpkIkb_uuviTuevcSkrgo :: Jgtoyuh Int - , wqrAtuvuecoHwr_ilotNxbuPleo :: Jgtoyuh Ufaxdeq - , lofAfuebdhpLuv_cnekPoyFxmg :: Jgtoyuh Ufaxdeq - , ouoFugtawzvUpk_oupiLzptugy :: Jgtoyuh Eujo - , iqiXjtziwogNsa_uiyvSunaTtgUsf3 :: Jgtoyuh Oaivn - , odbIriaqnojUlz_onotoWuunehIpuy :: Jgtoyuh Eujo - , opjUxtkxzkiKse_luqjuZazt - :: Jgtoyuh [(Eujo, Int, Int, Int, Int, Int, NELUxro)] - -- , jcqRaqznxfhIpa_ywevMezmoYkutuwa :: Jgtoyuh () - , vayOmuasyphOfd_bcsVljmvt :: Jgtoyuh Eujo - , rifArahilooRax_ufikecqdImsv :: Jgtoyuh Oaivn - , raqKtopcpszDwb_oqocubasZuqjcryoDojGkw :: Jgtoyuh Oaivn - , mluJiilpcijUtt_gaisklifVekfeyagRmfbyzz :: Jgtoyuh Oaivn - , oqhPaahjupaSmi_gamwwoovKyxznecvEayluc :: Jgtoyuh Oaivn - , mazFubimwebZpa_itidehDodiDlboz :: Jgtoyuh Vrep - , jeyOcuesexaYoy_vpqn :: Jgtoyuh () - } - -############################################################################### -############################################################################### -############################################################################### -#group equation.basic -############################################################################### -############################################################################### -############################################################################### -## some basic testing of different kinds of equations. -## some focus on column layouting for multiple-equation definitions. -## (that part probably is not implemented in any way yet.) - -#test basic 1 -func x = x - -#test infix 1 -x *** y = x - -#test symbol prefix -(***) x y = x - -#test infix more args simple -(f >=> g) k = f k >>= g - -#test infix more args alignment -(Left a <$$> Left dd) e f = True -(Left a <$$> Right d ) e f = True -(Right a <$$> Left d ) e f = False -(Right a <$$> Right dd) e f = True - - -############################################################################### -############################################################################### -############################################################################### -#group equation.patterns -############################################################################### -############################################################################### -############################################################################### - -#test wildcard -func _ = x - -#test simple long pattern -func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable = - x - -#test simple multiline pattern -func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable - = x - -#test another multiline pattern -func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable a b - = x - -#test simple constructor -func (A a) = a - -#test list constructor -func (x : xr) = x - -#test some other constructor symbol -func (x :+: xr) = x - -#test normal infix constructor -func (x `Foo` xr) = x - - -############################################################################### -############################################################################### -############################################################################### -#group equation.guards -############################################################################### -############################################################################### -############################################################################### -#test simple guard -func | True = x - -#test multiple-clauses-1 -func x | x = simple expression - | otherwise = 0 - -#test multiple-clauses-2 -func x - | a somewhat longer guard x = "and a somewhat longer expession that does not" - | otherwise = "fit without putting the guards in new lines" - -#test multiple-clauses-3 -func x - | very long guard, another rather long guard that refers to x = nontrivial - expression - foo - bar - alsdkjlasdjlasj - | otherwise = 0 - -#test multiple-clauses-4 -func x - | very long guard, another rather long guard that refers to x - = nontrivialexpression foo bar alsdkjlasdjlasj - | otherwise - = 0 - -#test multiple-clauses-5 -func x - | very loooooooooooooooooooooooooooooong guard - , another rather long guard that refers to x - = nontrivial expression foo bar alsdkjlasdjlasj - | otherwise - = 0 - - -############################################################################### -############################################################################### -############################################################################### -#group expression.basic -############################################################################### -############################################################################### -############################################################################### - -#test var -func = x - -describe "infix op" $ do -#test 1 -func = x + x - -#test long -func = - mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj - + mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj - -#test long keep linemode 1 -func = - mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj - + mweroiuxlskdfjlksj - + mweroiuxlskdfjlksj - -#test long keep linemode 2 -func = - mweroiuxlskdfjlksj - + mweroiuxlskdfjlksj - + mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj - -#test literals -func = 1 -func = "abc" -func = 1.1e5 -func = 'x' -func = 981409823458910394810928414192837123987123987123 - -#test lambda -func = \x -> abc - -describe "app" $ do -#test 1 -func = klajsdas klajsdas klajsdas - -#test 2 -func = lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd - lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd - lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd - -#test 3 -func = lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd lakjsdlajsdljas - lakjsdlajsdljas - lakjsdlajsdljas - -### -#group expression.basic.sections -### - -#test left -func = (1 +) - -#test right -func = (+ 1) - -#test left inf -func = (1 `abc`) - -#test right inf -func = (`abc` 1) - -### -#group tuples -### - -#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 -func = - ( lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd - , lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd - ) - -#test comment-after-then -foo = if True - then - -- iiiiii - "a " - else - "b " - -#test comment-after-if-else-do -func = if cond - then pure 42 - else do - -- test - abc - -#test nonempty-case-short -func = case x of - False -> False - True -> True - -#test nonempty-case-long -func = - case - lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd - lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd - of - False -> False - True -> True - -#test nonempty-case-long-do -func = do - case - lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd - lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd - of - False -> False - True -> True - -#test empty-case-short -func = case x of {} - -#test empty-case-long -func = - case - lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd - lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd - of {} - -#test empty-case-long-do -func = do - case - lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd - lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd - of {} - -############################################################################### -############################################################################### -############################################################################### -#group expression.do statements -############################################################################### -############################################################################### -############################################################################### - -#test simple -func = do - stmt - stmt - -#test bind -func = do - x <- stmt - stmt x - -#test let -func = do - let x = 13 - stmt x - - -############################################################################### -############################################################################### -############################################################################### -#group expression.lists -############################################################################### -############################################################################### -############################################################################### - -#test monad-comprehension-case-of -func = - foooooo - $ [ case - foooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo - of - _ -> True - ] - -############################################################################### -############################################################################### -############################################################################### -#group expression.let -############################################################################### -############################################################################### -############################################################################### - -#test single-bind-comment-long -testMethod foo bar baz qux = - let x = undefined foo bar baz qux qux baz bar :: String - -- some comment explaining the in expression - in undefined foo x :: String - -#test single-bind-comment-short -testMethod foo bar baz qux = - let x = undefined :: String - -- some comment explaining the in expression - in undefined :: String - -#test single-bind-comment-before -testMethod foo bar baz qux = - -- some comment explaining the in expression - let x = undefined :: String in undefined :: String - -#test multiple-binds-comment -foo foo bar baz qux = - let a = 1 - b = 2 - c = 3 - -- some comment explaining the in expression - in undefined :: String - - -############################################################################### -############################################################################### -############################################################################### -#group stylisticspecialcases -############################################################################### -############################################################################### -############################################################################### - -#test operatorprefixalignment-even-with-multiline-alignbreak -func = - foo - $ [ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - , bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb - ] - ++ [ccccccccccccccccccccccccccccccccccccccccccccccccccccccccc] - - -############################################################################### -############################################################################### -############################################################################### -#group module -############################################################################### -############################################################################### -############################################################################### - -#test simple -module Main where - -#test no-exports -module Main () where - -#test one-export -module Main (main) where - -#test several-exports -module Main (main, test1, test2) where - -#test many-exports -module Main - ( main - , test1 - , test2 - , test3 - , test4 - , test5 - , test6 - , test7 - , test8 - , test9 - ) where - -#test exports-with-comments -module Main - ( main - -- main - , test1 - , test2 - -- Test 3 - , test3 - , test4 - -- Test 5 - , test5 - -- Test 6 - ) where - -#test simple-export-with-things -module Main (Test(..)) where - -#test simple-export-with-module-contents -module Main (module Main) where - -#test export-with-things -module Main (Test(Test, a, b)) where - -#test export-with-things-comment --- comment1 - -module Main - ( Test(Test, a, b) - , foo -- comment2 - ) -- comment3 - where - -#test export-with-empty-thing -module Main (Test()) where - -#test empty-with-comment --- Intentionally left empty - -############################################################################### -############################################################################### -############################################################################### -#group module.import -############################################################################### -############################################################################### -############################################################################### - -#test simple-import -import Data.List - -#test simple-import-alias -import Data.List as L - -#test simple-qualified-import -import qualified Data.List - -#test simple-qualified-import-alias -import qualified Data.List as L - -#test simple-safe -import safe Data.List as L - -#test simple-source -import {-# SOURCE #-} Data.List ( ) - -#test simple-safe-qualified -import safe qualified Data.List - -#test simple-safe-qualified-source -import {-# SOURCE #-} safe qualified Data.List - -#test simple-qualified-package -import qualified "base" Data.List - -#test qualifier-effect -import {-# SOURCE #-} safe qualified "base" Data.List as L -import {-# SOURCE #-} safe qualified "base" Data.List ( ) -import {-# SOURCE #-} safe qualified Data.List hiding ( ) - -#test instances-only -import qualified Data.List ( ) - -#test one-element -import Data.List ( nub ) - -#test several-elements -import Data.List ( foldl' - , indexElem - , nub - ) - -#test a-ridiculous-amount-of-elements -import Test ( Long - , anymore - , fit - , items - , line - , list - , not - , onA - , quite - , single - , that - , will - , with - ) - -#test with-things -import Test ( (+) - , (:!)(..) - , (:*)((:.), T7, t7) - , (:.) - , T - , T2() - , T3(..) - , T4(T4) - , T5(T5, t5) - , T6((<|>)) - ) - -#test hiding -import Test hiding ( ) -import Test as T - hiding ( ) - -#test import-hiding-many -import Prelude as X - hiding ( head - , init - , last - , maximum - , minimum - , pred - , read - , readFile - , succ - , tail - , undefined - ) - -#test long-module-name-simple -import TestJustAbitToLongModuleNameLikeThisOneIs - ( ) -import TestJustShortEnoughModuleNameLikeThisOne ( ) - -#test long-module-name-as -import TestJustAbitToLongModuleNameLikeThisOneI - as T -import TestJustShortEnoughModuleNameLikeThisOn as T - -#test long-module-name-hiding -import TestJustAbitToLongModuleNameLikeTh - hiding ( ) -import TestJustShortEnoughModuleNameLike hiding ( ) - -#test long-module-name-simple-items -import MoreThanSufficientlyLongModuleNameWithSome - ( compact - , fit - , inA - , items - , layout - , not - , that - , will - ) - -#test long-module-name-hiding-items -import TestJustAbitToLongModuleNameLikeTh - hiding ( abc - , def - , ghci - , jklm - ) -import TestJustShortEnoughModuleNameLike hiding ( abc - , def - , ghci - , jklm - ) - -#test long-module-name-other -import {-# SOURCE #-} safe qualified "qualifier" A hiding ( ) -import {-# SOURCE #-} safe qualified "qualifiers" A - hiding ( ) -import {-# SOURCE #-} safe qualified "qualifiers" AlsoAf as T -import {-# SOURCE #-} safe qualified "qualifiers" AlsoAff ( ) -import {-# SOURCE #-} safe qualified "qualifiers" AlsoAff - as T -import {-# SOURCE #-} safe qualified "qualifiers" AlsoAffe - ( ) - -#test import-with-comments --- Test -import Data.List ( nub ) -- Test -{- Test -} -import qualified Data.List as L - ( foldl' ) {- Test -} - --- Test -import Test ( test ) - -#test import-with-comments-2 - -import Test ( abc - , def - -- comment - ) - -#test import-with-comments-3 - -import Test ( abc - -- comment - ) - -#test import-with-comments-4 -import Test ( abc - -- comment - , def - , ghi - {- comment -} - , jkl - -- comment - ) - -#test import-with-comments-5 -import Test ( -- comment - ) - -#test long-bindings -import Test ( longbindingNameThatoverflowsColum - ) -import Test ( Long - ( List - , Of - , Things - ) - ) - -#test things-with-with-comments -import Test ( Thing - ( -- Comments - ) - ) -import Test ( Thing - ( Item - -- and Comment - ) - ) -import Test ( Thing - ( With - -- Comments - , and - -- also - , items - -- ! - ) - ) -#test prefer-dense-empty-list -import VeryLongModuleNameThatCouldEvenCauseAnEmptyBindingListToExpandIntoMultipleLine - ( ) - -#test preamble full-preamble -{-# LANGUAGE BangPatterns #-} - -{- - - Test module - -} -module Test - ( test1 - -- ^ test - , test2 - -- | test - , test3 - , test4 - , test5 - , test6 - , test7 - , test8 - , test9 - , test10 - -- Test 10 - ) where - --- Test -import Data.List ( nub ) -- Test -{- Test -} -import qualified Data.List as L - ( foldl' ) {- Test -} - --- Test -import Test ( test ) - -#test sorted-imports -import Aaa -import Baa - -#test sorted-import-groups -import Zaa -import Zab - -import Aaa -import Baa - -#test sorted-qualified-imports -import Boo -import qualified Zoo - -#test imports-groups-same-module -import Boo ( a ) - -import Boo ( b ) - -#test sorted-imports-nested -import A.B.C -import A.B.D - -############################################################################### -############################################################################### -############################################################################### -#group type synonyms -############################################################################### -############################################################################### -############################################################################### - -#test simple-synonym - -type MySynonym = String - -#test parameterised-synonym - -type MySynonym a = [a] - -#test long-function-synonym - --- | Important comment thrown in -type MySynonym b a - = MySynonym a b -> MySynonym a b -> MyParamType a b -> MyParamType a b - -#test overflowing-function-synonym - -type MySynonym3 b a - = MySynonym a b - -> MySynonym a b - -- ^ RandomComment - -> MyParamType a b - -> MyParamType a b - -> MySynonym2 b a - -#test synonym-with-kind-sig - -{-# LANGUAGE StarIsType #-} - -type MySynonym (a :: * -> *) - = MySynonym a b - -> MySynonym a b - -> MyParamType a b - -> MyParamType a b - -> MySynonym2 b a - -#test synonym-with-constraint - -type MySynonym a = Num a => a -> Int - -#test synonym-overflowing-with-constraint - -type MySynonym a - = Num a - => AReallyLongTypeName - -> AnotherReallyLongTypeName - -> AThirdTypeNameToOverflow - -#test synonym-forall - -{-# LANGUAGE RankNTypes #-} - -type MySynonym = forall a . [a] - -#test synonym-operator - -type (:+:) a b = (a, b) - -#test synonym-infix - -type a `MySynonym` b = a -> b - -#test synonym-infix-operator - -type a :+: b = (a, b) - -#test synonym-infix-parens - -type (a `Foo` b) c = (a, b, c) - -#test synonym-comments - -type Foo a -- fancy type comment - = -- strange comment - Int - -#test synonym-type-operators -type (a :+: b) = (a, b) - -#test synonym-multi-parens -#pending loses extra parens - -type ((a :+: b) c) = (a, c) - -#test synonym-tuple-type-many-comments - -type Foo - = ( -- t1 - A -- t2 - , -- t3 - B -- t4 - ) -- t5 - -############################################################################### -############################################################################### -############################################################################### -#group class.instance -############################################################################### -############################################################################### -############################################################################### - -#test simple-instance - -instance MyClass Int where - myMethod x = x + 1 - -#test simple-method-comment - -instance MyClass Int where - myMethod x = - -- insightful comment - x + 1 - -#test simple-method-signature - -instance MyClass Int where - myMethod :: Int -> Int - myMethod x = x + 1 - -#test simple-long-method-signature - -instance MyClass Int where - myMethod - :: Int - -> Int - -> AReallyLongType - -> AReallyLongType - -> AReallyLongType - -> Int - myMethod x = x + 1 - -#test simple-two-methods - -instance MyClass Int where - myMethod x = x + 1 - myMethod2 x = x + 1 - -#test simple-two-signatures - -instance MyClass Int where - myMethod - :: Int - -> Int - -> AReallyLongType - -> AReallyLongType - -> AReallyLongType - -> Int - myMethod x = x + 1 - - myMethod2 :: Int -> Int - myMethod2 x = x + 1 - -#test simple-instance-comment - --- | This instance should be commented on -instance MyClass Int where - - -- | This method is also comment-worthy - myMethod x = x + 1 - -#test instance-with-type-family - -instance MyClass Int where - type MyType = Int - - myMethod :: MyType -> Int - myMethod x = x + 1 - -#test instance-with-type-family-below-method - -instance MyClass Int where - - type MyType = String - - myMethod :: MyType -> Int - myMethod x = x + 1 - - type MyType = Int - -#test instance-with-data-family - -instance MyClass Int where - - -- | This data is very important - data MyData = IntData - { intData :: String - , intData2 :: Int - } - - myMethod :: MyData -> Int - myMethod = intData2 - -#test instance-with-data-family-below-method - -instance MyClass Int where - -- | This data is important - data MyData = Test Int Int - - myMethod :: MyData -> Int - myMethod = intData2 - - -- | This data is also important - data MyData2 = IntData - { intData :: String - -- ^ Interesting field - , intData2 :: Int - } - -#test instance-with-newtype-family-and-deriving - -{-# LANGUAGE TypeFamilies #-} - -module Lib where - -instance Foo () where - newtype Bar () = Baz () - deriving (Eq, Ord, Show) - bar = Baz - -#test instance-with-newtype-family-and-record - -instance Foo Int where - newtype Bar Int = BarInt - { unBarInt :: Int - } - -############################################################################### -############################################################################### -############################################################################### -#group gh-357 -############################################################################### -############################################################################### -############################################################################### - -#test type-instance-without-comment - -{-# language TypeFamilies #-} -type family F a -type instance F Int = IO Int - -#test type-instance-with-comment - -{-# language TypeFamilies #-} -type family F a -type instance F Int = IO Int -- x - -#test type-instance-with-module-header - -{-# language TypeFamilies #-} -module M where -type family F a -type instance F Int = IO Int - -#test newtype-instance-without-comment - -{-# language TypeFamilies #-} -data family F a -newtype instance F Int = N Int - -#test newtype-instance-with-comment - -{-# language TypeFamilies #-} -data family F a -newtype instance F Int = N Int -- x - -#test newtype-instance-with-module-header - -{-# language TypeFamilies #-} -module M where -data family F a -newtype instance F Int = N Int - -#test data-instance-without-comment - -{-# language TypeFamilies #-} -data family F a -data instance F Int = D Int - -#test data-instance-with-comment - -{-# language TypeFamilies #-} -data family F a -data instance F Int = D Int -- x - -#test data-instance-with-module-header - -{-# language TypeFamilies #-} -module M where -data family F a -data instance F Int = D Int - -#test instance-type-without-comment - -{-# language TypeFamilies #-} -class C a where - type family F a -instance C Int where - type F Int = IO Int - -#test instance-type-with-comment - -{-# language TypeFamilies #-} -class C a where - type family F a -instance C Int where - type F Int = IO Int -- x - -#test instance-type-with-module-header - -{-# language TypeFamilies #-} -module M where -class C a where - type family F a -instance C Int where - type F Int = IO Int - -#test instance-newtype-without-comment - -{-# language TypeFamilies #-} -class C a where - data family F a -instance C Int where - newtype F Int = N Int - -#test instance-newtype-with-comment - -{-# language TypeFamilies #-} -class C a where - data family F a -instance C Int where - newtype F Int = N Int -- x - -#test instance-newtype-with-module-header - -{-# language TypeFamilies #-} -module M where -class C a where - data family F a -instance C Int where - newtype F Int = N Int - -#test instance-data-without-comment - -{-# language TypeFamilies #-} -class C a where - data family F a -instance C Int where - data F Int = D Int - -#test instance-data-with-comment - -{-# language TypeFamilies #-} -class C a where - data family F a -instance C Int where - data F Int = D Int -- x - -#test instance-data-with-module-header - -{-# language TypeFamilies #-} -module M where -class C a where - data family F a -instance C Int where - data F Int = D Int - -############################################################################### -############################################################################### -############################################################################### -#group whitespace-newlines -############################################################################### -############################################################################### -############################################################################### - -#test module-import-newlines - -module Main where - -import Prelude - -firstDecl = True - -#test function-where-newlines - -func = do - - -- complex first step - aaa - - -- complex second step - bbb - - where - - helper :: Helper - helper = helpful - - other :: Other - other = True - - -############################################################################### -############################################################################### -############################################################################### -#group typefam.instance -############################################################################### -############################################################################### -############################################################################### - -#test simple-typefam-instance - -type instance MyFam Bool = String - -#test simple-typefam-instance-param-type - -type instance MyFam (Maybe a) = a -> Bool - -#test simple-typefam-instance-parens -#pending the parens cause problems since ghc-8.8 - -type instance (MyFam (String -> Int)) = String - -#test simple-typefam-instance-overflow - -type instance MyFam ALongishType - = AMuchLongerTypeThanThat - -> AnEvenLongerTypeThanTheLastOne - -> ShouldDefinitelyOverflow - -#test simple-typefam-instance-comments - --- | A happy family -type instance MyFam Bool -- This is an odd one - = AnotherType -- Here's another - -#test simple-typefam-instance-parens-comment -#pending the parens cause problems since ghc-8.8 - --- | A happy family -type instance (MyFam Bool) -- This is an odd one - = -- Here's another - AnotherType diff --git a/data/14-extensions.blt b/data/14-extensions.blt deleted file mode 100644 index 18fc24f..0000000 --- a/data/14-extensions.blt +++ /dev/null @@ -1,241 +0,0 @@ -############################################################################### -############################################################################### -############################################################################### -#group extensions -############################################################################### -############################################################################### -############################################################################### - -############################################################################### -## MultiWayIf -#test multiwayif 1 -{-# LANGUAGE MultiWayIf #-} -func = if - | cond1 -> loooooooooooooooooooooooooooooong expr1 - | cond2 -> loooooooooooooooooooooooooooooong expr2 - -#test multiwayif 2 -{-# LANGUAGE MultiWayIf #-} -func = do - foo - bar $ if - | cond1 -> loooooooooooooooooooooooooooooong expr1 - | cond2 -> loooooooooooooooooooooooooooooong expr2 - - -############################################################################### -## LambdaCase -#test lambdacase 1 -{-# LANGUAGE LambdaCase #-} -func = \case - FooBar -> x - Baz -> y - - - -############################################################################### -## ImplicitParams -#test ImplicitParams 1 -{-# LANGUAGE ImplicitParams #-} -func :: (?asd::Int) -> () - -#test ImplicitParams 2 -{-# LANGUAGE ImplicitParams #-} -func - :: ( ?asd - :: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - ) - -> () - - -############################################################################### -## RecursiveDo -#test recursivedo 1 -{-# LANGUAGE RecursiveDo #-} -foo = do - rec a <- f b - b <- g a - return (a, b) - -#test recursivedo 2 -{-# LANGUAGE RecursiveDo #-} -foo = do - rec -- comment - a <- f b - b <- g a - return (a, b) - -############################################################################### -## ExplicitNamespaces + PatternSynonyms -#test explicitnamespaces_patternsynonyms export -{-# LANGUAGE ExplicitNamespaces #-} -{-# LANGUAGE PatternSynonyms #-} -module Test (type (++), (++), pattern Foo) where - -#test explicitnamespaces_patternsynonyms import -{-# LANGUAGE ExplicitNamespaces #-} -{-# LANGUAGE PatternSynonyms #-} -import Test ( type (++) - , (++) - , pattern (:.) - , pattern Foo - ) - -############################################################################### -## PatternSynonyms -#test bidirectional pattern -{-# LANGUAGE PatternSynonyms #-} -pattern J x = Just x - -#test unidirection pattern -{-# LANGUAGE PatternSynonyms #-} -pattern F x <- (x, _) - -#test explicitly bidirectional pattern -{-# LANGUAGE PatternSynonyms #-} -pattern HeadC x <- x : xs where - HeadC x = [x] - -#test Multiple arguments -{-# LANGUAGE PatternSynonyms #-} -pattern Head2 x y <- x : y : xs where - Head2 x y = [x, y] - -#test Infix argument -{-# LANGUAGE PatternSynonyms #-} -pattern x :> y = [x, y] - -#test Record argument -{-# LANGUAGE PatternSynonyms #-} -pattern MyData { a, b, c } = [a, b, c] - -#test long pattern match -{-# LANGUAGE PatternSynonyms #-} -pattern myLongLeftVariableName `MyLongInfixPatternMatcher` myLongRightVariableName = - [myLongLeftVariableName, myLongRightVariableName] - -#test long explicitly bidirectional match -{-# LANGUAGE PatternSynonyms #-} -pattern myLeftVariableName `MyInfixPatternMatcher` myRightVariableName <- - [myLongLeftVariableName, myLongRightVariableName] where - MyInfixPatternMatcher x y = [x, x, y] - -#test Pattern synonym types -{-# LANGUAGE PatternSynonyms #-} -pattern J :: a -> Maybe a -pattern J x = Just x - -#test pattern synonym bidirectional multiple cases -{-# LANGUAGE PatternSynonyms #-} -{-# LANGUAGE ViewPatterns #-} -pattern Signed x <- (asSigned -> x) where - Signed (Neg x) = -x - Signed Zero = 0 - Signed (Pos x) = x - -#test pattern synonym bidirectional multiple cases long -{-# LANGUAGE PatternSynonyms #-} -{-# LANGUAGE ViewPatterns #-} -pattern Signed xxxxxxxxxxxxxxxxxxxxxxxx <- - (asSigned -> xxxxxxxxxxxxxxxxxxxxxxxx) where - Signed (Neg x) = -x - Signed Zero = 0 - Signed (Pos x) = x - -#test pattern synonym bidirectional multiple cases with comments -{-# LANGUAGE PatternSynonyms #-} -{-# LANGUAGE ViewPatterns #-} -pattern Signed x <- (asSigned -> x) where - Signed (Neg x) = -x -- negative comment - Signed Zero = 0 -- zero comment - Signed (Pos x) = x -- positive comment - -#test Pattern synonym types multiple names -{-# LANGUAGE PatternSynonyms #-} -pattern J, K :: a -> Maybe a - -#test Pattern synonym type sig wrapped -{-# LANGUAGE PatternSynonyms #-} -pattern LongMatcher - :: longlongtypevar - -> longlongtypevar - -> longlongtypevar - -> Maybe [longlongtypevar] -pattern LongMatcher x y z = Just [x, y, z] - - -############################################################################### -## UnboxedTuples + MagicHash -#test unboxed-tuple and vanilla names -{-# LANGUAGE UnboxedTuples #-} -spanKey :: (# Int, Int #) -> (# Int, Int #) -spanKey = case foo of - (# bar, baz #) -> (# baz, bar #) - -#test unboxed-tuple and hashed name -{-# LANGUAGE MagicHash, UnboxedTuples #-} -spanKey :: (# Int#, Int# #) -> (# Int#, Int# #) -spanKey = case foo of - (# bar#, baz# #) -> (# baz# +# bar#, bar# #) - - -############################################################################### -## QuasiQuotes -#test quasi-quotes simple 1 -{-# LANGUAGE QuasiQuotes #-} -func = [blub| - asd - qwe - |] - -#test quasi-quotes simple 2 -{-# LANGUAGE QuasiQuotes #-} -func = [blub| - asd - qwe|] - -#test quasi-quotes ignoring layouting -{-# LANGUAGE QuasiQuotes #-} -func = do - let body = [json| - hello - |] - pure True - -#test quasi-quotes ignoring layouting, strict mode --- brittany { lconfig_allowHangingQuasiQuotes: False } -{-# LANGUAGE QuasiQuotes #-} -func = do - let - body = - [json| - hello - |] - pure True - -############################################################################### -## OverloadedLabels -#test bare label -{-# LANGUAGE OverloadedLabels #-} -foo = #bar - -#test applied and composed label -{-# LANGUAGE OverloadedLabels #-} -foo = #bar . #baz $ fmap #foo xs - -############################################################################### -## ImplicitParams - -#test IP usage -{-# LANGUAGE ImplicitParams #-} -foo = ?bar - -#test IP binding -{-# LANGUAGE ImplicitParams #-} -foo = let ?bar = Foo in value - -#test IP type signature -{-# LANGUAGE ImplicitParams #-} -foo :: (?bar::Bool) => () -foo = () diff --git a/data/15-regressions.blt b/data/15-regressions.blt deleted file mode 100644 index 9a6b623..0000000 --- a/data/15-regressions.blt +++ /dev/null @@ -1,874 +0,0 @@ -############################################################################### -############################################################################### -############################################################################### -#group regression -############################################################################### -############################################################################### -############################################################################### - -#test newlines-comment -func = do - abc <- foo - ---abc -return () - -#test parenthesis-around-unit -func = (()) - -#test let-defs indentation -func = do - let foo True = True - foo _ = False - return () - -#test record update indentation 1 -func = do - s <- mGet - mSet $ s { _lstate_indent = _lstate_indent state } - -#test record update indentation 2 -func = do - s <- mGet - mSet $ s { _lstate_indent = _lstate_indent state - , _lstate_foo = _lstate_foo state - } - -#test record update indentation 3 -func = do - s <- mGet - mSet $ s - { _lstate_indent = _lstate_indent lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - , _lstate_foo = _lstate_foo lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - } - -#test record construction 1 -func = Foo { _lstate_indent = _lstate_indent state } - -#test record construction 2 -func = Foo - { _lstate_indent = _lstate_indent lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - , _lstate_fooo = _lstate_foo lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - } - -#test record construction 3 -func = do - Foo { _lstate_indent = _lstate_indent lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - , _lstate_foo = _lstate_foo lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - } - -#test post-indent comment -func = do --- abc - -- def - return () - -#test post-unindent comment -func = do - do - return () - -- abc - -- def - return () - -#test CPP empty comment case -#pending CPP parsing needs fixing for roundTripEqual -{-# LANGUAGE CPP #-} -module Test where -func = do -#if FOO - let x = 13 -#endif - stmt x - -## really, the following should be handled by forcing the Alt to multiline -## because there are comments. as long as this is not implemented though, -## we should ensure the trivial solution works. -#test comment inline placement (temporary) -func - :: Int -- basic indentation amount - -> Int -- currently used width in current line (after indent) - -- used to accurately calc placing of the current-line - -> LayoutDesc - -> Int - -#test some indentation thingy -func = - ( lkjadljasldjalskdjaldjalsdjkalsdjlaksdjlasjdlajsaldskj - $ abc - $ def - $ ghi - $ jkl - ) - -#test parenthesized operator -buildG bounds0 edges0 = accumArray (flip (:)) [] bounds0 (map reassoc edges0) - where reassoc (v, e, w) = (v, (e, w)) - -#test record pattern matching stuff -downloadRepoPackage = case repo of - RepoLocal {..} -> return () - RepoLocal { abc } -> return () - RepoLocal{} -> return () - -#test do let comment indentation level problem -func = do - let (primaryPkg, otherPkgs) = selectPrimaryLocalPackage pwd pkgs' - (bproblems, x) = resolveBuildTargets primaryPkg otherPkgs utargets'' - -- default local dir target if there's no given target - utargets'' = "foo" - return () - -#test list comprehension comment placement -func = - [ (thing, take 10 alts) --TODO: select best ones - | (thing, _got, alts@(_ : _)) <- nosuchFooThing - , gast <- award - ] - -#test if-then-else comment placement -func = if x - then if y -- y is important - then foo - else bar - else Nothing - -#test qualified infix pattern -wrapPatPrepend pat prepElem = do - patDocs <- layoutPat pat - case Seq.viewl patDocs of - Seq.EmptyL -> return $ Seq.empty - x1 Seq.:< xR -> do - x1' <- docSeq [prepElem, return x1] - return $ x1' Seq.<| xR - -#test type signature multiline forcing issue -layoutWriteNewlineBlock - :: ( MonadMultiWriter Text.Builder.Builder m - , MonadMultiState LayoutState m - , MonadMultiWriter (Seq String) m - ) - => m () - -#test multiwayif proper indentation -{-# LANGUAGE MultiWayIf #-} -readMergePersConfig path shouldCreate conf = do - exists <- liftIO $ System.Directory.doesFileExist path - if - | exists -> do - contents <- liftIO $ ByteString.readFile path -- no lazy IO, tyvm. - fileConf <- case Data.Yaml.decodeEither contents of - Left e -> do - liftIO - $ putStrErrLn - $ "error reading in brittany config from " - ++ path - ++ ":" - liftIO $ putStrErrLn e - mzero - Right x -> return x - return $ fileConf Semigroup.<> conf - | shouldCreate -> do - liftIO $ ByteString.writeFile path $ Data.Yaml.encode $ cMap - (Option . Just . runIdentity) - staticDefaultConfig - return $ conf - | otherwise -> do - return conf - -#test nested pattern alignment issue" -func = BuildReport - where - convertInstallOutcome = case result of - Left BR.PlanningFailed -> PlanningFailed - Left (BR.DependentFailed p) -> DependencyFailed p - Left (BR.DownloadFailed _) -> DownloadFailed - Left (BR.UnpackFailed _) -> UnpackFailed - Left (BR.ConfigureFailed _) -> ConfigureFailed - Left (BR.BuildFailed _) -> BuildFailed - Left (BR.TestsFailed _) -> TestsFailed - Left (BR.InstallFailed _) -> InstallFailed - Right (BR.BuildOk _ _ _ ) -> InstallOk - -#test nested pattern alignment issue" -func = BuildReport - where - convertInstallOutcome = case result of - Left BR.PlanningFailed -> PlanningFailed - Left (BR.DependentFailed p) -> DependencyFailed p - Left (BR.DownloadFailed _) -> DownloadFailed - Left (BR.UnpackFailed _) -> UnpackFailed - Left (BR.ConfigureFailed _) -> ConfigureFailed - Left (BR.BuildFailed _) -> BuildFailed - Left (BR.TestsFailed _) -> TestsFailed - Left (BR.InstallFailed _) -> InstallFailed - Right (BR.BuildOk _ _ _ ) -> InstallOk - -#test partially overflowing alignment issue" -showPackageDetailedInfo pkginfo = - renderStyle (style { lineLength = 80, ribbonsPerLine = 1 }) - $ char '*' - $+$ something - [ entry "Synopsis" synopsis hideIfNull reflowParagraphs - , entry "Versions available" - sourceVersions - (altText null "[ Not available from server ]") - (dispTopVersions 9 (preferredVersions pkginfo)) - , entry - "Versions installed" - installedVersions - (altText - null - (if hasLib pkginfo then "[ Not installed ]" else "[ Unknown ]") - ) - (dispTopVersions 4 (preferredVersions pkginfo)) - , entry "Homepage" homepage orNotSpecified text - , entry "Bug reports" bugReports orNotSpecified text - , entry "Description" description hideIfNull reflowParagraphs - , entry "Category" category hideIfNull text - , entry "License" license alwaysShow disp - , entry "Author" author hideIfNull reflowLines - , entry "Maintainer" maintainer hideIfNull reflowLines - , entry "Source repo" sourceRepo orNotSpecified text - , entry "Executables" executables hideIfNull (commaSep text) - , entry "Flags" flags hideIfNull (commaSep dispFlag) - , entry "Dependencies" dependencies hideIfNull (commaSep dispExtDep) - , entry "Documentation" haddockHtml showIfInstalled text - , entry "Cached" haveTarball alwaysShow dispYesNo - , if not (hasLib pkginfo) - then empty - else text "Modules:" - $+$ nest 4 (vcat (map disp . sort . modules $ pkginfo)) - ] - -#test issue 7a -isValidPosition position | validX && validY = Just position - | otherwise = Nothing - -#test issue-6-pattern-linebreak-validity -## this is ugly, but at least syntactically valid. -foo = Reflex.runSpiderHost $ ReflexHost.hostApp $ do - (inputEvent :: Reflex.Event Reflex.Spider String, inputFire :: String - -> IO Bool ) <- - ReflexHost.newExternalEvent - liftIO . forkIO . forever $ getLine >>= inputFire - ReflexHost.performEvent_ $ fmap (liftIO . putStrLn) inputEvent - -#test issue 16 -foldrDesc f z = unSwitchQueue $ \q -> - switch (Min.foldrDesc (f unTaggedF) z q) (Min.foldrAsc (f unTaggedF) z q) - -#test issue 18 -autocheckCases = - [ ("Never Deadlocks" , representative deadlocksNever) - , ("No Exceptions" , representative exceptionsNever) - , ("Consistent Result", alwaysSame) -- already representative - ] - -#test issue 18b -autocheckCases = - [ ("Never Deadlocks", representative deadlocksNever) - , ("No Exceptions" , representative exceptionsNever) - , ( "Consistent Result" - , alwaysSame -- already representative - ) - ] - -#test issue 18c -func = - [ (abc, (1111, 1111)) - , (def, (2, 2)) - , foo -- comment - ] - -#test issue 26 -foo a b = g a b -- fooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo - where g a b = b + b * a - -#test issue 26b -foo a b = g a b where g a b = b + b * a -- fooooooooooooooooooooooooooooooooooo - -#test aggressive alignment 1 -func = do - abc <- expr - abcccccccccccccccccc <- expr - abcccccccccccccccccccccccccccccccccccccccccc <- expr - abccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc <- expr - -#test example alignment 1 -func (MyLongFoo abc def) = 1 -func (Bar a d ) = 2 -func _ = 3 - -#test listcomprehension-case-of -parserCompactLocation = - [ try - $ [ ParseRelAbs (Text.Read.read digits) _ _ - | digits <- many1 digit - , rel1 :: Maybe (Either Int (Ratio Int)) <- optionMaybe - [ case divPart of - Nothing -> Left $ Text.Read.read digits - Just ddigits -> - Right $ Text.Read.read digits % Text.Read.read ddigits - | digits <- many1 digit - , divPart <- optionMaybe (string "/" *> many1 digit) - ] - ] - ] - -#test opapp-specialcasing-1 -func = fooooooooooooooooooooooooooooooooo $ foooooooooooooooooooooooooooooooo - foooooooooooooooooooooooooooooooo - foooooooooooooooooooooooooooooooo - -#test opapp-specialcasing-2 -func = - fooooooooooooooooooooooooooooooooo - + foooooooooooooooooooooooooooooooo foooooooooooooooooooooooooooooooo - foooooooooooooooooooooooooooooooo - -#test opapp-specialcasing-3 -func = fooooooooooooooooooooooooooooooooo + foooooooooooooooooooooooooooooooo - [ foooooooooooooooooooooooooooooooo - , foooooooooooooooooooooooooooooooo - , foooooooooooooooooooooooooooooooo - ] - -#test opapp-indenting -parserPrim = - [ r - | r <- - [ SGPPrimFloat $ bool id (0 -) minus $ readGnok "parserPrim" - (d1 ++ d2 ++ d3 ++ d4) - | d2 <- string "." - , d3 <- many1 (oneOf "0123456789") - , _ <- string "f" - ] - <|> [ SGPPrimFloat $ bool id (0 -) minus $ fromIntegral - (readGnok "parserPrim" d1 :: Integer) - | _ <- string "f" - ] - <|> [ SGPPrimInt $ bool id (0 -) minus $ fromIntegral - (readGnok "parserPrim" d1 :: Integer) - | _ <- string "i" - ] - ] - -#test another-parspacing-testcase - -samples = (SV.unpackaaaaadat) <&> \f -> - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - -#test recordupd-singleline-bug - -runBrittany tabSize text = do - let config' = staticDefaultConfig - config = config' - { _conf_layout = (_conf_layout config') - { _lconfig_indentAmount = coerce tabSize - } - , _conf_forward = forwardOptionsSyntaxExtsEnabled - } - parsePrintModule config text - -#test recordupd-singleline-bug-left - --- brittany { lconfig_indentPolicy: IndentPolicyLeft } -runBrittany tabSize text = do - let - config' = staticDefaultConfig - config = config' - { _conf_layout = (_conf_layout config') - { _lconfig_indentAmount = coerce tabSize - } - , _conf_forward = forwardOptionsSyntaxExtsEnabled - } - parsePrintModule config text - -#test issue 37 - -foo = - ( a - , -- comment1 - b - -- comment2 - , c - ) - -#test issue 38 - -{-# LANGUAGE TypeApplications #-} -foo = bar @Baz - -#test comment-before-BDCols -{-# LANGUAGE TypeApplications #-} -layoutPatternBindFinal alignmentToken binderDoc mPatDoc clauseDocs = do - docAlt - $ -- one-line solution - [ docCols - (ColBindingLine alignmentToken) - [ docSeq (patPartInline ++ [guardPart]) - , docSeq - [ appSep $ return binderDoc - , docForceSingleline $ return body - , wherePart - ] - ] - | not hasComments - , [(guards, body, _bodyRaw)] <- [clauseDocs] - , let guardPart = singleLineGuardsDoc guards - , wherePart <- case mWhereDocs of - Nothing -> return @[] $ docEmpty - Just [w] -> return @[] $ docSeq - [ docSeparator - , appSep $ docLit $ Text.pack "where" - , docSetIndentLevel $ docForceSingleline $ return w - ] - _ -> [] - ] - ++ -- one-line solution + where in next line(s) - [ docLines - $ [ docCols - (ColBindingLine alignmentToken) - [ docSeq (patPartInline ++ [guardPart]) - , docSeq - [appSep $ return binderDoc, docForceParSpacing $ return body] - ] - ] - ++ wherePartMultiLine - | [(guards, body, _bodyRaw)] <- [clauseDocs] - , let guardPart = singleLineGuardsDoc guards - , Data.Maybe.isJust mWhereDocs - ] - ++ -- two-line solution + where in next line(s) - [ docLines - $ [ docForceSingleline - $ docSeq (patPartInline ++ [guardPart, return binderDoc]) - , docEnsureIndent BrIndentRegular $ docForceSingleline $ return - body - ] - ++ wherePartMultiLine - | [(guards, body, _bodyRaw)] <- [clauseDocs] - , let guardPart = singleLineGuardsDoc guards - ] - -#test comment-testcase-17 -{-# LANGUAGE MultiWayIf #-} -func = do - let foo = if - | Constuctoooooooooooooooooooooooooooooooooooor `elem` artics -- TODO - -> max - (defLen - 0.2) -- TODO - (defLen * 0.8) - | otherwise -> max (defLen - 0.05) (defLen * 0.95) -- TODO - return True - -#test issue 49 - -foo n = case n of - 1 -> True - -1 -> False - -bar n = case n of - (-2, -2) -> (-2, -2) - -#test issue 48 b - -{-# LANGUAGE TypeApplications #-} -foo = - let a = b @1 - cccc = () - in foo - -#test issue 52 a - -{-# LANGUAGE RecordWildCards #-} -v = A { a = 1, .. } where b = 2 - -#test issue 52 b - -{-# LANGUAGE RecordWildCards #-} -v = A { .. } where b = 2 - -#test issue 52 c - -{-# LANGUAGE RecordWildCards #-} -v = A { a = 1, b = 2, c = 3 } - -#test issue 63 a -test :: Proxy 'Int - -#test issue 63 b -test :: Proxy '[ 'True] - -#test issue 63 c -test :: Proxy '[Bool] - -#test issue 64 -{-# LANGUAGE RankNTypes, KindSignatures #-} -func - :: forall m str - . (Str str, Monad m) - => Int - -> Proxy (str :: [*]) - -> m (Tagged str String) - -#test issue 65 -widgetsDyn = - [ [ vBox - [ padTop Max outputLinesWidget - , padRight Max wid1 <+> flowWidget -- alignment here is strange/buggy - , padBottom (Pad 5) help - ] - ] - | wid1 <- promptDyn - , (flowWidget, _) <- flowResultD - , outputLinesWidget <- outputLinesWidgetD - , help <- suggestionHelpBox - , parser <- cmdParserD - ] - -#test issue 67 -fmapuv :: U.Unbox a => (a -> b) -> U.Vector a -> V.Vector b -fmapuv f xs = G.generate (G.length xs) (f . (xs G.!)) - - -#test parallellistcomp-workaround -cs0 = 0 : [ c / Interval n | c <- cs | n <- [1..] ] - -#test issue 70 -{-# LANGUAGE TemplateHaskell #-} -deriveFromJSON (unPrefix "assignPost") ''AssignmentPost - -#test issue 110 -main = -- a - let --b - x = 1 -- x - y = 2 -- y - in do - print x - print y - -#test issue 111 -alternatives :: Parser (Maybe Text) -alternatives = - alternativeOne -- first try this one - <|> alterantiveTwo -- then this one - <|> alternativeThree -- then this one - where - alternativeOne = purer "one" - alternativeTwo = purer "two" - alterantiveThree = purer "three" - -#test issue 116 -{-# LANGUAGE BangPatterns #-} -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) - -#test issue 125 -a :: () ':- () - -#test issue 128 -func = do - createDirectoryIfMissing True path - openFile fileName AppendMode - -#test hspar-comments - -alternatives :: Parser (Maybe Text) -alternatives = -- a - ( -- b - alternativeOne -- c - <|> alterantiveTwo -- d - <|> alternativeThree -- e - ) -- f - -#test issue 133 -{-# LANGUAGE ScopedTypeVariables #-} -func - :: forall a - . () - => aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -func - :: () - => aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - -#test alignment-potential-overflow -go l [] = Right l -go l ((IRType, _a) : eqr) = go l eqr -go l ((_, IRType) : eqr) = go l eqr -go _ ((IRTypeError ps t1 t2, _) : _) = Left $ makeError ps t1 t2 -go _ ((_, IRTypeError ps t1 t2) : _) = Left $ makeError ps t1 t2 - -#test issue 89 - type-family-instance -type instance XPure StageParse = () -type Pair a = (a, a) - -#test issue 144 --- brittany { lconfig_indentAmount: 4, lconfig_indentPolicy: IndentPolicyMultiple } -dsfnjKeekbwwbosbOfakxqRsiyix cnehokzozwbVaguvu migbnaRwutbz = - let - eyuAfrarIso' - :: (RveoexdxunuAafalm -> Axlau (Axlau (a, OinejrdCplle))) - -> Gbodoy - -> Axlau (Axlau OinejrdCplle, Gbodoy) - eyuAfrarIso' = ulcPaaekBst cnehokzozwbVaguvu - amkgoxEhalazJjxunecCuIfaw - :: Axlau (Axlau OinejrdCplle, Gbodoy) -> Axlau RqlnrluYqednbCiggxi - amkgoxEhalazJjxunecCuIfaw uKqviuBisjtn = do - (sEmo, quc) <- uKqviuBisjtn - pure (xoheccewfWoeyiagOkfodiq sEmo quc) - xoheccewfWoeyiagOkfodiq - :: Axlau OinejrdCplle -> Gbodoy -> RqlnrluYqednbCiggxi - xoheccewfWoeyiagOkfodiq sEmo quc = case migbnaRwutbz of - Afogmf -> xgeqe (OfBkkuih quc) (Ciitog quc) sEmo - in QabqyilexuiNizzhsQuxxac migbnaRwutbz (hwaTihhjt lhowvscIiozgqe) - -#test issue 159 -spec = do - it "creates a snapshot at the given level" . withGraph runDB $ do - lift $ do - studentDiagnosticReadingLevel updatedStudent `shouldBe` Just 10 -- x - elaSnapshotReadingLevel snapshot `shouldBe` 12 - -#test non-bottom-specialcase-altsearch -jaicyhHumzo btrKpeyiFej mava = do - m :: VtohxeRgpmgsu <- qloxIfiq mava - case m of - ZumnaoFujayerIswadabo kkecm chlixxag -> do - imomue <- ozisduRaqiseSBAob btrKpeyiFej $ \s -> - case MizA.pigevo kkecm (_tc_gulawulu s) of - Ebocaba -> - ( s { _tc_gulawulu = MizA.jxariu kkecm rwuRqxzhjo (_tc_gulawulu s) } - , Gtzvonm - ) - Xcde{} -> (s, Pioemav) - pure imomue - -#test issue 214 --- brittany { lconfig_indentPolicy: IndentPolicyMultiple } -foo = bar - arg1 -- this is the first argument - arg2 -- this is the second argument - arg3 -- this is the third argument, now I'll skip one comment - arg4 - arg5 -- this is the fifth argument - arg6 -- this is the sixth argument - -#test issue 234 - -True `nand` True = False -nand _ _ = True - -nor False False = True -_ `nor` _ = False - -#test issue 256 prefix operator match - -f ((:) a as) = undefined - -#test issue 228 lambda plus lazy or bang pattern - -{-# LANGUAGE BangPatterns #-} -a = \x -> x -b = \ ~x -> x -c = \ !x -> x -d = \(~x) -> x - -#test type signature with forall and constraint -{-# LANGUAGE RankNTypes #-} -func :: forall b . Show b => b -> String - -#test issue 267 - -{-# LANGUAGE TypeFamilies #-} -f :: ((~) a b) => a -> b -f = id - -#test large record update --- brittany { lconfig_indentPolicy: IndentPolicyLeft } -vakjkeSulxudbFokvir = Duotpo - { _ekku_gcrpbze = xgonae (1 :: Int) - , _oola_louwu = FoqsiYcuidx - { _xxagu_umea_iaztoj = xgonae False - , _tuktg_tizo_kfikacygsqf = xgonae False - , _ahzbo_xpow_otq_nzeyufq = xgonae False - , _uagpi_lzps_luy_xcjn = xgonae False - , _dxono_qjef_aqtafq_bes = xgonae False - , _yzuaf_nviy_vuhwxe_ihnbo_uhw = xgonae False - , _iwcit_fzjs_yerakt_dicox_mtryitko = xgonae False - , _ehjim_ucfe_dewarp_newrt_gso = xgonae False - , _ogtxb_ivoj_amqgai_rttui_xuwhetb = xgonae False - , _bhycb_iexz_megaug_qunoa_ohaked = xgonae False - , _nnmbe_uqgt_ewsuga_vaiis = xgonae False - , _otzil_ucvugaiyj_aosoiatunx_asir = xgonae False - } - , _iwsc_lalojz = XqspaiDainqw - { _uajznac_ugah = xgonae (80 :: Int) - , _qayziku_gazibzDejipj = xgonae DewizeCxwgyiKjig - , _auhebll_fiqjxyArfxia = xgonae (2 :: Int) - , _zubfuhq_dupiwnIoophXameeet = xgonae True - , _oavnuqg_opkreyOufuIkifiin = xgonae True - , _ufojfwy_fhuzcePeqwfu = xgonae (50 :: Int) - , _mlosikq_zajdxxSeRoelpf = xgonae (50 :: Int) - , _heemavf_fjgOfoaikh = xgonae (FyoVfvdygaZuzuvbeWarwuq 3) - , _ohxmeoq_ogtbfoPtqezVseu = xgonae (EdjotoLcbapUdiuMmytwoig 0.7) - , _omupuiu_ituamexjuLccwu = xgonae (30 :: Int) - , _xoseksf_atvwwdwaoHanofMyUvujjopoz = xgonae True - , _umuuuat_nuamezwWeqfUqzrnaxwp = xgonae False - , _uuriguz_wixhutbuKecigaFiwosret = xgonae True - , _betohxp_scixaLsvcesErtwItxrnaJmuz = xgonae False - , _lchxgee_olaetGcqzuqxVujenCzexub = xgonae True - , _egeibao_imamkuigqikhZdcbpidokVcixiqew = xgonae False - } - , _nloo_cfmrgZcisiugk = YuwodSavxwnicBekuel - { _oebew_rrtpvthUzlizjAqIwesly = xgonae False - , _blkff_Acxoid = xgonae False - , _datei_YewolAowoqOpunvpgu = xgonae BeekgUzojaPnixxaruJehyPmnnfu - , _ejfrj_eheb_justvh_pumcp_ismya = xgonae False - } - , _kena_uzeddovosoki = NyoRvshullezUpauud - { _mtfuwi_TUVEmoi = xgonae RZXKoytUtogx - , _larqam_adaxPehaylZafeqgpc = xgonae False - } - , _spob_qipaarx = KaxavsmOtoyeaq { _rusrirw_okx = Tajemkix [] } - , _vmah_uivucnfka_ikaquebxay_gzcm = xgonae False - , _qaqb_eykzuyuwi = xgonae False - -- test comment - } - -#test large record wildcard comment - --- brittany { lconfig_indentPolicy: IndentPolicyLeft } -vakjkeSulxudbFokvir = Duotpo - { _ekku_gcrpbze = xgonae (1 :: Int) - , _spob_qipaarx = KaxavsmOtoyeaq { _rusrirw_okx = Tajemkix [] } - , _vmah_uivucnfka_ikaquebxay_gzcm = xgonae False - , _qaqb_eykzuyuwi = xgonae False - -- test comment - , -- N.B. - .. -- x - } - -#test issue 263 - -func = abc + def - -- a - -- b - - -- comment - - where - abc = 13 - def = 1 - -#test AddBaseY/EnsureIndent float in effect - -zItazySunefp twgq nlyo lwojjoBiecao = - let mhIarjyai = - ukwAausnfcn - $ XojlsTOSR.vuwOvuvdAZUOJaa - $ XojlsTOSR.vkesForanLiufjeDI - $ XojlsTOSR.vkesForanLiufjeDI - $ XojlsTOSR.popjAyijoWarueeP - $ XojlsTOSR.jpwuPmafuDqlbkt nlyo - $ XojlsTOSR.jpwuPmafuDqlbkt xxneswWhxwng - $ XojlsTOSR.jpwuPmafuDqlbkt oloCuxeDdow - $ XojlsTOSR.jpwuPmafuDqlbkt (uwurrvoNnukzefuDjeh lwojjoBiecao nlyo) - $ etOslnoz lwojjoBiecao - in kucotg $ (bbbr, Yoxe.Dwzbuzi.zrLokoTnuy piv) - -#test module initial comment --- test -module MyModule where - -#test issue 231 - -foo = - [ ("xxx", "xx") - , -- - ("xx" , "xx") - -- - , ("xx" , "xxxxx") - , ("xx" , "xx") - ] - -#test issue 231 not - -foo = - [ ("xx", "xx") - , ( "xx" -- - , "xx" - ) - , ("xx", "xxxxx") - , ("xx", "xx") - ] - -#test issue 281 - -module Main - ( DataTypeI - , DataTypeII(DataConstructor) - -- * Haddock heading - , name - ) where - -#test type level list - -xeoeqibIaib - :: ( KqujhIsaus m - , XivuvIpoboi Droqifim m - , IgorvOtowtf m - , RyagaYaqac m - , QouruDU m - ) - => MaptAdfuxgu - -> Zcnxg NsxayqmvIjsezea -- ^ if Lvqucoo, opsip jl reyoyhk lfil qaculxgd - -> QNOZqwuzg - -> Eoattuq - '[ XkatytdWdquraosu -- test comment - , KyezKijim -- another test comment - , DjmioeePuoeg - , NinrxoiOwezc - , QATAlrijacpk - , TrutvotwIwifiqOjdtu - , CoMmuatjwr - , BoZckzqyodseZole - , VagfwoXaeChfqe - ] - m - () - -#test recordupd-overflow-bad-multiline-spacing - -createRedirectedProcess processConfig = do - let redirectedProc = (_processConfig_inner processConfig) - { std_in = CreatePipe - , std_out = CreatePipe - , std_err = CreatePipe - } - foo - -#test issue 282 - -instance HasDependencies SomeDataModel where - -- N.B. Here is a bunch of explanatory context about the relationship - -- between these data models or whatever. - type Dependencies SomeDataModel - = (SomeOtherDataModelId, SomeOtherOtherDataModelId) - -#test stupid-do-operator-combination - -func = - do - y - >>= x diff --git a/data/16-pending.blt b/data/16-pending.blt deleted file mode 100644 index c8147d8..0000000 --- a/data/16-pending.blt +++ /dev/null @@ -1,35 +0,0 @@ -############################################################################### -############################################################################### -############################################################################### -#group pending -############################################################################### -############################################################################### -############################################################################### - - - -## this testcase is not about idempotency, but about _how_ the output differs -## from the input; i cannot really express this yet with the current -## test-suite. -## #test ayaz -## -## myManageHook = -## composeOne [isFullscreen -?> doFullFloat, isDialog -?> doFloat, transience] -## <+> composeAll -## [ className =? "Pidgin" --> doFloat -## , className =? "XCalc" --> doFloat -## -- plan9port's acme -## , className =? "acme" --> doFloat -## -- Acme with Vi bindings editor -## , title =? "ED" --> doFloat -## , title =? "wlc-x11" --> doFloat -## , className =? "Skype" --> doFloat -## , className =? "ffplay" --> doFloat -## , className =? "mpv" --> doFloat -## , className =? "Plugin-container" --> doFloat -- Firefox flash, etc. -## -- Firefox works well tiled, but it has dialog windows we want to float. -## , appName =? "Browser" --> doFloat -## ] -## where -## role = stringProperty "WM_WINDOW_ROLE" - diff --git a/data/30-tests-context-free.blt b/data/30-tests-context-free.blt deleted file mode 100644 index d73e6d4..0000000 --- a/data/30-tests-context-free.blt +++ /dev/null @@ -1,1461 +0,0 @@ - -############################################################################### -############################################################################### -############################################################################### -#group type signatures -############################################################################### -############################################################################### -############################################################################### - -#test simple001 -func :: a -> a - -#test long typeVar -func - :: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -#test keep linebreak mode -func - :: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -> lakjsdlkjasldkj - -> lakjsdlkjasldkj - -#test simple parens 1 -func :: ((a)) - -#test simple parens 2 -func :: (a -> a) -> a - -#test simple parens 3 -func :: a -> (a -> a) - -#test did anyone say parentheses? -func :: (((((((((()))))))))) - --- current output is.. funny. wonder if that can/needs to be improved.. -#test give me more! -#pending nested tuples over line length -func :: ((((((((((((((((((((((((((((((((((((((((((())))))))))))))))))))))))))))))))))))))))))) - -#test unit -func :: () - - -############################################################################### - -#test paren'd func 1 -func - :: ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -> lakjsdlkjasldkj - -> lakjsdlkjasldkj - ) - -#test paren'd func 2 -func - :: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -> (lakjsdlkjasldkj -> lakjsdlkjasldkj) - -#test paren'd func 3 -func - :: (lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd -> lakjsdlkjasldkj) - -> lakjsdlkjasldkj - -#test paren'd func 4 -func - :: ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - ) - -> lakjsdlkjasldkj - -#test paren'd func 5 -func - :: ( ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - ) - ) - -############################################################################### - -#test type application 1 -func :: asd -> Either a b - -#test type application 2 -func - :: asd - -> Either - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -#test type application 3 -func - :: asd - -> Trither - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -#test type application 4 -func - :: Trither - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -> asd - -#test type application 5 -func - :: Trither - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - (lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd -> asd) - -#test type application 6 -func - :: Trither - asd - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - ) - -#test type application paren 1 -func - :: asd - -> ( Trither - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - ) - -#test type application paren 2 -func - :: asd - -> ( Trither - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - ) - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -#test type application paren 3 -func - :: ( Trither - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - ) - lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -> asd - -############################################################################### - -#test list simple -func :: [a -> b] - -#test list func -func - :: [ lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - ] - -#test list paren -func - :: [ ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - ) - ] - -################################################################## -- ############# - -#test tuple type 1 -func :: (a, b, c) - -#test tuple type 2 -func :: ((a, b, c), (a, b, c), (a, b, c)) - -#test tuple type long -func - :: ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - , lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - , lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - ) - -#test tuple type nested -func - :: ( ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - , (lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd) - , lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - ) - ) - -#test tuple type function -func - :: [ ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - , lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - , lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - ) - ] -############################################################################### -#test type operator stuff -#pending HsOpTy -test050 :: a :+: b -test051 - :: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - :+: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd -test052 - :: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - :+: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -############################################################################### - -#test forall oneliner -{-# LANGUAGE ScopedTypeVariables #-} -func :: forall (a :: *) b . a -> b - -#test forall context multiline -{-# LANGUAGE ScopedTypeVariables #-} -func - :: forall m - . Foo - => ColMap2 - -> ColInfo - -> ColInfo - -> ColInfo - -> ColInfo - -> m () - -#test forall no-context multiline -{-# LANGUAGE ScopedTypeVariables #-} -func - :: forall m - . ColMap2 - -> ColInfo - -> ColInfo - -> ColInfo - -> ColInfo - -> ColInfo - -> m () - -#test language pragma issue -{-# LANGUAGE ScopedTypeVariables #-} -func :: forall (a :: *) b . a -> b - -#test comments 1 -func :: a -> b -- comment - -#test comments 2 -funcA :: a -> b -- comment A -funcB :: a -> b -- comment B - -#test comments all --- a -func -- b - :: -- c - a -- d - -> -- e - ( -- f - c -- g - , -- h - d -- i - ) -- j-- k - -############################################################################### - -#test ImplicitParams 1 -{-# LANGUAGE ImplicitParams #-} -func :: (?asd::Int) -> () - -#test ImplicitParams 2 -{-# LANGUAGE ImplicitParams #-} -func - :: ( ?asd - :: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - ) - -> () - - -############################################################################### -############################################################################### -############################################################################### -#group type signatures pragmas -############################################################################### -############################################################################### -############################################################################### - -#test inline pragma 1 -func = f - where - {-# INLINE f #-} - f = id - -#test inline pragma 2 -func = ($) - where - {-# INLINE ($) #-} - ($) = id - -#test inline pragma 3 -func = f - where - {-# INLINE CONLIKE [1] f #-} - f = id - -#test inline pragma 4 -func = f - where - {-# INLINE [~1] f #-} - f = id - - -############################################################################### -############################################################################### -############################################################################### -#group data type declarations -############################################################################### -############################################################################### -############################################################################### - -#test single record -data Foo = Bar - { foo :: Baz - } - -#test record multiple names -data Foo = Bar - { foo, bar :: Baz - } - -#test record multiple types -data Foo = Bar - { foo :: Baz - , bar :: Bizzz - } - -#test record multiple types and names -data Foo = Bar - { foo, biz :: Baz - , bar :: Bizzz - } - -#test record multiple types deriving -data Foo = Bar - { foo :: Baz - , bar :: Bizzz - } - deriving Show - -#test record multiple types deriving -data Foo = Bar - { foo :: Baz - , bar :: Bizzz - } - deriving (Show, Eq, Monad, Functor, Traversable, Foldable) - - -############################################################################### -############################################################################### -############################################################################### -#group equation.basic -############################################################################### -############################################################################### -############################################################################### -## some basic testing of different kinds of equations. -## some focus on column layouting for multiple-equation definitions. -## (that part probably is not implemented in any way yet.) - -#test basic 1 -func x = x - -#test infix 1 -x *** y = x - -#test symbol prefix -(***) x y = x - - -############################################################################### -############################################################################### -############################################################################### -#group equation.patterns -############################################################################### -############################################################################### -############################################################################### - -#test wildcard -func _ = x - -#test simple long pattern -func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable = - x - -#test simple multiline pattern -func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable - = x - -#test another multiline pattern -func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable a b - = x - -#test simple constructor -func (A a) = a - -#test list constructor -func (x : xr) = x - -#test some other constructor symbol -func (x :+: xr) = x - - -############################################################################### -############################################################################### -############################################################################### -#group equation.guards -############################################################################### -############################################################################### -############################################################################### -#test simple guard -func | True = x - -#test multiple-clauses-1 -func x - | x = simple expression - | otherwise = 0 - -#test multiple-clauses-2 -func x - | a somewhat longer guard x = "and a somewhat longer expession that does not" - | otherwise = "fit without putting the guards in new lines" - -#test multiple-clauses-3 -func x - | very long guard, another rather long guard that refers to x = nontrivial - expression - foo - bar - alsdkjlasdjlasj - | otherwise = 0 - -#test multiple-clauses-4 -func x - | very long guard, another rather long guard that refers to x - = nontrivialexpression foo bar alsdkjlasdjlasj - | otherwise - = 0 - -#test multiple-clauses-5 -func x - | very loooooooooooooooooooooooooooooong guard - , another rather long guard that refers to x - = nontrivial expression foo bar alsdkjlasdjlasj - | otherwise - = 0 - - -############################################################################### -############################################################################### -############################################################################### -#group expression.basic -############################################################################### -############################################################################### -############################################################################### - -#test var -func = x - -describe "infix op" $ do -#test 1 -func = x + x - -#test long -func = - mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj - + mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj - -#test long keep linemode 1 -func = - mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj - + mweroiuxlskdfjlksj - + mweroiuxlskdfjlksj - -#test long keep linemode 2 -func = - mweroiuxlskdfjlksj - + mweroiuxlskdfjlksj - + mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj - -#test literals -func = 1 -func = "abc" -func = 1.1e5 -func = 'x' -func = 981409823458910394810928414192837123987123987123 - -#test lambdacase -{-# LANGUAGE LambdaCase #-} -func = \case - FooBar -> x - Baz -> y - -#test lambda -func = \x -> abc - -describe "app" $ do -#test 1 -func = klajsdas klajsdas klajsdas - -#test 2 -func = lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd - lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd - lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd - -#test 3 -func = lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd - lakjsdlajsdljas - lakjsdlajsdljas - lakjsdlajsdljas - -### -#group expression.basic.sections -### - -#test left -func = (1 +) - -#test right -func = (+ 1) - -#test left inf -## TODO: this could be improved.. -func = (1 `abc`) - -#test right inf -func = (`abc` 1) - -### -#group tuples -### - -#test 1 -func = (abc, def) - -#test 2 -func = - ( lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd - , lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd - ) - -#test let in on single line -foo = - let longIdentifierForShortValue = 1 - in longIdentifierForShortValue + longIdentifierForShortValue - - - -############################################################################### -############################################################################### -############################################################################### -#group expression.do statements -############################################################################### -############################################################################### -############################################################################### - -#test simple -func = do - stmt - stmt - -#test bind -func = do - x <- stmt - stmt x - -#test let -func = do - let x = 13 - stmt x - - -############################################################################### -############################################################################### -############################################################################### -#group expression.lists -############################################################################### -############################################################################### -############################################################################### - -#test monad-comprehension-case-of -func = - foooooo - $ [ case - foooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo - of - _ -> True - ] - - -############################################################################### -############################################################################### -############################################################################### -#group expression.multiwayif -############################################################################### -############################################################################### -############################################################################### - -#test simple -{-# LANGUAGE MultiWayIf #-} -func = if - | cond1 -> loooooooooooooooooooooooooooooong expr1 - | cond2 -> loooooooooooooooooooooooooooooong expr2 - -#test simplenested -{-# LANGUAGE MultiWayIf #-} -func = do - foo - bar $ if - | cond1 -> loooooooooooooooooooooooooooooong expr1 - | cond2 -> loooooooooooooooooooooooooooooong expr2 - - -############################################################################### -############################################################################### -############################################################################### -#group stylisticspecialcases -############################################################################### -############################################################################### -############################################################################### - -#test operatorprefixalignment-even-with-multiline-alignbreak -func = - foo - $ [ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - , bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb - ] - ++ [ccccccccccccccccccccccccccccccccccccccccccccccccccccccccc] - -############################################################################### -############################################################################### -############################################################################### -#group module -############################################################################### -############################################################################### -############################################################################### - -#test simple -module Main where - -#test no-exports -module Main () where - -#test one-export -module Main (main) where - -#test several-exports -module Main (main, test1, test2) where - -#test many-exports -module Main - ( main - , test1 - , test2 - , test3 - , test4 - , test5 - , test6 - , test7 - , test8 - , test9 - ) where - -#test exports-with-comments -module Main - ( main - -- main - , test1 - , test2 - -- Test 3 - , test3 - , test4 - -- Test 5 - , test5 - -- Test 6 - ) where - -#test simple-export-with-things -module Main (Test(..)) where - -#test simple-export-with-module-contents -module Main (module Main) where - -#test export-with-things -module Main (Test(Test, a, b)) where - -#test export-with-empty-thing -module Main (Test()) where - -#test empty-with-comment --- Intentionally left empty - -############################################################################### -############################################################################### -############################################################################### -#group import -############################################################################### -############################################################################### -############################################################################### - -#test simple-import -import Data.List - -#test simple-import-alias -import Data.List as L - -#test simple-qualified-import -import qualified Data.List - -#test simple-qualified-import-alias -import qualified Data.List as L - -#test simple-safe -import safe Data.List as L - -#test simple-source -import {-# SOURCE #-} Data.List () - -#test simple-safe-qualified -import safe qualified Data.List hiding (nub) - -#test simple-safe-qualified-source -import {-# SOURCE #-} safe qualified Data.List - -#test simple-qualified-package -import qualified "base" Data.List - -#test qualifier-effect -import {-# SOURCE #-} safe qualified "base" Data.List as L -import {-# SOURCE #-} safe qualified "base" Data.List () -import {-# SOURCE #-} safe qualified Data.List hiding () - -#test instances-only -import qualified Data.List () - -#test one-element -import Data.List (nub) - -#test several-elements -import Data.List (foldl', indexElem, nub) - -#test a-ridiculous-amount-of-elements -import Test - ( Long - , anymore - , fit - , items - , line - , list - , not - , onA - , quite - , single - , that - , will - , with - ) - -#test with-things -import Test ((+), T, T2(), T3(..), T4(T4), T5(T5, t5), T6((<|>))) - -#test hiding -import Test hiding () -import Test as T hiding () - -#test import-hiding-many -import Prelude as X - hiding - ( head - , init - , last - , maximum - , minimum - , pred - , read - , readFile - , succ - , tail - , undefined - ) - -#test long-module-name-simple -import MoreThanSufficientlyLongModuleNameWithSome - (compact, fit, inA, items, layout, not, that, will) -import TestJustAbitToLongModuleNameLikeThisOneIs () -import TestJustShortEnoughModuleNameLikeThisOne () - -#test long-module-name-as -import TestJustAbitToLongModuleNameLikeThisOneI as T -import TestJustShortEnoughModuleNameLikeThisOn as T - -#test long-module-name-hiding -import TestJustAbitToLongModuleNameLikeTh hiding () -import TestJustShortEnoughModuleNameLike hiding () - -#test long-module-name-simple-items -import MoreThanSufficientlyLongModuleNameWithSome - (compact, fit, inA, items, layout, not, that, will) - -#test long-module-name-hiding-items -import TestJustShortEnoughModuleNameLike hiding (abc, def, ghci, jklm) - -#test import-with-comments --- Test -import Data.List (nub) -- Test -{- Test -} -import qualified Data.List as L (foldl') {- Test -} - -#test import-with-comments-2 - -import Test - ( abc - , def - -- comment - ) - -#test import-with-comments-3 - -import Test - ( abc - -- comment - ) - -#test import-with-comments-4 -import Test - ( abc - -- comment - , def - , ghi - {- comment -} - , jkl - -- comment - ) - --- Test -import Test (test) - -#test import-with-comments-5 -import Test - ( -- comment - ) - -#test long-bindings -import Test (longbindingNameThatoverflowsColum) -import Test (Long(List, Of, Things)) - -#test things-with-with-comments -import Test - ( Thing - ( With - -- Comments - , and - -- also - , items - -- ! - ) - ) -import Test - ( Thing - ( Item - -- and Comment - ) - ) -import Test - ( Thing - ( With - -- Comments - , and - -- also - , items - -- ! - ) - ) - -#test prefer-dense-empty-list -import VeryLongModuleNameThatCouldEvenCauseAnEmptyBindingListToExpandIntoMultipleLine - () - -#test preamble full-preamble -{-# LANGUAGE BangPatterns #-} - -{- - - Test module - -} -module Test - ( test1 - -- ^ test - , test2 - -- | test - , test3 - , test4 - , test5 - , test6 - , test7 - , test8 - , test9 - , test10 - ) where - --- Test -import Data.List (nub) -- Test -{- Test -} -import qualified Data.List as L (foldl') {- Test -} - --- Test -import Test (test) - -############################################################################### -############################################################################### -############################################################################### -#group regression -############################################################################### -############################################################################### -############################################################################### - -#test newlines-comment -func = do - abc <- foo - ---abc -return () - -#test parenthesis-around-unit -func = (()) - -#test let-defs indentation -func = do - let - foo True = True - foo _ = False - return () - -#test let-defs no indent -func = do - let - foo True = True - foo _ = False - return () - -#test let-defs no indent -func = do - let - foo = True - b = False - return () - -#test let-defs no indent -func = - let - foo = True - b = False - in return () - -#test record update indentation 1 -func = do - s <- mGet - mSet $ s { _lstate_indent = _lstate_indent state } - -#test record update indentation 2 -func = do - s <- mGet - mSet $ s - { _lstate_indent = _lstate_indent state - , _lstate_foo = _lstate_foo state - } - -#test record update indentation 3 -func = do - s <- mGet - mSet $ s - { _lstate_indent = _lstate_indent lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - , _lstate_foo = _lstate_foo kasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - } - -#test record construction 1 -func = Foo { _lstate_indent = _lstate_indent state } - -#test record construction 2 -func = Foo - { _lstate_indent = _lstate_indent lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - , _lstate_foo = _lstate_foo lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - } - -#test record construction 3 -func = do - Foo - { _lstate_indent = _lstate_indent lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - , _lstate_foo = _lstate_foo lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd - } - -#test post-indent comment -func = do --- abc - -- def - return () - -#test post-unindent comment -func = do - do - return () - -- abc - -- def - return () - -#test CPP empty comment case -#pending CPP parsing needs fixing for roundTripEqual -{-# LANGUAGE CPP #-} -module Test where -func = do -#if FOO - let x = 13 -#endif - stmt x - -## really, the following should be handled by forcing the Alt to multiline -## because there are comments. as long as this is not implemented though, -## we should ensure the trivial solution works. -#test comment inline placement (temporary) -func - :: Int -- basic indentation amount - -> Int -- currently used width in current line (after indent) - -- used to accurately calc placing of the current-line - -> LayoutDesc - -> Int - -#test some indentation thingy -func = - (lkjadljasldjalskdjaldjalsdjkalsdjlaksdjlasjdlajsaldskj - $ abc - $ def - $ ghi - $ jkl - ) - -#test parenthesized operator -buildG bounds0 edges0 = accumArray (flip (:)) [] bounds0 (map reassoc edges0) - where reassoc (v, e, w) = (v, (e, w)) - -#test record pattern matching stuff -downloadRepoPackage = case repo of - RepoLocal {..} -> return () - RepoLocal { abc } -> return () - RepoLocal{} -> return () - -#test do let comment indentation level problem -func = do - let - (primaryPkg, otherPkgs) = selectPrimaryLocalPackage pwd pkgs' - (bproblems, x) = resolveBuildTargets primaryPkg otherPkgs utargets'' - -- default local dir target if there's no given target - utargets'' = "foo" - return () - -#test list comprehension comment placement -func = - [ (thing, take 10 alts) --TODO: select best ones - | (thing, _got, alts@(_ : _)) <- nosuchFooThing - , gast <- award - ] - -#test if-then-else comment placement -func = if x - then if y -- y is important - then foo - else bar - else Nothing - -#test qualified infix pattern -wrapPatPrepend pat prepElem = do - patDocs <- layoutPat pat - case Seq.viewl patDocs of - Seq.EmptyL -> return $ Seq.empty - x1 Seq.:< xR -> do - x1' <- docSeq [prepElem, return x1] - return $ x1' Seq.<| xR - -#test type signature multiline forcing issue -layoutWriteNewlineBlock - :: ( MonadMultiWriter Text.Builder.Builder m - , MonadMultiState LayoutState m - , MonadMultiWriter (Seq String) m - ) - => m () - -#test multiwayif proper indentation -{-# LANGUAGE MultiWayIf #-} -readMergePersConfig path shouldCreate conf = do - exists <- liftIO $ System.Directory.doesFileExist path - if - | exists -> do - contents <- liftIO $ ByteString.readFile path -- no lazy IO, tyvm. - fileConf <- case Data.Yaml.decodeEither contents of - Left e -> do - liftIO - $ putStrErrLn - $ "error reading in brittany config from " - ++ path - ++ ":" - liftIO $ putStrErrLn e - mzero - Right x -> return x - return $ fileConf Semigroup.<> conf - | shouldCreate -> do - liftIO $ ByteString.writeFile path $ Data.Yaml.encode $ cMap - (Option . Just . runIdentity) - staticDefaultConfig - return $ conf - | otherwise -> do - return conf - -#test nested pattern alignment issue" -func = BuildReport - where - convertInstallOutcome = case result of - Left BR.PlanningFailed -> PlanningFailed - Left (BR.DependentFailed p) -> DependencyFailed p - Left (BR.DownloadFailed _) -> DownloadFailed - Left (BR.UnpackFailed _) -> UnpackFailed - Left (BR.ConfigureFailed _) -> ConfigureFailed - Left (BR.BuildFailed _) -> BuildFailed - Left (BR.TestsFailed _) -> TestsFailed - Left (BR.InstallFailed _) -> InstallFailed - Right (BR.BuildOk _ _ _) -> InstallOk - -#test nested pattern alignment issue" -func = BuildReport - where - convertInstallOutcome = case result of - Left BR.PlanningFailed -> PlanningFailed - Left (BR.DependentFailed p) -> DependencyFailed p - Left (BR.DownloadFailed _) -> DownloadFailed - Left (BR.UnpackFailed _) -> UnpackFailed - Left (BR.ConfigureFailed _) -> ConfigureFailed - Left (BR.BuildFailed _) -> BuildFailed - Left (BR.TestsFailed _) -> TestsFailed - Left (BR.InstallFailed _) -> InstallFailed - Right (BR.BuildOk _ _ _) -> InstallOk - -#test partially overflowing alignment issue" -showPackageDetailedInfo pkginfo = - renderStyle (style { lineLength = 80, ribbonsPerLine = 1 }) - $ char '*' - $+$ something - [ entry "Synopsis" synopsis hideIfNull reflowParagraphs - , entry - "Versions available" - sourceVersions - (altText null "[ Not available from server ]") - (dispTopVersions 9 (preferredVersions pkginfo)) - , entry - "Versions installed" - installedVersions - (altText - null - (if hasLib pkginfo then "[ Not installed ]" else "[ Unknown ]") - ) - (dispTopVersions 4 (preferredVersions pkginfo)) - , entry "Homepage" homepage orNotSpecified text - , entry "Bug reports" bugReports orNotSpecified text - , entry "Description" description hideIfNull reflowParagraphs - , entry "Category" category hideIfNull text - , entry "License" license alwaysShow disp - , entry "Author" author hideIfNull reflowLines - , entry "Maintainer" maintainer hideIfNull reflowLines - , entry "Source repo" sourceRepo orNotSpecified text - , entry "Executables" executables hideIfNull (commaSep text) - , entry "Flags" flags hideIfNull (commaSep dispFlag) - , entry "Dependencies" dependencies hideIfNull (commaSep dispExtDep) - , entry "Documentation" haddockHtml showIfInstalled text - , entry "Cached" haveTarball alwaysShow dispYesNo - , if not (hasLib pkginfo) - then empty - else text "Modules:" - $+$ nest 4 (vcat (map disp . sort . modules $ pkginfo)) - ] - -#test issue 7a -isValidPosition position - | validX && validY = Just position - | otherwise = Nothing - -#test issue-6-pattern-linebreak-validity -## this is ugly, but at least syntactically valid. -foo = Reflex.runSpiderHost $ ReflexHost.hostApp $ do - (inputEvent :: Reflex.Event Reflex.Spider String, inputFire :: String - -> IO Bool) <- - ReflexHost.newExternalEvent - liftIO . forkIO . forever $ getLine >>= inputFire - ReflexHost.performEvent_ $ fmap (liftIO . putStrLn) inputEvent - -#test issue 15 --- Test.hs -module Test where - -data X = X - -#test issue 16 -foldrDesc f z = unSwitchQueue $ \q -> - switch (Min.foldrDesc (f unTaggedF) z q) (Min.foldrAsc (f unTaggedF) z q) - -#test issue 18 -autocheckCases = - [ ("Never Deadlocks", representative deadlocksNever) - , ("No Exceptions", representative exceptionsNever) - , ("Consistent Result", alwaysSame) -- already representative - ] - -#test issue 18b -autocheckCases = - [ ("Never Deadlocks", representative deadlocksNever) - , ("No Exceptions", representative exceptionsNever) - , ( "Consistent Result" - , alwaysSame -- already representative - ) - ] - -#test issue 18c -func = - [ (abc, (1111, 1111)) - , (def, (2, 2)) - , foo -- comment - ] - -#test issue 26 -foo a b = g a b -- fooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo - where g a b = b + b * a - -#test issue 26b -foo a b = g a b where g a b = b + b * a -- fooooooooooooooooooooooooooooooooooo - -#test aggressive alignment 1 -func = do - abc <- expr - abcccccccccccccccccc <- expr - abcccccccccccccccccccccccccccccccccccccccccc <- expr - abccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc <- expr - -#test example alignment 1 -func (MyLongFoo abc def) = 1 -func (Bar a d) = 2 -func _ = 3 - -#test listcomprehension-case-of -parserCompactLocation = - [ try - $ [ ParseRelAbs (Text.Read.read digits) _ _ - | digits <- many1 digit - , rel1 :: Maybe (Either Int (Ratio Int)) <- optionMaybe - [ case divPart of - Nothing -> Left $ Text.Read.read digits - Just ddigits -> - Right $ Text.Read.read digits % Text.Read.read ddigits - | digits <- many1 digit - , divPart <- optionMaybe (string "/" *> many1 digit) - ] - ] - ] - -#test opapp-specialcasing-1 -func = fooooooooooooooooooooooooooooooooo $ foooooooooooooooooooooooooooooooo - foooooooooooooooooooooooooooooooo - foooooooooooooooooooooooooooooooo - -#test opapp-specialcasing-2 -func = - fooooooooooooooooooooooooooooooooo - + foooooooooooooooooooooooooooooooo - foooooooooooooooooooooooooooooooo - foooooooooooooooooooooooooooooooo - -#test opapp-specialcasing-3 -func = fooooooooooooooooooooooooooooooooo + foooooooooooooooooooooooooooooooo - [ foooooooooooooooooooooooooooooooo - , foooooooooooooooooooooooooooooooo - , foooooooooooooooooooooooooooooooo - ] - -#test opapp-indenting -parserPrim = - [ r - | r <- - [ SGPPrimFloat $ bool id (0 -) minus $ readGnok - "parserPrim" - (d1 ++ d2 ++ d3 ++ d4) - | d2 <- string "." - , d3 <- many1 (oneOf "0123456789") - , _ <- string "f" - ] - <|> [ SGPPrimFloat $ bool id (0 -) minus $ fromIntegral - (readGnok "parserPrim" d1 :: Integer) - | _ <- string "f" - ] - <|> [ SGPPrimInt $ bool id (0 -) minus $ fromIntegral - (readGnok "parserPrim" d1 :: Integer) - | _ <- string "i" - ] - ] - -#test another-parspacing-testcase - -samples = (SV.unpackaaaaadat) <&> \f -> - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - -#test recordupd-singleline-bug - -runBrittany tabSize text = do - let - config' = staticDefaultConfig - config = config' - { _conf_layout = (_conf_layout config') - { _lconfig_indentAmount = coerce tabSize - } - , _conf_forward = forwardOptionsSyntaxExtsEnabled - } - parsePrintModule config text - -#test issue 38 - -{-# LANGUAGE TypeApplications #-} -foo = bar @Baz - -#test comment-before-BDCols -{-# LANGUAGE TypeApplications #-} -layoutPatternBindFinal alignmentToken binderDoc mPatDoc clauseDocs = do - docAlt - $ -- one-line solution - [ docCols - (ColBindingLine alignmentToken) - [ docSeq (patPartInline ++ [guardPart]) - , docSeq - [ appSep $ return binderDoc - , docForceSingleline $ return body - , wherePart - ] - ] - | not hasComments - , [(guards, body, _bodyRaw)] <- [clauseDocs] - , let guardPart = singleLineGuardsDoc guards - , wherePart <- case mWhereDocs of - Nothing -> return @[] $ docEmpty - Just [w] -> return @[] $ docSeq - [ docSeparator - , appSep $ docLit $ Text.pack "where" - , docSetIndentLevel $ docForceSingleline $ return w - ] - _ -> [] - ] - ++ -- one-line solution + where in next line(s) - [ docLines - $ [ docCols - (ColBindingLine alignmentToken) - [ docSeq (patPartInline ++ [guardPart]) - , docSeq - [appSep $ return binderDoc, docForceParSpacing $ return body] - ] - ] - ++ wherePartMultiLine - | [(guards, body, _bodyRaw)] <- [clauseDocs] - , let guardPart = singleLineGuardsDoc guards - , Data.Maybe.isJust mWhereDocs - ] - ++ -- two-line solution + where in next line(s) - [ docLines - $ [ docForceSingleline - $ docSeq (patPartInline ++ [guardPart, return binderDoc]) - , docEnsureIndent BrIndentRegular $ docForceSingleline $ return - body - ] - ++ wherePartMultiLine - | [(guards, body, _bodyRaw)] <- [clauseDocs] - , let guardPart = singleLineGuardsDoc guards - ] - -#test comment-testcase-17 -{-# LANGUAGE MultiWayIf #-} -func = do - let - foo = if - | Constuctoooooooooooooooooooooooooooooooooooor `elem` artics -- TODO - -> max - (defLen - 0.2) -- TODO - (defLen * 0.8) - | otherwise -> max (defLen - 0.05) (defLen * 0.95) -- TODO - return True - -#test issue 49 - -foo n = case n of - 1 -> True - -1 -> False - -bar n = case n of - (-2, -2) -> (-2, -2) - -#test issue 48 b - -{-# LANGUAGE TypeApplications #-} -foo = - let - a = b @1 - cccc = () - in foo - -#test issue 176 - -record :: Record -record = Record - { rProperties = - [ "foo" .= "bar" - , "foo" .= "bar" - , "foo" .= "bar" - , "foo" .= "bar" - , "foo" .= "bar" - , "foo" .= "bar" - , "foo" .= "bar" - , "foo" .= "bar" - ] - } - - -############################################################################### -############################################################################### -############################################################################### -#group pending -############################################################################### -############################################################################### -############################################################################### - - - -## this testcase is not about idempotency, but about _how_ the output differs -## from the input; i cannot really express this yet with the current -## test-suite. -## #test ayaz -## -## myManageHook = -## composeOne [isFullscreen -?> doFullFloat, isDialog -?> doFloat, transience] -## <+> composeAll -## [ className =? "Pidgin" --> doFloat -## , className =? "XCalc" --> doFloat -## -- plan9port's acme -## , className =? "acme" --> doFloat -## -- Acme with Vi bindings editor -## , title =? "ED" --> doFloat -## , title =? "wlc-x11" --> doFloat -## , className =? "Skype" --> doFloat -## , className =? "ffplay" --> doFloat -## , className =? "mpv" --> doFloat -## , className =? "Plugin-container" --> doFloat -- Firefox flash, etc. -## -- Firefox works well tiled, but it has dialog windows we want to float. -## , appName =? "Browser" --> doFloat -## ] -## where -## role = stringProperty "WM_WINDOW_ROLE" diff --git a/data/40-indent-policy-multiple.blt b/data/40-indent-policy-multiple.blt deleted file mode 100644 index b75c726..0000000 --- a/data/40-indent-policy-multiple.blt +++ /dev/null @@ -1,42 +0,0 @@ -############################################################################### -############################################################################### -############################################################################### -#group indent-policy-multiple -############################################################################### -############################################################################### -############################################################################### - -#test long --- brittany { lconfig_indentAmount: 4, lconfig_indentPolicy: IndentPolicyMultiple } -func = - mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj - + mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj - -#test let indAmount=4 --- brittany { lconfig_indentAmount: 4, lconfig_indentPolicy: IndentPolicyMultiple } -foo = do - let aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - foo - -#test let indAmount=8 --- brittany { lconfig_indentAmount: 8, lconfig_indentPolicy: IndentPolicyMultiple } -foo = do - let aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - foo -foo = do - let aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - foo - -#test nested do-block --- brittany { lconfig_indentAmount: 4, lconfig_indentPolicy: IndentPolicyMultiple } -foo = asdyf8asdf - "ajsdfas" - [ asjdf asyhf $ do - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - ] diff --git a/data/Test1.hs b/data/Test1.hs new file mode 100644 index 0000000..44e6262 --- /dev/null +++ b/data/Test1.hs @@ -0,0 +1 @@ +func :: a -> a diff --git a/data/Test10.hs b/data/Test10.hs new file mode 100644 index 0000000..f1b8e0d --- /dev/null +++ b/data/Test10.hs @@ -0,0 +1,3 @@ +func + :: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + -> (lakjsdlkjasldkj -> lakjsdlkjasldkj) diff --git a/data/Test100.hs b/data/Test100.hs new file mode 100644 index 0000000..f6643c0 --- /dev/null +++ b/data/Test100.hs @@ -0,0 +1 @@ +func = klajsdas klajsdas klajsdas diff --git a/data/Test101.hs b/data/Test101.hs new file mode 100644 index 0000000..57bac0e --- /dev/null +++ b/data/Test101.hs @@ -0,0 +1,3 @@ +func = lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd + lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd + lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd diff --git a/data/Test102.hs b/data/Test102.hs new file mode 100644 index 0000000..b361b53 --- /dev/null +++ b/data/Test102.hs @@ -0,0 +1,3 @@ +func = lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd lakjsdlajsdljas + lakjsdlajsdljas + lakjsdlajsdljas diff --git a/data/Test103.hs b/data/Test103.hs new file mode 100644 index 0000000..2b2b052 --- /dev/null +++ b/data/Test103.hs @@ -0,0 +1 @@ +func = (1 +) diff --git a/data/Test104.hs b/data/Test104.hs new file mode 100644 index 0000000..e8f99be --- /dev/null +++ b/data/Test104.hs @@ -0,0 +1 @@ +func = (+ 1) diff --git a/data/Test105.hs b/data/Test105.hs new file mode 100644 index 0000000..699ead3 --- /dev/null +++ b/data/Test105.hs @@ -0,0 +1 @@ +func = (1 `abc`) diff --git a/data/Test106.hs b/data/Test106.hs new file mode 100644 index 0000000..ccaa551 --- /dev/null +++ b/data/Test106.hs @@ -0,0 +1 @@ +func = (`abc` 1) diff --git a/data/Test107.hs b/data/Test107.hs new file mode 100644 index 0000000..99b30ec --- /dev/null +++ b/data/Test107.hs @@ -0,0 +1 @@ +func = (abc, def) diff --git a/data/Test108.hs b/data/Test108.hs new file mode 100644 index 0000000..90f6d90 --- /dev/null +++ b/data/Test108.hs @@ -0,0 +1 @@ +func = (abc, ) diff --git a/data/Test109.hs b/data/Test109.hs new file mode 100644 index 0000000..973aed0 --- /dev/null +++ b/data/Test109.hs @@ -0,0 +1 @@ +func = (, abc) diff --git a/data/Test11.hs b/data/Test11.hs new file mode 100644 index 0000000..25670eb --- /dev/null +++ b/data/Test11.hs @@ -0,0 +1,3 @@ +func + :: (lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd -> lakjsdlkjasldkj) + -> lakjsdlkjasldkj diff --git a/data/Test110.hs b/data/Test110.hs new file mode 100644 index 0000000..78d0c01 --- /dev/null +++ b/data/Test110.hs @@ -0,0 +1,6 @@ +myTupleSection = + ( verylaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaargefirstelement + , + , verylaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaargethirdelement + , + ) diff --git a/data/Test111.hs b/data/Test111.hs new file mode 100644 index 0000000..87acbec --- /dev/null +++ b/data/Test111.hs @@ -0,0 +1,4 @@ +func = + ( lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd + , lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd + ) diff --git a/data/Test112.hs b/data/Test112.hs new file mode 100644 index 0000000..daf62d6 --- /dev/null +++ b/data/Test112.hs @@ -0,0 +1,6 @@ +foo = if True + then + -- iiiiii + "a " + else + "b " diff --git a/data/Test113.hs b/data/Test113.hs new file mode 100644 index 0000000..26bb39d --- /dev/null +++ b/data/Test113.hs @@ -0,0 +1,5 @@ +func = if cond + then pure 42 + else do + -- test + abc diff --git a/data/Test114.hs b/data/Test114.hs new file mode 100644 index 0000000..ea9f935 --- /dev/null +++ b/data/Test114.hs @@ -0,0 +1,3 @@ +func = case x of + False -> False + True -> True diff --git a/data/Test115.hs b/data/Test115.hs new file mode 100644 index 0000000..eb88667 --- /dev/null +++ b/data/Test115.hs @@ -0,0 +1,7 @@ +func = + case + lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd + lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd + of + False -> False + True -> True diff --git a/data/Test116.hs b/data/Test116.hs new file mode 100644 index 0000000..5d7739c --- /dev/null +++ b/data/Test116.hs @@ -0,0 +1,7 @@ +func = do + case + lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd + lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd + of + False -> False + True -> True diff --git a/data/Test117.hs b/data/Test117.hs new file mode 100644 index 0000000..43e6130 --- /dev/null +++ b/data/Test117.hs @@ -0,0 +1 @@ +func = case x of {} diff --git a/data/Test118.hs b/data/Test118.hs new file mode 100644 index 0000000..85c98c6 --- /dev/null +++ b/data/Test118.hs @@ -0,0 +1,5 @@ +func = + case + lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd + lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd + of {} diff --git a/data/Test119.hs b/data/Test119.hs new file mode 100644 index 0000000..195201e --- /dev/null +++ b/data/Test119.hs @@ -0,0 +1,5 @@ +func = do + case + lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd + lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd + of {} diff --git a/data/Test12.hs b/data/Test12.hs new file mode 100644 index 0000000..fa012f7 --- /dev/null +++ b/data/Test12.hs @@ -0,0 +1,5 @@ +func + :: ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + ) + -> lakjsdlkjasldkj diff --git a/data/Test120.hs b/data/Test120.hs new file mode 100644 index 0000000..5bbd0e6 --- /dev/null +++ b/data/Test120.hs @@ -0,0 +1,3 @@ +func = do + stmt + stmt diff --git a/data/Test121.hs b/data/Test121.hs new file mode 100644 index 0000000..aa47dfd --- /dev/null +++ b/data/Test121.hs @@ -0,0 +1,3 @@ +func = do + x <- stmt + stmt x diff --git a/data/Test122.hs b/data/Test122.hs new file mode 100644 index 0000000..589d354 --- /dev/null +++ b/data/Test122.hs @@ -0,0 +1,3 @@ +func = do + let x = 13 + stmt x diff --git a/data/Test123.hs b/data/Test123.hs new file mode 100644 index 0000000..6319013 --- /dev/null +++ b/data/Test123.hs @@ -0,0 +1,7 @@ +func = + foooooo + $ [ case + foooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo + of + _ -> True + ] diff --git a/data/Test124.hs b/data/Test124.hs new file mode 100644 index 0000000..1164c0f --- /dev/null +++ b/data/Test124.hs @@ -0,0 +1,4 @@ +testMethod foo bar baz qux = + let x = undefined foo bar baz qux qux baz bar :: String + -- some comment explaining the in expression + in undefined foo x :: String diff --git a/data/Test125.hs b/data/Test125.hs new file mode 100644 index 0000000..e711480 --- /dev/null +++ b/data/Test125.hs @@ -0,0 +1,4 @@ +testMethod foo bar baz qux = + let x = undefined :: String + -- some comment explaining the in expression + in undefined :: String diff --git a/data/Test126.hs b/data/Test126.hs new file mode 100644 index 0000000..e0c379a --- /dev/null +++ b/data/Test126.hs @@ -0,0 +1,3 @@ +testMethod foo bar baz qux = + -- some comment explaining the in expression + let x = undefined :: String in undefined :: String diff --git a/data/Test127.hs b/data/Test127.hs new file mode 100644 index 0000000..e446394 --- /dev/null +++ b/data/Test127.hs @@ -0,0 +1,6 @@ +foo foo bar baz qux = + let a = 1 + b = 2 + c = 3 + -- some comment explaining the in expression + in undefined :: String diff --git a/data/Test128.hs b/data/Test128.hs new file mode 100644 index 0000000..8e3a783 --- /dev/null +++ b/data/Test128.hs @@ -0,0 +1,6 @@ +func = + foo + $ [ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + , bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb + ] + ++ [ccccccccccccccccccccccccccccccccccccccccccccccccccccccccc] diff --git a/data/Test129.hs b/data/Test129.hs new file mode 100644 index 0000000..6ca9a1f --- /dev/null +++ b/data/Test129.hs @@ -0,0 +1 @@ +module Main where diff --git a/data/Test13.hs b/data/Test13.hs new file mode 100644 index 0000000..68e8e9e --- /dev/null +++ b/data/Test13.hs @@ -0,0 +1,5 @@ +func + :: ( ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + ) + ) diff --git a/data/Test130.hs b/data/Test130.hs new file mode 100644 index 0000000..43a1fee --- /dev/null +++ b/data/Test130.hs @@ -0,0 +1 @@ +module Main () where diff --git a/data/Test131.hs b/data/Test131.hs new file mode 100644 index 0000000..0fdcb21 --- /dev/null +++ b/data/Test131.hs @@ -0,0 +1 @@ +module Main (main) where diff --git a/data/Test132.hs b/data/Test132.hs new file mode 100644 index 0000000..1998fe9 --- /dev/null +++ b/data/Test132.hs @@ -0,0 +1 @@ +module Main (main, test1, test2) where diff --git a/data/Test133.hs b/data/Test133.hs new file mode 100644 index 0000000..20fd443 --- /dev/null +++ b/data/Test133.hs @@ -0,0 +1,12 @@ +module Main + ( main + , test1 + , test2 + , test3 + , test4 + , test5 + , test6 + , test7 + , test8 + , test9 + ) where diff --git a/data/Test134.hs b/data/Test134.hs new file mode 100644 index 0000000..20ea610 --- /dev/null +++ b/data/Test134.hs @@ -0,0 +1,12 @@ +module Main + ( main + -- main + , test1 + , test2 + -- Test 3 + , test3 + , test4 + -- Test 5 + , test5 + -- Test 6 + ) where diff --git a/data/Test135.hs b/data/Test135.hs new file mode 100644 index 0000000..6d7b8eb --- /dev/null +++ b/data/Test135.hs @@ -0,0 +1 @@ +module Main (Test(..)) where diff --git a/data/Test136.hs b/data/Test136.hs new file mode 100644 index 0000000..e06cbfc --- /dev/null +++ b/data/Test136.hs @@ -0,0 +1 @@ +module Main (module Main) where diff --git a/data/Test137.hs b/data/Test137.hs new file mode 100644 index 0000000..5f1af50 --- /dev/null +++ b/data/Test137.hs @@ -0,0 +1 @@ +module Main (Test(Test, a, b)) where diff --git a/data/Test138.hs b/data/Test138.hs new file mode 100644 index 0000000..b436099 --- /dev/null +++ b/data/Test138.hs @@ -0,0 +1,6 @@ +-- comment1 +module Main + ( Test(Test, a, b) + , foo -- comment2 + ) -- comment3 + where diff --git a/data/Test139.hs b/data/Test139.hs new file mode 100644 index 0000000..6fd114e --- /dev/null +++ b/data/Test139.hs @@ -0,0 +1 @@ +module Main (Test()) where diff --git a/data/Test14.hs b/data/Test14.hs new file mode 100644 index 0000000..05b4cb6 --- /dev/null +++ b/data/Test14.hs @@ -0,0 +1 @@ +func :: asd -> Either a b diff --git a/data/Test140.hs b/data/Test140.hs new file mode 100644 index 0000000..6d7a6ef --- /dev/null +++ b/data/Test140.hs @@ -0,0 +1 @@ +-- Intentionally left empty diff --git a/data/Test141.hs b/data/Test141.hs new file mode 100644 index 0000000..a053bb5 --- /dev/null +++ b/data/Test141.hs @@ -0,0 +1 @@ +import Data.List diff --git a/data/Test142.hs b/data/Test142.hs new file mode 100644 index 0000000..1bc9f03 --- /dev/null +++ b/data/Test142.hs @@ -0,0 +1 @@ +import Data.List as L diff --git a/data/Test143.hs b/data/Test143.hs new file mode 100644 index 0000000..691c0c1 --- /dev/null +++ b/data/Test143.hs @@ -0,0 +1 @@ +import qualified Data.List diff --git a/data/Test144.hs b/data/Test144.hs new file mode 100644 index 0000000..b64f22f --- /dev/null +++ b/data/Test144.hs @@ -0,0 +1 @@ +import qualified Data.List as L diff --git a/data/Test145.hs b/data/Test145.hs new file mode 100644 index 0000000..020afa7 --- /dev/null +++ b/data/Test145.hs @@ -0,0 +1 @@ +import safe Data.List as L diff --git a/data/Test146.hs b/data/Test146.hs new file mode 100644 index 0000000..cad516e --- /dev/null +++ b/data/Test146.hs @@ -0,0 +1 @@ +import {-# SOURCE #-} Data.List ( ) diff --git a/data/Test147.hs b/data/Test147.hs new file mode 100644 index 0000000..42148e0 --- /dev/null +++ b/data/Test147.hs @@ -0,0 +1 @@ +import safe qualified Data.List diff --git a/data/Test148.hs b/data/Test148.hs new file mode 100644 index 0000000..dd2c6b9 --- /dev/null +++ b/data/Test148.hs @@ -0,0 +1 @@ +import {-# SOURCE #-} safe qualified Data.List diff --git a/data/Test149.hs b/data/Test149.hs new file mode 100644 index 0000000..650a6ad --- /dev/null +++ b/data/Test149.hs @@ -0,0 +1 @@ +import qualified "base" Data.List diff --git a/data/Test15.hs b/data/Test15.hs new file mode 100644 index 0000000..668dca4 --- /dev/null +++ b/data/Test15.hs @@ -0,0 +1,5 @@ +func + :: asd + -> Either + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd diff --git a/data/Test150.hs b/data/Test150.hs new file mode 100644 index 0000000..0c30830 --- /dev/null +++ b/data/Test150.hs @@ -0,0 +1,3 @@ +import {-# SOURCE #-} safe qualified "base" Data.List as L +import {-# SOURCE #-} safe qualified "base" Data.List ( ) +import {-# SOURCE #-} safe qualified Data.List hiding ( ) diff --git a/data/Test151.hs b/data/Test151.hs new file mode 100644 index 0000000..992b081 --- /dev/null +++ b/data/Test151.hs @@ -0,0 +1 @@ +import qualified Data.List ( ) diff --git a/data/Test152.hs b/data/Test152.hs new file mode 100644 index 0000000..631bb4c --- /dev/null +++ b/data/Test152.hs @@ -0,0 +1 @@ +import Data.List ( nub ) diff --git a/data/Test153.hs b/data/Test153.hs new file mode 100644 index 0000000..537fce6 --- /dev/null +++ b/data/Test153.hs @@ -0,0 +1,4 @@ +import Data.List ( foldl' + , indexElem + , nub + ) diff --git a/data/Test154.hs b/data/Test154.hs new file mode 100644 index 0000000..387f268 --- /dev/null +++ b/data/Test154.hs @@ -0,0 +1,14 @@ +import Test ( Long + , anymore + , fit + , items + , line + , list + , not + , onA + , quite + , single + , that + , will + , with + ) diff --git a/data/Test155.hs b/data/Test155.hs new file mode 100644 index 0000000..6150ff3 --- /dev/null +++ b/data/Test155.hs @@ -0,0 +1,11 @@ +import Test ( (+) + , (:!)(..) + , (:*)((:.), T7, t7) + , (:.) + , T + , T2() + , T3(..) + , T4(T4) + , T5(T5, t5) + , T6((<|>)) + ) diff --git a/data/Test156.hs b/data/Test156.hs new file mode 100644 index 0000000..9eb3db5 --- /dev/null +++ b/data/Test156.hs @@ -0,0 +1,3 @@ +import Test hiding ( ) +import Test as T + hiding ( ) diff --git a/data/Test157.hs b/data/Test157.hs new file mode 100644 index 0000000..f78c007 --- /dev/null +++ b/data/Test157.hs @@ -0,0 +1,13 @@ +import Prelude as X + hiding ( head + , init + , last + , maximum + , minimum + , pred + , read + , readFile + , succ + , tail + , undefined + ) diff --git a/data/Test158.hs b/data/Test158.hs new file mode 100644 index 0000000..0fb60c8 --- /dev/null +++ b/data/Test158.hs @@ -0,0 +1,3 @@ +import TestJustAbitToLongModuleNameLikeThisOneIs + ( ) +import TestJustShortEnoughModuleNameLikeThisOne ( ) diff --git a/data/Test159.hs b/data/Test159.hs new file mode 100644 index 0000000..886dfdc --- /dev/null +++ b/data/Test159.hs @@ -0,0 +1,3 @@ +import TestJustAbitToLongModuleNameLikeThisOneI + as T +import TestJustShortEnoughModuleNameLikeThisOn as T diff --git a/data/Test16.hs b/data/Test16.hs new file mode 100644 index 0000000..a91f667 --- /dev/null +++ b/data/Test16.hs @@ -0,0 +1,6 @@ +func + :: asd + -> Trither + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd diff --git a/data/Test160.hs b/data/Test160.hs new file mode 100644 index 0000000..eff7fd4 --- /dev/null +++ b/data/Test160.hs @@ -0,0 +1,3 @@ +import TestJustAbitToLongModuleNameLikeTh + hiding ( ) +import TestJustShortEnoughModuleNameLike hiding ( ) diff --git a/data/Test161.hs b/data/Test161.hs new file mode 100644 index 0000000..14bd638 --- /dev/null +++ b/data/Test161.hs @@ -0,0 +1,10 @@ +import MoreThanSufficientlyLongModuleNameWithSome + ( compact + , fit + , inA + , items + , layout + , not + , that + , will + ) diff --git a/data/Test162.hs b/data/Test162.hs new file mode 100644 index 0000000..f09b604 --- /dev/null +++ b/data/Test162.hs @@ -0,0 +1,11 @@ +import TestJustAbitToLongModuleNameLikeTh + hiding ( abc + , def + , ghci + , jklm + ) +import TestJustShortEnoughModuleNameLike hiding ( abc + , def + , ghci + , jklm + ) diff --git a/data/Test163.hs b/data/Test163.hs new file mode 100644 index 0000000..c71aaba --- /dev/null +++ b/data/Test163.hs @@ -0,0 +1,9 @@ +import {-# SOURCE #-} safe qualified "qualifier" A hiding ( ) +import {-# SOURCE #-} safe qualified "qualifiers" A + hiding ( ) +import {-# SOURCE #-} safe qualified "qualifiers" AlsoAf as T +import {-# SOURCE #-} safe qualified "qualifiers" AlsoAff ( ) +import {-# SOURCE #-} safe qualified "qualifiers" AlsoAff + as T +import {-# SOURCE #-} safe qualified "qualifiers" AlsoAffe + ( ) diff --git a/data/Test164.hs b/data/Test164.hs new file mode 100644 index 0000000..26469d9 --- /dev/null +++ b/data/Test164.hs @@ -0,0 +1,7 @@ +-- Test +import Data.List ( nub ) -- Test +{- Test -} +import qualified Data.List as L + ( foldl' ) {- Test -} +-- Test +import Test ( test ) diff --git a/data/Test165.hs b/data/Test165.hs new file mode 100644 index 0000000..af0b6ab --- /dev/null +++ b/data/Test165.hs @@ -0,0 +1,4 @@ +import Test ( abc + , def + -- comment + ) diff --git a/data/Test166.hs b/data/Test166.hs new file mode 100644 index 0000000..3f0a3ea --- /dev/null +++ b/data/Test166.hs @@ -0,0 +1,3 @@ +import Test ( abc + -- comment + ) diff --git a/data/Test167.hs b/data/Test167.hs new file mode 100644 index 0000000..fb8c357 --- /dev/null +++ b/data/Test167.hs @@ -0,0 +1,8 @@ +import Test ( abc + -- comment + , def + , ghi + {- comment -} + , jkl + -- comment + ) diff --git a/data/Test168.hs b/data/Test168.hs new file mode 100644 index 0000000..40ca190 --- /dev/null +++ b/data/Test168.hs @@ -0,0 +1,2 @@ +import Test ( -- comment + ) diff --git a/data/Test169.hs b/data/Test169.hs new file mode 100644 index 0000000..12a8008 --- /dev/null +++ b/data/Test169.hs @@ -0,0 +1,8 @@ +import Test ( longbindingNameThatoverflowsColum + ) +import Test ( Long + ( List + , Of + , Things + ) + ) diff --git a/data/Test17.hs b/data/Test17.hs new file mode 100644 index 0000000..a4bf487 --- /dev/null +++ b/data/Test17.hs @@ -0,0 +1,6 @@ +func + :: Trither + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + -> asd diff --git a/data/Test170.hs b/data/Test170.hs new file mode 100644 index 0000000..01d0881 --- /dev/null +++ b/data/Test170.hs @@ -0,0 +1,18 @@ +import Test ( Thing + ( -- Comments + ) + ) +import Test ( Thing + ( Item + -- and Comment + ) + ) +import Test ( Thing + ( With + -- Comments + , and + -- also + , items + -- ! + ) + ) diff --git a/data/Test171.hs b/data/Test171.hs new file mode 100644 index 0000000..2716a8d --- /dev/null +++ b/data/Test171.hs @@ -0,0 +1,2 @@ +import VeryLongModuleNameThatCouldEvenCauseAnEmptyBindingListToExpandIntoMultipleLine + ( ) diff --git a/data/Test172.hs b/data/Test172.hs new file mode 100644 index 0000000..190cdb1 --- /dev/null +++ b/data/Test172.hs @@ -0,0 +1,26 @@ +{-# LANGUAGE BangPatterns #-} +{- + - Test module + -} +module Test + ( test1 + -- ^ test + , test2 + -- | test + , test3 + , test4 + , test5 + , test6 + , test7 + , test8 + , test9 + , test10 + -- Test 10 + ) where +-- Test +import Data.List ( nub ) -- Test +{- Test -} +import qualified Data.List as L + ( foldl' ) {- Test -} +-- Test +import Test ( test ) diff --git a/data/Test173.hs b/data/Test173.hs new file mode 100644 index 0000000..ca49c29 --- /dev/null +++ b/data/Test173.hs @@ -0,0 +1,2 @@ +import Aaa +import Baa diff --git a/data/Test174.hs b/data/Test174.hs new file mode 100644 index 0000000..cb7a8f3 --- /dev/null +++ b/data/Test174.hs @@ -0,0 +1,5 @@ +import Zaa +import Zab + +import Aaa +import Baa diff --git a/data/Test175.hs b/data/Test175.hs new file mode 100644 index 0000000..b25e13a --- /dev/null +++ b/data/Test175.hs @@ -0,0 +1,2 @@ +import Boo +import qualified Zoo diff --git a/data/Test176.hs b/data/Test176.hs new file mode 100644 index 0000000..3ed3401 --- /dev/null +++ b/data/Test176.hs @@ -0,0 +1,3 @@ +import Boo ( a ) + +import Boo ( b ) diff --git a/data/Test177.hs b/data/Test177.hs new file mode 100644 index 0000000..67b690d --- /dev/null +++ b/data/Test177.hs @@ -0,0 +1,2 @@ +import A.B.C +import A.B.D diff --git a/data/Test178.hs b/data/Test178.hs new file mode 100644 index 0000000..f4d347f --- /dev/null +++ b/data/Test178.hs @@ -0,0 +1 @@ +type MySynonym = String diff --git a/data/Test179.hs b/data/Test179.hs new file mode 100644 index 0000000..dff281d --- /dev/null +++ b/data/Test179.hs @@ -0,0 +1 @@ +type MySynonym a = [a] diff --git a/data/Test18.hs b/data/Test18.hs new file mode 100644 index 0000000..aed66fd --- /dev/null +++ b/data/Test18.hs @@ -0,0 +1,5 @@ +func + :: Trither + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + (lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd -> asd) diff --git a/data/Test180.hs b/data/Test180.hs new file mode 100644 index 0000000..3f41a1a --- /dev/null +++ b/data/Test180.hs @@ -0,0 +1,3 @@ +-- | Important comment thrown in +type MySynonym b a + = MySynonym a b -> MySynonym a b -> MyParamType a b -> MyParamType a b diff --git a/data/Test181.hs b/data/Test181.hs new file mode 100644 index 0000000..727c443 --- /dev/null +++ b/data/Test181.hs @@ -0,0 +1,7 @@ +type MySynonym3 b a + = MySynonym a b + -> MySynonym a b + -- ^ RandomComment + -> MyParamType a b + -> MyParamType a b + -> MySynonym2 b a diff --git a/data/Test182.hs b/data/Test182.hs new file mode 100644 index 0000000..142a73a --- /dev/null +++ b/data/Test182.hs @@ -0,0 +1,7 @@ +{-# LANGUAGE StarIsType #-} +type MySynonym (a :: * -> *) + = MySynonym a b + -> MySynonym a b + -> MyParamType a b + -> MyParamType a b + -> MySynonym2 b a diff --git a/data/Test183.hs b/data/Test183.hs new file mode 100644 index 0000000..a48b11c --- /dev/null +++ b/data/Test183.hs @@ -0,0 +1 @@ +type MySynonym a = Num a => a -> Int diff --git a/data/Test184.hs b/data/Test184.hs new file mode 100644 index 0000000..7b868ea --- /dev/null +++ b/data/Test184.hs @@ -0,0 +1,5 @@ +type MySynonym a + = Num a + => AReallyLongTypeName + -> AnotherReallyLongTypeName + -> AThirdTypeNameToOverflow diff --git a/data/Test185.hs b/data/Test185.hs new file mode 100644 index 0000000..69107a7 --- /dev/null +++ b/data/Test185.hs @@ -0,0 +1,2 @@ +{-# LANGUAGE RankNTypes #-} +type MySynonym = forall a . [a] diff --git a/data/Test186.hs b/data/Test186.hs new file mode 100644 index 0000000..ed9c0e4 --- /dev/null +++ b/data/Test186.hs @@ -0,0 +1 @@ +type (:+:) a b = (a, b) diff --git a/data/Test187.hs b/data/Test187.hs new file mode 100644 index 0000000..3b94215 --- /dev/null +++ b/data/Test187.hs @@ -0,0 +1 @@ +type a `MySynonym` b = a -> b diff --git a/data/Test188.hs b/data/Test188.hs new file mode 100644 index 0000000..d7ba4a9 --- /dev/null +++ b/data/Test188.hs @@ -0,0 +1 @@ +type a :+: b = (a, b) diff --git a/data/Test189.hs b/data/Test189.hs new file mode 100644 index 0000000..7228f6d --- /dev/null +++ b/data/Test189.hs @@ -0,0 +1 @@ +type (a `Foo` b) c = (a, b, c) diff --git a/data/Test19.hs b/data/Test19.hs new file mode 100644 index 0000000..92634de --- /dev/null +++ b/data/Test19.hs @@ -0,0 +1,7 @@ +func + :: Trither + asd + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + ) diff --git a/data/Test190.hs b/data/Test190.hs new file mode 100644 index 0000000..b686bf0 --- /dev/null +++ b/data/Test190.hs @@ -0,0 +1,3 @@ +type Foo a -- fancy type comment + = -- strange comment + Int diff --git a/data/Test191.hs b/data/Test191.hs new file mode 100644 index 0000000..b6ce836 --- /dev/null +++ b/data/Test191.hs @@ -0,0 +1 @@ +type (a :+: b) = (a, b) diff --git a/data/Test192.hs b/data/Test192.hs new file mode 100644 index 0000000..f08498a --- /dev/null +++ b/data/Test192.hs @@ -0,0 +1,6 @@ +type Foo + = ( -- t1 + A -- t2 + , -- t3 + B -- t4 + ) -- t5 diff --git a/data/Test193.hs b/data/Test193.hs new file mode 100644 index 0000000..b422133 --- /dev/null +++ b/data/Test193.hs @@ -0,0 +1,2 @@ +instance MyClass Int where + myMethod x = x + 1 diff --git a/data/Test194.hs b/data/Test194.hs new file mode 100644 index 0000000..69107c6 --- /dev/null +++ b/data/Test194.hs @@ -0,0 +1,4 @@ +instance MyClass Int where + myMethod x = + -- insightful comment + x + 1 diff --git a/data/Test195.hs b/data/Test195.hs new file mode 100644 index 0000000..3de314a --- /dev/null +++ b/data/Test195.hs @@ -0,0 +1,3 @@ +instance MyClass Int where + myMethod :: Int -> Int + myMethod x = x + 1 diff --git a/data/Test196.hs b/data/Test196.hs new file mode 100644 index 0000000..63f0d95 --- /dev/null +++ b/data/Test196.hs @@ -0,0 +1,9 @@ +instance MyClass Int where + myMethod + :: Int + -> Int + -> AReallyLongType + -> AReallyLongType + -> AReallyLongType + -> Int + myMethod x = x + 1 diff --git a/data/Test197.hs b/data/Test197.hs new file mode 100644 index 0000000..d7c7d3c --- /dev/null +++ b/data/Test197.hs @@ -0,0 +1,3 @@ +instance MyClass Int where + myMethod x = x + 1 + myMethod2 x = x + 1 diff --git a/data/Test198.hs b/data/Test198.hs new file mode 100644 index 0000000..811e7c4 --- /dev/null +++ b/data/Test198.hs @@ -0,0 +1,11 @@ +instance MyClass Int where + myMethod + :: Int + -> Int + -> AReallyLongType + -> AReallyLongType + -> AReallyLongType + -> Int + myMethod x = x + 1 + myMethod2 :: Int -> Int + myMethod2 x = x + 1 diff --git a/data/Test199.hs b/data/Test199.hs new file mode 100644 index 0000000..9b9cf38 --- /dev/null +++ b/data/Test199.hs @@ -0,0 +1,4 @@ +-- | This instance should be commented on +instance MyClass Int where + -- | This method is also comment-worthy + myMethod x = x + 1 diff --git a/data/Test2.hs b/data/Test2.hs new file mode 100644 index 0000000..b0d734a --- /dev/null +++ b/data/Test2.hs @@ -0,0 +1,3 @@ +func + :: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd diff --git a/data/Test20.hs b/data/Test20.hs new file mode 100644 index 0000000..4ad54b6 --- /dev/null +++ b/data/Test20.hs @@ -0,0 +1,7 @@ +func + :: asd + -> ( Trither + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + ) diff --git a/data/Test200.hs b/data/Test200.hs new file mode 100644 index 0000000..c184597 --- /dev/null +++ b/data/Test200.hs @@ -0,0 +1,4 @@ +instance MyClass Int where + type MyType = Int + myMethod :: MyType -> Int + myMethod x = x + 1 diff --git a/data/Test201.hs b/data/Test201.hs new file mode 100644 index 0000000..1dcbe3a --- /dev/null +++ b/data/Test201.hs @@ -0,0 +1,5 @@ +instance MyClass Int where + type MyType = String + myMethod :: MyType -> Int + myMethod x = x + 1 + type MyType = Int diff --git a/data/Test202.hs b/data/Test202.hs new file mode 100644 index 0000000..b2789c2 --- /dev/null +++ b/data/Test202.hs @@ -0,0 +1,8 @@ +instance MyClass Int where + -- | This data is very important + data MyData = IntData + { intData :: String + , intData2 :: Int + } + myMethod :: MyData -> Int + myMethod = intData2 diff --git a/data/Test203.hs b/data/Test203.hs new file mode 100644 index 0000000..04353a6 --- /dev/null +++ b/data/Test203.hs @@ -0,0 +1,11 @@ +instance MyClass Int where + -- | This data is important + data MyData = Test Int Int + myMethod :: MyData -> Int + myMethod = intData2 + -- | This data is also important + data MyData2 = IntData + { intData :: String + -- ^ Interesting field + , intData2 :: Int + } diff --git a/data/Test204.hs b/data/Test204.hs new file mode 100644 index 0000000..7ad4fc6 --- /dev/null +++ b/data/Test204.hs @@ -0,0 +1,6 @@ +{-# LANGUAGE TypeFamilies #-} +module Lib where +instance Foo () where + newtype Bar () = Baz () + deriving (Eq, Ord, Show) + bar = Baz diff --git a/data/Test205.hs b/data/Test205.hs new file mode 100644 index 0000000..a224c18 --- /dev/null +++ b/data/Test205.hs @@ -0,0 +1,4 @@ +instance Foo Int where + newtype Bar Int = BarInt + { unBarInt :: Int + } diff --git a/data/Test206.hs b/data/Test206.hs new file mode 100644 index 0000000..7266b3e --- /dev/null +++ b/data/Test206.hs @@ -0,0 +1,3 @@ +{-# language TypeFamilies #-} +type family F a +type instance F Int = IO Int diff --git a/data/Test207.hs b/data/Test207.hs new file mode 100644 index 0000000..9bb7ba2 --- /dev/null +++ b/data/Test207.hs @@ -0,0 +1,3 @@ +{-# language TypeFamilies #-} +type family F a +type instance F Int = IO Int -- x diff --git a/data/Test208.hs b/data/Test208.hs new file mode 100644 index 0000000..0e3c3f8 --- /dev/null +++ b/data/Test208.hs @@ -0,0 +1,4 @@ +{-# language TypeFamilies #-} +module M where +type family F a +type instance F Int = IO Int diff --git a/data/Test209.hs b/data/Test209.hs new file mode 100644 index 0000000..f103480 --- /dev/null +++ b/data/Test209.hs @@ -0,0 +1,3 @@ +{-# language TypeFamilies #-} +data family F a +newtype instance F Int = N Int diff --git a/data/Test21.hs b/data/Test21.hs new file mode 100644 index 0000000..d27183e --- /dev/null +++ b/data/Test21.hs @@ -0,0 +1,7 @@ +func + :: asd + -> ( Trither + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + ) + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd diff --git a/data/Test210.hs b/data/Test210.hs new file mode 100644 index 0000000..659bd8a --- /dev/null +++ b/data/Test210.hs @@ -0,0 +1,3 @@ +{-# language TypeFamilies #-} +data family F a +newtype instance F Int = N Int -- x diff --git a/data/Test211.hs b/data/Test211.hs new file mode 100644 index 0000000..9e71377 --- /dev/null +++ b/data/Test211.hs @@ -0,0 +1,4 @@ +{-# language TypeFamilies #-} +module M where +data family F a +newtype instance F Int = N Int diff --git a/data/Test212.hs b/data/Test212.hs new file mode 100644 index 0000000..715990f --- /dev/null +++ b/data/Test212.hs @@ -0,0 +1,3 @@ +{-# language TypeFamilies #-} +data family F a +data instance F Int = D Int diff --git a/data/Test213.hs b/data/Test213.hs new file mode 100644 index 0000000..0194c4c --- /dev/null +++ b/data/Test213.hs @@ -0,0 +1,3 @@ +{-# language TypeFamilies #-} +data family F a +data instance F Int = D Int -- x diff --git a/data/Test214.hs b/data/Test214.hs new file mode 100644 index 0000000..81d27db --- /dev/null +++ b/data/Test214.hs @@ -0,0 +1,4 @@ +{-# language TypeFamilies #-} +module M where +data family F a +data instance F Int = D Int diff --git a/data/Test215.hs b/data/Test215.hs new file mode 100644 index 0000000..feaf541 --- /dev/null +++ b/data/Test215.hs @@ -0,0 +1,5 @@ +{-# language TypeFamilies #-} +class C a where + type family F a +instance C Int where + type F Int = IO Int diff --git a/data/Test216.hs b/data/Test216.hs new file mode 100644 index 0000000..13dcee5 --- /dev/null +++ b/data/Test216.hs @@ -0,0 +1,5 @@ +{-# language TypeFamilies #-} +class C a where + type family F a +instance C Int where + type F Int = IO Int -- x diff --git a/data/Test217.hs b/data/Test217.hs new file mode 100644 index 0000000..c14956e --- /dev/null +++ b/data/Test217.hs @@ -0,0 +1,6 @@ +{-# language TypeFamilies #-} +module M where +class C a where + type family F a +instance C Int where + type F Int = IO Int diff --git a/data/Test218.hs b/data/Test218.hs new file mode 100644 index 0000000..824b034 --- /dev/null +++ b/data/Test218.hs @@ -0,0 +1,5 @@ +{-# language TypeFamilies #-} +class C a where + data family F a +instance C Int where + newtype F Int = N Int diff --git a/data/Test219.hs b/data/Test219.hs new file mode 100644 index 0000000..1df22e4 --- /dev/null +++ b/data/Test219.hs @@ -0,0 +1,5 @@ +{-# language TypeFamilies #-} +class C a where + data family F a +instance C Int where + newtype F Int = N Int -- x diff --git a/data/Test22.hs b/data/Test22.hs new file mode 100644 index 0000000..35b8134 --- /dev/null +++ b/data/Test22.hs @@ -0,0 +1,7 @@ +func + :: ( Trither + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + ) + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + -> asd diff --git a/data/Test220.hs b/data/Test220.hs new file mode 100644 index 0000000..6f6dc67 --- /dev/null +++ b/data/Test220.hs @@ -0,0 +1,6 @@ +{-# language TypeFamilies #-} +module M where +class C a where + data family F a +instance C Int where + newtype F Int = N Int diff --git a/data/Test221.hs b/data/Test221.hs new file mode 100644 index 0000000..1ec34f4 --- /dev/null +++ b/data/Test221.hs @@ -0,0 +1,5 @@ +{-# language TypeFamilies #-} +class C a where + data family F a +instance C Int where + data F Int = D Int diff --git a/data/Test222.hs b/data/Test222.hs new file mode 100644 index 0000000..84a1f5f --- /dev/null +++ b/data/Test222.hs @@ -0,0 +1,5 @@ +{-# language TypeFamilies #-} +class C a where + data family F a +instance C Int where + data F Int = D Int -- x diff --git a/data/Test223.hs b/data/Test223.hs new file mode 100644 index 0000000..677369b --- /dev/null +++ b/data/Test223.hs @@ -0,0 +1,6 @@ +{-# language TypeFamilies #-} +module M where +class C a where + data family F a +instance C Int where + data F Int = D Int diff --git a/data/Test224.hs b/data/Test224.hs new file mode 100644 index 0000000..8798205 --- /dev/null +++ b/data/Test224.hs @@ -0,0 +1,3 @@ +module Main where +import Prelude +firstDecl = True diff --git a/data/Test225.hs b/data/Test225.hs new file mode 100644 index 0000000..e5861f4 --- /dev/null +++ b/data/Test225.hs @@ -0,0 +1,10 @@ +func = do + -- complex first step + aaa + -- complex second step + bbb + where + helper :: Helper + helper = helpful + other :: Other + other = True diff --git a/data/Test226.hs b/data/Test226.hs new file mode 100644 index 0000000..d999644 --- /dev/null +++ b/data/Test226.hs @@ -0,0 +1 @@ +type instance MyFam Bool = String diff --git a/data/Test227.hs b/data/Test227.hs new file mode 100644 index 0000000..a67980b --- /dev/null +++ b/data/Test227.hs @@ -0,0 +1 @@ +type instance MyFam (Maybe a) = a -> Bool diff --git a/data/Test228.hs b/data/Test228.hs new file mode 100644 index 0000000..21a82dc --- /dev/null +++ b/data/Test228.hs @@ -0,0 +1,4 @@ +type instance MyFam ALongishType + = AMuchLongerTypeThanThat + -> AnEvenLongerTypeThanTheLastOne + -> ShouldDefinitelyOverflow diff --git a/data/Test229.hs b/data/Test229.hs new file mode 100644 index 0000000..9299647 --- /dev/null +++ b/data/Test229.hs @@ -0,0 +1,3 @@ +-- | A happy family +type instance MyFam Bool -- This is an odd one + = AnotherType -- Here's another diff --git a/data/Test23.hs b/data/Test23.hs new file mode 100644 index 0000000..45b6ecc --- /dev/null +++ b/data/Test23.hs @@ -0,0 +1 @@ +func :: [a -> b] diff --git a/data/Test230.hs b/data/Test230.hs new file mode 100644 index 0000000..c7daa9c --- /dev/null +++ b/data/Test230.hs @@ -0,0 +1,4 @@ +{-# LANGUAGE MultiWayIf #-} +func = if + | cond1 -> loooooooooooooooooooooooooooooong expr1 + | cond2 -> loooooooooooooooooooooooooooooong expr2 diff --git a/data/Test231.hs b/data/Test231.hs new file mode 100644 index 0000000..4580c39 --- /dev/null +++ b/data/Test231.hs @@ -0,0 +1,6 @@ +{-# LANGUAGE MultiWayIf #-} +func = do + foo + bar $ if + | cond1 -> loooooooooooooooooooooooooooooong expr1 + | cond2 -> loooooooooooooooooooooooooooooong expr2 diff --git a/data/Test232.hs b/data/Test232.hs new file mode 100644 index 0000000..a1e09b1 --- /dev/null +++ b/data/Test232.hs @@ -0,0 +1,4 @@ +{-# LANGUAGE LambdaCase #-} +func = \case + FooBar -> x + Baz -> y diff --git a/data/Test233.hs b/data/Test233.hs new file mode 100644 index 0000000..c4b3a93 --- /dev/null +++ b/data/Test233.hs @@ -0,0 +1,2 @@ +{-# LANGUAGE ImplicitParams #-} +func :: (?asd::Int) -> () diff --git a/data/Test234.hs b/data/Test234.hs new file mode 100644 index 0000000..55305cf --- /dev/null +++ b/data/Test234.hs @@ -0,0 +1,7 @@ +{-# LANGUAGE ImplicitParams #-} +func + :: ( ?asd + :: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + ) + -> () diff --git a/data/Test235.hs b/data/Test235.hs new file mode 100644 index 0000000..41406a4 --- /dev/null +++ b/data/Test235.hs @@ -0,0 +1,5 @@ +{-# LANGUAGE RecursiveDo #-} +foo = do + rec a <- f b + b <- g a + return (a, b) diff --git a/data/Test236.hs b/data/Test236.hs new file mode 100644 index 0000000..ebf2076 --- /dev/null +++ b/data/Test236.hs @@ -0,0 +1,6 @@ +{-# LANGUAGE RecursiveDo #-} +foo = do + rec -- comment + a <- f b + b <- g a + return (a, b) diff --git a/data/Test237.hs b/data/Test237.hs new file mode 100644 index 0000000..78ecef2 --- /dev/null +++ b/data/Test237.hs @@ -0,0 +1,3 @@ +{-# LANGUAGE ExplicitNamespaces #-} +{-# LANGUAGE PatternSynonyms #-} +module Test (type (++), (++), pattern Foo) where diff --git a/data/Test238.hs b/data/Test238.hs new file mode 100644 index 0000000..61444fa --- /dev/null +++ b/data/Test238.hs @@ -0,0 +1,7 @@ +{-# LANGUAGE ExplicitNamespaces #-} +{-# LANGUAGE PatternSynonyms #-} +import Test ( type (++) + , (++) + , pattern (:.) + , pattern Foo + ) diff --git a/data/Test239.hs b/data/Test239.hs new file mode 100644 index 0000000..f535c48 --- /dev/null +++ b/data/Test239.hs @@ -0,0 +1,2 @@ +{-# LANGUAGE PatternSynonyms #-} +pattern J x = Just x diff --git a/data/Test24.hs b/data/Test24.hs new file mode 100644 index 0000000..272c2b4 --- /dev/null +++ b/data/Test24.hs @@ -0,0 +1,4 @@ +func + :: [ lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + ] diff --git a/data/Test240.hs b/data/Test240.hs new file mode 100644 index 0000000..82251e5 --- /dev/null +++ b/data/Test240.hs @@ -0,0 +1,2 @@ +{-# LANGUAGE PatternSynonyms #-} +pattern F x <- (x, _) diff --git a/data/Test241.hs b/data/Test241.hs new file mode 100644 index 0000000..e00b3ca --- /dev/null +++ b/data/Test241.hs @@ -0,0 +1,3 @@ +{-# LANGUAGE PatternSynonyms #-} +pattern HeadC x <- x : xs where + HeadC x = [x] diff --git a/data/Test242.hs b/data/Test242.hs new file mode 100644 index 0000000..f6587d6 --- /dev/null +++ b/data/Test242.hs @@ -0,0 +1,3 @@ +{-# LANGUAGE PatternSynonyms #-} +pattern Head2 x y <- x : y : xs where + Head2 x y = [x, y] diff --git a/data/Test243.hs b/data/Test243.hs new file mode 100644 index 0000000..4ffaf11 --- /dev/null +++ b/data/Test243.hs @@ -0,0 +1,2 @@ +{-# LANGUAGE PatternSynonyms #-} +pattern x :> y = [x, y] diff --git a/data/Test244.hs b/data/Test244.hs new file mode 100644 index 0000000..d61801f --- /dev/null +++ b/data/Test244.hs @@ -0,0 +1,2 @@ +{-# LANGUAGE PatternSynonyms #-} +pattern MyData { a, b, c } = [a, b, c] diff --git a/data/Test245.hs b/data/Test245.hs new file mode 100644 index 0000000..78869f8 --- /dev/null +++ b/data/Test245.hs @@ -0,0 +1,3 @@ +{-# LANGUAGE PatternSynonyms #-} +pattern myLongLeftVariableName `MyLongInfixPatternMatcher` myLongRightVariableName = + [myLongLeftVariableName, myLongRightVariableName] diff --git a/data/Test246.hs b/data/Test246.hs new file mode 100644 index 0000000..811bb22 --- /dev/null +++ b/data/Test246.hs @@ -0,0 +1,4 @@ +{-# LANGUAGE PatternSynonyms #-} +pattern myLeftVariableName `MyInfixPatternMatcher` myRightVariableName <- + [myLongLeftVariableName, myLongRightVariableName] where + MyInfixPatternMatcher x y = [x, x, y] diff --git a/data/Test247.hs b/data/Test247.hs new file mode 100644 index 0000000..cd38165 --- /dev/null +++ b/data/Test247.hs @@ -0,0 +1,3 @@ +{-# LANGUAGE PatternSynonyms #-} +pattern J :: a -> Maybe a +pattern J x = Just x diff --git a/data/Test248.hs b/data/Test248.hs new file mode 100644 index 0000000..823e1f4 --- /dev/null +++ b/data/Test248.hs @@ -0,0 +1,6 @@ +{-# LANGUAGE PatternSynonyms #-} +{-# LANGUAGE ViewPatterns #-} +pattern Signed x <- (asSigned -> x) where + Signed (Neg x) = -x + Signed Zero = 0 + Signed (Pos x) = x diff --git a/data/Test249.hs b/data/Test249.hs new file mode 100644 index 0000000..9b69561 --- /dev/null +++ b/data/Test249.hs @@ -0,0 +1,7 @@ +{-# LANGUAGE PatternSynonyms #-} +{-# LANGUAGE ViewPatterns #-} +pattern Signed xxxxxxxxxxxxxxxxxxxxxxxx <- + (asSigned -> xxxxxxxxxxxxxxxxxxxxxxxx) where + Signed (Neg x) = -x + Signed Zero = 0 + Signed (Pos x) = x diff --git a/data/Test25.hs b/data/Test25.hs new file mode 100644 index 0000000..142958b --- /dev/null +++ b/data/Test25.hs @@ -0,0 +1,5 @@ +func + :: [ ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + ) + ] diff --git a/data/Test250.hs b/data/Test250.hs new file mode 100644 index 0000000..8493743 --- /dev/null +++ b/data/Test250.hs @@ -0,0 +1,6 @@ +{-# LANGUAGE PatternSynonyms #-} +{-# LANGUAGE ViewPatterns #-} +pattern Signed x <- (asSigned -> x) where + Signed (Neg x) = -x -- negative comment + Signed Zero = 0 -- zero comment + Signed (Pos x) = x -- positive comment diff --git a/data/Test251.hs b/data/Test251.hs new file mode 100644 index 0000000..3ea9b99 --- /dev/null +++ b/data/Test251.hs @@ -0,0 +1,2 @@ +{-# LANGUAGE PatternSynonyms #-} +pattern J, K :: a -> Maybe a diff --git a/data/Test252.hs b/data/Test252.hs new file mode 100644 index 0000000..54eb4c5 --- /dev/null +++ b/data/Test252.hs @@ -0,0 +1,7 @@ +{-# LANGUAGE PatternSynonyms #-} +pattern LongMatcher + :: longlongtypevar + -> longlongtypevar + -> longlongtypevar + -> Maybe [longlongtypevar] +pattern LongMatcher x y z = Just [x, y, z] diff --git a/data/Test253.hs b/data/Test253.hs new file mode 100644 index 0000000..25fc4ce --- /dev/null +++ b/data/Test253.hs @@ -0,0 +1,4 @@ +{-# LANGUAGE UnboxedTuples #-} +spanKey :: (# Int, Int #) -> (# Int, Int #) +spanKey = case foo of + (# bar, baz #) -> (# baz, bar #) diff --git a/data/Test254.hs b/data/Test254.hs new file mode 100644 index 0000000..3ceb254 --- /dev/null +++ b/data/Test254.hs @@ -0,0 +1,4 @@ +{-# LANGUAGE MagicHash, UnboxedTuples #-} +spanKey :: (# Int#, Int# #) -> (# Int#, Int# #) +spanKey = case foo of + (# bar#, baz# #) -> (# baz# +# bar#, bar# #) diff --git a/data/Test255.hs b/data/Test255.hs new file mode 100644 index 0000000..a644156 --- /dev/null +++ b/data/Test255.hs @@ -0,0 +1,5 @@ +{-# LANGUAGE QuasiQuotes #-} +func = [blub| + asd + qwe + |] diff --git a/data/Test256.hs b/data/Test256.hs new file mode 100644 index 0000000..1624200 --- /dev/null +++ b/data/Test256.hs @@ -0,0 +1,4 @@ +{-# LANGUAGE QuasiQuotes #-} +func = [blub| + asd + qwe|] diff --git a/data/Test257.hs b/data/Test257.hs new file mode 100644 index 0000000..20f877f --- /dev/null +++ b/data/Test257.hs @@ -0,0 +1,6 @@ +{-# LANGUAGE QuasiQuotes #-} +func = do + let body = [json| + hello + |] + pure True diff --git a/data/Test258.hs b/data/Test258.hs new file mode 100644 index 0000000..29039ca --- /dev/null +++ b/data/Test258.hs @@ -0,0 +1,9 @@ +-- brittany { lconfig_allowHangingQuasiQuotes: False } +{-# LANGUAGE QuasiQuotes #-} +func = do + let + body = + [json| + hello + |] + pure True diff --git a/data/Test259.hs b/data/Test259.hs new file mode 100644 index 0000000..2407ef8 --- /dev/null +++ b/data/Test259.hs @@ -0,0 +1,2 @@ +{-# LANGUAGE OverloadedLabels #-} +foo = #bar diff --git a/data/Test26.hs b/data/Test26.hs new file mode 100644 index 0000000..cdc1e7e --- /dev/null +++ b/data/Test26.hs @@ -0,0 +1 @@ +func :: (a, b, c) diff --git a/data/Test260.hs b/data/Test260.hs new file mode 100644 index 0000000..d7cc187 --- /dev/null +++ b/data/Test260.hs @@ -0,0 +1,2 @@ +{-# LANGUAGE OverloadedLabels #-} +foo = #bar . #baz $ fmap #foo xs diff --git a/data/Test261.hs b/data/Test261.hs new file mode 100644 index 0000000..f56379d --- /dev/null +++ b/data/Test261.hs @@ -0,0 +1,2 @@ +{-# LANGUAGE ImplicitParams #-} +foo = ?bar diff --git a/data/Test262.hs b/data/Test262.hs new file mode 100644 index 0000000..0ed092e --- /dev/null +++ b/data/Test262.hs @@ -0,0 +1,2 @@ +{-# LANGUAGE ImplicitParams #-} +foo = let ?bar = Foo in value diff --git a/data/Test263.hs b/data/Test263.hs new file mode 100644 index 0000000..a85a777 --- /dev/null +++ b/data/Test263.hs @@ -0,0 +1,3 @@ +{-# LANGUAGE ImplicitParams #-} +foo :: (?bar::Bool) => () +foo = () diff --git a/data/Test264.hs b/data/Test264.hs new file mode 100644 index 0000000..d3ebee3 --- /dev/null +++ b/data/Test264.hs @@ -0,0 +1,4 @@ +func = do + abc <- foo +--abc +return () diff --git a/data/Test265.hs b/data/Test265.hs new file mode 100644 index 0000000..c965c63 --- /dev/null +++ b/data/Test265.hs @@ -0,0 +1 @@ +func = (()) diff --git a/data/Test266.hs b/data/Test266.hs new file mode 100644 index 0000000..b6a3539 --- /dev/null +++ b/data/Test266.hs @@ -0,0 +1,4 @@ +func = do + let foo True = True + foo _ = False + return () diff --git a/data/Test267.hs b/data/Test267.hs new file mode 100644 index 0000000..65d2172 --- /dev/null +++ b/data/Test267.hs @@ -0,0 +1,3 @@ +func = do + s <- mGet + mSet $ s { _lstate_indent = _lstate_indent state } diff --git a/data/Test268.hs b/data/Test268.hs new file mode 100644 index 0000000..6d369d8 --- /dev/null +++ b/data/Test268.hs @@ -0,0 +1,5 @@ +func = do + s <- mGet + mSet $ s { _lstate_indent = _lstate_indent state + , _lstate_foo = _lstate_foo state + } diff --git a/data/Test269.hs b/data/Test269.hs new file mode 100644 index 0000000..4741485 --- /dev/null +++ b/data/Test269.hs @@ -0,0 +1,6 @@ +func = do + s <- mGet + mSet $ s + { _lstate_indent = _lstate_indent lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + , _lstate_foo = _lstate_foo lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + } diff --git a/data/Test27.hs b/data/Test27.hs new file mode 100644 index 0000000..774cc9d --- /dev/null +++ b/data/Test27.hs @@ -0,0 +1 @@ +func :: ((a, b, c), (a, b, c), (a, b, c)) diff --git a/data/Test270.hs b/data/Test270.hs new file mode 100644 index 0000000..cd17597 --- /dev/null +++ b/data/Test270.hs @@ -0,0 +1 @@ +func = Foo { _lstate_indent = _lstate_indent state } diff --git a/data/Test271.hs b/data/Test271.hs new file mode 100644 index 0000000..112af5e --- /dev/null +++ b/data/Test271.hs @@ -0,0 +1,4 @@ +func = Foo + { _lstate_indent = _lstate_indent lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + , _lstate_fooo = _lstate_foo lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + } diff --git a/data/Test272.hs b/data/Test272.hs new file mode 100644 index 0000000..3d0a415 --- /dev/null +++ b/data/Test272.hs @@ -0,0 +1,4 @@ +func = do + Foo { _lstate_indent = _lstate_indent lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + , _lstate_foo = _lstate_foo lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + } diff --git a/data/Test273.hs b/data/Test273.hs new file mode 100644 index 0000000..172b344 --- /dev/null +++ b/data/Test273.hs @@ -0,0 +1,4 @@ +func = do +-- abc + -- def + return () diff --git a/data/Test274.hs b/data/Test274.hs new file mode 100644 index 0000000..13d9924 --- /dev/null +++ b/data/Test274.hs @@ -0,0 +1,6 @@ +func = do + do + return () + -- abc + -- def + return () diff --git a/data/Test275.hs b/data/Test275.hs new file mode 100644 index 0000000..45fbb05 --- /dev/null +++ b/data/Test275.hs @@ -0,0 +1,6 @@ +func + :: Int -- basic indentation amount + -> Int -- currently used width in current line (after indent) + -- used to accurately calc placing of the current-line + -> LayoutDesc + -> Int diff --git a/data/Test276.hs b/data/Test276.hs new file mode 100644 index 0000000..1a55b76 --- /dev/null +++ b/data/Test276.hs @@ -0,0 +1,7 @@ +func = + ( lkjadljasldjalskdjaldjalsdjkalsdjlaksdjlasjdlajsaldskj + $ abc + $ def + $ ghi + $ jkl + ) diff --git a/data/Test277.hs b/data/Test277.hs new file mode 100644 index 0000000..954c81d --- /dev/null +++ b/data/Test277.hs @@ -0,0 +1,2 @@ +buildG bounds0 edges0 = accumArray (flip (:)) [] bounds0 (map reassoc edges0) + where reassoc (v, e, w) = (v, (e, w)) diff --git a/data/Test278.hs b/data/Test278.hs new file mode 100644 index 0000000..012222d --- /dev/null +++ b/data/Test278.hs @@ -0,0 +1,4 @@ +downloadRepoPackage = case repo of + RepoLocal {..} -> return () + RepoLocal { abc } -> return () + RepoLocal{} -> return () diff --git a/data/Test279.hs b/data/Test279.hs new file mode 100644 index 0000000..2a53d37 --- /dev/null +++ b/data/Test279.hs @@ -0,0 +1,6 @@ +func = do + let (primaryPkg, otherPkgs) = selectPrimaryLocalPackage pwd pkgs' + (bproblems, x) = resolveBuildTargets primaryPkg otherPkgs utargets'' + -- default local dir target if there's no given target + utargets'' = "foo" + return () diff --git a/data/Test28.hs b/data/Test28.hs new file mode 100644 index 0000000..06bd705 --- /dev/null +++ b/data/Test28.hs @@ -0,0 +1,5 @@ +func + :: ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + , lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + , lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + ) diff --git a/data/Test280.hs b/data/Test280.hs new file mode 100644 index 0000000..0ea93d9 --- /dev/null +++ b/data/Test280.hs @@ -0,0 +1,5 @@ +func = + [ (thing, take 10 alts) --TODO: select best ones + | (thing, _got, alts@(_ : _)) <- nosuchFooThing + , gast <- award + ] diff --git a/data/Test281.hs b/data/Test281.hs new file mode 100644 index 0000000..6366436 --- /dev/null +++ b/data/Test281.hs @@ -0,0 +1,5 @@ +func = if x + then if y -- y is important + then foo + else bar + else Nothing diff --git a/data/Test282.hs b/data/Test282.hs new file mode 100644 index 0000000..c6cba2d --- /dev/null +++ b/data/Test282.hs @@ -0,0 +1,7 @@ +wrapPatPrepend pat prepElem = do + patDocs <- layoutPat pat + case Seq.viewl patDocs of + Seq.EmptyL -> return $ Seq.empty + x1 Seq.:< xR -> do + x1' <- docSeq [prepElem, return x1] + return $ x1' Seq.<| xR diff --git a/data/Test283.hs b/data/Test283.hs new file mode 100644 index 0000000..21044e6 --- /dev/null +++ b/data/Test283.hs @@ -0,0 +1,6 @@ +layoutWriteNewlineBlock + :: ( MonadMultiWriter Text.Builder.Builder m + , MonadMultiState LayoutState m + , MonadMultiWriter (Seq String) m + ) + => m () diff --git a/data/Test284.hs b/data/Test284.hs new file mode 100644 index 0000000..f6a21c7 --- /dev/null +++ b/data/Test284.hs @@ -0,0 +1,24 @@ +{-# LANGUAGE MultiWayIf #-} +readMergePersConfig path shouldCreate conf = do + exists <- liftIO $ System.Directory.doesFileExist path + if + | exists -> do + contents <- liftIO $ ByteString.readFile path -- no lazy IO, tyvm. + fileConf <- case Data.Yaml.decodeEither contents of + Left e -> do + liftIO + $ putStrErrLn + $ "error reading in brittany config from " + ++ path + ++ ":" + liftIO $ putStrErrLn e + mzero + Right x -> return x + return $ fileConf Semigroup.<> conf + | shouldCreate -> do + liftIO $ ByteString.writeFile path $ Data.Yaml.encode $ cMap + (Option . Just . runIdentity) + staticDefaultConfig + return $ conf + | otherwise -> do + return conf diff --git a/data/Test285.hs b/data/Test285.hs new file mode 100644 index 0000000..388281d --- /dev/null +++ b/data/Test285.hs @@ -0,0 +1,12 @@ +func = BuildReport + where + convertInstallOutcome = case result of + Left BR.PlanningFailed -> PlanningFailed + Left (BR.DependentFailed p) -> DependencyFailed p + Left (BR.DownloadFailed _) -> DownloadFailed + Left (BR.UnpackFailed _) -> UnpackFailed + Left (BR.ConfigureFailed _) -> ConfigureFailed + Left (BR.BuildFailed _) -> BuildFailed + Left (BR.TestsFailed _) -> TestsFailed + Left (BR.InstallFailed _) -> InstallFailed + Right (BR.BuildOk _ _ _ ) -> InstallOk diff --git a/data/Test286.hs b/data/Test286.hs new file mode 100644 index 0000000..388281d --- /dev/null +++ b/data/Test286.hs @@ -0,0 +1,12 @@ +func = BuildReport + where + convertInstallOutcome = case result of + Left BR.PlanningFailed -> PlanningFailed + Left (BR.DependentFailed p) -> DependencyFailed p + Left (BR.DownloadFailed _) -> DownloadFailed + Left (BR.UnpackFailed _) -> UnpackFailed + Left (BR.ConfigureFailed _) -> ConfigureFailed + Left (BR.BuildFailed _) -> BuildFailed + Left (BR.TestsFailed _) -> TestsFailed + Left (BR.InstallFailed _) -> InstallFailed + Right (BR.BuildOk _ _ _ ) -> InstallOk diff --git a/data/Test287.hs b/data/Test287.hs new file mode 100644 index 0000000..a50af8b --- /dev/null +++ b/data/Test287.hs @@ -0,0 +1,35 @@ +showPackageDetailedInfo pkginfo = + renderStyle (style { lineLength = 80, ribbonsPerLine = 1 }) + $ char '*' + $+$ something + [ entry "Synopsis" synopsis hideIfNull reflowParagraphs + , entry "Versions available" + sourceVersions + (altText null "[ Not available from server ]") + (dispTopVersions 9 (preferredVersions pkginfo)) + , entry + "Versions installed" + installedVersions + (altText + null + (if hasLib pkginfo then "[ Not installed ]" else "[ Unknown ]") + ) + (dispTopVersions 4 (preferredVersions pkginfo)) + , entry "Homepage" homepage orNotSpecified text + , entry "Bug reports" bugReports orNotSpecified text + , entry "Description" description hideIfNull reflowParagraphs + , entry "Category" category hideIfNull text + , entry "License" license alwaysShow disp + , entry "Author" author hideIfNull reflowLines + , entry "Maintainer" maintainer hideIfNull reflowLines + , entry "Source repo" sourceRepo orNotSpecified text + , entry "Executables" executables hideIfNull (commaSep text) + , entry "Flags" flags hideIfNull (commaSep dispFlag) + , entry "Dependencies" dependencies hideIfNull (commaSep dispExtDep) + , entry "Documentation" haddockHtml showIfInstalled text + , entry "Cached" haveTarball alwaysShow dispYesNo + , if not (hasLib pkginfo) + then empty + else text "Modules:" + $+$ nest 4 (vcat (map disp . sort . modules $ pkginfo)) + ] diff --git a/data/Test288.hs b/data/Test288.hs new file mode 100644 index 0000000..3289dd7 --- /dev/null +++ b/data/Test288.hs @@ -0,0 +1,2 @@ +isValidPosition position | validX && validY = Just position + | otherwise = Nothing diff --git a/data/Test289.hs b/data/Test289.hs new file mode 100644 index 0000000..023032c --- /dev/null +++ b/data/Test289.hs @@ -0,0 +1,6 @@ +foo = Reflex.runSpiderHost $ ReflexHost.hostApp $ do + (inputEvent :: Reflex.Event Reflex.Spider String, inputFire :: String + -> IO Bool ) <- + ReflexHost.newExternalEvent + liftIO . forkIO . forever $ getLine >>= inputFire + ReflexHost.performEvent_ $ fmap (liftIO . putStrLn) inputEvent diff --git a/data/Test29.hs b/data/Test29.hs new file mode 100644 index 0000000..fc19ba1 --- /dev/null +++ b/data/Test29.hs @@ -0,0 +1,6 @@ +func + :: ( ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + , (lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd) + , lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + ) + ) diff --git a/data/Test290.hs b/data/Test290.hs new file mode 100644 index 0000000..689fa70 --- /dev/null +++ b/data/Test290.hs @@ -0,0 +1,2 @@ +foldrDesc f z = unSwitchQueue $ \q -> + switch (Min.foldrDesc (f unTaggedF) z q) (Min.foldrAsc (f unTaggedF) z q) diff --git a/data/Test291.hs b/data/Test291.hs new file mode 100644 index 0000000..68face0 --- /dev/null +++ b/data/Test291.hs @@ -0,0 +1,5 @@ +autocheckCases = + [ ("Never Deadlocks" , representative deadlocksNever) + , ("No Exceptions" , representative exceptionsNever) + , ("Consistent Result", alwaysSame) -- already representative + ] diff --git a/data/Test292.hs b/data/Test292.hs new file mode 100644 index 0000000..cc6ecb2 --- /dev/null +++ b/data/Test292.hs @@ -0,0 +1,7 @@ +autocheckCases = + [ ("Never Deadlocks", representative deadlocksNever) + , ("No Exceptions" , representative exceptionsNever) + , ( "Consistent Result" + , alwaysSame -- already representative + ) + ] diff --git a/data/Test293.hs b/data/Test293.hs new file mode 100644 index 0000000..596f9ea --- /dev/null +++ b/data/Test293.hs @@ -0,0 +1,5 @@ +func = + [ (abc, (1111, 1111)) + , (def, (2, 2)) + , foo -- comment + ] diff --git a/data/Test294.hs b/data/Test294.hs new file mode 100644 index 0000000..927da51 --- /dev/null +++ b/data/Test294.hs @@ -0,0 +1,2 @@ +foo a b = g a b -- fooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo + where g a b = b + b * a diff --git a/data/Test295.hs b/data/Test295.hs new file mode 100644 index 0000000..2b6fc80 --- /dev/null +++ b/data/Test295.hs @@ -0,0 +1 @@ +foo a b = g a b where g a b = b + b * a -- fooooooooooooooooooooooooooooooooooo diff --git a/data/Test296.hs b/data/Test296.hs new file mode 100644 index 0000000..1954213 --- /dev/null +++ b/data/Test296.hs @@ -0,0 +1,5 @@ +func = do + abc <- expr + abcccccccccccccccccc <- expr + abcccccccccccccccccccccccccccccccccccccccccc <- expr + abccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc <- expr diff --git a/data/Test297.hs b/data/Test297.hs new file mode 100644 index 0000000..198bd69 --- /dev/null +++ b/data/Test297.hs @@ -0,0 +1,3 @@ +func (MyLongFoo abc def) = 1 +func (Bar a d ) = 2 +func _ = 3 diff --git a/data/Test298.hs b/data/Test298.hs new file mode 100644 index 0000000..17013e2 --- /dev/null +++ b/data/Test298.hs @@ -0,0 +1,14 @@ +parserCompactLocation = + [ try + $ [ ParseRelAbs (Text.Read.read digits) _ _ + | digits <- many1 digit + , rel1 :: Maybe (Either Int (Ratio Int)) <- optionMaybe + [ case divPart of + Nothing -> Left $ Text.Read.read digits + Just ddigits -> + Right $ Text.Read.read digits % Text.Read.read ddigits + | digits <- many1 digit + , divPart <- optionMaybe (string "/" *> many1 digit) + ] + ] + ] diff --git a/data/Test299.hs b/data/Test299.hs new file mode 100644 index 0000000..26927f9 --- /dev/null +++ b/data/Test299.hs @@ -0,0 +1,3 @@ +func = fooooooooooooooooooooooooooooooooo $ foooooooooooooooooooooooooooooooo + foooooooooooooooooooooooooooooooo + foooooooooooooooooooooooooooooooo diff --git a/data/Test3.hs b/data/Test3.hs new file mode 100644 index 0000000..98d8196 --- /dev/null +++ b/data/Test3.hs @@ -0,0 +1,4 @@ +func + :: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + -> lakjsdlkjasldkj + -> lakjsdlkjasldkj diff --git a/data/Test30.hs b/data/Test30.hs new file mode 100644 index 0000000..2ed144e --- /dev/null +++ b/data/Test30.hs @@ -0,0 +1,6 @@ +func + :: [ ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + , lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + , lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + ) + ] diff --git a/data/Test300.hs b/data/Test300.hs new file mode 100644 index 0000000..0338df4 --- /dev/null +++ b/data/Test300.hs @@ -0,0 +1,4 @@ +func = + fooooooooooooooooooooooooooooooooo + + foooooooooooooooooooooooooooooooo foooooooooooooooooooooooooooooooo + foooooooooooooooooooooooooooooooo diff --git a/data/Test301.hs b/data/Test301.hs new file mode 100644 index 0000000..bd8d21c --- /dev/null +++ b/data/Test301.hs @@ -0,0 +1,5 @@ +func = fooooooooooooooooooooooooooooooooo + foooooooooooooooooooooooooooooooo + [ foooooooooooooooooooooooooooooooo + , foooooooooooooooooooooooooooooooo + , foooooooooooooooooooooooooooooooo + ] diff --git a/data/Test302.hs b/data/Test302.hs new file mode 100644 index 0000000..946346c --- /dev/null +++ b/data/Test302.hs @@ -0,0 +1,18 @@ +parserPrim = + [ r + | r <- + [ SGPPrimFloat $ bool id (0 -) minus $ readGnok "parserPrim" + (d1 ++ d2 ++ d3 ++ d4) + | d2 <- string "." + , d3 <- many1 (oneOf "0123456789") + , _ <- string "f" + ] + <|> [ SGPPrimFloat $ bool id (0 -) minus $ fromIntegral + (readGnok "parserPrim" d1 :: Integer) + | _ <- string "f" + ] + <|> [ SGPPrimInt $ bool id (0 -) minus $ fromIntegral + (readGnok "parserPrim" d1 :: Integer) + | _ <- string "i" + ] + ] diff --git a/data/Test303.hs b/data/Test303.hs new file mode 100644 index 0000000..d3f4d9e --- /dev/null +++ b/data/Test303.hs @@ -0,0 +1,2 @@ +samples = (SV.unpackaaaaadat) <&> \f -> + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/data/Test304.hs b/data/Test304.hs new file mode 100644 index 0000000..c62bfc0 --- /dev/null +++ b/data/Test304.hs @@ -0,0 +1,9 @@ +runBrittany tabSize text = do + let config' = staticDefaultConfig + config = config' + { _conf_layout = (_conf_layout config') + { _lconfig_indentAmount = coerce tabSize + } + , _conf_forward = forwardOptionsSyntaxExtsEnabled + } + parsePrintModule config text diff --git a/data/Test305.hs b/data/Test305.hs new file mode 100644 index 0000000..a288c39 --- /dev/null +++ b/data/Test305.hs @@ -0,0 +1,11 @@ +-- brittany { lconfig_indentPolicy: IndentPolicyLeft } +runBrittany tabSize text = do + let + config' = staticDefaultConfig + config = config' + { _conf_layout = (_conf_layout config') + { _lconfig_indentAmount = coerce tabSize + } + , _conf_forward = forwardOptionsSyntaxExtsEnabled + } + parsePrintModule config text diff --git a/data/Test306.hs b/data/Test306.hs new file mode 100644 index 0000000..822d18a --- /dev/null +++ b/data/Test306.hs @@ -0,0 +1,7 @@ +foo = + ( a + , -- comment1 + b + -- comment2 + , c + ) diff --git a/data/Test307.hs b/data/Test307.hs new file mode 100644 index 0000000..0d54fb5 --- /dev/null +++ b/data/Test307.hs @@ -0,0 +1,2 @@ +{-# LANGUAGE TypeApplications #-} +foo = bar @Baz diff --git a/data/Test308.hs b/data/Test308.hs new file mode 100644 index 0000000..ca3fd97 --- /dev/null +++ b/data/Test308.hs @@ -0,0 +1,50 @@ +{-# LANGUAGE TypeApplications #-} +layoutPatternBindFinal alignmentToken binderDoc mPatDoc clauseDocs = do + docAlt + $ -- one-line solution + [ docCols + (ColBindingLine alignmentToken) + [ docSeq (patPartInline ++ [guardPart]) + , docSeq + [ appSep $ return binderDoc + , docForceSingleline $ return body + , wherePart + ] + ] + | not hasComments + , [(guards, body, _bodyRaw)] <- [clauseDocs] + , let guardPart = singleLineGuardsDoc guards + , wherePart <- case mWhereDocs of + Nothing -> return @[] $ docEmpty + Just [w] -> return @[] $ docSeq + [ docSeparator + , appSep $ docLit $ Text.pack "where" + , docSetIndentLevel $ docForceSingleline $ return w + ] + _ -> [] + ] + ++ -- one-line solution + where in next line(s) + [ docLines + $ [ docCols + (ColBindingLine alignmentToken) + [ docSeq (patPartInline ++ [guardPart]) + , docSeq + [appSep $ return binderDoc, docForceParSpacing $ return body] + ] + ] + ++ wherePartMultiLine + | [(guards, body, _bodyRaw)] <- [clauseDocs] + , let guardPart = singleLineGuardsDoc guards + , Data.Maybe.isJust mWhereDocs + ] + ++ -- two-line solution + where in next line(s) + [ docLines + $ [ docForceSingleline + $ docSeq (patPartInline ++ [guardPart, return binderDoc]) + , docEnsureIndent BrIndentRegular $ docForceSingleline $ return + body + ] + ++ wherePartMultiLine + | [(guards, body, _bodyRaw)] <- [clauseDocs] + , let guardPart = singleLineGuardsDoc guards + ] diff --git a/data/Test309.hs b/data/Test309.hs new file mode 100644 index 0000000..d02a8c6 --- /dev/null +++ b/data/Test309.hs @@ -0,0 +1,9 @@ +{-# LANGUAGE MultiWayIf #-} +func = do + let foo = if + | Constuctoooooooooooooooooooooooooooooooooooor `elem` artics -- TODO + -> max + (defLen - 0.2) -- TODO + (defLen * 0.8) + | otherwise -> max (defLen - 0.05) (defLen * 0.95) -- TODO + return True diff --git a/data/Test31.hs b/data/Test31.hs new file mode 100644 index 0000000..7e217d5 --- /dev/null +++ b/data/Test31.hs @@ -0,0 +1,2 @@ +{-# LANGUAGE ScopedTypeVariables #-} +func :: forall (a :: *) b . a -> b diff --git a/data/Test310.hs b/data/Test310.hs new file mode 100644 index 0000000..a6f54fa --- /dev/null +++ b/data/Test310.hs @@ -0,0 +1,5 @@ +foo n = case n of + 1 -> True + -1 -> False +bar n = case n of + (-2, -2) -> (-2, -2) diff --git a/data/Test311.hs b/data/Test311.hs new file mode 100644 index 0000000..99e92c5 --- /dev/null +++ b/data/Test311.hs @@ -0,0 +1,5 @@ +{-# LANGUAGE TypeApplications #-} +foo = + let a = b @1 + cccc = () + in foo diff --git a/data/Test312.hs b/data/Test312.hs new file mode 100644 index 0000000..615e416 --- /dev/null +++ b/data/Test312.hs @@ -0,0 +1,2 @@ +{-# LANGUAGE RecordWildCards #-} +v = A { a = 1, .. } where b = 2 diff --git a/data/Test313.hs b/data/Test313.hs new file mode 100644 index 0000000..1f5f34f --- /dev/null +++ b/data/Test313.hs @@ -0,0 +1,2 @@ +{-# LANGUAGE RecordWildCards #-} +v = A { .. } where b = 2 diff --git a/data/Test314.hs b/data/Test314.hs new file mode 100644 index 0000000..e0cc55d --- /dev/null +++ b/data/Test314.hs @@ -0,0 +1,2 @@ +{-# LANGUAGE RecordWildCards #-} +v = A { a = 1, b = 2, c = 3 } diff --git a/data/Test315.hs b/data/Test315.hs new file mode 100644 index 0000000..8bd72ce --- /dev/null +++ b/data/Test315.hs @@ -0,0 +1 @@ +test :: Proxy 'Int diff --git a/data/Test316.hs b/data/Test316.hs new file mode 100644 index 0000000..e5a8eef --- /dev/null +++ b/data/Test316.hs @@ -0,0 +1 @@ +test :: Proxy '[ 'True] diff --git a/data/Test317.hs b/data/Test317.hs new file mode 100644 index 0000000..79d5442 --- /dev/null +++ b/data/Test317.hs @@ -0,0 +1 @@ +test :: Proxy '[Bool] diff --git a/data/Test318.hs b/data/Test318.hs new file mode 100644 index 0000000..f2c5673 --- /dev/null +++ b/data/Test318.hs @@ -0,0 +1,7 @@ +{-# LANGUAGE RankNTypes, KindSignatures #-} +func + :: forall m str + . (Str str, Monad m) + => Int + -> Proxy (str :: [*]) + -> m (Tagged str String) diff --git a/data/Test319.hs b/data/Test319.hs new file mode 100644 index 0000000..1c6ce85 --- /dev/null +++ b/data/Test319.hs @@ -0,0 +1,13 @@ +widgetsDyn = + [ [ vBox + [ padTop Max outputLinesWidget + , padRight Max wid1 <+> flowWidget -- alignment here is strange/buggy + , padBottom (Pad 5) help + ] + ] + | wid1 <- promptDyn + , (flowWidget, _) <- flowResultD + , outputLinesWidget <- outputLinesWidgetD + , help <- suggestionHelpBox + , parser <- cmdParserD + ] diff --git a/data/Test32.hs b/data/Test32.hs new file mode 100644 index 0000000..19e72f4 --- /dev/null +++ b/data/Test32.hs @@ -0,0 +1,10 @@ +{-# LANGUAGE ScopedTypeVariables #-} +func + :: forall m + . Foo + => ColMap2 + -> ColInfo + -> ColInfo + -> ColInfo + -> ColInfo + -> m () diff --git a/data/Test320.hs b/data/Test320.hs new file mode 100644 index 0000000..c7e9eae --- /dev/null +++ b/data/Test320.hs @@ -0,0 +1,2 @@ +fmapuv :: U.Unbox a => (a -> b) -> U.Vector a -> V.Vector b +fmapuv f xs = G.generate (G.length xs) (f . (xs G.!)) diff --git a/data/Test321.hs b/data/Test321.hs new file mode 100644 index 0000000..5cee20d --- /dev/null +++ b/data/Test321.hs @@ -0,0 +1 @@ +cs0 = 0 : [ c / Interval n | c <- cs | n <- [1..] ] diff --git a/data/Test322.hs b/data/Test322.hs new file mode 100644 index 0000000..f515f6d --- /dev/null +++ b/data/Test322.hs @@ -0,0 +1,2 @@ +{-# LANGUAGE TemplateHaskell #-} +deriveFromJSON (unPrefix "assignPost") ''AssignmentPost diff --git a/data/Test323.hs b/data/Test323.hs new file mode 100644 index 0000000..ae0ee2e --- /dev/null +++ b/data/Test323.hs @@ -0,0 +1,7 @@ +main = -- a + let --b + x = 1 -- x + y = 2 -- y + in do + print x + print y diff --git a/data/Test324.hs b/data/Test324.hs new file mode 100644 index 0000000..fcbe491 --- /dev/null +++ b/data/Test324.hs @@ -0,0 +1,9 @@ +alternatives :: Parser (Maybe Text) +alternatives = + alternativeOne -- first try this one + <|> alterantiveTwo -- then this one + <|> alternativeThree -- then this one + where + alternativeOne = purer "one" + alternativeTwo = purer "two" + alterantiveThree = purer "three" diff --git a/data/Test325.hs b/data/Test325.hs new file mode 100644 index 0000000..b8d67d0 --- /dev/null +++ b/data/Test325.hs @@ -0,0 +1,4 @@ +{-# LANGUAGE BangPatterns #-} +func = do + let !forced = some + pure () diff --git a/data/Test326.hs b/data/Test326.hs new file mode 100644 index 0000000..0435d04 --- /dev/null +++ b/data/Test326.hs @@ -0,0 +1,4 @@ +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/data/Test327.hs b/data/Test327.hs new file mode 100644 index 0000000..b7efa94 --- /dev/null +++ b/data/Test327.hs @@ -0,0 +1 @@ +a :: () ':- () diff --git a/data/Test328.hs b/data/Test328.hs new file mode 100644 index 0000000..c2ace2f --- /dev/null +++ b/data/Test328.hs @@ -0,0 +1,3 @@ +func = do + createDirectoryIfMissing True path + openFile fileName AppendMode diff --git a/data/Test329.hs b/data/Test329.hs new file mode 100644 index 0000000..449cf88 --- /dev/null +++ b/data/Test329.hs @@ -0,0 +1,7 @@ +alternatives :: Parser (Maybe Text) +alternatives = -- a + ( -- b + alternativeOne -- c + <|> alterantiveTwo -- d + <|> alternativeThree -- e + ) -- f diff --git a/data/Test33.hs b/data/Test33.hs new file mode 100644 index 0000000..335c68e --- /dev/null +++ b/data/Test33.hs @@ -0,0 +1,10 @@ +{-# LANGUAGE ScopedTypeVariables #-} +func + :: forall m + . ColMap2 + -> ColInfo + -> ColInfo + -> ColInfo + -> ColInfo + -> ColInfo + -> m () diff --git a/data/Test330.hs b/data/Test330.hs new file mode 100644 index 0000000..0485ac6 --- /dev/null +++ b/data/Test330.hs @@ -0,0 +1,10 @@ +{-# LANGUAGE ScopedTypeVariables #-} +func + :: forall a + . () + => aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +func + :: () + => aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + -> aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/data/Test331.hs b/data/Test331.hs new file mode 100644 index 0000000..9737285 --- /dev/null +++ b/data/Test331.hs @@ -0,0 +1,5 @@ +go l [] = Right l +go l ((IRType, _a) : eqr) = go l eqr +go l ((_, IRType) : eqr) = go l eqr +go _ ((IRTypeError ps t1 t2, _) : _) = Left $ makeError ps t1 t2 +go _ ((_, IRTypeError ps t1 t2) : _) = Left $ makeError ps t1 t2 diff --git a/data/Test332.hs b/data/Test332.hs new file mode 100644 index 0000000..1785320 --- /dev/null +++ b/data/Test332.hs @@ -0,0 +1,2 @@ +type instance XPure StageParse = () +type Pair a = (a, a) diff --git a/data/Test333.hs b/data/Test333.hs new file mode 100644 index 0000000..0b87f50 --- /dev/null +++ b/data/Test333.hs @@ -0,0 +1,18 @@ +-- brittany { lconfig_indentAmount: 4, lconfig_indentPolicy: IndentPolicyMultiple } +dsfnjKeekbwwbosbOfakxqRsiyix cnehokzozwbVaguvu migbnaRwutbz = + let + eyuAfrarIso' + :: (RveoexdxunuAafalm -> Axlau (Axlau (a, OinejrdCplle))) + -> Gbodoy + -> Axlau (Axlau OinejrdCplle, Gbodoy) + eyuAfrarIso' = ulcPaaekBst cnehokzozwbVaguvu + amkgoxEhalazJjxunecCuIfaw + :: Axlau (Axlau OinejrdCplle, Gbodoy) -> Axlau RqlnrluYqednbCiggxi + amkgoxEhalazJjxunecCuIfaw uKqviuBisjtn = do + (sEmo, quc) <- uKqviuBisjtn + pure (xoheccewfWoeyiagOkfodiq sEmo quc) + xoheccewfWoeyiagOkfodiq + :: Axlau OinejrdCplle -> Gbodoy -> RqlnrluYqednbCiggxi + xoheccewfWoeyiagOkfodiq sEmo quc = case migbnaRwutbz of + Afogmf -> xgeqe (OfBkkuih quc) (Ciitog quc) sEmo + in QabqyilexuiNizzhsQuxxac migbnaRwutbz (hwaTihhjt lhowvscIiozgqe) diff --git a/data/Test334.hs b/data/Test334.hs new file mode 100644 index 0000000..f97dfd6 --- /dev/null +++ b/data/Test334.hs @@ -0,0 +1,5 @@ +spec = do + it "creates a snapshot at the given level" . withGraph runDB $ do + lift $ do + studentDiagnosticReadingLevel updatedStudent `shouldBe` Just 10 -- x + elaSnapshotReadingLevel snapshot `shouldBe` 12 diff --git a/data/Test335.hs b/data/Test335.hs new file mode 100644 index 0000000..0a2a760 --- /dev/null +++ b/data/Test335.hs @@ -0,0 +1,12 @@ +jaicyhHumzo btrKpeyiFej mava = do + m :: VtohxeRgpmgsu <- qloxIfiq mava + case m of + ZumnaoFujayerIswadabo kkecm chlixxag -> do + imomue <- ozisduRaqiseSBAob btrKpeyiFej $ \s -> + case MizA.pigevo kkecm (_tc_gulawulu s) of + Ebocaba -> + ( s { _tc_gulawulu = MizA.jxariu kkecm rwuRqxzhjo (_tc_gulawulu s) } + , Gtzvonm + ) + Xcde{} -> (s, Pioemav) + pure imomue diff --git a/data/Test336.hs b/data/Test336.hs new file mode 100644 index 0000000..5876f85 --- /dev/null +++ b/data/Test336.hs @@ -0,0 +1,8 @@ +-- brittany { lconfig_indentPolicy: IndentPolicyMultiple } +foo = bar + arg1 -- this is the first argument + arg2 -- this is the second argument + arg3 -- this is the third argument, now I'll skip one comment + arg4 + arg5 -- this is the fifth argument + arg6 -- this is the sixth argument diff --git a/data/Test337.hs b/data/Test337.hs new file mode 100644 index 0000000..917af95 --- /dev/null +++ b/data/Test337.hs @@ -0,0 +1,4 @@ +True `nand` True = False +nand _ _ = True +nor False False = True +_ `nor` _ = False diff --git a/data/Test338.hs b/data/Test338.hs new file mode 100644 index 0000000..e6df6c6 --- /dev/null +++ b/data/Test338.hs @@ -0,0 +1 @@ +f ((:) a as) = undefined diff --git a/data/Test339.hs b/data/Test339.hs new file mode 100644 index 0000000..cfa949d --- /dev/null +++ b/data/Test339.hs @@ -0,0 +1,5 @@ +{-# LANGUAGE BangPatterns #-} +a = \x -> x +b = \ ~x -> x +c = \ !x -> x +d = \(~x) -> x diff --git a/data/Test34.hs b/data/Test34.hs new file mode 100644 index 0000000..24f6b28 --- /dev/null +++ b/data/Test34.hs @@ -0,0 +1,9 @@ +{-# LANGUAGE RankNTypes #-} +addFlagStringParam + :: forall f out + . (Applicative f) + => String -- ^ short flag chars, i.e. "v" for -v + -> [String] -- ^ list of long names, i.e. ["verbose"] + -> String -- ^ param name + -> Flag String -- ^ properties + -> CmdParser f out String diff --git a/data/Test340.hs b/data/Test340.hs new file mode 100644 index 0000000..fb61bc1 --- /dev/null +++ b/data/Test340.hs @@ -0,0 +1,2 @@ +{-# LANGUAGE RankNTypes #-} +func :: forall b . Show b => b -> String diff --git a/data/Test341.hs b/data/Test341.hs new file mode 100644 index 0000000..cea68da --- /dev/null +++ b/data/Test341.hs @@ -0,0 +1,3 @@ +{-# LANGUAGE TypeFamilies #-} +f :: ((~) a b) => a -> b +f = id diff --git a/data/Test342.hs b/data/Test342.hs new file mode 100644 index 0000000..c522948 --- /dev/null +++ b/data/Test342.hs @@ -0,0 +1,50 @@ +-- brittany { lconfig_indentPolicy: IndentPolicyLeft } +vakjkeSulxudbFokvir = Duotpo + { _ekku_gcrpbze = xgonae (1 :: Int) + , _oola_louwu = FoqsiYcuidx + { _xxagu_umea_iaztoj = xgonae False + , _tuktg_tizo_kfikacygsqf = xgonae False + , _ahzbo_xpow_otq_nzeyufq = xgonae False + , _uagpi_lzps_luy_xcjn = xgonae False + , _dxono_qjef_aqtafq_bes = xgonae False + , _yzuaf_nviy_vuhwxe_ihnbo_uhw = xgonae False + , _iwcit_fzjs_yerakt_dicox_mtryitko = xgonae False + , _ehjim_ucfe_dewarp_newrt_gso = xgonae False + , _ogtxb_ivoj_amqgai_rttui_xuwhetb = xgonae False + , _bhycb_iexz_megaug_qunoa_ohaked = xgonae False + , _nnmbe_uqgt_ewsuga_vaiis = xgonae False + , _otzil_ucvugaiyj_aosoiatunx_asir = xgonae False + } + , _iwsc_lalojz = XqspaiDainqw + { _uajznac_ugah = xgonae (80 :: Int) + , _qayziku_gazibzDejipj = xgonae DewizeCxwgyiKjig + , _auhebll_fiqjxyArfxia = xgonae (2 :: Int) + , _zubfuhq_dupiwnIoophXameeet = xgonae True + , _oavnuqg_opkreyOufuIkifiin = xgonae True + , _ufojfwy_fhuzcePeqwfu = xgonae (50 :: Int) + , _mlosikq_zajdxxSeRoelpf = xgonae (50 :: Int) + , _heemavf_fjgOfoaikh = xgonae (FyoVfvdygaZuzuvbeWarwuq 3) + , _ohxmeoq_ogtbfoPtqezVseu = xgonae (EdjotoLcbapUdiuMmytwoig 0.7) + , _omupuiu_ituamexjuLccwu = xgonae (30 :: Int) + , _xoseksf_atvwwdwaoHanofMyUvujjopoz = xgonae True + , _umuuuat_nuamezwWeqfUqzrnaxwp = xgonae False + , _uuriguz_wixhutbuKecigaFiwosret = xgonae True + , _betohxp_scixaLsvcesErtwItxrnaJmuz = xgonae False + , _lchxgee_olaetGcqzuqxVujenCzexub = xgonae True + , _egeibao_imamkuigqikhZdcbpidokVcixiqew = xgonae False + } + , _nloo_cfmrgZcisiugk = YuwodSavxwnicBekuel + { _oebew_rrtpvthUzlizjAqIwesly = xgonae False + , _blkff_Acxoid = xgonae False + , _datei_YewolAowoqOpunvpgu = xgonae BeekgUzojaPnixxaruJehyPmnnfu + , _ejfrj_eheb_justvh_pumcp_ismya = xgonae False + } + , _kena_uzeddovosoki = NyoRvshullezUpauud + { _mtfuwi_TUVEmoi = xgonae RZXKoytUtogx + , _larqam_adaxPehaylZafeqgpc = xgonae False + } + , _spob_qipaarx = KaxavsmOtoyeaq { _rusrirw_okx = Tajemkix [] } + , _vmah_uivucnfka_ikaquebxay_gzcm = xgonae False + , _qaqb_eykzuyuwi = xgonae False + -- test comment + } diff --git a/data/Test343.hs b/data/Test343.hs new file mode 100644 index 0000000..bb5d7d2 --- /dev/null +++ b/data/Test343.hs @@ -0,0 +1,10 @@ +-- brittany { lconfig_indentPolicy: IndentPolicyLeft } +vakjkeSulxudbFokvir = Duotpo + { _ekku_gcrpbze = xgonae (1 :: Int) + , _spob_qipaarx = KaxavsmOtoyeaq { _rusrirw_okx = Tajemkix [] } + , _vmah_uivucnfka_ikaquebxay_gzcm = xgonae False + , _qaqb_eykzuyuwi = xgonae False + -- test comment + , -- N.B. + .. -- x + } diff --git a/data/Test344.hs b/data/Test344.hs new file mode 100644 index 0000000..53649fc --- /dev/null +++ b/data/Test344.hs @@ -0,0 +1,7 @@ +func = abc + def + -- a + -- b + -- comment + where + abc = 13 + def = 1 diff --git a/data/Test345.hs b/data/Test345.hs new file mode 100644 index 0000000..613a398 --- /dev/null +++ b/data/Test345.hs @@ -0,0 +1,13 @@ +zItazySunefp twgq nlyo lwojjoBiecao = + let mhIarjyai = + ukwAausnfcn + $ XojlsTOSR.vuwOvuvdAZUOJaa + $ XojlsTOSR.vkesForanLiufjeDI + $ XojlsTOSR.vkesForanLiufjeDI + $ XojlsTOSR.popjAyijoWarueeP + $ XojlsTOSR.jpwuPmafuDqlbkt nlyo + $ XojlsTOSR.jpwuPmafuDqlbkt xxneswWhxwng + $ XojlsTOSR.jpwuPmafuDqlbkt oloCuxeDdow + $ XojlsTOSR.jpwuPmafuDqlbkt (uwurrvoNnukzefuDjeh lwojjoBiecao nlyo) + $ etOslnoz lwojjoBiecao + in kucotg $ (bbbr, Yoxe.Dwzbuzi.zrLokoTnuy piv) diff --git a/data/Test346.hs b/data/Test346.hs new file mode 100644 index 0000000..83ba0bc --- /dev/null +++ b/data/Test346.hs @@ -0,0 +1,2 @@ +-- test +module MyModule where diff --git a/data/Test347.hs b/data/Test347.hs new file mode 100644 index 0000000..d01c656 --- /dev/null +++ b/data/Test347.hs @@ -0,0 +1,8 @@ +foo = + [ ("xxx", "xx") + , -- + ("xx" , "xx") + -- + , ("xx" , "xxxxx") + , ("xx" , "xx") + ] diff --git a/data/Test348.hs b/data/Test348.hs new file mode 100644 index 0000000..d0b4eb5 --- /dev/null +++ b/data/Test348.hs @@ -0,0 +1,8 @@ +foo = + [ ("xx", "xx") + , ( "xx" -- + , "xx" + ) + , ("xx", "xxxxx") + , ("xx", "xx") + ] diff --git a/data/Test349.hs b/data/Test349.hs new file mode 100644 index 0000000..0d374de --- /dev/null +++ b/data/Test349.hs @@ -0,0 +1,6 @@ +module Main + ( DataTypeI + , DataTypeII(DataConstructor) + -- * Haddock heading + , name + ) where diff --git a/data/Test35.hs b/data/Test35.hs new file mode 100644 index 0000000..7e217d5 --- /dev/null +++ b/data/Test35.hs @@ -0,0 +1,2 @@ +{-# LANGUAGE ScopedTypeVariables #-} +func :: forall (a :: *) b . a -> b diff --git a/data/Test350.hs b/data/Test350.hs new file mode 100644 index 0000000..0f5b4e9 --- /dev/null +++ b/data/Test350.hs @@ -0,0 +1,23 @@ +xeoeqibIaib + :: ( KqujhIsaus m + , XivuvIpoboi Droqifim m + , IgorvOtowtf m + , RyagaYaqac m + , QouruDU m + ) + => MaptAdfuxgu + -> Zcnxg NsxayqmvIjsezea -- ^ if Lvqucoo, opsip jl reyoyhk lfil qaculxgd + -> QNOZqwuzg + -> Eoattuq + '[ XkatytdWdquraosu -- test comment + , KyezKijim -- another test comment + , DjmioeePuoeg + , NinrxoiOwezc + , QATAlrijacpk + , TrutvotwIwifiqOjdtu + , CoMmuatjwr + , BoZckzqyodseZole + , VagfwoXaeChfqe + ] + m + () diff --git a/data/Test351.hs b/data/Test351.hs new file mode 100644 index 0000000..fe25514 --- /dev/null +++ b/data/Test351.hs @@ -0,0 +1,7 @@ +createRedirectedProcess processConfig = do + let redirectedProc = (_processConfig_inner processConfig) + { std_in = CreatePipe + , std_out = CreatePipe + , std_err = CreatePipe + } + foo diff --git a/data/Test352.hs b/data/Test352.hs new file mode 100644 index 0000000..3e5d558 --- /dev/null +++ b/data/Test352.hs @@ -0,0 +1,5 @@ +instance HasDependencies SomeDataModel where + -- N.B. Here is a bunch of explanatory context about the relationship + -- between these data models or whatever. + type Dependencies SomeDataModel + = (SomeOtherDataModelId, SomeOtherOtherDataModelId) diff --git a/data/Test353.hs b/data/Test353.hs new file mode 100644 index 0000000..cedb99d --- /dev/null +++ b/data/Test353.hs @@ -0,0 +1,4 @@ +func = + do + y + >>= x diff --git a/data/Test354.hs b/data/Test354.hs new file mode 100644 index 0000000..e082c6d --- /dev/null +++ b/data/Test354.hs @@ -0,0 +1,4 @@ +-- brittany { lconfig_indentAmount: 4, lconfig_indentPolicy: IndentPolicyMultiple } +func = + mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj + + mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj diff --git a/data/Test355.hs b/data/Test355.hs new file mode 100644 index 0000000..56cf385 --- /dev/null +++ b/data/Test355.hs @@ -0,0 +1,5 @@ +-- brittany { lconfig_indentAmount: 4, lconfig_indentPolicy: IndentPolicyMultiple } +foo = do + let aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + foo diff --git a/data/Test356.hs b/data/Test356.hs new file mode 100644 index 0000000..94a19a4 --- /dev/null +++ b/data/Test356.hs @@ -0,0 +1,11 @@ +-- brittany { lconfig_indentAmount: 8, lconfig_indentPolicy: IndentPolicyMultiple } +foo = do + let aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + foo +foo = do + let aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa = + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + foo diff --git a/data/Test357.hs b/data/Test357.hs new file mode 100644 index 0000000..9fd454a --- /dev/null +++ b/data/Test357.hs @@ -0,0 +1,7 @@ +-- brittany { lconfig_indentAmount: 4, lconfig_indentPolicy: IndentPolicyMultiple } +foo = asdyf8asdf + "ajsdfas" + [ asjdf asyhf $ do + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + ] diff --git a/data/Test358.hs b/data/Test358.hs new file mode 100644 index 0000000..7a121e7 --- /dev/null +++ b/data/Test358.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func :: a -> a diff --git a/data/Test359.hs b/data/Test359.hs new file mode 100644 index 0000000..6991c53 --- /dev/null +++ b/data/Test359.hs @@ -0,0 +1,4 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func + :: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd diff --git a/data/Test36.hs b/data/Test36.hs new file mode 100644 index 0000000..7fc70e4 --- /dev/null +++ b/data/Test36.hs @@ -0,0 +1 @@ +func :: a -> b -- comment diff --git a/data/Test360.hs b/data/Test360.hs new file mode 100644 index 0000000..b7c0128 --- /dev/null +++ b/data/Test360.hs @@ -0,0 +1,5 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func + :: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + -> lakjsdlkjasldkj + -> lakjsdlkjasldkj diff --git a/data/Test361.hs b/data/Test361.hs new file mode 100644 index 0000000..ffd3ff9 --- /dev/null +++ b/data/Test361.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func :: ((a)) diff --git a/data/Test362.hs b/data/Test362.hs new file mode 100644 index 0000000..df79511 --- /dev/null +++ b/data/Test362.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func :: (a -> a) -> a diff --git a/data/Test363.hs b/data/Test363.hs new file mode 100644 index 0000000..921d92d --- /dev/null +++ b/data/Test363.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func :: a -> (a -> a) diff --git a/data/Test364.hs b/data/Test364.hs new file mode 100644 index 0000000..ed845fb --- /dev/null +++ b/data/Test364.hs @@ -0,0 +1,3 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func :: (((((((((()))))))))) +-- current output is.. funny. wonder if that can/needs to be improved.. diff --git a/data/Test365.hs b/data/Test365.hs new file mode 100644 index 0000000..bf8f673 --- /dev/null +++ b/data/Test365.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func :: () diff --git a/data/Test366.hs b/data/Test366.hs new file mode 100644 index 0000000..a478841 --- /dev/null +++ b/data/Test366.hs @@ -0,0 +1,6 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func + :: ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + -> lakjsdlkjasldkj + -> lakjsdlkjasldkj + ) diff --git a/data/Test367.hs b/data/Test367.hs new file mode 100644 index 0000000..165c111 --- /dev/null +++ b/data/Test367.hs @@ -0,0 +1,4 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func + :: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + -> (lakjsdlkjasldkj -> lakjsdlkjasldkj) diff --git a/data/Test368.hs b/data/Test368.hs new file mode 100644 index 0000000..4a1e980 --- /dev/null +++ b/data/Test368.hs @@ -0,0 +1,4 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func + :: (lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd -> lakjsdlkjasldkj) + -> lakjsdlkjasldkj diff --git a/data/Test369.hs b/data/Test369.hs new file mode 100644 index 0000000..ed4d90c --- /dev/null +++ b/data/Test369.hs @@ -0,0 +1,6 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func + :: ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + ) + -> lakjsdlkjasldkj diff --git a/data/Test37.hs b/data/Test37.hs new file mode 100644 index 0000000..70aa3c6 --- /dev/null +++ b/data/Test37.hs @@ -0,0 +1,2 @@ +funcA :: a -> b -- comment A +funcB :: a -> b -- comment B diff --git a/data/Test370.hs b/data/Test370.hs new file mode 100644 index 0000000..4621ea3 --- /dev/null +++ b/data/Test370.hs @@ -0,0 +1,6 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func + :: ( ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + ) + ) diff --git a/data/Test371.hs b/data/Test371.hs new file mode 100644 index 0000000..0ec2ac4 --- /dev/null +++ b/data/Test371.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func :: asd -> Either a b diff --git a/data/Test372.hs b/data/Test372.hs new file mode 100644 index 0000000..2adc98c --- /dev/null +++ b/data/Test372.hs @@ -0,0 +1,6 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func + :: asd + -> Either + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd diff --git a/data/Test373.hs b/data/Test373.hs new file mode 100644 index 0000000..faee723 --- /dev/null +++ b/data/Test373.hs @@ -0,0 +1,7 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func + :: asd + -> Trither + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd diff --git a/data/Test374.hs b/data/Test374.hs new file mode 100644 index 0000000..be2766e --- /dev/null +++ b/data/Test374.hs @@ -0,0 +1,7 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func + :: Trither + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + -> asd diff --git a/data/Test375.hs b/data/Test375.hs new file mode 100644 index 0000000..6efe43f --- /dev/null +++ b/data/Test375.hs @@ -0,0 +1,6 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func + :: Trither + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + (lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd -> asd) diff --git a/data/Test376.hs b/data/Test376.hs new file mode 100644 index 0000000..8d7a7ae --- /dev/null +++ b/data/Test376.hs @@ -0,0 +1,8 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func + :: Trither + asd + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + ) diff --git a/data/Test377.hs b/data/Test377.hs new file mode 100644 index 0000000..16d6ee7 --- /dev/null +++ b/data/Test377.hs @@ -0,0 +1,8 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func + :: asd + -> ( Trither + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + ) diff --git a/data/Test378.hs b/data/Test378.hs new file mode 100644 index 0000000..b7a24ca --- /dev/null +++ b/data/Test378.hs @@ -0,0 +1,8 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func + :: asd + -> ( Trither + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + ) + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd diff --git a/data/Test379.hs b/data/Test379.hs new file mode 100644 index 0000000..50f95b2 --- /dev/null +++ b/data/Test379.hs @@ -0,0 +1,8 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func + :: ( Trither + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + ) + lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + -> asd diff --git a/data/Test38.hs b/data/Test38.hs new file mode 100644 index 0000000..6978eb6 --- /dev/null +++ b/data/Test38.hs @@ -0,0 +1,11 @@ +-- a +func -- b + :: -- c + a -- d + -> -- e + ( -- f + c -- g + , -- h + d -- i + ) -- j +-- k diff --git a/data/Test380.hs b/data/Test380.hs new file mode 100644 index 0000000..4453786 --- /dev/null +++ b/data/Test380.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func :: [a -> b] diff --git a/data/Test381.hs b/data/Test381.hs new file mode 100644 index 0000000..faf63f1 --- /dev/null +++ b/data/Test381.hs @@ -0,0 +1,5 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func + :: [ lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + ] diff --git a/data/Test382.hs b/data/Test382.hs new file mode 100644 index 0000000..fbcaa1c --- /dev/null +++ b/data/Test382.hs @@ -0,0 +1,6 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func + :: [ ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + ) + ] diff --git a/data/Test383.hs b/data/Test383.hs new file mode 100644 index 0000000..edfefd8 --- /dev/null +++ b/data/Test383.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func :: (a, b, c) diff --git a/data/Test384.hs b/data/Test384.hs new file mode 100644 index 0000000..cb8e4cd --- /dev/null +++ b/data/Test384.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func :: ((a, b, c), (a, b, c), (a, b, c)) diff --git a/data/Test385.hs b/data/Test385.hs new file mode 100644 index 0000000..8177c7f --- /dev/null +++ b/data/Test385.hs @@ -0,0 +1,6 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func + :: ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + , lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + , lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + ) diff --git a/data/Test386.hs b/data/Test386.hs new file mode 100644 index 0000000..e3efa79 --- /dev/null +++ b/data/Test386.hs @@ -0,0 +1,7 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func + :: ( ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + , (lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd) + , lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + ) + ) diff --git a/data/Test387.hs b/data/Test387.hs new file mode 100644 index 0000000..3a64ee9 --- /dev/null +++ b/data/Test387.hs @@ -0,0 +1,7 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func + :: [ ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + , lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + , lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + ) + ] diff --git a/data/Test388.hs b/data/Test388.hs new file mode 100644 index 0000000..15b0b06 --- /dev/null +++ b/data/Test388.hs @@ -0,0 +1,3 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +{-# LANGUAGE ScopedTypeVariables #-} +func :: forall (a :: *) b . a -> b diff --git a/data/Test389.hs b/data/Test389.hs new file mode 100644 index 0000000..5acb0b6 --- /dev/null +++ b/data/Test389.hs @@ -0,0 +1,11 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +{-# LANGUAGE ScopedTypeVariables #-} +func + :: forall m + . Foo + => ColMap2 + -> ColInfo + -> ColInfo + -> ColInfo + -> ColInfo + -> m () diff --git a/data/Test39.hs b/data/Test39.hs new file mode 100644 index 0000000..9c9b324 --- /dev/null +++ b/data/Test39.hs @@ -0,0 +1,4 @@ +func = f + where + {-# INLINE f #-} + f = id diff --git a/data/Test390.hs b/data/Test390.hs new file mode 100644 index 0000000..72f2d0a --- /dev/null +++ b/data/Test390.hs @@ -0,0 +1,11 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +{-# LANGUAGE ScopedTypeVariables #-} +func + :: forall m + . ColMap2 + -> ColInfo + -> ColInfo + -> ColInfo + -> ColInfo + -> ColInfo + -> m () diff --git a/data/Test391.hs b/data/Test391.hs new file mode 100644 index 0000000..15b0b06 --- /dev/null +++ b/data/Test391.hs @@ -0,0 +1,3 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +{-# LANGUAGE ScopedTypeVariables #-} +func :: forall (a :: *) b . a -> b diff --git a/data/Test392.hs b/data/Test392.hs new file mode 100644 index 0000000..de8ad75 --- /dev/null +++ b/data/Test392.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func :: a -> b -- comment diff --git a/data/Test393.hs b/data/Test393.hs new file mode 100644 index 0000000..1a15a53 --- /dev/null +++ b/data/Test393.hs @@ -0,0 +1,3 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +funcA :: a -> b -- comment A +funcB :: a -> b -- comment B diff --git a/data/Test394.hs b/data/Test394.hs new file mode 100644 index 0000000..44eb854 --- /dev/null +++ b/data/Test394.hs @@ -0,0 +1,11 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +-- a +func -- b + :: -- c + a -- d + -> -- e + ( -- f + c -- g + , -- h + d -- i + ) -- j-- k diff --git a/data/Test395.hs b/data/Test395.hs new file mode 100644 index 0000000..729290d --- /dev/null +++ b/data/Test395.hs @@ -0,0 +1,3 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +{-# LANGUAGE ImplicitParams #-} +func :: (?asd::Int) -> () diff --git a/data/Test396.hs b/data/Test396.hs new file mode 100644 index 0000000..f706d17 --- /dev/null +++ b/data/Test396.hs @@ -0,0 +1,8 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +{-# LANGUAGE ImplicitParams #-} +func + :: ( ?asd + :: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + -> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + ) + -> () diff --git a/data/Test397.hs b/data/Test397.hs new file mode 100644 index 0000000..750f3f9 --- /dev/null +++ b/data/Test397.hs @@ -0,0 +1,5 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = f + where + {-# INLINE f #-} + f = id diff --git a/data/Test398.hs b/data/Test398.hs new file mode 100644 index 0000000..8770767 --- /dev/null +++ b/data/Test398.hs @@ -0,0 +1,5 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = ($) + where + {-# INLINE ($) #-} + ($) = id diff --git a/data/Test399.hs b/data/Test399.hs new file mode 100644 index 0000000..996e831 --- /dev/null +++ b/data/Test399.hs @@ -0,0 +1,5 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = f + where + {-# INLINE CONLIKE [1] f #-} + f = id diff --git a/data/Test4.hs b/data/Test4.hs new file mode 100644 index 0000000..e517aa0 --- /dev/null +++ b/data/Test4.hs @@ -0,0 +1 @@ +func :: ((a)) diff --git a/data/Test40.hs b/data/Test40.hs new file mode 100644 index 0000000..c182430 --- /dev/null +++ b/data/Test40.hs @@ -0,0 +1,4 @@ +func = ($) + where + {-# INLINE ($) #-} + ($) = id diff --git a/data/Test400.hs b/data/Test400.hs new file mode 100644 index 0000000..8b00a95 --- /dev/null +++ b/data/Test400.hs @@ -0,0 +1,5 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = f + where + {-# INLINE [~1] f #-} + f = id diff --git a/data/Test401.hs b/data/Test401.hs new file mode 100644 index 0000000..7d334ba --- /dev/null +++ b/data/Test401.hs @@ -0,0 +1,4 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +data Foo = Bar + { foo :: Baz + } diff --git a/data/Test402.hs b/data/Test402.hs new file mode 100644 index 0000000..f94f463 --- /dev/null +++ b/data/Test402.hs @@ -0,0 +1,4 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +data Foo = Bar + { foo, bar :: Baz + } diff --git a/data/Test403.hs b/data/Test403.hs new file mode 100644 index 0000000..3b2e688 --- /dev/null +++ b/data/Test403.hs @@ -0,0 +1,5 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +data Foo = Bar + { foo :: Baz + , bar :: Bizzz + } diff --git a/data/Test404.hs b/data/Test404.hs new file mode 100644 index 0000000..9144cc0 --- /dev/null +++ b/data/Test404.hs @@ -0,0 +1,5 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +data Foo = Bar + { foo, biz :: Baz + , bar :: Bizzz + } diff --git a/data/Test405.hs b/data/Test405.hs new file mode 100644 index 0000000..7d20e0d --- /dev/null +++ b/data/Test405.hs @@ -0,0 +1,6 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +data Foo = Bar + { foo :: Baz + , bar :: Bizzz + } + deriving Show diff --git a/data/Test406.hs b/data/Test406.hs new file mode 100644 index 0000000..cfe7ae2 --- /dev/null +++ b/data/Test406.hs @@ -0,0 +1,6 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +data Foo = Bar + { foo :: Baz + , bar :: Bizzz + } + deriving (Show, Eq, Monad, Functor, Traversable, Foldable) diff --git a/data/Test407.hs b/data/Test407.hs new file mode 100644 index 0000000..b889d43 --- /dev/null +++ b/data/Test407.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func x = x diff --git a/data/Test408.hs b/data/Test408.hs new file mode 100644 index 0000000..2764fb5 --- /dev/null +++ b/data/Test408.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +x *** y = x diff --git a/data/Test409.hs b/data/Test409.hs new file mode 100644 index 0000000..a9a0917 --- /dev/null +++ b/data/Test409.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +(***) x y = x diff --git a/data/Test41.hs b/data/Test41.hs new file mode 100644 index 0000000..205a728 --- /dev/null +++ b/data/Test41.hs @@ -0,0 +1,4 @@ +func = f + where + {-# INLINE CONLIKE [1] f #-} + f = id diff --git a/data/Test410.hs b/data/Test410.hs new file mode 100644 index 0000000..155d06d --- /dev/null +++ b/data/Test410.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func _ = x diff --git a/data/Test411.hs b/data/Test411.hs new file mode 100644 index 0000000..73dc40a --- /dev/null +++ b/data/Test411.hs @@ -0,0 +1,3 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable = + x diff --git a/data/Test412.hs b/data/Test412.hs new file mode 100644 index 0000000..92a61f3 --- /dev/null +++ b/data/Test412.hs @@ -0,0 +1,3 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable + = x diff --git a/data/Test413.hs b/data/Test413.hs new file mode 100644 index 0000000..a5f08d9 --- /dev/null +++ b/data/Test413.hs @@ -0,0 +1,3 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable a b + = x diff --git a/data/Test414.hs b/data/Test414.hs new file mode 100644 index 0000000..c0690eb --- /dev/null +++ b/data/Test414.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func (A a) = a diff --git a/data/Test415.hs b/data/Test415.hs new file mode 100644 index 0000000..fb95ff8 --- /dev/null +++ b/data/Test415.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func (x : xr) = x diff --git a/data/Test416.hs b/data/Test416.hs new file mode 100644 index 0000000..490720c --- /dev/null +++ b/data/Test416.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func (x :+: xr) = x diff --git a/data/Test417.hs b/data/Test417.hs new file mode 100644 index 0000000..8ee6b8b --- /dev/null +++ b/data/Test417.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func | True = x diff --git a/data/Test418.hs b/data/Test418.hs new file mode 100644 index 0000000..506b4d1 --- /dev/null +++ b/data/Test418.hs @@ -0,0 +1,4 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func x + | x = simple expression + | otherwise = 0 diff --git a/data/Test419.hs b/data/Test419.hs new file mode 100644 index 0000000..ee128f1 --- /dev/null +++ b/data/Test419.hs @@ -0,0 +1,4 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func x + | a somewhat longer guard x = "and a somewhat longer expession that does not" + | otherwise = "fit without putting the guards in new lines" diff --git a/data/Test42.hs b/data/Test42.hs new file mode 100644 index 0000000..cfd38bb --- /dev/null +++ b/data/Test42.hs @@ -0,0 +1,2 @@ +{-# NOINLINE func #-} +func :: Int diff --git a/data/Test420.hs b/data/Test420.hs new file mode 100644 index 0000000..a8f1881 --- /dev/null +++ b/data/Test420.hs @@ -0,0 +1,8 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func x + | very long guard, another rather long guard that refers to x = nontrivial + expression + foo + bar + alsdkjlasdjlasj + | otherwise = 0 diff --git a/data/Test421.hs b/data/Test421.hs new file mode 100644 index 0000000..5dd669d --- /dev/null +++ b/data/Test421.hs @@ -0,0 +1,6 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func x + | very long guard, another rather long guard that refers to x + = nontrivialexpression foo bar alsdkjlasdjlasj + | otherwise + = 0 diff --git a/data/Test422.hs b/data/Test422.hs new file mode 100644 index 0000000..830e3ee --- /dev/null +++ b/data/Test422.hs @@ -0,0 +1,7 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func x + | very loooooooooooooooooooooooooooooong guard + , another rather long guard that refers to x + = nontrivial expression foo bar alsdkjlasdjlasj + | otherwise + = 0 diff --git a/data/Test423.hs b/data/Test423.hs new file mode 100644 index 0000000..88d75b3 --- /dev/null +++ b/data/Test423.hs @@ -0,0 +1,3 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = x +describe "infix op" $ do diff --git a/data/Test424.hs b/data/Test424.hs new file mode 100644 index 0000000..1258fc6 --- /dev/null +++ b/data/Test424.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = x + x diff --git a/data/Test425.hs b/data/Test425.hs new file mode 100644 index 0000000..1ed0c86 --- /dev/null +++ b/data/Test425.hs @@ -0,0 +1,4 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = + mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj + + mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj diff --git a/data/Test426.hs b/data/Test426.hs new file mode 100644 index 0000000..e70a294 --- /dev/null +++ b/data/Test426.hs @@ -0,0 +1,5 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = + mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj + + mweroiuxlskdfjlksj + + mweroiuxlskdfjlksj diff --git a/data/Test427.hs b/data/Test427.hs new file mode 100644 index 0000000..38b5fd2 --- /dev/null +++ b/data/Test427.hs @@ -0,0 +1,5 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = + mweroiuxlskdfjlksj + + mweroiuxlskdfjlksj + + mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj diff --git a/data/Test428.hs b/data/Test428.hs new file mode 100644 index 0000000..ab8bc90 --- /dev/null +++ b/data/Test428.hs @@ -0,0 +1,6 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = 1 +func = "abc" +func = 1.1e5 +func = 'x' +func = 981409823458910394810928414192837123987123987123 diff --git a/data/Test429.hs b/data/Test429.hs new file mode 100644 index 0000000..6fcf5ea --- /dev/null +++ b/data/Test429.hs @@ -0,0 +1,5 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +{-# LANGUAGE LambdaCase #-} +func = \case + FooBar -> x + Baz -> y diff --git a/data/Test43.hs b/data/Test43.hs new file mode 100644 index 0000000..83572d8 --- /dev/null +++ b/data/Test43.hs @@ -0,0 +1,4 @@ +func = f + where + {-# INLINE [~1] f #-} + f = id diff --git a/data/Test430.hs b/data/Test430.hs new file mode 100644 index 0000000..3efc267 --- /dev/null +++ b/data/Test430.hs @@ -0,0 +1,3 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = \x -> abc +describe "app" $ do diff --git a/data/Test431.hs b/data/Test431.hs new file mode 100644 index 0000000..c1c1c58 --- /dev/null +++ b/data/Test431.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = klajsdas klajsdas klajsdas diff --git a/data/Test432.hs b/data/Test432.hs new file mode 100644 index 0000000..aa2b380 --- /dev/null +++ b/data/Test432.hs @@ -0,0 +1,4 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd + lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd + lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd diff --git a/data/Test433.hs b/data/Test433.hs new file mode 100644 index 0000000..851e5cb --- /dev/null +++ b/data/Test433.hs @@ -0,0 +1,5 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd + lakjsdlajsdljas + lakjsdlajsdljas + lakjsdlajsdljas diff --git a/data/Test434.hs b/data/Test434.hs new file mode 100644 index 0000000..f52edc1 --- /dev/null +++ b/data/Test434.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = (1 +) diff --git a/data/Test435.hs b/data/Test435.hs new file mode 100644 index 0000000..09d341e --- /dev/null +++ b/data/Test435.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = (+ 1) diff --git a/data/Test436.hs b/data/Test436.hs new file mode 100644 index 0000000..25a7bda --- /dev/null +++ b/data/Test436.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = (1 `abc`) diff --git a/data/Test437.hs b/data/Test437.hs new file mode 100644 index 0000000..3c56cf8 --- /dev/null +++ b/data/Test437.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = (`abc` 1) diff --git a/data/Test438.hs b/data/Test438.hs new file mode 100644 index 0000000..a9c30d5 --- /dev/null +++ b/data/Test438.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = (abc, def) diff --git a/data/Test439.hs b/data/Test439.hs new file mode 100644 index 0000000..90cb29d --- /dev/null +++ b/data/Test439.hs @@ -0,0 +1,5 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = + ( lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd + , lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd + ) diff --git a/data/Test44.hs b/data/Test44.hs new file mode 100644 index 0000000..7dd43f0 --- /dev/null +++ b/data/Test44.hs @@ -0,0 +1,2 @@ +data Foo = Bar {} +data Biz = Baz diff --git a/data/Test440.hs b/data/Test440.hs new file mode 100644 index 0000000..0d46933 --- /dev/null +++ b/data/Test440.hs @@ -0,0 +1,4 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +foo = + let longIdentifierForShortValue = 1 + in longIdentifierForShortValue + longIdentifierForShortValue diff --git a/data/Test441.hs b/data/Test441.hs new file mode 100644 index 0000000..6a77a85 --- /dev/null +++ b/data/Test441.hs @@ -0,0 +1,4 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = do + stmt + stmt diff --git a/data/Test442.hs b/data/Test442.hs new file mode 100644 index 0000000..3ab95e7 --- /dev/null +++ b/data/Test442.hs @@ -0,0 +1,4 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = do + x <- stmt + stmt x diff --git a/data/Test443.hs b/data/Test443.hs new file mode 100644 index 0000000..c832f21 --- /dev/null +++ b/data/Test443.hs @@ -0,0 +1,4 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = do + let x = 13 + stmt x diff --git a/data/Test444.hs b/data/Test444.hs new file mode 100644 index 0000000..31b1cc7 --- /dev/null +++ b/data/Test444.hs @@ -0,0 +1,8 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = + foooooo + $ [ case + foooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo + of + _ -> True + ] diff --git a/data/Test445.hs b/data/Test445.hs new file mode 100644 index 0000000..c3f325f --- /dev/null +++ b/data/Test445.hs @@ -0,0 +1,5 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +{-# LANGUAGE MultiWayIf #-} +func = if + | cond1 -> loooooooooooooooooooooooooooooong expr1 + | cond2 -> loooooooooooooooooooooooooooooong expr2 diff --git a/data/Test446.hs b/data/Test446.hs new file mode 100644 index 0000000..4d8efd2 --- /dev/null +++ b/data/Test446.hs @@ -0,0 +1,7 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +{-# LANGUAGE MultiWayIf #-} +func = do + foo + bar $ if + | cond1 -> loooooooooooooooooooooooooooooong expr1 + | cond2 -> loooooooooooooooooooooooooooooong expr2 diff --git a/data/Test447.hs b/data/Test447.hs new file mode 100644 index 0000000..6e718f0 --- /dev/null +++ b/data/Test447.hs @@ -0,0 +1,7 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = + foo + $ [ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + , bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb + ] + ++ [ccccccccccccccccccccccccccccccccccccccccccccccccccccccccc] diff --git a/data/Test448.hs b/data/Test448.hs new file mode 100644 index 0000000..3884989 --- /dev/null +++ b/data/Test448.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +module Main where diff --git a/data/Test449.hs b/data/Test449.hs new file mode 100644 index 0000000..7a6295f --- /dev/null +++ b/data/Test449.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +module Main () where diff --git a/data/Test45.hs b/data/Test45.hs new file mode 100644 index 0000000..d1c8c85 --- /dev/null +++ b/data/Test45.hs @@ -0,0 +1,3 @@ +data Foo = Bar + { foo :: Baz + } diff --git a/data/Test450.hs b/data/Test450.hs new file mode 100644 index 0000000..89316b0 --- /dev/null +++ b/data/Test450.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +module Main (main) where diff --git a/data/Test451.hs b/data/Test451.hs new file mode 100644 index 0000000..a55d851 --- /dev/null +++ b/data/Test451.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +module Main (main, test1, test2) where diff --git a/data/Test452.hs b/data/Test452.hs new file mode 100644 index 0000000..4fe8cbf --- /dev/null +++ b/data/Test452.hs @@ -0,0 +1,13 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +module Main + ( main + , test1 + , test2 + , test3 + , test4 + , test5 + , test6 + , test7 + , test8 + , test9 + ) where diff --git a/data/Test453.hs b/data/Test453.hs new file mode 100644 index 0000000..eaeb665 --- /dev/null +++ b/data/Test453.hs @@ -0,0 +1,13 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +module Main + ( main + -- main + , test1 + , test2 + -- Test 3 + , test3 + , test4 + -- Test 5 + , test5 + -- Test 6 + ) where diff --git a/data/Test454.hs b/data/Test454.hs new file mode 100644 index 0000000..c2e7a8e --- /dev/null +++ b/data/Test454.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +module Main (Test(..)) where diff --git a/data/Test455.hs b/data/Test455.hs new file mode 100644 index 0000000..6191afd --- /dev/null +++ b/data/Test455.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +module Main (module Main) where diff --git a/data/Test456.hs b/data/Test456.hs new file mode 100644 index 0000000..3d9694b --- /dev/null +++ b/data/Test456.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +module Main (Test(Test, a, b)) where diff --git a/data/Test457.hs b/data/Test457.hs new file mode 100644 index 0000000..82a8e14 --- /dev/null +++ b/data/Test457.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +module Main (Test()) where diff --git a/data/Test458.hs b/data/Test458.hs new file mode 100644 index 0000000..df50e76 --- /dev/null +++ b/data/Test458.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +-- Intentionally left empty diff --git a/data/Test459.hs b/data/Test459.hs new file mode 100644 index 0000000..0dea4be --- /dev/null +++ b/data/Test459.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import Data.List diff --git a/data/Test46.hs b/data/Test46.hs new file mode 100644 index 0000000..2472782 --- /dev/null +++ b/data/Test46.hs @@ -0,0 +1,3 @@ +data Foo = Bar + { foo, bar :: Baz + } diff --git a/data/Test460.hs b/data/Test460.hs new file mode 100644 index 0000000..50b8621 --- /dev/null +++ b/data/Test460.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import Data.List as L diff --git a/data/Test461.hs b/data/Test461.hs new file mode 100644 index 0000000..835646b --- /dev/null +++ b/data/Test461.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import qualified Data.List diff --git a/data/Test462.hs b/data/Test462.hs new file mode 100644 index 0000000..7e772a5 --- /dev/null +++ b/data/Test462.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import qualified Data.List as L diff --git a/data/Test463.hs b/data/Test463.hs new file mode 100644 index 0000000..1bfa264 --- /dev/null +++ b/data/Test463.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import safe Data.List as L diff --git a/data/Test464.hs b/data/Test464.hs new file mode 100644 index 0000000..53fad4c --- /dev/null +++ b/data/Test464.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import {-# SOURCE #-} Data.List () diff --git a/data/Test465.hs b/data/Test465.hs new file mode 100644 index 0000000..8e5b381 --- /dev/null +++ b/data/Test465.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import safe qualified Data.List hiding (nub) diff --git a/data/Test466.hs b/data/Test466.hs new file mode 100644 index 0000000..73046d6 --- /dev/null +++ b/data/Test466.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import {-# SOURCE #-} safe qualified Data.List diff --git a/data/Test467.hs b/data/Test467.hs new file mode 100644 index 0000000..7745833 --- /dev/null +++ b/data/Test467.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import qualified "base" Data.List diff --git a/data/Test468.hs b/data/Test468.hs new file mode 100644 index 0000000..2c704b4 --- /dev/null +++ b/data/Test468.hs @@ -0,0 +1,4 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import {-# SOURCE #-} safe qualified "base" Data.List as L +import {-# SOURCE #-} safe qualified "base" Data.List () +import {-# SOURCE #-} safe qualified Data.List hiding () diff --git a/data/Test469.hs b/data/Test469.hs new file mode 100644 index 0000000..fa53576 --- /dev/null +++ b/data/Test469.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import qualified Data.List () diff --git a/data/Test47.hs b/data/Test47.hs new file mode 100644 index 0000000..2dbac94 --- /dev/null +++ b/data/Test47.hs @@ -0,0 +1,4 @@ +data Foo = Bar + { foo :: Baz + , bars :: Bizzz + } diff --git a/data/Test470.hs b/data/Test470.hs new file mode 100644 index 0000000..97ce770 --- /dev/null +++ b/data/Test470.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import Data.List (nub) diff --git a/data/Test471.hs b/data/Test471.hs new file mode 100644 index 0000000..fb499b1 --- /dev/null +++ b/data/Test471.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import Data.List (foldl', indexElem, nub) diff --git a/data/Test472.hs b/data/Test472.hs new file mode 100644 index 0000000..39cfd67 --- /dev/null +++ b/data/Test472.hs @@ -0,0 +1,16 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import Test + ( Long + , anymore + , fit + , items + , line + , list + , not + , onA + , quite + , single + , that + , will + , with + ) diff --git a/data/Test473.hs b/data/Test473.hs new file mode 100644 index 0000000..016a6b7 --- /dev/null +++ b/data/Test473.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import Test ((+), T, T2(), T3(..), T4(T4), T5(T5, t5), T6((<|>))) diff --git a/data/Test474.hs b/data/Test474.hs new file mode 100644 index 0000000..1716691 --- /dev/null +++ b/data/Test474.hs @@ -0,0 +1,3 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import Test hiding () +import Test as T hiding () diff --git a/data/Test475.hs b/data/Test475.hs new file mode 100644 index 0000000..adbfb6e --- /dev/null +++ b/data/Test475.hs @@ -0,0 +1,15 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import Prelude as X + hiding + ( head + , init + , last + , maximum + , minimum + , pred + , read + , readFile + , succ + , tail + , undefined + ) diff --git a/data/Test476.hs b/data/Test476.hs new file mode 100644 index 0000000..900fb1f --- /dev/null +++ b/data/Test476.hs @@ -0,0 +1,5 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import MoreThanSufficientlyLongModuleNameWithSome + (compact, fit, inA, items, layout, not, that, will) +import TestJustAbitToLongModuleNameLikeThisOneIs () +import TestJustShortEnoughModuleNameLikeThisOne () diff --git a/data/Test477.hs b/data/Test477.hs new file mode 100644 index 0000000..0f32c77 --- /dev/null +++ b/data/Test477.hs @@ -0,0 +1,3 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import TestJustAbitToLongModuleNameLikeThisOneI as T +import TestJustShortEnoughModuleNameLikeThisOn as T diff --git a/data/Test478.hs b/data/Test478.hs new file mode 100644 index 0000000..3c047b9 --- /dev/null +++ b/data/Test478.hs @@ -0,0 +1,3 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import TestJustAbitToLongModuleNameLikeTh hiding () +import TestJustShortEnoughModuleNameLike hiding () diff --git a/data/Test479.hs b/data/Test479.hs new file mode 100644 index 0000000..3e8adc0 --- /dev/null +++ b/data/Test479.hs @@ -0,0 +1,3 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import MoreThanSufficientlyLongModuleNameWithSome + (compact, fit, inA, items, layout, not, that, will) diff --git a/data/Test48.hs b/data/Test48.hs new file mode 100644 index 0000000..56c5cba --- /dev/null +++ b/data/Test48.hs @@ -0,0 +1,4 @@ +data Foo = Bar + { foo, biz :: Baz + , bar :: Bizzz + } diff --git a/data/Test480.hs b/data/Test480.hs new file mode 100644 index 0000000..4bc1c0c --- /dev/null +++ b/data/Test480.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import TestJustShortEnoughModuleNameLike hiding (abc, def, ghci, jklm) diff --git a/data/Test481.hs b/data/Test481.hs new file mode 100644 index 0000000..b6f7509 --- /dev/null +++ b/data/Test481.hs @@ -0,0 +1,5 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +-- Test +import Data.List (nub) -- Test +{- Test -} +import qualified Data.List as L (foldl') {- Test -} diff --git a/data/Test482.hs b/data/Test482.hs new file mode 100644 index 0000000..4fd065e --- /dev/null +++ b/data/Test482.hs @@ -0,0 +1,6 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import Test + ( abc + , def + -- comment + ) diff --git a/data/Test483.hs b/data/Test483.hs new file mode 100644 index 0000000..5a03da5 --- /dev/null +++ b/data/Test483.hs @@ -0,0 +1,5 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import Test + ( abc + -- comment + ) diff --git a/data/Test484.hs b/data/Test484.hs new file mode 100644 index 0000000..7749c61 --- /dev/null +++ b/data/Test484.hs @@ -0,0 +1,12 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import Test + ( abc + -- comment + , def + , ghi + {- comment -} + , jkl + -- comment + ) +-- Test +import Test (test) diff --git a/data/Test485.hs b/data/Test485.hs new file mode 100644 index 0000000..a1879a2 --- /dev/null +++ b/data/Test485.hs @@ -0,0 +1,4 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import Test + ( -- comment + ) diff --git a/data/Test486.hs b/data/Test486.hs new file mode 100644 index 0000000..e66d47a --- /dev/null +++ b/data/Test486.hs @@ -0,0 +1,3 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import Test (longbindingNameThatoverflowsColum) +import Test (Long(List, Of, Things)) diff --git a/data/Test487.hs b/data/Test487.hs new file mode 100644 index 0000000..4fa860d --- /dev/null +++ b/data/Test487.hs @@ -0,0 +1,27 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import Test + ( Thing + ( With + -- Comments + , and + -- also + , items + -- ! + ) + ) +import Test + ( Thing + ( Item + -- and Comment + ) + ) +import Test + ( Thing + ( With + -- Comments + , and + -- also + , items + -- ! + ) + ) diff --git a/data/Test488.hs b/data/Test488.hs new file mode 100644 index 0000000..f65f0d6 --- /dev/null +++ b/data/Test488.hs @@ -0,0 +1,3 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +import VeryLongModuleNameThatCouldEvenCauseAnEmptyBindingListToExpandIntoMultipleLine + () diff --git a/data/Test489.hs b/data/Test489.hs new file mode 100644 index 0000000..f16fa76 --- /dev/null +++ b/data/Test489.hs @@ -0,0 +1,25 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +{-# LANGUAGE BangPatterns #-} +{- + - Test module + -} +module Test + ( test1 + -- ^ test + , test2 + -- | test + , test3 + , test4 + , test5 + , test6 + , test7 + , test8 + , test9 + , test10 + ) where +-- Test +import Data.List (nub) -- Test +{- Test -} +import qualified Data.List as L (foldl') {- Test -} +-- Test +import Test (test) diff --git a/data/Test49.hs b/data/Test49.hs new file mode 100644 index 0000000..3b236c6 --- /dev/null +++ b/data/Test49.hs @@ -0,0 +1,5 @@ +data Foo = Bar + { fooz :: Baz + , bar :: Bizzz + } + deriving Show diff --git a/data/Test490.hs b/data/Test490.hs new file mode 100644 index 0000000..0cf1f73 --- /dev/null +++ b/data/Test490.hs @@ -0,0 +1,5 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = do + abc <- foo +--abc +return () diff --git a/data/Test491.hs b/data/Test491.hs new file mode 100644 index 0000000..b625fed --- /dev/null +++ b/data/Test491.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = (()) diff --git a/data/Test492.hs b/data/Test492.hs new file mode 100644 index 0000000..2585e2d --- /dev/null +++ b/data/Test492.hs @@ -0,0 +1,6 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = do + let + foo True = True + foo _ = False + return () diff --git a/data/Test493.hs b/data/Test493.hs new file mode 100644 index 0000000..2585e2d --- /dev/null +++ b/data/Test493.hs @@ -0,0 +1,6 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = do + let + foo True = True + foo _ = False + return () diff --git a/data/Test494.hs b/data/Test494.hs new file mode 100644 index 0000000..872a368 --- /dev/null +++ b/data/Test494.hs @@ -0,0 +1,6 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = do + let + foo = True + b = False + return () diff --git a/data/Test495.hs b/data/Test495.hs new file mode 100644 index 0000000..43d52fe --- /dev/null +++ b/data/Test495.hs @@ -0,0 +1,6 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = + let + foo = True + b = False + in return () diff --git a/data/Test496.hs b/data/Test496.hs new file mode 100644 index 0000000..d06ea75 --- /dev/null +++ b/data/Test496.hs @@ -0,0 +1,4 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = do + s <- mGet + mSet $ s { _lstate_indent = _lstate_indent state } diff --git a/data/Test497.hs b/data/Test497.hs new file mode 100644 index 0000000..f862333 --- /dev/null +++ b/data/Test497.hs @@ -0,0 +1,7 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = do + s <- mGet + mSet $ s + { _lstate_indent = _lstate_indent state + , _lstate_foo = _lstate_foo state + } diff --git a/data/Test498.hs b/data/Test498.hs new file mode 100644 index 0000000..52505be --- /dev/null +++ b/data/Test498.hs @@ -0,0 +1,7 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = do + s <- mGet + mSet $ s + { _lstate_indent = _lstate_indent lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + , _lstate_foo = _lstate_foo kasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + } diff --git a/data/Test499.hs b/data/Test499.hs new file mode 100644 index 0000000..7362219 --- /dev/null +++ b/data/Test499.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = Foo { _lstate_indent = _lstate_indent state } diff --git a/data/Test5.hs b/data/Test5.hs new file mode 100644 index 0000000..71a352d --- /dev/null +++ b/data/Test5.hs @@ -0,0 +1 @@ +func :: (a -> a) -> a diff --git a/data/Test50.hs b/data/Test50.hs new file mode 100644 index 0000000..f249e56 --- /dev/null +++ b/data/Test50.hs @@ -0,0 +1,8 @@ +data MyRecord = MyConstructor + { bar1, bar2 + :: Loooooooooooooooooooooooooooooooong + -> Loooooooooooooooooooooooooooooooong + , foo1, foo2 + :: Loooooooooooooooooooooooooooooooonger + -> Loooooooooooooooooooooooooooooooonger + } diff --git a/data/Test500.hs b/data/Test500.hs new file mode 100644 index 0000000..9b188e5 --- /dev/null +++ b/data/Test500.hs @@ -0,0 +1,5 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = Foo + { _lstate_indent = _lstate_indent lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + , _lstate_foo = _lstate_foo lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + } diff --git a/data/Test501.hs b/data/Test501.hs new file mode 100644 index 0000000..1cac41f --- /dev/null +++ b/data/Test501.hs @@ -0,0 +1,6 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = do + Foo + { _lstate_indent = _lstate_indent lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + , _lstate_foo = _lstate_foo lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + } diff --git a/data/Test502.hs b/data/Test502.hs new file mode 100644 index 0000000..2482992 --- /dev/null +++ b/data/Test502.hs @@ -0,0 +1,5 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = do +-- abc + -- def + return () diff --git a/data/Test503.hs b/data/Test503.hs new file mode 100644 index 0000000..36aa1f1 --- /dev/null +++ b/data/Test503.hs @@ -0,0 +1,7 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = do + do + return () + -- abc + -- def + return () diff --git a/data/Test504.hs b/data/Test504.hs new file mode 100644 index 0000000..3c3d575 --- /dev/null +++ b/data/Test504.hs @@ -0,0 +1,7 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func + :: Int -- basic indentation amount + -> Int -- currently used width in current line (after indent) + -- used to accurately calc placing of the current-line + -> LayoutDesc + -> Int diff --git a/data/Test505.hs b/data/Test505.hs new file mode 100644 index 0000000..0157f35 --- /dev/null +++ b/data/Test505.hs @@ -0,0 +1,8 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = + (lkjadljasldjalskdjaldjalsdjkalsdjlaksdjlasjdlajsaldskj + $ abc + $ def + $ ghi + $ jkl + ) diff --git a/data/Test506.hs b/data/Test506.hs new file mode 100644 index 0000000..ed27504 --- /dev/null +++ b/data/Test506.hs @@ -0,0 +1,3 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +buildG bounds0 edges0 = accumArray (flip (:)) [] bounds0 (map reassoc edges0) + where reassoc (v, e, w) = (v, (e, w)) diff --git a/data/Test507.hs b/data/Test507.hs new file mode 100644 index 0000000..1795543 --- /dev/null +++ b/data/Test507.hs @@ -0,0 +1,5 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +downloadRepoPackage = case repo of + RepoLocal {..} -> return () + RepoLocal { abc } -> return () + RepoLocal{} -> return () diff --git a/data/Test508.hs b/data/Test508.hs new file mode 100644 index 0000000..5ecfcc9 --- /dev/null +++ b/data/Test508.hs @@ -0,0 +1,8 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = do + let + (primaryPkg, otherPkgs) = selectPrimaryLocalPackage pwd pkgs' + (bproblems, x) = resolveBuildTargets primaryPkg otherPkgs utargets'' + -- default local dir target if there's no given target + utargets'' = "foo" + return () diff --git a/data/Test509.hs b/data/Test509.hs new file mode 100644 index 0000000..f66ac30 --- /dev/null +++ b/data/Test509.hs @@ -0,0 +1,6 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = + [ (thing, take 10 alts) --TODO: select best ones + | (thing, _got, alts@(_ : _)) <- nosuchFooThing + , gast <- award + ] diff --git a/data/Test51.hs b/data/Test51.hs new file mode 100644 index 0000000..ba064e1 --- /dev/null +++ b/data/Test51.hs @@ -0,0 +1,13 @@ +{-# LANGUAGE DatatypeContexts #-} +data + ( LooooooooooooooooooooongConstraint a + , LooooooooooooooooooooongConstraint b + ) => + MyRecord a b + = MyConstructor + { foo1, foo2 + :: loooooooooooooooooooooooooooooooong + -> loooooooooooooooooooooooooooooooong + , bar :: a + , bazz :: b + } diff --git a/data/Test510.hs b/data/Test510.hs new file mode 100644 index 0000000..e939f8f --- /dev/null +++ b/data/Test510.hs @@ -0,0 +1,6 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = if x + then if y -- y is important + then foo + else bar + else Nothing diff --git a/data/Test511.hs b/data/Test511.hs new file mode 100644 index 0000000..fcc4b7c --- /dev/null +++ b/data/Test511.hs @@ -0,0 +1,8 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +wrapPatPrepend pat prepElem = do + patDocs <- layoutPat pat + case Seq.viewl patDocs of + Seq.EmptyL -> return $ Seq.empty + x1 Seq.:< xR -> do + x1' <- docSeq [prepElem, return x1] + return $ x1' Seq.<| xR diff --git a/data/Test512.hs b/data/Test512.hs new file mode 100644 index 0000000..721607a --- /dev/null +++ b/data/Test512.hs @@ -0,0 +1,7 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +layoutWriteNewlineBlock + :: ( MonadMultiWriter Text.Builder.Builder m + , MonadMultiState LayoutState m + , MonadMultiWriter (Seq String) m + ) + => m () diff --git a/data/Test513.hs b/data/Test513.hs new file mode 100644 index 0000000..19308aa --- /dev/null +++ b/data/Test513.hs @@ -0,0 +1,25 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +{-# LANGUAGE MultiWayIf #-} +readMergePersConfig path shouldCreate conf = do + exists <- liftIO $ System.Directory.doesFileExist path + if + | exists -> do + contents <- liftIO $ ByteString.readFile path -- no lazy IO, tyvm. + fileConf <- case Data.Yaml.decodeEither contents of + Left e -> do + liftIO + $ putStrErrLn + $ "error reading in brittany config from " + ++ path + ++ ":" + liftIO $ putStrErrLn e + mzero + Right x -> return x + return $ fileConf Semigroup.<> conf + | shouldCreate -> do + liftIO $ ByteString.writeFile path $ Data.Yaml.encode $ cMap + (Option . Just . runIdentity) + staticDefaultConfig + return $ conf + | otherwise -> do + return conf diff --git a/data/Test514.hs b/data/Test514.hs new file mode 100644 index 0000000..8dcc5a1 --- /dev/null +++ b/data/Test514.hs @@ -0,0 +1,13 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = BuildReport + where + convertInstallOutcome = case result of + Left BR.PlanningFailed -> PlanningFailed + Left (BR.DependentFailed p) -> DependencyFailed p + Left (BR.DownloadFailed _) -> DownloadFailed + Left (BR.UnpackFailed _) -> UnpackFailed + Left (BR.ConfigureFailed _) -> ConfigureFailed + Left (BR.BuildFailed _) -> BuildFailed + Left (BR.TestsFailed _) -> TestsFailed + Left (BR.InstallFailed _) -> InstallFailed + Right (BR.BuildOk _ _ _) -> InstallOk diff --git a/data/Test515.hs b/data/Test515.hs new file mode 100644 index 0000000..8dcc5a1 --- /dev/null +++ b/data/Test515.hs @@ -0,0 +1,13 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = BuildReport + where + convertInstallOutcome = case result of + Left BR.PlanningFailed -> PlanningFailed + Left (BR.DependentFailed p) -> DependencyFailed p + Left (BR.DownloadFailed _) -> DownloadFailed + Left (BR.UnpackFailed _) -> UnpackFailed + Left (BR.ConfigureFailed _) -> ConfigureFailed + Left (BR.BuildFailed _) -> BuildFailed + Left (BR.TestsFailed _) -> TestsFailed + Left (BR.InstallFailed _) -> InstallFailed + Right (BR.BuildOk _ _ _) -> InstallOk diff --git a/data/Test516.hs b/data/Test516.hs new file mode 100644 index 0000000..ccf86e7 --- /dev/null +++ b/data/Test516.hs @@ -0,0 +1,37 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +showPackageDetailedInfo pkginfo = + renderStyle (style { lineLength = 80, ribbonsPerLine = 1 }) + $ char '*' + $+$ something + [ entry "Synopsis" synopsis hideIfNull reflowParagraphs + , entry + "Versions available" + sourceVersions + (altText null "[ Not available from server ]") + (dispTopVersions 9 (preferredVersions pkginfo)) + , entry + "Versions installed" + installedVersions + (altText + null + (if hasLib pkginfo then "[ Not installed ]" else "[ Unknown ]") + ) + (dispTopVersions 4 (preferredVersions pkginfo)) + , entry "Homepage" homepage orNotSpecified text + , entry "Bug reports" bugReports orNotSpecified text + , entry "Description" description hideIfNull reflowParagraphs + , entry "Category" category hideIfNull text + , entry "License" license alwaysShow disp + , entry "Author" author hideIfNull reflowLines + , entry "Maintainer" maintainer hideIfNull reflowLines + , entry "Source repo" sourceRepo orNotSpecified text + , entry "Executables" executables hideIfNull (commaSep text) + , entry "Flags" flags hideIfNull (commaSep dispFlag) + , entry "Dependencies" dependencies hideIfNull (commaSep dispExtDep) + , entry "Documentation" haddockHtml showIfInstalled text + , entry "Cached" haveTarball alwaysShow dispYesNo + , if not (hasLib pkginfo) + then empty + else text "Modules:" + $+$ nest 4 (vcat (map disp . sort . modules $ pkginfo)) + ] diff --git a/data/Test517.hs b/data/Test517.hs new file mode 100644 index 0000000..5b5926c --- /dev/null +++ b/data/Test517.hs @@ -0,0 +1,4 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +isValidPosition position + | validX && validY = Just position + | otherwise = Nothing diff --git a/data/Test518.hs b/data/Test518.hs new file mode 100644 index 0000000..5583847 --- /dev/null +++ b/data/Test518.hs @@ -0,0 +1,7 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +foo = Reflex.runSpiderHost $ ReflexHost.hostApp $ do + (inputEvent :: Reflex.Event Reflex.Spider String, inputFire :: String + -> IO Bool) <- + ReflexHost.newExternalEvent + liftIO . forkIO . forever $ getLine >>= inputFire + ReflexHost.performEvent_ $ fmap (liftIO . putStrLn) inputEvent diff --git a/data/Test519.hs b/data/Test519.hs new file mode 100644 index 0000000..88cd872 --- /dev/null +++ b/data/Test519.hs @@ -0,0 +1,4 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +-- Test.hs +module Test where +data X = X diff --git a/data/Test52.hs b/data/Test52.hs new file mode 100644 index 0000000..a8b49da --- /dev/null +++ b/data/Test52.hs @@ -0,0 +1,5 @@ +{-# LANGUAGE ScopedTypeVariables #-} +-- brittany { lconfig_allowSinglelineRecord: true } +data MyRecord = forall a . Show a => Bar + { foo :: abittoolongbutnotvery -> abittoolongbutnotvery + } diff --git a/data/Test520.hs b/data/Test520.hs new file mode 100644 index 0000000..d9dac4b --- /dev/null +++ b/data/Test520.hs @@ -0,0 +1,3 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +foldrDesc f z = unSwitchQueue $ \q -> + switch (Min.foldrDesc (f unTaggedF) z q) (Min.foldrAsc (f unTaggedF) z q) diff --git a/data/Test521.hs b/data/Test521.hs new file mode 100644 index 0000000..ff6208b --- /dev/null +++ b/data/Test521.hs @@ -0,0 +1,6 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +autocheckCases = + [ ("Never Deadlocks", representative deadlocksNever) + , ("No Exceptions", representative exceptionsNever) + , ("Consistent Result", alwaysSame) -- already representative + ] diff --git a/data/Test522.hs b/data/Test522.hs new file mode 100644 index 0000000..d3c2fb0 --- /dev/null +++ b/data/Test522.hs @@ -0,0 +1,8 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +autocheckCases = + [ ("Never Deadlocks", representative deadlocksNever) + , ("No Exceptions", representative exceptionsNever) + , ( "Consistent Result" + , alwaysSame -- already representative + ) + ] diff --git a/data/Test523.hs b/data/Test523.hs new file mode 100644 index 0000000..78897cd --- /dev/null +++ b/data/Test523.hs @@ -0,0 +1,6 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = + [ (abc, (1111, 1111)) + , (def, (2, 2)) + , foo -- comment + ] diff --git a/data/Test524.hs b/data/Test524.hs new file mode 100644 index 0000000..0aeb4a8 --- /dev/null +++ b/data/Test524.hs @@ -0,0 +1,3 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +foo a b = g a b -- fooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo + where g a b = b + b * a diff --git a/data/Test525.hs b/data/Test525.hs new file mode 100644 index 0000000..74d9df7 --- /dev/null +++ b/data/Test525.hs @@ -0,0 +1,2 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +foo a b = g a b where g a b = b + b * a -- fooooooooooooooooooooooooooooooooooo diff --git a/data/Test526.hs b/data/Test526.hs new file mode 100644 index 0000000..ae6bb6a --- /dev/null +++ b/data/Test526.hs @@ -0,0 +1,6 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = do + abc <- expr + abcccccccccccccccccc <- expr + abcccccccccccccccccccccccccccccccccccccccccc <- expr + abccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc <- expr diff --git a/data/Test527.hs b/data/Test527.hs new file mode 100644 index 0000000..f3664cd --- /dev/null +++ b/data/Test527.hs @@ -0,0 +1,4 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func (MyLongFoo abc def) = 1 +func (Bar a d) = 2 +func _ = 3 diff --git a/data/Test528.hs b/data/Test528.hs new file mode 100644 index 0000000..2867ab4 --- /dev/null +++ b/data/Test528.hs @@ -0,0 +1,15 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +parserCompactLocation = + [ try + $ [ ParseRelAbs (Text.Read.read digits) _ _ + | digits <- many1 digit + , rel1 :: Maybe (Either Int (Ratio Int)) <- optionMaybe + [ case divPart of + Nothing -> Left $ Text.Read.read digits + Just ddigits -> + Right $ Text.Read.read digits % Text.Read.read ddigits + | digits <- many1 digit + , divPart <- optionMaybe (string "/" *> many1 digit) + ] + ] + ] diff --git a/data/Test529.hs b/data/Test529.hs new file mode 100644 index 0000000..f2b42a8 --- /dev/null +++ b/data/Test529.hs @@ -0,0 +1,4 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = fooooooooooooooooooooooooooooooooo $ foooooooooooooooooooooooooooooooo + foooooooooooooooooooooooooooooooo + foooooooooooooooooooooooooooooooo diff --git a/data/Test53.hs b/data/Test53.hs new file mode 100644 index 0000000..82be3f3 --- /dev/null +++ b/data/Test53.hs @@ -0,0 +1,7 @@ +{-# LANGUAGE ScopedTypeVariables #-} +data MyRecord + = forall a + . LooooooooooooooooooooongConstraint a => + LoooooooooooongConstructor + { foo :: abittoolongbutnotvery -> abittoolongbutnotvery + } diff --git a/data/Test530.hs b/data/Test530.hs new file mode 100644 index 0000000..ae12740 --- /dev/null +++ b/data/Test530.hs @@ -0,0 +1,6 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = + fooooooooooooooooooooooooooooooooo + + foooooooooooooooooooooooooooooooo + foooooooooooooooooooooooooooooooo + foooooooooooooooooooooooooooooooo diff --git a/data/Test531.hs b/data/Test531.hs new file mode 100644 index 0000000..fc1335c --- /dev/null +++ b/data/Test531.hs @@ -0,0 +1,6 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +func = fooooooooooooooooooooooooooooooooo + foooooooooooooooooooooooooooooooo + [ foooooooooooooooooooooooooooooooo + , foooooooooooooooooooooooooooooooo + , foooooooooooooooooooooooooooooooo + ] diff --git a/data/Test532.hs b/data/Test532.hs new file mode 100644 index 0000000..fcda0ed --- /dev/null +++ b/data/Test532.hs @@ -0,0 +1,20 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +parserPrim = + [ r + | r <- + [ SGPPrimFloat $ bool id (0 -) minus $ readGnok + "parserPrim" + (d1 ++ d2 ++ d3 ++ d4) + | d2 <- string "." + , d3 <- many1 (oneOf "0123456789") + , _ <- string "f" + ] + <|> [ SGPPrimFloat $ bool id (0 -) minus $ fromIntegral + (readGnok "parserPrim" d1 :: Integer) + | _ <- string "f" + ] + <|> [ SGPPrimInt $ bool id (0 -) minus $ fromIntegral + (readGnok "parserPrim" d1 :: Integer) + | _ <- string "i" + ] + ] diff --git a/data/Test533.hs b/data/Test533.hs new file mode 100644 index 0000000..3f54efe --- /dev/null +++ b/data/Test533.hs @@ -0,0 +1,3 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +samples = (SV.unpackaaaaadat) <&> \f -> + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/data/Test534.hs b/data/Test534.hs new file mode 100644 index 0000000..33c5182 --- /dev/null +++ b/data/Test534.hs @@ -0,0 +1,11 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +runBrittany tabSize text = do + let + config' = staticDefaultConfig + config = config' + { _conf_layout = (_conf_layout config') + { _lconfig_indentAmount = coerce tabSize + } + , _conf_forward = forwardOptionsSyntaxExtsEnabled + } + parsePrintModule config text diff --git a/data/Test535.hs b/data/Test535.hs new file mode 100644 index 0000000..cb2da37 --- /dev/null +++ b/data/Test535.hs @@ -0,0 +1,3 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +{-# LANGUAGE TypeApplications #-} +foo = bar @Baz diff --git a/data/Test536.hs b/data/Test536.hs new file mode 100644 index 0000000..8674ebf --- /dev/null +++ b/data/Test536.hs @@ -0,0 +1,51 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +{-# LANGUAGE TypeApplications #-} +layoutPatternBindFinal alignmentToken binderDoc mPatDoc clauseDocs = do + docAlt + $ -- one-line solution + [ docCols + (ColBindingLine alignmentToken) + [ docSeq (patPartInline ++ [guardPart]) + , docSeq + [ appSep $ return binderDoc + , docForceSingleline $ return body + , wherePart + ] + ] + | not hasComments + , [(guards, body, _bodyRaw)] <- [clauseDocs] + , let guardPart = singleLineGuardsDoc guards + , wherePart <- case mWhereDocs of + Nothing -> return @[] $ docEmpty + Just [w] -> return @[] $ docSeq + [ docSeparator + , appSep $ docLit $ Text.pack "where" + , docSetIndentLevel $ docForceSingleline $ return w + ] + _ -> [] + ] + ++ -- one-line solution + where in next line(s) + [ docLines + $ [ docCols + (ColBindingLine alignmentToken) + [ docSeq (patPartInline ++ [guardPart]) + , docSeq + [appSep $ return binderDoc, docForceParSpacing $ return body] + ] + ] + ++ wherePartMultiLine + | [(guards, body, _bodyRaw)] <- [clauseDocs] + , let guardPart = singleLineGuardsDoc guards + , Data.Maybe.isJust mWhereDocs + ] + ++ -- two-line solution + where in next line(s) + [ docLines + $ [ docForceSingleline + $ docSeq (patPartInline ++ [guardPart, return binderDoc]) + , docEnsureIndent BrIndentRegular $ docForceSingleline $ return + body + ] + ++ wherePartMultiLine + | [(guards, body, _bodyRaw)] <- [clauseDocs] + , let guardPart = singleLineGuardsDoc guards + ] diff --git a/data/Test537.hs b/data/Test537.hs new file mode 100644 index 0000000..12526a2 --- /dev/null +++ b/data/Test537.hs @@ -0,0 +1,11 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +{-# LANGUAGE MultiWayIf #-} +func = do + let + foo = if + | Constuctoooooooooooooooooooooooooooooooooooor `elem` artics -- TODO + -> max + (defLen - 0.2) -- TODO + (defLen * 0.8) + | otherwise -> max (defLen - 0.05) (defLen * 0.95) -- TODO + return True diff --git a/data/Test538.hs b/data/Test538.hs new file mode 100644 index 0000000..a527909 --- /dev/null +++ b/data/Test538.hs @@ -0,0 +1,6 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +foo n = case n of + 1 -> True + -1 -> False +bar n = case n of + (-2, -2) -> (-2, -2) diff --git a/data/Test539.hs b/data/Test539.hs new file mode 100644 index 0000000..7da39e1 --- /dev/null +++ b/data/Test539.hs @@ -0,0 +1,7 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +{-# LANGUAGE TypeApplications #-} +foo = + let + a = b @1 + cccc = () + in foo diff --git a/data/Test54.hs b/data/Test54.hs new file mode 100644 index 0000000..7d2cb1b --- /dev/null +++ b/data/Test54.hs @@ -0,0 +1,10 @@ +{-# LANGUAGE ScopedTypeVariables #-} +data MyRecord + = forall a b + . ( Loooooooooooooooooooooooooooooooong a + , Loooooooooooooooooooooooooooooooong b + ) => + MyConstructor + { a :: a + , b :: b + } diff --git a/data/Test540.hs b/data/Test540.hs new file mode 100644 index 0000000..936c1cd --- /dev/null +++ b/data/Test540.hs @@ -0,0 +1,14 @@ +-- brittany { lconfig_columnAlignMode: { tag: ColumnAlignModeDisabled }, lconfig_indentPolicy: IndentPolicyLeft } +record :: Record +record = Record + { rProperties = + [ "foo" .= "bar" + , "foo" .= "bar" + , "foo" .= "bar" + , "foo" .= "bar" + , "foo" .= "bar" + , "foo" .= "bar" + , "foo" .= "bar" + , "foo" .= "bar" + ] + } diff --git a/data/Test55.hs b/data/Test55.hs new file mode 100644 index 0000000..e49c0da --- /dev/null +++ b/data/Test55.hs @@ -0,0 +1,9 @@ +{-# LANGUAGE ScopedTypeVariables #-} +data MyStruct + = forall a b + . ( Loooooooooooooooooooooooooooooooong a + , Loooooooooooooooooooooooooooooooong b + ) => + MyConstructor (ToBriDocM BriDocNumbered) + (ToBriDocM BriDocNumbered) + (ToBriDocM BriDocNumbered) diff --git a/data/Test56.hs b/data/Test56.hs new file mode 100644 index 0000000..941107b --- /dev/null +++ b/data/Test56.hs @@ -0,0 +1,14 @@ +{-# LANGUAGE ScopedTypeVariables #-} +data MyRecord + = forall a b + . ( Loooooooooooooooooooooooooooooooong a + , Loooooooooooooooooooooooooooooooong b + ) => + MyConstructor + { foo, foo2 + :: loooooooooooooooooooooooooooooooong + -> loooooooooooooooooooooooooooooooong + , bar :: a + , bazz :: b + } + deriving Show diff --git a/data/Test57.hs b/data/Test57.hs new file mode 100644 index 0000000..6bcfc1b --- /dev/null +++ b/data/Test57.hs @@ -0,0 +1,5 @@ +data Foo = Bar + { foo :: Baz + , bars :: Bizzz + } + deriving (Show, Eq, Monad, Functor, Traversable, Foldable) diff --git a/data/Test58.hs b/data/Test58.hs new file mode 100644 index 0000000..6b228a2 --- /dev/null +++ b/data/Test58.hs @@ -0,0 +1,12 @@ +data Foo = Bar + { foo :: Baz + , bars :: Bizzz + } + deriving Show + deriving (Eq, Ord) + deriving stock Show + deriving stock (Eq, Ord) + deriving anyclass Show + deriving anyclass (Show, Eq, Monad, Functor) + deriving newtype Show + deriving newtype (Traversable, Foldable) diff --git a/data/Test59.hs b/data/Test59.hs new file mode 100644 index 0000000..5721ef0 --- /dev/null +++ b/data/Test59.hs @@ -0,0 +1,6 @@ +data Foo = Bar + { foo :: Baz + , bars :: Bizzz + } + deriving ToJSON via (SomeType) + deriving (ToJSON, FromJSON) via (SomeType) diff --git a/data/Test6.hs b/data/Test6.hs new file mode 100644 index 0000000..9bf7bb6 --- /dev/null +++ b/data/Test6.hs @@ -0,0 +1 @@ +func :: a -> (a -> a) diff --git a/data/Test60.hs b/data/Test60.hs new file mode 100644 index 0000000..79ccc7a --- /dev/null +++ b/data/Test60.hs @@ -0,0 +1,4 @@ +{-# LANGUAGE ExistentialQuantification #-} +data Foo = forall a . Show a => Bar + { foo :: a + } diff --git a/data/Test61.hs b/data/Test61.hs new file mode 100644 index 0000000..81d41bf --- /dev/null +++ b/data/Test61.hs @@ -0,0 +1,5 @@ +{-# LANGUAGE ExistentialQuantification #-} +data Foo = forall a b . (Show a, Eq b) => Bar + { foo :: a + , bars :: b + } diff --git a/data/Test62.hs b/data/Test62.hs new file mode 100644 index 0000000..8762559 --- /dev/null +++ b/data/Test62.hs @@ -0,0 +1,3 @@ +-- before +data MyData = MyData Int +-- after diff --git a/data/Test63.hs b/data/Test63.hs new file mode 100644 index 0000000..5532f33 --- /dev/null +++ b/data/Test63.hs @@ -0,0 +1,5 @@ +data MyRecord = MyRecord + { a :: Int + -- comment + , b :: Int + } diff --git a/data/Test64.hs b/data/Test64.hs new file mode 100644 index 0000000..0d37152 --- /dev/null +++ b/data/Test64.hs @@ -0,0 +1,5 @@ +data Foo = Bar -- a + { foo :: Baz -- b + , bars :: Bizzz -- c + } -- d + deriving (Show, Eq, Monad, Functor, Traversable, Foldable) -- e diff --git a/data/Test65.hs b/data/Test65.hs new file mode 100644 index 0000000..dd2506f --- /dev/null +++ b/data/Test65.hs @@ -0,0 +1,9 @@ +data Foo = Bar + { -- a + foo -- b + :: -- c + Baz -- d + , -- e + bars :: Bizzz + } + deriving (Show, Eq, Monad, Functor, Traversable, Foldable) diff --git a/data/Test66.hs b/data/Test66.hs new file mode 100644 index 0000000..3c7aeaa --- /dev/null +++ b/data/Test66.hs @@ -0,0 +1,11 @@ +data Foo = Bar + { foo :: Baz + , bars :: Bizzz + } + -- a + deriving --b + ( -- c + ToJSON -- d + , -- e + FromJSON --f + ) -- g diff --git a/data/Test67.hs b/data/Test67.hs new file mode 100644 index 0000000..a3a915b --- /dev/null +++ b/data/Test67.hs @@ -0,0 +1,13 @@ +data Foo = Bar + { foo :: Baz + , bars :: Bizzz + } + -- a + deriving --a + ToJSON --b + via -- c + ( -- d + SomeType --e + , -- f + ABC --g + ) diff --git a/data/Test68.hs b/data/Test68.hs new file mode 100644 index 0000000..0375bbb --- /dev/null +++ b/data/Test68.hs @@ -0,0 +1,8 @@ +{-# LANGUAGE ExistentialQuantification #-} +data MyRecord + -- test comment + = forall a b + . ( Loooooooooooooooooooooooooooooooong a + , Loooooooooooooooooooooooooooooooong b + ) => + MyConstructor a b diff --git a/data/Test69.hs b/data/Test69.hs new file mode 100644 index 0000000..a1759f1 --- /dev/null +++ b/data/Test69.hs @@ -0,0 +1,4 @@ +-- brittany {lconfig_indentPolicy: IndentPolicyLeft } +data EnterpriseGrantsForCompanyResponse = EnterpriseGrantsForCompanyResponse + Types.Company + [EnterpriseGrantResponse] diff --git a/data/Test7.hs b/data/Test7.hs new file mode 100644 index 0000000..6fd2b47 --- /dev/null +++ b/data/Test7.hs @@ -0,0 +1,2 @@ +func :: (((((((((()))))))))) +-- current output is.. funny. wonder if that can/needs to be improved.. diff --git a/data/Test70.hs b/data/Test70.hs new file mode 100644 index 0000000..a2147f6 --- /dev/null +++ b/data/Test70.hs @@ -0,0 +1,3 @@ +-- brittany {lconfig_indentPolicy: IndentPolicyFree } +data GrantsForCompanyResp = GrantsForCompanyResp Types.Company + [EnterpriseGrantResponse] diff --git a/data/Test71.hs b/data/Test71.hs new file mode 100644 index 0000000..5de2318 --- /dev/null +++ b/data/Test71.hs @@ -0,0 +1,4 @@ +-- brittany {lconfig_indentPolicy: IndentPolicyFree } +data EnterpriseGrantsForCompanyResponse = EnterpriseGrantsForCompanyResponse + Types.Company + [EnterpriseGrantResponse] diff --git a/data/Test72.hs b/data/Test72.hs new file mode 100644 index 0000000..af66351 --- /dev/null +++ b/data/Test72.hs @@ -0,0 +1,3 @@ +-- brittany {lconfig_indentPolicy: IndentPolicyMultiple } +data GrantsForCompanyResp = GrantsForCompanyResp Types.Company + [EnterpriseGrantResponse] diff --git a/data/Test73.hs b/data/Test73.hs new file mode 100644 index 0000000..260d671 --- /dev/null +++ b/data/Test73.hs @@ -0,0 +1,22 @@ +data XIILqcacwiuNiu = XIILqcacwiuNiu + { oyyFtvbepgbOge_pebzVmuftEijwuj :: Jgtoyuh HessJvNlo + , wloQsiskdoxJop_xatiKrwedOxtu :: Jgtoyuh [Inotg] + , mmmJjcqtemyIyo_ovosDoreKeeoyamvove :: Jgtoyuh Eujo + , mbiIatelofxOzr_uluxNngiiMjah :: Jgtoyuh HessJvNlo + , obxIskfcxpkIkb_uuviTuevcSkrgo :: Jgtoyuh Int + , wqrAtuvuecoHwr_ilotNxbuPleo :: Jgtoyuh Ufaxdeq + , lofAfuebdhpLuv_cnekPoyFxmg :: Jgtoyuh Ufaxdeq + , ouoFugtawzvUpk_oupiLzptugy :: Jgtoyuh Eujo + , iqiXjtziwogNsa_uiyvSunaTtgUsf3 :: Jgtoyuh Oaivn + , odbIriaqnojUlz_onotoWuunehIpuy :: Jgtoyuh Eujo + , opjUxtkxzkiKse_luqjuZazt + :: Jgtoyuh [(Eujo, Int, Int, Int, Int, Int, NELUxro)] + -- , jcqRaqznxfhIpa_ywevMezmoYkutuwa :: Jgtoyuh () + , vayOmuasyphOfd_bcsVljmvt :: Jgtoyuh Eujo + , rifArahilooRax_ufikecqdImsv :: Jgtoyuh Oaivn + , raqKtopcpszDwb_oqocubasZuqjcryoDojGkw :: Jgtoyuh Oaivn + , mluJiilpcijUtt_gaisklifVekfeyagRmfbyzz :: Jgtoyuh Oaivn + , oqhPaahjupaSmi_gamwwoovKyxznecvEayluc :: Jgtoyuh Oaivn + , mazFubimwebZpa_itidehDodiDlboz :: Jgtoyuh Vrep + , jeyOcuesexaYoy_vpqn :: Jgtoyuh () + } diff --git a/data/Test74.hs b/data/Test74.hs new file mode 100644 index 0000000..e9e6d4f --- /dev/null +++ b/data/Test74.hs @@ -0,0 +1 @@ +func x = x diff --git a/data/Test75.hs b/data/Test75.hs new file mode 100644 index 0000000..2e7361d --- /dev/null +++ b/data/Test75.hs @@ -0,0 +1 @@ +x *** y = x diff --git a/data/Test76.hs b/data/Test76.hs new file mode 100644 index 0000000..877399e --- /dev/null +++ b/data/Test76.hs @@ -0,0 +1 @@ +(***) x y = x diff --git a/data/Test77.hs b/data/Test77.hs new file mode 100644 index 0000000..b0795a1 --- /dev/null +++ b/data/Test77.hs @@ -0,0 +1 @@ +(f >=> g) k = f k >>= g diff --git a/data/Test78.hs b/data/Test78.hs new file mode 100644 index 0000000..1f3d4e7 --- /dev/null +++ b/data/Test78.hs @@ -0,0 +1,4 @@ +(Left a <$$> Left dd) e f = True +(Left a <$$> Right d ) e f = True +(Right a <$$> Left d ) e f = False +(Right a <$$> Right dd) e f = True diff --git a/data/Test79.hs b/data/Test79.hs new file mode 100644 index 0000000..bc6cbe5 --- /dev/null +++ b/data/Test79.hs @@ -0,0 +1 @@ +func _ = x diff --git a/data/Test8.hs b/data/Test8.hs new file mode 100644 index 0000000..9b1b57b --- /dev/null +++ b/data/Test8.hs @@ -0,0 +1 @@ +func :: () diff --git a/data/Test80.hs b/data/Test80.hs new file mode 100644 index 0000000..5c29c83 --- /dev/null +++ b/data/Test80.hs @@ -0,0 +1,2 @@ +func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable = + x diff --git a/data/Test81.hs b/data/Test81.hs new file mode 100644 index 0000000..7649b18 --- /dev/null +++ b/data/Test81.hs @@ -0,0 +1,2 @@ +func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable + = x diff --git a/data/Test82.hs b/data/Test82.hs new file mode 100644 index 0000000..dcb58cf --- /dev/null +++ b/data/Test82.hs @@ -0,0 +1,2 @@ +func reallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongvariable a b + = x diff --git a/data/Test83.hs b/data/Test83.hs new file mode 100644 index 0000000..2e709c1 --- /dev/null +++ b/data/Test83.hs @@ -0,0 +1 @@ +func (A a) = a diff --git a/data/Test84.hs b/data/Test84.hs new file mode 100644 index 0000000..58f9aca --- /dev/null +++ b/data/Test84.hs @@ -0,0 +1 @@ +func (x : xr) = x diff --git a/data/Test85.hs b/data/Test85.hs new file mode 100644 index 0000000..f097653 --- /dev/null +++ b/data/Test85.hs @@ -0,0 +1 @@ +func (x :+: xr) = x diff --git a/data/Test86.hs b/data/Test86.hs new file mode 100644 index 0000000..f5eccc0 --- /dev/null +++ b/data/Test86.hs @@ -0,0 +1 @@ +func (x `Foo` xr) = x diff --git a/data/Test87.hs b/data/Test87.hs new file mode 100644 index 0000000..5a64709 --- /dev/null +++ b/data/Test87.hs @@ -0,0 +1 @@ +func | True = x diff --git a/data/Test88.hs b/data/Test88.hs new file mode 100644 index 0000000..ca71136 --- /dev/null +++ b/data/Test88.hs @@ -0,0 +1,2 @@ +func x | x = simple expression + | otherwise = 0 diff --git a/data/Test89.hs b/data/Test89.hs new file mode 100644 index 0000000..c18a534 --- /dev/null +++ b/data/Test89.hs @@ -0,0 +1,3 @@ +func x + | a somewhat longer guard x = "and a somewhat longer expession that does not" + | otherwise = "fit without putting the guards in new lines" diff --git a/data/Test9.hs b/data/Test9.hs new file mode 100644 index 0000000..1b64914 --- /dev/null +++ b/data/Test9.hs @@ -0,0 +1,5 @@ +func + :: ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd + -> lakjsdlkjasldkj + -> lakjsdlkjasldkj + ) diff --git a/data/Test90.hs b/data/Test90.hs new file mode 100644 index 0000000..6f9ef8f --- /dev/null +++ b/data/Test90.hs @@ -0,0 +1,7 @@ +func x + | very long guard, another rather long guard that refers to x = nontrivial + expression + foo + bar + alsdkjlasdjlasj + | otherwise = 0 diff --git a/data/Test91.hs b/data/Test91.hs new file mode 100644 index 0000000..9256c3f --- /dev/null +++ b/data/Test91.hs @@ -0,0 +1,5 @@ +func x + | very long guard, another rather long guard that refers to x + = nontrivialexpression foo bar alsdkjlasdjlasj + | otherwise + = 0 diff --git a/data/Test92.hs b/data/Test92.hs new file mode 100644 index 0000000..289aa8b --- /dev/null +++ b/data/Test92.hs @@ -0,0 +1,6 @@ +func x + | very loooooooooooooooooooooooooooooong guard + , another rather long guard that refers to x + = nontrivial expression foo bar alsdkjlasdjlasj + | otherwise + = 0 diff --git a/data/Test93.hs b/data/Test93.hs new file mode 100644 index 0000000..48053a4 --- /dev/null +++ b/data/Test93.hs @@ -0,0 +1,2 @@ +func = x +describe "infix op" $ do diff --git a/data/Test94.hs b/data/Test94.hs new file mode 100644 index 0000000..aa1fd8f --- /dev/null +++ b/data/Test94.hs @@ -0,0 +1 @@ +func = x + x diff --git a/data/Test95.hs b/data/Test95.hs new file mode 100644 index 0000000..2d99eaf --- /dev/null +++ b/data/Test95.hs @@ -0,0 +1,3 @@ +func = + mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj + + mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj diff --git a/data/Test96.hs b/data/Test96.hs new file mode 100644 index 0000000..d9a2015 --- /dev/null +++ b/data/Test96.hs @@ -0,0 +1,4 @@ +func = + mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj + + mweroiuxlskdfjlksj + + mweroiuxlskdfjlksj diff --git a/data/Test97.hs b/data/Test97.hs new file mode 100644 index 0000000..094383e --- /dev/null +++ b/data/Test97.hs @@ -0,0 +1,4 @@ +func = + mweroiuxlskdfjlksj + + mweroiuxlskdfjlksj + + mweroiuxlskdfjlksjdflkjsdfljksldkjflkjsdflkj diff --git a/data/Test98.hs b/data/Test98.hs new file mode 100644 index 0000000..cc29546 --- /dev/null +++ b/data/Test98.hs @@ -0,0 +1,5 @@ +func = 1 +func = "abc" +func = 1.1e5 +func = 'x' +func = 981409823458910394810928414192837123987123987123 diff --git a/data/Test99.hs b/data/Test99.hs new file mode 100644 index 0000000..efcec60 --- /dev/null +++ b/data/Test99.hs @@ -0,0 +1,2 @@ +func = \x -> abc +describe "app" $ do diff --git a/data/brittany.yaml b/data/brittany.yaml new file mode 100644 index 0000000..b9b9aab --- /dev/null +++ b/data/brittany.yaml @@ -0,0 +1,4 @@ +conf_layout: + lconfig_allowSingleLineExportList: true + lconfig_importAsColumn: 60 + lconfig_importColumn: 60 diff --git a/source/library/Language/Haskell/Brittany/Main.hs b/source/library/Language/Haskell/Brittany/Main.hs index c32f1f7..ca9fc7b 100644 --- a/source/library/Language/Haskell/Brittany/Main.hs +++ b/source/library/Language/Haskell/Brittany/Main.hs @@ -31,6 +31,7 @@ import Language.Haskell.Brittany.Internal.Utils import qualified Language.Haskell.GHC.ExactPrint as ExactPrint import Paths_brittany import qualified System.Directory as Directory +import qualified System.Environment as Environment import qualified System.Exit import qualified System.FilePath.Posix as FilePath import qualified System.IO @@ -54,7 +55,16 @@ instance Show WriteMode where main :: IO () -main = mainFromCmdParserWithHelpDesc mainCmdParser +main = do + progName <- Environment.getProgName + args <- Environment.getArgs + mainWith progName args + +mainWith :: String -> [String] -> IO () +mainWith progName args = + Environment.withProgName progName + . Environment.withArgs args + $ mainFromCmdParserWithHelpDesc mainCmdParser helpDoc :: PP.Doc helpDoc = PP.vcat $ List.intersperse diff --git a/source/test-suite/Main.hs b/source/test-suite/Main.hs index 36e79ef..c8324df 100644 --- a/source/test-suite/Main.hs +++ b/source/test-suite/Main.hs @@ -1,256 +1,50 @@ -{-# LANGUAGE LambdaCase #-} -{-# LANGUAGE MonadComprehensions #-} -{-# LANGUAGE ScopedTypeVariables #-} - -import Data.Coerce (coerce) -import Data.List (groupBy) -import qualified Data.Maybe -import qualified Data.Semigroup as Semigroup -import qualified Data.Text as Text -import qualified Data.Text.IO as Text.IO -import qualified GHC.OldList as List -import Language.Haskell.Brittany.Internal -import Language.Haskell.Brittany.Internal.Config -import Language.Haskell.Brittany.Internal.Config.Types -import Language.Haskell.Brittany.Internal.Prelude -import Language.Haskell.Brittany.Internal.PreludeUtils -import qualified System.Directory -import System.FilePath (()) -import System.Timeout (timeout) -import Test.Hspec -import qualified Text.Parsec as Parsec -import Text.Parsec.Text (Parser) - -hush :: Either a b -> Maybe b -hush = either (const Nothing) Just - - - -asymptoticPerfTest :: Spec -asymptoticPerfTest = do - it "10 do statements" - $ roundTripEqualWithTimeout 1500000 - $ (Text.pack "func = do\n") - <> Text.replicate 10 (Text.pack " statement\n") - it "10 do nestings" - $ roundTripEqualWithTimeout 4000000 - $ (Text.pack "func = ") - <> mconcat - ( [1 .. 10] - <&> \(i :: Int) -> - (Text.replicate (2 * i) (Text.pack " ") <> Text.pack "do\n") - ) - <> Text.replicate 2000 (Text.pack " ") - <> Text.pack "return\n" - <> Text.replicate 2002 (Text.pack " ") - <> Text.pack "()" - it "10 AppOps" - $ roundTripEqualWithTimeout 1000000 - $ (Text.pack "func = expr") - <> Text.replicate 10 (Text.pack "\n . expr") --TODO - -roundTripEqualWithTimeout :: Int -> Text -> Expectation -roundTripEqualWithTimeout time t = - timeout time (action >>= evaluate) >>= (`shouldSatisfy`Data.Maybe.isJust) - where - action = fmap (fmap PPTextWrapper) - (parsePrintModuleTests defaultTestConfig "TestFakeFileName.hs" t) - - -data InputLine - = GroupLine Text - | HeaderLine Text - | PendingLine - | NormalLine Text - | CommentLine - deriving Show - -data TestCase = TestCase - { testName :: Text - , isPending :: Bool - , content :: Text - } +import qualified Control.Exception as Exception +import qualified Control.Monad as Monad +import qualified Data.List as List +import qualified Language.Haskell.Brittany.Main as Brittany +import qualified System.Directory as Directory +import qualified System.FilePath as FilePath +import qualified System.IO as IO +import qualified Test.Hspec as Hspec main :: IO () -main = do - files <- System.Directory.listDirectory "data/" - let blts = - List.sort - $ filter (\x -> not ("tests-context-free.blt" `isSuffixOf` x)) - $ filter (".blt" `isSuffixOf`) files - inputs <- blts `forM` \blt -> Text.IO.readFile ("data" blt) - let groups = createChunks =<< inputs - inputCtxFree <- Text.IO.readFile "data/30-tests-context-free.blt" - let groupsCtxFree = createChunks inputCtxFree - hspec $ do - describe "asymptotic perf roundtrips" $ asymptoticPerfTest - describe "library interface basic functionality" $ do - it "gives properly formatted result for valid input" $ do - let - input = Text.pack $ unlines - ["func = [00000000000000000000000, 00000000000000000000000, 00000000000000000000000, 00000000000000000000000]"] - let expected = Text.pack $ unlines - [ "func =" - , " [ 00000000000000000000000" - , " , 00000000000000000000000" - , " , 00000000000000000000000" - , " , 00000000000000000000000" - , " ]" - ] - output <- liftIO $ parsePrintModule staticDefaultConfig input - hush output `shouldBe` Just expected - groups `forM_` \(groupname, tests) -> do - describe (Text.unpack groupname) $ do - tests `forM_` \test -> do - (if isPending test then before_ pending else id) - $ it (Text.unpack $ testName test) - $ roundTripEqual defaultTestConfig - $ content test - groupsCtxFree `forM_` \(groupname, tests) -> do - describe ("context free: " ++ Text.unpack groupname) $ do - tests `forM_` \test -> do - (if isPending test then before_ pending else id) - $ it (Text.unpack $ testName test) - $ roundTripEqual contextFreeTestConfig - $ content test - where - -- this function might be implemented in a weirdly complex fashion; the - -- reason being that it was copied from a somewhat more complex variant. - createChunks :: Text -> [(Text, [TestCase])] - createChunks input = --- fmap (\case --- HeaderLine n:PendingLine:rest | Just rlines <- mapM extractNormal rest -> (n, True, Text.unlines rlines) --- HeaderLine n:rest | Just rlines <- mapM extractNormal rest -> (n, False, Text.unlines rlines) --- l -> error $ "first non-empty line must start with #test footest\n" ++ show l --- ) --- $ fmap (groupBy grouperT) - fmap groupProcessor - $ groupBy grouperG - $ filter (not . lineIsSpace) - $ lineMapper - <$> Text.lines input - where - groupProcessor :: [InputLine] -> (Text, [TestCase]) - groupProcessor = \case - GroupLine g : grouprest -> - (,) g - $ fmap testProcessor - $ groupBy grouperT - $ filter (not . lineIsSpace) - $ grouprest - l -> error $ "first non-empty line must be a #group\n" ++ show l - testProcessor :: [InputLine] -> TestCase - testProcessor = \case - HeaderLine n : rest -> - let normalLines = Data.Maybe.mapMaybe extractNormal rest - in TestCase - { testName = n - , isPending = any isPendingLine rest - , content = Text.unlines normalLines - } - l -> - error $ "first non-empty line must start with #test footest\n" ++ show l - extractNormal (NormalLine l) = Just l - extractNormal _ = Nothing - isPendingLine PendingLine{} = True - isPendingLine _ = False - specialLineParser :: Parser InputLine - specialLineParser = Parsec.choice - [ [ GroupLine $ Text.pack name - | _ <- Parsec.try $ Parsec.string "#group" - , _ <- Parsec.many1 $ Parsec.oneOf " \t" - , name <- Parsec.many1 $ Parsec.noneOf "\r\n:" - , _ <- Parsec.eof - ] - , [ HeaderLine $ Text.pack name - | _ <- Parsec.try $ Parsec.string "#test" - , _ <- Parsec.many1 $ Parsec.oneOf " \t" - , name <- Parsec.many1 $ Parsec.noneOf "\r\n:" - , _ <- Parsec.eof - ] - , [ PendingLine - | _ <- Parsec.try $ Parsec.string "#pending" - , _ <- Parsec.optional $ many (Parsec.noneOf "\r\n") - , _ <- Parsec.eof - ] - , [ CommentLine - | _ <- Parsec.many $ Parsec.oneOf " \t" - , _ <- Parsec.optional $ Parsec.string "##" <* many - (Parsec.noneOf "\r\n") - , _ <- Parsec.eof - ] - , [ NormalLine mempty - | _ <- Parsec.try $ Parsec.string "" - , _ <- Parsec.eof - ] - ] - lineMapper :: Text -> InputLine - lineMapper line = case Parsec.runParser specialLineParser () "" line of - Left _e -> NormalLine line - Right l -> l - lineIsSpace :: InputLine -> Bool - lineIsSpace CommentLine = True - lineIsSpace _ = False - grouperG :: InputLine -> InputLine -> Bool - grouperG _ GroupLine{} = False - grouperG _ _ = True - grouperT :: InputLine -> InputLine -> Bool - grouperT _ HeaderLine{} = False - grouperT _ _ = True +main = Hspec.hspec . Hspec.parallel $ do + let directory = "data" + entries <- Hspec.runIO $ Directory.listDirectory directory + Monad.forM_ (List.sort entries) $ \entry -> + case FilePath.stripExtension "hs" entry of + Nothing -> pure () + Just slug -> Hspec.it slug $ do + let input = FilePath.combine directory entry + expected <- readFile input + actual <- withTemporaryFile $ \output handle -> do + IO.hClose handle + Directory.copyFile input output + Brittany.mainWith + "brittany" + [ "--config-file" + , FilePath.combine directory "brittany.yaml" + , "--no-user-config" + , "--write-mode" + , "inplace" + , output + ] + readFile output + Literal actual `Hspec.shouldBe` Literal expected +withTemporaryFile :: (FilePath -> IO.Handle -> IO a) -> IO a +withTemporaryFile callback = do + directory <- Directory.getTemporaryDirectory + let + acquire = IO.openTempFile directory "brittany-.hs" + release filePath handle = do + IO.hClose handle + Directory.removeFile filePath + Exception.bracket acquire (uncurry release) (uncurry callback) --------------------- --- past this line: copy-pasta from other test (meh..) --------------------- -roundTripEqual :: Config -> Text -> Expectation -roundTripEqual c t = - fmap (fmap PPTextWrapper) (parsePrintModuleTests c "TestFakeFileName.hs" t) - `shouldReturn` Right (PPTextWrapper t) - -newtype PPTextWrapper = PPTextWrapper Text +newtype Literal + = Literal String deriving Eq -instance Show PPTextWrapper where - show (PPTextWrapper t) = "\n" ++ Text.unpack t - --- brittany-next-binding --columns 160 --- brittany-next-binding { lconfig_indentPolicy: IndentPolicyLeft } -defaultTestConfig :: Config -defaultTestConfig = Config - { _conf_version = _conf_version staticDefaultConfig - , _conf_debug = _conf_debug staticDefaultConfig - , _conf_layout = LayoutConfig - { _lconfig_cols = coerce (80 :: Int) - , _lconfig_indentPolicy = coerce IndentPolicyFree - , _lconfig_indentAmount = coerce (2 :: Int) - , _lconfig_indentWhereSpecial = coerce True - , _lconfig_indentListSpecial = coerce True - , _lconfig_importColumn = coerce (60 :: Int) - , _lconfig_importAsColumn = coerce (60 :: Int) - , _lconfig_altChooser = coerce $ AltChooserBoundedSearch 3 - , _lconfig_columnAlignMode = coerce (ColumnAlignModeMajority 0.7) - , _lconfig_alignmentLimit = coerce (30 :: Int) - , _lconfig_alignmentBreakOnMultiline = coerce True - , _lconfig_hangingTypeSignature = coerce False - , _lconfig_reformatModulePreamble = coerce True - , _lconfig_allowSingleLineExportList = coerce True - , _lconfig_allowHangingQuasiQuotes = coerce True - , _lconfig_experimentalSemicolonNewlines = coerce False - -- , _lconfig_allowSinglelineRecord = coerce False - } - , _conf_errorHandling = (_conf_errorHandling staticDefaultConfig) { _econf_omit_output_valid_check = coerce True } - , _conf_preprocessor = _conf_preprocessor staticDefaultConfig - , _conf_forward = ForwardOptions { _options_ghc = Identity [] } - , _conf_roundtrip_exactprint_only = coerce False - , _conf_disable_formatting = coerce False - , _conf_obfuscate = coerce False - } - -contextFreeTestConfig :: Config -contextFreeTestConfig = defaultTestConfig - { _conf_layout = (_conf_layout defaultTestConfig) - { _lconfig_indentPolicy = coerce IndentPolicyLeft - , _lconfig_alignmentLimit = coerce (1 :: Int) - , _lconfig_columnAlignMode = coerce ColumnAlignModeDisabled - } - } +instance Show Literal where + show (Literal x) = x -- 2.30.2 From cddb98b12471462bd8387b84eaac7f389627f6d5 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Thu, 25 Nov 2021 14:16:22 +0000 Subject: [PATCH 72/74] Run tests in serial --- source/test-suite/Main.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/test-suite/Main.hs b/source/test-suite/Main.hs index c8324df..ecc3042 100644 --- a/source/test-suite/Main.hs +++ b/source/test-suite/Main.hs @@ -8,7 +8,7 @@ import qualified System.IO as IO import qualified Test.Hspec as Hspec main :: IO () -main = Hspec.hspec . Hspec.parallel $ do +main = Hspec.hspec $ do let directory = "data" entries <- Hspec.runIO $ Directory.listDirectory directory Monad.forM_ (List.sort entries) $ \entry -> -- 2.30.2 From 8f2625dc87ca63629fc5413a5664fecc601d4e08 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sun, 28 Nov 2021 13:24:11 +0000 Subject: [PATCH 73/74] Simplify test suite --- source/test-suite/Main.hs | 39 +++++++++++++-------------------------- 1 file changed, 13 insertions(+), 26 deletions(-) diff --git a/source/test-suite/Main.hs b/source/test-suite/Main.hs index ecc3042..e48ec56 100644 --- a/source/test-suite/Main.hs +++ b/source/test-suite/Main.hs @@ -1,14 +1,12 @@ -import qualified Control.Exception as Exception import qualified Control.Monad as Monad import qualified Data.List as List import qualified Language.Haskell.Brittany.Main as Brittany import qualified System.Directory as Directory import qualified System.FilePath as FilePath -import qualified System.IO as IO import qualified Test.Hspec as Hspec main :: IO () -main = Hspec.hspec $ do +main = Hspec.hspec . Hspec.parallel $ do let directory = "data" entries <- Hspec.runIO $ Directory.listDirectory directory Monad.forM_ (List.sort entries) $ \entry -> @@ -17,31 +15,20 @@ main = Hspec.hspec $ do Just slug -> Hspec.it slug $ do let input = FilePath.combine directory entry expected <- readFile input - actual <- withTemporaryFile $ \output handle -> do - IO.hClose handle - Directory.copyFile input output - Brittany.mainWith - "brittany" - [ "--config-file" - , FilePath.combine directory "brittany.yaml" - , "--no-user-config" - , "--write-mode" - , "inplace" - , output - ] - readFile output + let output = FilePath.combine "output" entry + Directory.copyFile input output + Brittany.mainWith + "brittany" + [ "--config-file" + , FilePath.combine directory "brittany.yaml" + , "--no-user-config" + , "--write-mode" + , "inplace" + , output + ] + actual <- readFile output Literal actual `Hspec.shouldBe` Literal expected -withTemporaryFile :: (FilePath -> IO.Handle -> IO a) -> IO a -withTemporaryFile callback = do - directory <- Directory.getTemporaryDirectory - let - acquire = IO.openTempFile directory "brittany-.hs" - release filePath handle = do - IO.hClose handle - Directory.removeFile filePath - Exception.bracket acquire (uncurry release) (uncurry callback) - newtype Literal = Literal String deriving Eq -- 2.30.2 From 339d2ebf23604dd410bfd1675a2c663b09364eb8 Mon Sep 17 00:00:00 2001 From: Taylor Fausak Date: Sun, 28 Nov 2021 14:08:58 +0000 Subject: [PATCH 74/74] Version 0.14.0.0 --- ChangeLog.md | 7 +++++++ brittany.cabal | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/ChangeLog.md b/ChangeLog.md index c96c598..baf8314 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,5 +1,12 @@ # Revision history for brittany +## 0.14.0.0 -- November 2021 + +* #357: Added support for GHC 9.0. Dropped support for all other versions of GHC. + * ab59e9acc3069551ac4132321b285d000f5f5691: Removed runtime dependency on `ghc-paths`. + * fa8365a7fa9372043d5a1018f2f7669ce3853edd: Started providing pre-built binaries for Linux, MacOS, and Windows. + * Many other changes to Brittany's internals and exposed Haskell interface, but (hopefully) no changes to its command-line interface. + ## 0.13.1.2 -- May 2021 * #347: Allowed hspec 2.8. Thanks @felixonmars! diff --git a/brittany.cabal b/brittany.cabal index 33d760e..45b6a65 100644 --- a/brittany.cabal +++ b/brittany.cabal @@ -1,7 +1,7 @@ cabal-version: 2.2 name: brittany -version: 0.13.1.2 +version: 0.14.0.0 synopsis: Haskell source code formatter description: See . -- 2.30.2