Compare commits

...

45 Commits

Author SHA1 Message Date
Lennart Spitzner 3f9e9d9bcb Respect and Fix disable-next-binding/decl 2023-05-02 12:12:54 +00:00
Lennart Spitzner 414baca643 Hardcode more precedences 2023-05-02 09:56:39 +00:00
Lennart Spitzner 884c7da97c Allow special layout for HsApp with HsDo/HsSpiceE args 2023-05-02 09:56:39 +00:00
Lennart Spitzner ab67a794db Fix retaining newlines between do statements 2023-05-02 09:56:39 +00:00
Lennart Spitzner b6001e9ecc Bump version to 92.1.0.0
The 92 indicates that this version is based on ghc-9.2.*.
Given that we support a single GHC version at a time
(and avoid any CPP mess) I thought this might be appropriate.
This also allows bug-fix releases to different "branches",
i.e. publishing 92.x.x.(n+1) together with 94.y.y.(n+1) to
address some bug that affects both the ghc-9.2.* branch
and the ghc-9.4 branch. From a PVP perspective it might not
be ideal that we regularly bump major versions when the
API does not actually change much, if at all, but given that
brittany primarily is an executable and will probably have
a small set of reverse-dependencies this seems acceptable.
2023-05-02 09:56:39 +00:00
Phil Hazelden 52bde7910f Support promoted type applications.
Closes #370.

Up to GHC 8.10,

    foo @ 'Bar

was a valid type application. In GHC 9 it's not, which means brittany
needs to allow

    foo @'Bar

which it now does.

The reason the space was needed was to allow a promoted type variable at
the head of a type-level list. That is,

    '['Foo]

is invalid syntax, because it initially parses as the character `'['`.
So the promoted type variable was always given a separator at the
beginning, and we'd get

    '[ 'Foo]

which was valid. Now we handle this case by specifically examining the
head of a type-level list; if it's promoted we introduce spaces, so

    '[ 'Foo ]
    '[Foo]

I've added tests for this and some related cases. In doing so I noticed
that unnecessary spaces get added in front of commas in these lists; I
believe that's a separate bug, and I've written a comment explaining why
it happens, but I haven't tried to fix it.

I'm not sure when the first alternates in the `FirstLastSingleton`
and `FirstLast` branches would ever be hit, so I'm not entirely sure if
the separators are necessary there. But since `docSeparator` disappears
at the end of a line and merges with adjacent separators, they should be
harmless.
2023-05-02 09:56:39 +00:00
Lennart Spitzner e11188eb16 Respect newlines after block-comments 2023-05-02 09:56:39 +00:00
Lennart Spitzner 556bc896a6 Refactor WriteBriDoc FlushCommentsPrior code slightly 2023-05-02 09:56:39 +00:00
Lennart Spitzner d2a48ba559 Fixup misspelled data-type name 2023-05-02 09:56:39 +00:00
Lennart Spitzner 7ab6a207ae Update OpApp layouting options
- Allow par-spacing for single-operator 1+n-line layout
- Tweak when to flatten operators, i.e. when to allow a flat one-line-each
  layout for the operator sequence "$ $ $ + +".
2023-05-02 09:16:44 +00:00
Lennart Spitzner 99e5aacb5e Discard special case for non-nested OpApp 2023-05-02 09:16:04 +00:00
Lennart Spitzner 52e4658314 Minor comment updates and cleanup 2023-05-02 09:16:04 +00:00
Lennart Spitzner 56e7d6b5b9 Simplify/Optimize Decl:layoutPatternBindFinal 2023-05-02 09:16:04 +00:00
Lennart Spitzner 156b5cf407 setParSpacing for operator-expression ending in par 2023-05-02 09:16:04 +00:00
Lennart Spitzner d29303d4cd Improve one HsLet layout
- Allow parSpacing for single-clause layout
- Allow par/sl layout when no where-clause was present
  (not sure why this was disabled in the first place)
2023-05-02 09:16:04 +00:00
Lennart Spitzner 5563cd4d93 Dont flatten operators without surrounding parens 2023-05-02 09:16:04 +00:00
Lennart Spitzner 09ec59eaf9 Fix comment-after-context 2023-05-02 09:16:04 +00:00
Lennart Spitzner b24379d104 Fix restore-position after block comment 2023-05-02 09:16:04 +00:00
Lennart Spitzner 2fef44559e Fix comments moving after "where" 2023-05-02 09:16:04 +00:00
Lennart Spitzner ebe85a5949 Use dependency-injection for ToBriDoc modules
I assume this makes inlining impossible, but it enables
parallel compilation of all these modules. In my tests
this reduce wall clock time to 92%, and with more cores
the benefit should be higher.
2023-05-02 09:16:04 +00:00
Lennart Spitzner 736c2a8d46 Fix retain comments on matches (lambda rhs etc.) 2023-05-02 09:16:04 +00:00
Lennart Spitzner 0a76fe952c Refactor s/rec/go for extension compat 2023-05-02 09:16:03 +00:00
Lennart Spitzner dc4e59f2a1 Fix BDLines getSpacing computation 2023-05-02 09:16:03 +00:00
Lennart Spitzner 412c5460aa Do not count warnings for considering exactprint fallback 2023-05-02 09:16:03 +00:00
Lennart Spitzner dd4367c6e8 Fixup annotation on error-fallback 2023-05-02 09:16:03 +00:00
Lennart Spitzner 676695a609 Implement fixity-aware-ops feature 2023-05-02 09:16:03 +00:00
Lennart Spitzner 75d17b961c Fix double-printing of comments on certain data-decls 2023-05-02 09:16:03 +00:00
Lennart Spitzner f13a82964a Partially restore retaining-empty-lines behaviour
Currently works for do blocks, multi-line list literals, and
lambda-case cases (apart from top-level blank lines that
never got ignored).
2023-05-02 09:16:03 +00:00
Lennart Spitzner 05270ecb45 Improve block-comment behaviour (newlines after or not) 2023-05-02 09:16:03 +00:00
Lennart Spitzner 7c329d391b Make if-then-layout layout more consistent 2023-05-02 09:16:03 +00:00
Lennart Spitzner 5bee3fa93d Fix missing comment for MG 2023-05-02 09:16:03 +00:00
Lennart Spitzner 83b13d61a0 Change behaviour: Less par-spacing for function application 2023-05-02 09:16:03 +00:00
Lennart Spitzner 3121ccacfe Behaviour addition: Allow par-spacing on HsApp 2023-05-02 09:16:03 +00:00
Lennart Spitzner d9373ec80e Implement extension support - OverloadedRecordDot 2023-05-02 09:16:03 +00:00
Lennart Spitzner 72c9e4c3ab Fix block-comment delta position special case 2023-05-02 09:16:03 +00:00
Lennart Spitzner b116529005 Replace BriDoc+BriDocF with single BriDocW + type family 2023-05-02 09:16:03 +00:00
Lennart Spitzner ee2814e3a8 Reintroduce BDAnnotationKW in the form of BDEntryDelta 2023-05-02 09:16:03 +00:00
Lennart Spitzner 7d3490b80a Clean up WriteBriDoc monad state handling 2023-05-02 09:16:03 +00:00
Lennart Spitzner 847e01cc30 Clean up unused WriteBriDoc operators 2023-05-02 09:16:03 +00:00
Lennart Spitzner d11141d34d Refactor+Rewrite+Adaptation for ghc-9.2 support 2023-05-02 09:16:03 +00:00
Lennart Spitzner dedeab61e2 Ignore missing kind signatures and unused imports for now 2023-05-02 09:16:03 +00:00
Lennart Spitzner 84669034b5 Unhide warning 2023-05-02 09:16:03 +00:00
Lennart Spitzner 7f4730858e Pass ghc -fhide-source-paths by default 2023-05-02 09:16:03 +00:00
Lennart Spitzner bff9bfb312 Support and use nested file structure for tests 2023-05-02 09:16:03 +00:00
Lennart Spitzner 4e397441b9 Revert "Split tests into individual files"
This reverts commit 21e86adf6e.
2023-05-02 09:16:00 +00:00
626 changed files with 14388 additions and 10521 deletions

View File

@ -1,7 +1,7 @@
cabal-version: 2.2 cabal-version: 2.2
name: brittany name: brittany
version: 0.14.0.2 version: 92.1.0.0
synopsis: Haskell source code formatter synopsis: Haskell source code formatter
description: description:
See <https://github.com/lspitzner/brittany/blob/master/README.md the README>. See <https://github.com/lspitzner/brittany/blob/master/README.md the README>.
@ -24,8 +24,7 @@ extra-doc-files:
README.md README.md
doc/implementation/*.md doc/implementation/*.md
extra-source-files: extra-source-files:
data/brittany.yaml data/*.blt
data/*.hs
source-repository head source-repository head
type: git type: git
@ -39,9 +38,9 @@ flag pedantic
common library common library
build-depends: build-depends:
, aeson ^>= 2.0.1 , aeson ^>= 2.0.1
, base ^>= 4.15.0 , base >= 4.15.0 && < 4.17
, butcher ^>= 2.0.0 , butcher ^>= 2.0.0
, bytestring ^>= 0.10.12 , bytestring >= 0.10.12 && < 0.12
, cmdargs ^>= 0.10.21 , cmdargs ^>= 0.10.21
, containers ^>= 0.6.4 , containers ^>= 0.6.4
, czipwith ^>= 1.0.1 , czipwith ^>= 1.0.1
@ -50,17 +49,17 @@ common library
, directory ^>= 1.3.6 , directory ^>= 1.3.6
, extra ^>= 1.7.10 , extra ^>= 1.7.10
, filepath ^>= 1.4.2 , filepath ^>= 1.4.2
, ghc ^>= 9.0.1 , ghc >= 9.0.1 && < 9.3
, ghc-boot ^>= 9.0.1 , ghc-boot >= 9.0.1 && < 9.3
, ghc-boot-th ^>= 9.0.1 , ghc-boot-th >= 9.0.1 && < 9.3
, ghc-exactprint ^>= 0.6.4 , ghc-exactprint >= 0.6.4 && < 1.6
, monad-memo ^>= 0.5.3 , monad-memo ^>= 0.5.3
, mtl ^>= 2.2.2 , mtl ^>= 2.2.2
, multistate ^>= 0.8.0 , multistate ^>= 0.8.0
, pretty ^>= 1.1.3 , pretty ^>= 1.1.3
, random ^>= 1.2.1 , random ^>= 1.2.1
, safe ^>= 0.3.19 , safe ^>= 0.3.19
, semigroups ^>= 0.19.2 , semigroups >= 0.19.2 && < 0.21
, strict ^>= 0.4.0 , strict ^>= 0.4.0
, syb ^>= 0.7.2 , syb ^>= 0.7.2
, text ^>= 1.2.5 , text ^>= 1.2.5
@ -71,7 +70,6 @@ common library
ghc-options: ghc-options:
-Weverything -Weverything
-Wno-all-missed-specialisations -Wno-all-missed-specialisations
-Wno-incomplete-uni-patterns
-Wno-missing-deriving-strategies -Wno-missing-deriving-strategies
-Wno-missing-export-lists -Wno-missing-export-lists
-Wno-missing-import-lists -Wno-missing-import-lists
@ -81,10 +79,28 @@ common library
-Wno-prepositive-qualified-module -Wno-prepositive-qualified-module
-Wno-safe -Wno-safe
-Wno-unsafe -Wno-unsafe
-Wno-missing-kind-signatures
-Wunused-imports
-fhide-source-paths
if flag(pedantic) if flag(pedantic)
ghc-options: -Werror ghc-options: -Werror
default-extensions: {
FlexibleContexts
FlexibleInstances
ScopedTypeVariables
MonadComprehensions
LambdaCase
MultiWayIf
KindSignatures
MultiParamTypeClasses
TypeApplications
RankNTypes
GADTs
BangPatterns
}
common executable common executable
import: library import: library
@ -94,6 +110,7 @@ common executable
-threaded -threaded
-Wno-implicit-prelude -Wno-implicit-prelude
-Wno-unused-packages -Wno-unused-packages
-fhide-source-paths
library library
import: library import: library
@ -101,36 +118,45 @@ library
autogen-modules: Paths_brittany autogen-modules: Paths_brittany
hs-source-dirs: source/library hs-source-dirs: source/library
exposed-modules: exposed-modules:
Language.Haskell.Brittany.Main
Language.Haskell.Brittany Language.Haskell.Brittany
Language.Haskell.Brittany.Internal Language.Haskell.Brittany.Internal
Language.Haskell.Brittany.Internal.Backend Language.Haskell.Brittany.Internal.Config.Config
Language.Haskell.Brittany.Internal.BackendUtils Language.Haskell.Brittany.Internal.Config.InlineParsing
Language.Haskell.Brittany.Internal.Config
Language.Haskell.Brittany.Internal.Config.Types Language.Haskell.Brittany.Internal.Config.Types
Language.Haskell.Brittany.Internal.Config.Types.Instances Language.Haskell.Brittany.Internal.Config.Types.Instances1
Language.Haskell.Brittany.Internal.ExactPrintUtils Language.Haskell.Brittany.Internal.Config.Types.Instances2
Language.Haskell.Brittany.Internal.LayouterBasics Language.Haskell.Brittany.Internal.ToBriDoc.DataDecl
Language.Haskell.Brittany.Internal.Layouters.DataDecl Language.Haskell.Brittany.Internal.ToBriDoc.Decl
Language.Haskell.Brittany.Internal.Layouters.Decl Language.Haskell.Brittany.Internal.ToBriDoc.Expr
Language.Haskell.Brittany.Internal.Layouters.Expr Language.Haskell.Brittany.Internal.ToBriDoc.OpTree
Language.Haskell.Brittany.Internal.Layouters.IE Language.Haskell.Brittany.Internal.ToBriDoc.IE
Language.Haskell.Brittany.Internal.Layouters.Import Language.Haskell.Brittany.Internal.ToBriDoc.Import
Language.Haskell.Brittany.Internal.Layouters.Module Language.Haskell.Brittany.Internal.ToBriDoc.Module
Language.Haskell.Brittany.Internal.Layouters.Pattern Language.Haskell.Brittany.Internal.ToBriDoc.Pattern
Language.Haskell.Brittany.Internal.Layouters.Stmt Language.Haskell.Brittany.Internal.ToBriDoc.Stmt
Language.Haskell.Brittany.Internal.Layouters.Type Language.Haskell.Brittany.Internal.ToBriDoc.Type
Language.Haskell.Brittany.Internal.Obfuscation Language.Haskell.Brittany.Internal.ToBriDoc
Language.Haskell.Brittany.Internal.ParseModule Language.Haskell.Brittany.Internal.Components.BriDoc
Language.Haskell.Brittany.Internal.Components.Obfuscation
Language.Haskell.Brittany.Internal.Components.OpTree
Language.Haskell.Brittany.Internal.S1_Parsing
Language.Haskell.Brittany.Internal.S2_SplitModule
Language.Haskell.Brittany.Internal.S3_ToBriDocTools
Language.Haskell.Brittany.Internal.S4_WriteBriDoc
Language.Haskell.Brittany.Internal.StepOrchestrate
Language.Haskell.Brittany.Internal.Prelude Language.Haskell.Brittany.Internal.Prelude
Language.Haskell.Brittany.Internal.PreludeUtils Language.Haskell.Brittany.Internal.Transformations.T1_Alt
Language.Haskell.Brittany.Internal.Transformations.Alt Language.Haskell.Brittany.Internal.Transformations.T2_Floating
Language.Haskell.Brittany.Internal.Transformations.Columns Language.Haskell.Brittany.Internal.Transformations.T3_Par
Language.Haskell.Brittany.Internal.Transformations.Floating Language.Haskell.Brittany.Internal.Transformations.T4_Columns
Language.Haskell.Brittany.Internal.Transformations.Indent Language.Haskell.Brittany.Internal.Transformations.T5_Indent
Language.Haskell.Brittany.Internal.Transformations.Par Language.Haskell.Brittany.Internal.WriteBriDoc.AlignmentAlgo
Language.Haskell.Brittany.Internal.WriteBriDoc.Operators
Language.Haskell.Brittany.Internal.WriteBriDoc.Types
Language.Haskell.Brittany.Internal.Types Language.Haskell.Brittany.Internal.Types
Language.Haskell.Brittany.Internal.Utils Language.Haskell.Brittany.Internal.Utils
Language.Haskell.Brittany.Main Language.Haskell.Brittany.Internal.Util.AST
Paths_brittany Paths_brittany
executable brittany executable brittany
@ -143,7 +169,9 @@ test-suite brittany-test-suite
import: executable import: executable
build-depends: build-depends:
, hspec ^>= 2.8.3 , hspec >= 2.8.3 && < 2.10
, parsec ^>= 3.1.14
, these ^>= 1.1
hs-source-dirs: source/test-suite hs-source-dirs: source/test-suite
main-is: Main.hs main-is: Main.hs
type: exitcode-stdio-1.0 type: exitcode-stdio-1.0

View File

@ -0,0 +1,288 @@
#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 ()
}

View File

View File

@ -0,0 +1,127 @@
#group decl/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
}

View File

@ -0,0 +1,134 @@
#group decl/typefam/ghc9-support
#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

View File

@ -0,0 +1,36 @@
#group decl/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

View File

@ -0,0 +1,150 @@
#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 {}

View File

@ -0,0 +1,26 @@
#group expression/do
#test simple
func = do
stmt
stmt
#test bind
func = do
x <- stmt
stmt x
#test let
func = do
let x = 13
stmt x
#test do empty lines
func = do
<BLANKLINE>
let x = 13
<BLANKLINE>
y <- monadic
<BLANKLINE>
stmt (x + y)

View File

@ -0,0 +1,27 @@
#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

View File

@ -0,0 +1,16 @@
#group expression.special
#test monad-comprehension-case-of
func = foooooo
$ [ case foooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo of
_ -> True
]
#test operatorprefixalignment-even-with-multiline-alignbreak
func =
foo
$ [ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
]
++ [ccccccccccccccccccccccccccccccccccccccccccccccccccccccccc]

View File

@ -0,0 +1,92 @@
###############################################################################
#group decl/binding/basic
###############################################################################
#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 decl/binding/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 decl/binding/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

View File

@ -0,0 +1,271 @@
#group module/imports
#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
<BLANKLINE>
import Aaa
import Baa
#test sorted-qualified-imports
import Boo
import qualified Zoo
#test imports-groups-same-module
import Boo ( a )
<BLANKLINE>
import Boo ( b )
#test sorted-imports-nested
import A.B.C
import A.B.D

View File

@ -0,0 +1,66 @@
#group module/top
#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

View File

@ -0,0 +1,234 @@
#group expression/op-precedence
#test basic precedence-aware layouting
operatorExpr1 =
( foo1 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr1
+ foo2 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr2
+ foo3 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr3
+ foo4 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr4
+ foo5 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr5
+ foo6 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr6
+ foo7 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr7
+ foo8 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr8
+ foo9 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr9
)
#test nested different precedences
operatorExpr2 =
( foo1 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr1
+ foo2 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr2
+ foo3 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr3
+ foo4 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr4
== foo5 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr5
+ foo6 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr6
+ foo7 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr7
+ foo8 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr8
+ foo9 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr9
)
#test simple comment respecting
alternatives = -- a
( -- b
alternativeOne -- c
<|> alterantiveTwo -- d
<|> alternativeThree -- e
) -- f
#golden retaining comments while minimizing duplicated parens
#pending
-- brittany { lconfig_operatorParenthesisRefactorMode: PRMMinimize }
alternatives = -- a
x
+ ( -- b
( -- c
alternativeOne -- c
<|> alterantiveTwo -- d
<|> alternativeThree -- e
) -- f
) -- g
#expected
-- brittany { lconfig_operatorParenthesisRefactorMode: PRMMinimize }
alternatives = -- a
x
+ -- b
( -- c
alternativeOne -- c
<|> alterantiveTwo -- d
<|> alternativeThree -- e
) -- f -- g
#golden refactoring unnecessary parens basic example
-- brittany { lconfig_operatorParenthesisRefactorMode: PRMMinimize }
operatorExpr1 =
( (goo1 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr1)
+ goo2 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr2
+ goo3 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr3
+ goo4 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr4
)
#expected
-- brittany { lconfig_operatorParenthesisRefactorMode: PRMMinimize }
operatorExpr1 =
( goo1 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr1
+ goo2 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr2
+ goo3 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr3
+ goo4 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr4
)
#test feature flag fixityAwareOps works
-- brittany { lconfig_fixityAwareOps: False }
operatorExpr1 =
( goo1
* barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr1
+ goo2
* barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr2
+ goo3
* barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr3
+ goo4
* barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr4
+ goo5
* barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr5
+ goo6
* barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr6
+ goo7
* barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr7
+ goo8
* barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr8
+ goo9
* barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr9
)
#golden op-app simple golden test
operatorExpr1 =
( goo1
* barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr1
+ goo2
* barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr2
+ goo3
* barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr3
+ goo4
* barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr4
+ goo5
* barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr5
+ goo6
* barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr6
+ goo7
* barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr7
+ goo8
* barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr8
+ goo9
* barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr9
)
#expected
operatorExpr1 =
( goo1 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr1
+ goo2 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr2
+ goo3 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr3
+ goo4 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr4
+ goo5 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr5
+ goo6 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr6
+ goo7 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr7
+ goo8 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr8
+ goo9 * barrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr9
)
#golden op-app mixed golden
doop =
some long invocation ==
loooooooooongman + (third nested expression)
- 4 && {- meow -} 5
- 6
> 7
`mod` loooooooooongwoman || ill just invoke a function with these args
|| foo && dooasdoiaosdoi ** oaisdoioasido <= asduiuaisduiasdu + asdahjsd + ahsjdhjhasd
#expected
doop =
some long invocation == loooooooooongman + (third nested expression) - 4
&& {- meow -} 5 - 6 > 7 `mod` loooooooooongwoman
|| ill just invoke a function with these args
|| foo
&& dooasdoiaosdoi ** oaisdoioasido
<= asduiuaisduiasdu + asdahjsd + ahsjdhjhasd
#golden op-app mixed golden with added parens
-- brittany { lconfig_fixityBasedAddAlignParens: True }
doop =
some long invocation ==
loooooooooongman + (third nested expression)
- 4 && {- meow -} 5
- 6
> 7
`mod` loooooooooongwoman || ill just invoke a function with these args
|| foo && dooasdoiaosdoi ** oaisdoioasido <= asduiuaisduiasdu + asdahjsd + ahsjdhjhasd
#expected
-- brittany { lconfig_fixityBasedAddAlignParens: True }
doop =
( ( some long invocation == loooooooooongman + (third nested expression) - 4
&& {- meow -} 5 - 6 > 7 `mod` loooooooooongwoman
)
|| ill just invoke a function with these args
|| ( foo
&& ( dooasdoiaosdoi ** oaisdoioasido
<= asduiuaisduiasdu + asdahjsd + ahsjdhjhasd
)
)
)
#golden multiline mixed op expression 1
-- brittany { lconfig_fixityBasedAddAlignParens: True }
meow =
[docSeparator, docForceSL od1, docSeparator, docForceSL ed1]
++ join
[ [docSeparator, docForceSingleline od, docSeparator, docForceSingleline ed]
| (od, ed) <- ems
]
++ [docSeparator, docForceSingleline odN, docSeparator, lastWrap edN]
#expected
-- brittany { lconfig_fixityBasedAddAlignParens: True }
meow =
( [docSeparator, docForceSL od1, docSeparator, docForceSL ed1]
++ join
[ [ docSeparator
, docForceSingleline od
, docSeparator
, docForceSingleline ed
]
| (od, ed) <- ems
]
++ [docSeparator, docForceSingleline odN, docSeparator, lastWrap edN]
)
#golden multiline mixed op expression 2
-- brittany { lconfig_fixityBasedAddAlignParens: True }
meow =
[docSeparator, docForceSingleline od1, docSeparator, docForceSingleline ed1, something]
++ join
[ [docSeparator, docForceSingleline od, docSeparator, docForceSingleline ed]
| (od, ed) <- ems
]
++ [docSeparator, docForceSingleline odN, docSeparator, lastWrap edN, something]
#expected
-- brittany { lconfig_fixityBasedAddAlignParens: True }
meow =
( [ docSeparator
, docForceSingleline od1
, docSeparator
, docForceSingleline ed1
, something
]
++ join
[ [ docSeparator
, docForceSingleline od
, docSeparator
, docForceSingleline ed
]
| (od, ed) <- ems
]
++ [ docSeparator
, docForceSingleline odN
, docSeparator
, lastWrap edN
, something
]
)

View File

@ -0,0 +1,29 @@
#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

View File

@ -0,0 +1,265 @@
#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

View File

@ -0,0 +1,94 @@
#group decl/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

View File

@ -0,0 +1,74 @@
#group extensions/datakinds-promoted-types
### The spaces before commas are undesirable
#test 1
test :: Proxy '[ 'True ]
test = Proxy @'[ 'True ]
#test 2
test :: Proxy '[True]
test = Proxy @'[True]
#test 3
test :: Proxy '[ 'True , False ]
test = Proxy @'[ 'True , False ]
#test 4
test :: Proxy '[True , False]
test = Proxy @'[True , False]
#test 5
test :: Proxy '[True , 'False]
test = Proxy @'[True , 'False]
#test 6
test :: Proxy '[ 'True , 'False ]
test = Proxy @'[ 'True , 'False ]
#test 7
test :: Proxy '[ 'Just 'True , False ]
test = Proxy @'[ 'Just 'True , False ]
#test 8
test :: Proxy '[Just True , False]
test = Proxy @'[Just True , False]
#test 9
test :: Proxy '[('True)]
test = Proxy @'[('True)]
#test 10
test :: Proxy ('Just 'True)
test = Proxy @('Just 'True)
#test 11
test :: Proxy ('True)
test = Proxy @('True)
#test with-comment-1
test
:: Proxy '[-- comment
'True ]
test = Proxy @'[-- comment
'True ]
#test with-comment-2
test
:: Proxy '[-- comment
True]
test = Proxy @'[-- comment
True]
#test with-comment-3
test
:: Proxy '[{- comment -} 'True ]
test = Proxy @'[{- comment -} 'True ]
#test with-comment-4
test
:: Proxy '[{- comment -}
'True ]
test = Proxy @'[{- comment -}
'True ]
#test with-comment-5
test
:: Proxy '[{- comment -} True]
test = Proxy @'[{- comment -} True]
#test with-comment-6
test
:: Proxy '[{- comment -}
True]
test = Proxy @'[{- comment -}
True]

View File

@ -0,0 +1,28 @@
#group extensions/implicitparams
#test ImplicitParams 1
{-# LANGUAGE ImplicitParams #-}
func :: (?asd::Int) -> ()
#test ImplicitParams 2
{-# LANGUAGE ImplicitParams #-}
func
:: ( ?asd
:: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd
-> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd
)
-> ()
#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 = ()

View File

@ -1,3 +1,7 @@
#group extensions/lambdacase
#test lambdacase 1
{-# LANGUAGE LambdaCase #-} {-# LANGUAGE LambdaCase #-}
func = \case func = \case
FooBar -> x FooBar -> x

View File

@ -0,0 +1,16 @@
#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

View File

@ -0,0 +1,10 @@
#group extensions/overloadedlabels
#test bare label
{-# LANGUAGE OverloadedLabels #-}
foo = #bar
#test applied and composed label
{-# LANGUAGE OverloadedLabels #-}
foo = #bar . #baz $ fmap #foo xs

View File

@ -0,0 +1,24 @@
#group extensions/overloadedrecorddot
#test getfield
{-# LANGUAGE OverloadedRecordDot #-}
recorddot1 = a.b.c
#test getfield
{-# LANGUAGE OverloadedRecordDot #-}
recorddot2 =
{-before-} a.b.c {-after-}
#test projection
{-# LANGUAGE OverloadedRecordDot #-}
recorddot3 =
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
& (.bbbbbbbbbbbbbbbbbbbbbbbbbbb)
& (.ccccccccccccccccccccccccccccccccccccc)
& (.ddddddddddddddddddddddddddddddddddddddddddddddddddd)
#test projection too long
{-# LANGUAGE OverloadedRecordDot #-}
recorddot4 =
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
& (.bbbbbbbbbbbbbbbbbbbbbbbbbbb.ccccccccccccccccccccccccccccccccccccc.ddddddddddddddddddddddddddddddddddddddddddddddddddd)

View File

@ -0,0 +1,100 @@
#group extensions/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]
#group extensions/patternsynonyms+explicitnamespaces
#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
)

View File

@ -0,0 +1,34 @@
#group extensions/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

View File

@ -0,0 +1,17 @@
#group extensions/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)

View File

@ -0,0 +1,14 @@
#group extensions/unboxedtuples
#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# #)

27
data/12-other.blt Normal file
View File

@ -0,0 +1,27 @@
#group other/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

958
data/15-regressions.blt Normal file
View File

@ -0,0 +1,958 @@
###############################################################################
###############################################################################
###############################################################################
#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"
asd = True
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
#pending
func =
do
y
>>= x
#test nested-arrow-type
#pending
fieldWith
:: a
-> a
-> ( ( GHC.RealSrcLoc
, a
, Either
(Maybe GHC.RealSrcLoc, ToBriDocM BriDocNumbered)
( Maybe GHC.RealSrcLoc
, ToBriDocM BriDocNumbered
, ToBriDocM BriDocNumbered
)
)
-> ToBriDocM BriDocNumbered
)
-> [ToBriDocM BriDocNumbered]
#test comment-before-where
briDocLineLength briDoc = flip StateS.evalState False $ go briDoc
-- the state encodes whether a separator was already
-- appended at the current position.
where
go = \case
BDEmpty -> return $ 0
BDLit t -> StateS.put False $> Text.length t
BDSeq bds -> sum <$> go `mapM` bds
#test where-funbind-no-empty-lines
alignColsLines layoutBriDocM bridocs = do -- colInfos `forM_` \colInfo -> do
-- tellDebugMess ("alignColsLines: at " ++ take 100 (show $ briDocToDoc $ head bridocs))
case () of
_ -> do
-- tellDebugMess ("colInfos:\n" ++ List.unlines [ "> " ++ prettyColInfos "> " x | x <- colInfos])
-- tellDebugMess ("processedMap: " ++ show processedMap)
sequence_
$ List.intersperse layoutWriteEnsureNewlineBlock
$ colInfos <&> processInfo layoutBriDocM colMax processedMap
where
(colInfos, finalState) = StateS.runState
(mergeBriDocs bridocs)
(ColBuildState IntMapS.empty 0)
-- maxZipper :: [Int] -> [Int] -> [Int]
-- maxZipper [] ys = ys
-- maxZipper xs [] = xs
-- maxZipper (x:xr) (y:yr) = max x y : maxZipper xr yr
colAggregation :: [Int] -> Int
colAggregation [] = 0 -- this probably cannot happen the way we call
-- this function, because _cbs_map only ever
-- contains nonempty Seqs.
colAggregation xs = maximum [ x | x <- xs, x <= minimum xs + alignMax' ]
where alignMax' = max 0 alignMax
#test type-signature comment-after-context
tzejubuVxairoy
:: (VwzuyApikd.VwzuyApikd zub, ZxtbaKospaKwqnuw Defg.Xeqpgko.Xeqpgko m)
-- foo bar
=> CUR.Ozuzcak zub
-> m ()
#test allow par-spacing for HsApp HsDo
func = other $ meep
do
abc
def
(some other very long linnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnne)
#test allow par-spacing for HsApp HsDo
func = other $ meep
[ x | x <- myList ]
(some other very long linnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnne)
#test allow par-spacing for HsApp HsSpliceE
{-# LANGUAGE QuasiQuotes #-}
func = other $ meep
[q|hello
world|]
(some other very long linnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnne)

35
data/16-pending.blt Normal file
View File

@ -0,0 +1,35 @@
###############################################################################
###############################################################################
###############################################################################
#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"

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,43 @@
###############################################################################
###############################################################################
###############################################################################
#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
]

View File

@ -1 +0,0 @@
func :: a -> a

View File

@ -1,3 +0,0 @@
func
:: lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd
-> (lakjsdlkjasldkj -> lakjsdlkjasldkj)

View File

@ -1 +0,0 @@
func = klajsdas klajsdas klajsdas

View File

@ -1,3 +0,0 @@
func = lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd
lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd
lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd

View File

@ -1,3 +0,0 @@
func = lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd lakjsdlajsdljas
lakjsdlajsdljas
lakjsdlajsdljas

View File

@ -1 +0,0 @@
func = (1 +)

View File

@ -1 +0,0 @@
func = (+ 1)

View File

@ -1 +0,0 @@
func = (1 `abc`)

View File

@ -1 +0,0 @@
func = (`abc` 1)

View File

@ -1 +0,0 @@
func = (abc, def)

View File

@ -1 +0,0 @@
func = (abc, )

View File

@ -1 +0,0 @@
func = (, abc)

View File

@ -1,3 +0,0 @@
func
:: (lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd -> lakjsdlkjasldkj)
-> lakjsdlkjasldkj

View File

@ -1,6 +0,0 @@
myTupleSection =
( verylaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaargefirstelement
,
, verylaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaargethirdelement
,
)

View File

@ -1,4 +0,0 @@
func =
( lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd
, lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd
)

View File

@ -1,6 +0,0 @@
foo = if True
then
-- iiiiii
"a "
else
"b "

View File

@ -1,5 +0,0 @@
func = if cond
then pure 42
else do
-- test
abc

View File

@ -1,3 +0,0 @@
func = case x of
False -> False
True -> True

View File

@ -1,7 +0,0 @@
func =
case
lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd
lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd
of
False -> False
True -> True

View File

@ -1,7 +0,0 @@
func = do
case
lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd
lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd
of
False -> False
True -> True

View File

@ -1 +0,0 @@
func = case x of {}

View File

@ -1,5 +0,0 @@
func =
case
lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd
lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd
of {}

View File

@ -1,5 +0,0 @@
func = do
case
lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd
lakjsdlajsdljasdlkjasldjasldjasldjalsdjlaskjd
of {}

View File

@ -1,5 +0,0 @@
func
:: ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd
-> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd
)
-> lakjsdlkjasldkj

View File

@ -1,3 +0,0 @@
func = do
stmt
stmt

View File

@ -1,3 +0,0 @@
func = do
x <- stmt
stmt x

View File

@ -1,3 +0,0 @@
func = do
let x = 13
stmt x

View File

@ -1,7 +0,0 @@
func =
foooooo
$ [ case
foooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
of
_ -> True
]

View File

@ -1,4 +0,0 @@
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

View File

@ -1,4 +0,0 @@
testMethod foo bar baz qux =
let x = undefined :: String
-- some comment explaining the in expression
in undefined :: String

View File

@ -1,3 +0,0 @@
testMethod foo bar baz qux =
-- some comment explaining the in expression
let x = undefined :: String in undefined :: String

View File

@ -1,6 +0,0 @@
foo foo bar baz qux =
let a = 1
b = 2
c = 3
-- some comment explaining the in expression
in undefined :: String

View File

@ -1,6 +0,0 @@
func =
foo
$ [ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
, bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
]
++ [ccccccccccccccccccccccccccccccccccccccccccccccccccccccccc]

View File

@ -1 +0,0 @@
module Main where

View File

@ -1,5 +0,0 @@
func
:: ( ( lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd
-> lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd
)
)

View File

@ -1 +0,0 @@
module Main () where

View File

@ -1 +0,0 @@
module Main (main) where

View File

@ -1 +0,0 @@
module Main (main, test1, test2) where

View File

@ -1,12 +0,0 @@
module Main
( main
, test1
, test2
, test3
, test4
, test5
, test6
, test7
, test8
, test9
) where

View File

@ -1,12 +0,0 @@
module Main
( main
-- main
, test1
, test2
-- Test 3
, test3
, test4
-- Test 5
, test5
-- Test 6
) where

View File

@ -1 +0,0 @@
module Main (Test(..)) where

View File

@ -1 +0,0 @@
module Main (module Main) where

View File

@ -1 +0,0 @@
module Main (Test(Test, a, b)) where

View File

@ -1,6 +0,0 @@
-- comment1
module Main
( Test(Test, a, b)
, foo -- comment2
) -- comment3
where

View File

@ -1 +0,0 @@
module Main (Test()) where

View File

@ -1 +0,0 @@
func :: asd -> Either a b

View File

@ -1 +0,0 @@
-- Intentionally left empty

View File

@ -1 +0,0 @@
import Data.List

View File

@ -1 +0,0 @@
import Data.List as L

View File

@ -1 +0,0 @@
import qualified Data.List

View File

@ -1 +0,0 @@
import qualified Data.List as L

View File

@ -1 +0,0 @@
import safe Data.List as L

View File

@ -1 +0,0 @@
import {-# SOURCE #-} Data.List ( )

View File

@ -1 +0,0 @@
import safe qualified Data.List

View File

@ -1 +0,0 @@
import {-# SOURCE #-} safe qualified Data.List

View File

@ -1 +0,0 @@
import qualified "base" Data.List

View File

@ -1,5 +0,0 @@
func
:: asd
-> Either
lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd
lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd

View File

@ -1,3 +0,0 @@
import {-# SOURCE #-} safe qualified "base" Data.List as L
import {-# SOURCE #-} safe qualified "base" Data.List ( )
import {-# SOURCE #-} safe qualified Data.List hiding ( )

View File

@ -1 +0,0 @@
import qualified Data.List ( )

View File

@ -1 +0,0 @@
import Data.List ( nub )

View File

@ -1,4 +0,0 @@
import Data.List ( foldl'
, indexElem
, nub
)

View File

@ -1,14 +0,0 @@
import Test ( Long
, anymore
, fit
, items
, line
, list
, not
, onA
, quite
, single
, that
, will
, with
)

View File

@ -1,11 +0,0 @@
import Test ( (+)
, (:!)(..)
, (:*)((:.), T7, t7)
, (:.)
, T
, T2()
, T3(..)
, T4(T4)
, T5(T5, t5)
, T6((<|>))
)

View File

@ -1,3 +0,0 @@
import Test hiding ( )
import Test as T
hiding ( )

View File

@ -1,13 +0,0 @@
import Prelude as X
hiding ( head
, init
, last
, maximum
, minimum
, pred
, read
, readFile
, succ
, tail
, undefined
)

View File

@ -1,3 +0,0 @@
import TestJustAbitToLongModuleNameLikeThisOneIs
( )
import TestJustShortEnoughModuleNameLikeThisOne ( )

View File

@ -1,3 +0,0 @@
import TestJustAbitToLongModuleNameLikeThisOneI
as T
import TestJustShortEnoughModuleNameLikeThisOn as T

View File

@ -1,6 +0,0 @@
func
:: asd
-> Trither
lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd
lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd
lkasdlkjalsdjlakjsdlkjasldkjalskdjlkajsd

Some files were not shown because too many files have changed in this diff Show More