ghc-exactprint 0.5.2.1 → 0.5.3.0
raw patch · 58 files changed
+6717/−3318 lines, 58 filesdep ~bytestringdep ~freedep ~ghc-exactprintPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: bytestring, free, ghc-exactprint, turtle
API changes (from Hackage documentation)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsImpExp.IE name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsImpExp.ImportDecl name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate [HsImpExp.LIE name]
+ Language.Haskell.GHC.ExactPrint: addAnnotationsForPretty :: (Annotate a) => [Comment] -> Located a -> Anns -> Anns
+ Language.Haskell.GHC.ExactPrint.Annotate: [IfInContext] :: Set AstContext -> Annotated () -> Annotated () -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotate: [MarkManyOptional] :: AnnKeywordId -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotate: [MarkOffsetPrimOptional] :: AnnKeywordId -> Int -> Maybe String -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotate: [MarkPPOptional] :: AnnKeywordId -> Maybe String -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotate: [SetContextLevel] :: Set AstContext -> Int -> Annotated () -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotate: [TellContext] :: Set AstContext -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotate: [UnsetContext] :: AstContext -> Annotated () -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotate: [WithSortKeyContexts] :: ListContexts -> [(SrcSpan, Annotated ())] -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsImpExp.IE name)
+ Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsImpExp.ImportDecl name)
+ Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate [HsImpExp.LIE name]
+ Language.Haskell.GHC.ExactPrint.Annotate: withSortKeyContextsHelper :: (Monad m) => (Annotated () -> m ()) -> ListContexts -> [(SrcSpan, Annotated ())] -> m ()
+ Language.Haskell.GHC.ExactPrint.Parsers: ghcWrapper :: Ghc a -> IO a
+ Language.Haskell.GHC.ExactPrint.Parsers: initDynFlags :: GhcMonad m => FilePath -> m DynFlags
+ Language.Haskell.GHC.ExactPrint.Parsers: initDynFlagsPure :: GhcMonad m => FilePath -> String -> m DynFlags
+ Language.Haskell.GHC.ExactPrint.Parsers: parseModuleApiAnnsWithCppInternal :: GhcMonad m => CppOptions -> DynFlags -> FilePath -> m (Either (SrcSpan, String) (ApiAnns, [Comment], DynFlags, ParsedSource))
+ Language.Haskell.GHC.ExactPrint.Parsers: postParseTransform :: Either a (ApiAnns, [Comment], DynFlags, ParsedSource) -> DeltaOptions -> Either a (Anns, ParsedSource)
+ Language.Haskell.GHC.ExactPrint.Pretty: addAnnotationsForPretty :: (Annotate a) => [Comment] -> Located a -> Anns -> Anns
+ Language.Haskell.GHC.ExactPrint.Pretty: instance GHC.Base.Monoid Language.Haskell.GHC.ExactPrint.Pretty.PrettyWriter
+ Language.Haskell.GHC.ExactPrint.Pretty: instance GHC.Show.Show Language.Haskell.GHC.ExactPrint.Pretty.PrettyOptions
+ Language.Haskell.GHC.ExactPrint.Types: ACS :: !(Map a Int) -> ACS' a
+ Language.Haskell.GHC.ExactPrint.Types: AddVbar :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: AdvanceLine :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: CaseAlt :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: CtxFirst :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: CtxLast :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: CtxMiddle :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: CtxOnly :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: CtxPos :: Int -> AstContext
+ Language.Haskell.GHC.ExactPrint.Types: Deriving :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: ExplicitNeverActive :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: FollowingLine :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: HasHiding :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: InClassDecl :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: InGadt :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: InIE :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: InRecCon :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: InSpliceDecl :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: InfixOp :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: Intercalate :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: LC :: !(Set AstContext) -> ListContexts
+ Language.Haskell.GHC.ExactPrint.Types: LambdaExpr :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: LeftMost :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: ListItem :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: ListStart :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: NoAdvanceLine :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: NoDarrow :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: NoPrecedingSpace :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: Parens :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: PrefixOp :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: PrefixOpDollar :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: TopLevel :: AstContext
+ Language.Haskell.GHC.ExactPrint.Types: [acs] :: ACS' a -> !(Map a Int)
+ Language.Haskell.GHC.ExactPrint.Types: [lcOnly, lcInitial, lcMiddle, lcLast] :: ListContexts -> !(Set AstContext)
+ Language.Haskell.GHC.ExactPrint.Types: data ACS' a
+ Language.Haskell.GHC.ExactPrint.Types: data AstContext
+ Language.Haskell.GHC.ExactPrint.Types: data ListContexts
+ Language.Haskell.GHC.ExactPrint.Types: defaultACS :: AstContextSet
+ Language.Haskell.GHC.ExactPrint.Types: instance Data.Data.Data Language.Haskell.GHC.ExactPrint.Types.AnnConName
+ Language.Haskell.GHC.ExactPrint.Types: instance Data.Data.Data Language.Haskell.GHC.ExactPrint.Types.AnnKey
+ Language.Haskell.GHC.ExactPrint.Types: instance Data.Data.Data Language.Haskell.GHC.ExactPrint.Types.KeywordId
+ Language.Haskell.GHC.ExactPrint.Types: instance GHC.Base.Monoid (Language.Haskell.GHC.ExactPrint.Types.ACS' Language.Haskell.GHC.ExactPrint.Types.AstContext)
+ Language.Haskell.GHC.ExactPrint.Types: instance GHC.Classes.Eq Language.Haskell.GHC.ExactPrint.Types.AstContext
+ Language.Haskell.GHC.ExactPrint.Types: instance GHC.Classes.Eq Language.Haskell.GHC.ExactPrint.Types.ListContexts
+ Language.Haskell.GHC.ExactPrint.Types: instance GHC.Classes.Ord Language.Haskell.GHC.ExactPrint.Types.AstContext
+ Language.Haskell.GHC.ExactPrint.Types: instance GHC.Show.Show Language.Haskell.GHC.ExactPrint.Types.AstContext
+ Language.Haskell.GHC.ExactPrint.Types: instance GHC.Show.Show Language.Haskell.GHC.ExactPrint.Types.ListContexts
+ Language.Haskell.GHC.ExactPrint.Types: instance GHC.Show.Show a => GHC.Show.Show (Language.Haskell.GHC.ExactPrint.Types.ACS' a)
+ Language.Haskell.GHC.ExactPrint.Types: instance GHC.Show.Show a => Outputable.Outputable (Language.Haskell.GHC.ExactPrint.Types.ACS' a)
+ Language.Haskell.GHC.ExactPrint.Types: type AstContextSet = ACS' AstContext
+ Language.Haskell.GHC.ExactPrint.Utils: bumpAcs :: ACS' a -> ACS' a
+ Language.Haskell.GHC.ExactPrint.Utils: extractComments :: ApiAnns -> [Comment]
+ Language.Haskell.GHC.ExactPrint.Utils: inAcs :: (Ord a) => Set a -> ACS' a -> Bool
+ Language.Haskell.GHC.ExactPrint.Utils: isExactName :: (Data name) => name -> Bool
+ Language.Haskell.GHC.ExactPrint.Utils: isGadt :: [LConDecl name] -> Bool
+ Language.Haskell.GHC.ExactPrint.Utils: occAttributes :: OccName -> String
+ Language.Haskell.GHC.ExactPrint.Utils: pushAcs :: ACS' a -> ACS' a
+ Language.Haskell.GHC.ExactPrint.Utils: setAcs :: Set AstContext -> AstContextSet -> AstContextSet
+ Language.Haskell.GHC.ExactPrint.Utils: setAcsWithLevel :: (Ord a) => Set a -> Int -> ACS' a -> ACS' a
+ Language.Haskell.GHC.ExactPrint.Utils: showSDocDebug_ :: SDoc -> String
+ Language.Haskell.GHC.ExactPrint.Utils: showSDoc_ :: SDoc -> String
+ Language.Haskell.GHC.ExactPrint.Utils: unsetAcs :: (Ord a) => a -> ACS' a -> ACS' a
- Language.Haskell.GHC.ExactPrint.Annotate: [GetSrcSpanForKw] :: AnnKeywordId -> (SrcSpan -> next) -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotate: [GetSrcSpanForKw] :: SrcSpan -> AnnKeywordId -> (SrcSpan -> next) -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotate: [StoreOriginalSrcSpan] :: AnnKey -> (AnnKey -> next) -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotate: [StoreOriginalSrcSpan] :: SrcSpan -> AnnKey -> (AnnKey -> next) -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Utils: orderByKey :: [(SrcSpan, a)] -> [SrcSpan] -> [a]
+ Language.Haskell.GHC.ExactPrint.Utils: orderByKey :: [(SrcSpan, a)] -> [SrcSpan] -> [(SrcSpan, a)]
Files
- ChangeLog +10/−0
- ghc-exactprint.cabal +28/−7
- src/Language/Haskell/GHC/ExactPrint.hs +4/−0
- src/Language/Haskell/GHC/ExactPrint/Annotate.hs +3668/−3045
- src/Language/Haskell/GHC/ExactPrint/Delta.hs +69/−31
- src/Language/Haskell/GHC/ExactPrint/Parsers.hs +96/−63
- src/Language/Haskell/GHC/ExactPrint/Preprocess.hs +13/−2
- src/Language/Haskell/GHC/ExactPrint/Pretty.hs +576/−0
- src/Language/Haskell/GHC/ExactPrint/Print.hs +79/−36
- src/Language/Haskell/GHC/ExactPrint/Transform.hs +1/−1
- src/Language/Haskell/GHC/ExactPrint/Types.hs +125/−5
- src/Language/Haskell/GHC/ExactPrint/Utils.hs +191/−22
- tests/PrepareHackage.hs +16/−42
- tests/Test.hs +45/−48
- tests/Test/Common.hs +32/−10
- tests/Test/NoAnnotations.hs +218/−0
- tests/Test/Transform.hs +5/−4
- tests/examples/failing/CtorOp.hs +11/−0
- tests/examples/failing/CtorOp.hs.bad +11/−0
- tests/examples/failing/List2.hs +40/−0
- tests/examples/failing/List2.hs.bad +40/−0
- tests/examples/failing/TensorTests.hs +41/−0
- tests/examples/failing/TensorTests.hs.bad +41/−0
- tests/examples/ghc710/Case.hs +5/−0
- tests/examples/ghc710/Field1.hs +10/−0
- tests/examples/ghc710/Mixed.hs +3/−1
- tests/examples/ghc710/ModuleOnly.hs +1/−0
- tests/examples/ghc710/RdrNames.hs +6/−1
- tests/examples/ghc710/Simple.hs +8/−0
- tests/examples/ghc710/Splice.hs +2/−0
- tests/examples/ghc8/AddParams2.hs +9/−0
- tests/examples/ghc8/Class.hs +20/−0
- tests/examples/ghc8/Collapse1.hs +16/−0
- tests/examples/ghc8/Compare.hs +23/−0
- tests/examples/ghc8/DatatypeContexts.hs +25/−0
- tests/examples/ghc8/Decision.hs +726/−0
- tests/examples/ghc8/F.hs +20/−0
- tests/examples/ghc8/Families.hs +14/−0
- tests/examples/ghc8/ForFree.hs +23/−0
- tests/examples/ghc8/FromGrin2.hs +6/−0
- tests/examples/ghc8/GA1r.hs +5/−0
- tests/examples/ghc8/Generic.hs +9/−0
- tests/examples/ghc8/Manipulate.hs +39/−0
- tests/examples/ghc8/Match.hs +38/−0
- tests/examples/ghc8/MultiQuote.hs +39/−0
- tests/examples/ghc8/PSQ.hs +4/−0
- tests/examples/ghc8/Ppr017.hs +9/−0
- tests/examples/ghc8/Query.hs +13/−0
- tests/examples/ghc8/RulePragma.hs +7/−0
- tests/examples/ghc8/SpecializePhaseControl.hs +15/−0
- tests/examples/ghc8/Structure8.hs +1/−0
- tests/examples/ghc8/Structure8a.hs +1/−0
- tests/examples/ghc8/T11381.hs +9/−0
- tests/examples/ghc8/T11959.hs +6/−0
- tests/examples/ghc8/Templates.hs +57/−0
- tests/examples/ghc8/TestUtils.hs +5/−0
- tests/examples/ghc8/UnicodeSyntax.hs +7/−0
- tests/examples/ghc8/Webhook.hs +176/−0
ChangeLog view
@@ -1,3 +1,13 @@+2017-02-07 v0.5.3.0+ * Support GHC 8.0.2+ * Correct the logic around RigidLayout to function as originally+ intended.+ * Introduce Pretty module to add default annotations to a bare AST+ fragment, so that it can be printed correctly via exactprint. In+ this case, "correct" is defined as generating the same AST if+ parsed again, it may not be beautiful layout.+ * Expose some additional internal parsing options (@lspitzner)+ 2016-07-24 v0.5.2.1 * Remove additional files from release tarball
ghc-exactprint.cabal view
@@ -1,5 +1,5 @@ name: ghc-exactprint-version: 0.5.2.1+version: 0.5.3.0 synopsis: ExactPrint for GHC description: Using the API Annotations available from GHC 7.10.2, this library provides a means to round trip any code that can@@ -26,7 +26,7 @@ maintainer: alan.zimm@gmail.com category: Development build-type: Simple-tested-with: GHC == 7.10.3, GHC == 8.0.1+tested-with: GHC == 7.10.3, GHC == 8.0.1, GHC == 8.0.2 extra-source-files: ChangeLog tests/examples/failing/*.hs tests/examples/ghc710/*.hs@@ -47,7 +47,12 @@ Default: False } +Flag dev {+ Description: Development mode, do not use ghc-exactprint lib in the tests+ Default: False+} + library exposed-modules: Language.Haskell.GHC.ExactPrint , Language.Haskell.GHC.ExactPrint.Annotate@@ -55,6 +60,7 @@ , Language.Haskell.GHC.ExactPrint.GhcInterim , Language.Haskell.GHC.ExactPrint.Lookup , Language.Haskell.GHC.ExactPrint.Preprocess+ , Language.Haskell.GHC.ExactPrint.Pretty , Language.Haskell.GHC.ExactPrint.Print , Language.Haskell.GHC.ExactPrint.Transform , Language.Haskell.GHC.ExactPrint.Types@@ -84,25 +90,40 @@ Test-Suite test type: exitcode-stdio-1.0- hs-source-dirs: tests+ if flag (dev)+ hs-source-dirs: tests+ src+ else+ hs-source-dirs: tests+ main-is: Test.hs- other-modules: Test.Common, Test.Consistency, Test.Transform+ other-modules: Test.Common+ , Test.Consistency+ , Test.NoAnnotations+ , Test.Transform GHC-Options: -threaded Default-language: Haskell2010 if impl (ghc < 7.10.2) buildable: False Build-depends: HUnit >= 1.2 , base < 5+ , bytestring , containers >= 0.5+ , Diff , directory >= 1.2 , filepath >= 1.4 , ghc >= 7.10.2- , ghc-exactprint >= 0.3 , ghc-paths >= 0.1 , mtl >= 2.2.1 , syb >= 0.5 , silently >= 1.2 , filemanip >= 0.3+ -- for the lib only+ if flag (dev)+ build-depends: free+ else+ build-depends: ghc-exactprint >= 0.5.3+ if impl (ghc >= 7.11) build-depends: ghc-boot @@ -165,8 +186,8 @@ , ghc >= 7.10.2 , ghc-paths >= 0.1 , HUnit- , text >= 1.2.2- , turtle >= 1.2.5+ , text >= 1.2.2+ , turtle >= 1.3.0 buildable: True if impl (ghc >= 7.11) build-depends: ghc-boot
src/Language/Haskell/GHC/ExactPrint.hs view
@@ -16,12 +16,16 @@ -- * Transformation , module Language.Haskell.GHC.ExactPrint.Transform + -- * Adding default annotations+ , addAnnotationsForPretty+ -- * Printing , exactPrint ) where import Language.Haskell.GHC.ExactPrint.Delta+import Language.Haskell.GHC.ExactPrint.Pretty import Language.Haskell.GHC.ExactPrint.Print import Language.Haskell.GHC.ExactPrint.Transform import Language.Haskell.GHC.ExactPrint.Types
src/Language/Haskell/GHC/ExactPrint/Annotate.hs view
@@ -1,3049 +1,3672 @@ {-# LANGUAGE CPP #-}-{-# LANGUAGE TemplateHaskell #-}-{-# LANGUAGE StandaloneDeriving #-}-{-# LANGUAGE DeriveFunctor #-}-{-# LANGUAGE GADTs #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE UndecidableInstances #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE PatternSynonyms #-}-{-# LANGUAGE StandaloneDeriving #-}-{-# LANGUAGE DeriveDataTypeable #-}--- | 'annotate' is a function which given a GHC AST fragment, constructs--- a syntax tree which indicates which annotations belong to each specific--- part of the fragment.------ "Delta" and "Print" provide two interpreters for this structure. You--- should probably use those unless you know what you're doing!------ The functor 'AnnotationF' has a number of constructors which correspond--- to different sitations which annotations can arise. It is hoped that in--- future versions of GHC these can be simplified by making suitable--- modifications to the AST.--module Language.Haskell.GHC.ExactPrint.Annotate- (- annotate- , AnnotationF(..)- , Annotated- , Annotate(..)- ) where--import Data.Maybe ( fromMaybe )-#if __GLASGOW_HASKELL__ <= 710-import Data.Ord ( comparing )-import Data.List ( sortBy )-#endif--import Language.Haskell.GHC.ExactPrint.Types-import Language.Haskell.GHC.ExactPrint.Utils--import qualified Bag as GHC-import qualified BasicTypes as GHC-import qualified BooleanFormula as GHC-import qualified Class as GHC-import qualified CoAxiom as GHC-import qualified FastString as GHC-import qualified ForeignCall as GHC-import qualified GHC as GHC-import qualified OccName as GHC-import qualified Outputable as GHC--import Control.Monad.Trans.Free-import Control.Monad.Free.TH (makeFreeCon)-import Control.Monad.Identity-import Data.Data--import Debug.Trace---{-# ANN module "HLint: ignore Eta reduce" #-}--- ------------------------------------------------------------------------- |--- ['MarkPrim']--- The main constructor. Marks that a specific AnnKeywordId could--- appear with an optional String which is used when printing.--- ['MarkEOF']--- Special constructor which marks the end of file marker.--- ['MarkExternal'] TODO--- ['MarkOutside'] A @AnnKeywordId@ which is precisely located but not inside the--- current context. This is usually used to reassociated located--- @RdrName@ which are more naturally associated with their parent than--- in their own annotation.--- ['MarkInside']--- The dual of MarkOutside. If we wish to mark a non-separating comma--- or semi-colon then we must use this constructor.--- ['MarkMany'] Some syntax elements allow an arbritary number of puncuation marks--- without reflection in the AST. This construction greedily takes all of--- the specified @AnnKeywordId@.--- ['MarkOffsetPrim'] Some syntax elements have repeated @AnnKeywordId@ which are--- seperated by different @AnnKeywordId@. Thus using MarkMany is--- unsuitable and instead we provide an index to specify which specific--- instance to choose each time.--- ['WithAST'] TODO--- ['CountAnns'] Sometimes the AST does not reflect the concrete source code and the--- only way to tell what the concrete source was is to count a certain--- kind of @AnnKeywordId@.--- ['WithSortKey'] There are many places where the syntactic ordering of elements is--- thrown away by the AST. This constructor captures the original--- ordering and reflects any changes in ordered as specified by the--- @annSortKey@ field in @Annotation@.--- ['SetLayoutFlag'] It is important to know precisely where layout rules apply. This--- constructor wraps a computation to indicate that LayoutRules apply to--- the corresponding construct.--- ['StoreOriginalSrcSpan'] TODO--- ['GetSrcSpanFromKw'] TODO--- ['StoreString'] TODO--- ['AnnotationsToComments'] Used when the AST is sufficiently vague that there is no other--- option but to convert a fragment of source code into a comment. This--- means it is impossible to edit such a fragment but means that--- processing files with such fragments is still possible.-data AnnotationF next where- MarkPrim :: GHC.AnnKeywordId -> Maybe String -> next -> AnnotationF next- MarkEOF :: next -> AnnotationF next- MarkExternal :: GHC.SrcSpan -> GHC.AnnKeywordId -> String -> next -> AnnotationF next- MarkOutside :: GHC.AnnKeywordId -> KeywordId -> next -> AnnotationF next- MarkInside :: GHC.AnnKeywordId -> next -> AnnotationF next- MarkMany :: GHC.AnnKeywordId -> next -> AnnotationF next- MarkOffsetPrim :: GHC.AnnKeywordId -> Int -> Maybe String -> next -> AnnotationF next- WithAST :: Data a => GHC.Located a- -> Annotated b -> next -> AnnotationF next- CountAnns :: GHC.AnnKeywordId -> (Int -> next) -> AnnotationF next- WithSortKey :: [(GHC.SrcSpan, Annotated ())] -> next -> AnnotationF next-- SetLayoutFlag :: Rigidity -> Annotated () -> next -> AnnotationF next-- -- Required to work around deficiencies in the GHC AST- StoreOriginalSrcSpan :: AnnKey -> (AnnKey -> next) -> AnnotationF next- GetSrcSpanForKw :: GHC.AnnKeywordId -> (GHC.SrcSpan -> next) -> AnnotationF next-#if __GLASGOW_HASKELL__ <= 710- StoreString :: String -> GHC.SrcSpan -> next -> AnnotationF next-#endif- AnnotationsToComments :: [GHC.AnnKeywordId] -> next -> AnnotationF next--deriving instance Functor (AnnotationF)--type Annotated = FreeT AnnotationF Identity----- -----------------------------------------------------------------------makeFreeCon 'MarkEOF-makeFreeCon 'MarkPrim-makeFreeCon 'MarkOutside-makeFreeCon 'MarkInside-makeFreeCon 'MarkExternal-makeFreeCon 'MarkMany-makeFreeCon 'MarkOffsetPrim-makeFreeCon 'CountAnns-makeFreeCon 'StoreOriginalSrcSpan-makeFreeCon 'GetSrcSpanForKw-#if __GLASGOW_HASKELL__ <= 710-makeFreeCon 'StoreString-#endif-makeFreeCon 'AnnotationsToComments-makeFreeCon 'WithSortKey---- -----------------------------------------------------------------------setLayoutFlag :: Annotated () -> Annotated ()-setLayoutFlag action = liftF (SetLayoutFlag NormalLayout action ())--setRigidFlag :: Annotated () -> Annotated ()-setRigidFlag action = liftF (SetLayoutFlag RigidLayout action ())---- | Construct a syntax tree which represent which KeywordIds must appear--- where.-annotate :: (Annotate ast) => GHC.Located ast -> Annotated ()-annotate = markLocated---- -----------------------------------------------------------------------#if __GLASGOW_HASKELL__ <= 710-workOutString :: GHC.AnnKeywordId -> (GHC.SrcSpan -> String) -> Annotated ()-workOutString kw f = do- ss <- getSrcSpanForKw kw- storeString (f ss) ss-#endif---- ------------------------------------------------------------------------- |Main driver point for annotations.-withAST :: Data a => GHC.Located a -> Annotated () -> Annotated ()-withAST lss action =- liftF (WithAST lss prog ())- where- prog = do- action- -- Automatically add any trailing comma or semi- markOutside GHC.AnnComma (G GHC.AnnComma)---- ------------------------------------------------------------------------ Additional smart constructors--mark :: GHC.AnnKeywordId -> Annotated ()-mark kwid = markPrim kwid Nothing--markWithString :: GHC.AnnKeywordId -> String -> Annotated ()-markWithString kwid s = markPrim kwid (Just s)--markOffsetWithString :: GHC.AnnKeywordId -> Int -> String -> Annotated ()-markOffsetWithString kwid n s = markOffsetPrim kwid n (Just s)--markOffset :: GHC.AnnKeywordId -> Int -> Annotated ()-markOffset kwid n = markOffsetPrim kwid n Nothing--markTrailingSemi :: Annotated ()-markTrailingSemi = markOutside GHC.AnnSemi AnnSemiSep---- ------------------------------------------------------------------------- | Constructs a syntax tree which contains information about which--- annotations are required by each element.-markLocated :: (Annotate ast) => GHC.Located ast -> Annotated ()-markLocated ast =- case cast ast :: Maybe (GHC.LHsDecl GHC.RdrName) of- Just d -> markLHsDecl d- Nothing -> withLocated ast markAST--withLocated :: Data a- => GHC.Located a- -> (GHC.SrcSpan -> a -> Annotated ())- -> Annotated ()-withLocated a@(GHC.L l ast) action =- withAST a (action l ast)---- -----------------------------------------------------------------------markListWithLayout :: Annotate ast => [GHC.Located ast] -> Annotated ()-markListWithLayout ls =- setLayoutFlag (mapM_ markLocated ls)--markLocalBindsWithLayout :: (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => GHC.HsLocalBinds name -> Annotated ()-markLocalBindsWithLayout binds =- setLayoutFlag (markHsLocalBinds binds)---- ------------------------------------------------------------------------- |This function is used to get around shortcomings in the GHC AST for 7.10.1-markLocatedFromKw :: (Annotate ast) => GHC.AnnKeywordId -> ast -> Annotated ()-markLocatedFromKw kw a = do- ss <- getSrcSpanForKw kw- AnnKey ss' _ <- storeOriginalSrcSpan (mkAnnKey (GHC.L ss a))- markLocated (GHC.L ss' a)---- -----------------------------------------------------------------------markMaybe :: (Annotate ast) => Maybe (GHC.Located ast) -> Annotated ()-markMaybe Nothing = return ()-markMaybe (Just ast) = markLocated ast---- ------------------------------------------------------------------------ Managing lists which have been separated, e.g. Sigs and Binds--prepareListAnnotation :: Annotate a => [GHC.Located a] -> [(GHC.SrcSpan,Annotated ())]-prepareListAnnotation ls = map (\b -> (GHC.getLoc b,markLocated b)) ls--applyListAnnotations :: [(GHC.SrcSpan, Annotated ())] -> Annotated ()-applyListAnnotations ls = withSortKey ls--#if __GLASGOW_HASKELL__ <= 710-lexicalSortLocated :: [GHC.Located a] -> [GHC.Located a]-lexicalSortLocated = sortBy (comparing GHC.getLoc)-#endif---- -----------------------------------------------------------------------class Data ast => Annotate ast where- markAST :: GHC.SrcSpan -> ast -> Annotated ()---- -----------------------------------------------------------------------instance Annotate (GHC.HsModule GHC.RdrName) where- markAST _ (GHC.HsModule mmn mexp imps decs mdepr _haddock) = do-- case mmn of- Nothing -> return ()- Just (GHC.L ln mn) -> do- mark GHC.AnnModule- markExternal ln GHC.AnnVal (GHC.moduleNameString mn)-- case mdepr of- Nothing -> return ()- Just depr -> markLocated depr-- case mexp of- Nothing -> return ()- Just expr -> markLocated expr-- mark GHC.AnnWhere- mark GHC.AnnOpenC -- Possible '{'- markMany GHC.AnnSemi -- possible leading semis- mapM_ markLocated imps-- mapM_ markLocated decs-- mark GHC.AnnCloseC -- Possible '}'-- markEOF---- -----------------------------------------------------------------------instance Annotate GHC.WarningTxt where- markAST _ (GHC.WarningTxt (GHC.L ls txt) lss) = do- markExternal ls GHC.AnnOpen txt- mark GHC.AnnOpenS- mapM_ markLocated lss- mark GHC.AnnCloseS- markWithString GHC.AnnClose "#-}"-- markAST _ (GHC.DeprecatedTxt (GHC.L ls txt) lss) = do- markExternal ls GHC.AnnOpen txt- mark GHC.AnnOpenS- mapM_ markLocated lss- mark GHC.AnnCloseS- markWithString GHC.AnnClose "#-}"---- ----------------------------------------------------------------------#if __GLASGOW_HASKELL__ <= 710-#else-instance Annotate GHC.StringLiteral where- markAST l (GHC.StringLiteral src _) = markExternal l GHC.AnnVal src-#endif---- -----------------------------------------------------------------------instance Annotate (GHC.SourceText,GHC.FastString) where- -- markAST l (_,fs) = markAST l fs- markAST l (src,_fs) = markExternal l GHC.AnnVal src---- -----------------------------------------------------------------------instance (GHC.DataId name,Annotate name)- => Annotate [GHC.LIE name] where- markAST _ ls = do- mark GHC.AnnHiding -- in an import decl- mark GHC.AnnOpenP -- '('- mapM_ markLocated ls- mark GHC.AnnCloseP -- ')'--instance (GHC.DataId name,Annotate name)- => Annotate (GHC.IE name) where- markAST _ ie = do-- case ie of- (GHC.IEVar ln) -> do- mark GHC.AnnPattern- mark GHC.AnnType- markLocated ln-- (GHC.IEThingAbs ln@(GHC.L _ n)) -> do- {-- At the moment (7.10.2) GHC does not cleanly represent an export of the form- "type Foo"- and it only captures the name "Foo".-- The Api Annotations workaround is to have the IEThingAbs SrcSpan- extend across both the "type" and "Foo", and then to capture the- individual item locations in an AnnType and AnnVal annotation.-- This need to be fixed for 7.12.- -}- cnt <- countAnns GHC.AnnType- if cnt == 1- then do- mark GHC.AnnType- markLocatedFromKw GHC.AnnVal n- else markLocated ln--#if __GLASGOW_HASKELL__ <= 710- (GHC.IEThingWith ln ns) -> do-#else- (GHC.IEThingWith ln wc ns _lfs) -> do-{-- | IEThingWith (Located name)- IEWildcard- [Located name]- [Located (FieldLbl name)]- -- ^ Class/Type plus some methods/constructors- -- and record fields; see Note [IEThingWith]---}-#endif- -- TODO: Deal with GHC 8.0 additions- markLocated ln- mark GHC.AnnOpenP-#if __GLASGOW_HASKELL__ <= 710- mapM_ markLocated ns-#else- case wc of- GHC.NoIEWildcard -> mapM_ markLocated ns- GHC.IEWildcard n -> do- mapM_ markLocated (take n ns)- mark GHC.AnnDotdot- case drop n ns of- [] -> return ()- ns' -> do- markOffset GHC.AnnComma 0- mapM_ markLocated ns'-#endif- mark GHC.AnnCloseP-- (GHC.IEThingAll ln) -> do- markLocated ln- mark GHC.AnnOpenP- mark GHC.AnnDotdot- mark GHC.AnnCloseP-- (GHC.IEModuleContents (GHC.L lm mn)) -> do- mark GHC.AnnModule- markExternal lm GHC.AnnVal (GHC.moduleNameString mn)-- -- Only used in Haddock mode so we can ignore them.- (GHC.IEGroup _ _) -> return ()-- (GHC.IEDoc _) -> return ()-- (GHC.IEDocNamed _) -> return ()---- ----------------------------------------------------------------------{---- For details on above see note [Api annotations] in ApiAnnotation-data RdrName- = Unqual OccName- -- ^ Used for ordinary, unqualified occurrences, e.g. @x@, @y@ or @Foo@.- -- Create such a 'RdrName' with 'mkRdrUnqual'-- | Qual ModuleName OccName- -- ^ A qualified name written by the user in- -- /source/ code. The module isn't necessarily- -- the module where the thing is defined;- -- just the one from which it is imported.- -- Examples are @Bar.x@, @Bar.y@ or @Bar.Foo@.- -- Create such a 'RdrName' with 'mkRdrQual'-- | Orig Module OccName- -- ^ An original name; the module is the /defining/ module.- -- This is used when GHC generates code that will be fed- -- into the renamer (e.g. from deriving clauses), but where- -- we want to say \"Use Prelude.map dammit\". One of these- -- can be created with 'mkOrig'-- | Exact Name- -- ^ We know exactly the 'Name'. This is used:- --- -- (1) When the parser parses built-in syntax like @[]@- -- and @(,)@, but wants a 'RdrName' from it- --- -- (2) By Template Haskell, when TH has generated a unique name- --- -- Such a 'RdrName' can be created by using 'getRdrName' on a 'Name'- deriving (Data, Typeable)--}--instance Annotate GHC.RdrName where- markAST l n = do- let- str = rdrName2String n- doNormalRdrName = do- let str' = case str of- "forall" -> if spanLength l == 1 then "∀" else str- _ -> str- mark GHC.AnnType- mark GHC.AnnOpenP -- '('- markOffset GHC.AnnBackquote 0- cnt <- countAnns GHC.AnnVal- cntT <- countAnns GHC.AnnCommaTuple- markMany GHC.AnnCommaTuple -- For '(,,,)'- case cnt of- 0 -> if cntT > 0- then return ()- else markExternal l GHC.AnnVal str'- 1 -> markWithString GHC.AnnVal str'- _ -> traceM $ "Printing RdrName, more than 1 AnnVal:" ++ showGhc (l,n)- markOffset GHC.AnnBackquote 1- mark GHC.AnnCloseP-- case n of- GHC.Unqual _ -> doNormalRdrName- GHC.Qual _ _ -> doNormalRdrName- _ -> do- case str of- -- Special handling for atypical RdrNames.- "[]" -> do- mark GHC.AnnOpenS -- '['- mark GHC.AnnCloseS -- ']'- "()" -> do- mark GHC.AnnOpenP -- '('- mark GHC.AnnCloseP -- ')'- ('(':'#':_) -> do- markWithString GHC.AnnOpen "(#" -- '(#'- markMany GHC.AnnCommaTuple- markWithString GHC.AnnClose "#)"-- '#)'- "[::]" -> do- markWithString GHC.AnnOpen "[:" -- '[:'- markWithString GHC.AnnClose ":]" -- ':]'- "(->)" -> do- mark GHC.AnnOpenP -- '('- mark GHC.AnnRarrow- mark GHC.AnnCloseP -- ')'- "~#" -> do- mark GHC.AnnOpenP -- '('- mark GHC.AnnTildehsh- mark GHC.AnnCloseP-#if __GLASGOW_HASKELL__ <= 710- "~" -> do- mark GHC.AnnOpenP- mark GHC.AnnTilde- mark GHC.AnnCloseP-#endif- _ -> doNormalRdrName---- ------------------------------------------------------------------------- TODO: What is this used for? Not in ExactPrint-instance Annotate GHC.Name where- markAST l n = do- markExternal l GHC.AnnVal (showGhc n)---- -----------------------------------------------------------------------instance (GHC.DataId name,Annotate name)- => Annotate (GHC.ImportDecl name) where- markAST _ imp@(GHC.ImportDecl msrc modname mpkg src safeflag _qual _impl _as hiding) = do-- -- 'import' maybe_src maybe_safe optqualified maybe_pkg modid maybeas maybeimpspec- mark GHC.AnnImport-- -- "{-# SOURCE" and "#-}"- when src (markWithString GHC.AnnOpen (fromMaybe "{-# SOURCE" msrc)- >> markWithString GHC.AnnClose "#-}")- when safeflag (mark GHC.AnnSafe)- mark GHC.AnnQualified- case mpkg of- Nothing -> return ()-#if __GLASGOW_HASKELL__ <= 710- Just pkg -> markWithString GHC.AnnPackageName (show (GHC.unpackFS pkg))-#else- Just (GHC.StringLiteral srcPkg _) -> markWithString GHC.AnnPackageName srcPkg-#endif-- markLocated modname-- case GHC.ideclAs imp of- Nothing -> return ()- Just mn -> do- mark GHC.AnnAs- markWithString GHC.AnnVal (GHC.moduleNameString mn)-- case hiding of- Nothing -> return ()- Just (_isHiding,lie) -> do- mark GHC.AnnHiding- markLocated lie- markTrailingSemi---- -----------------------------------------------------------------------instance Annotate GHC.ModuleName where- markAST l mname =- markExternal l GHC.AnnVal (GHC.moduleNameString mname)---- ------------------------------------------------------------------------- instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)-markLHsDecl :: (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => GHC.LHsDecl name -> Annotated ()-markLHsDecl (GHC.L l decl) =- case decl of- GHC.TyClD d -> markLocated (GHC.L l d)- GHC.InstD d -> markLocated (GHC.L l d)- GHC.DerivD d -> markLocated (GHC.L l d)- GHC.ValD d -> markLocated (GHC.L l d)- GHC.SigD d -> markLocated (GHC.L l d)- GHC.DefD d -> markLocated (GHC.L l d)- GHC.ForD d -> markLocated (GHC.L l d)- GHC.WarningD d -> markLocated (GHC.L l d)- GHC.AnnD d -> markLocated (GHC.L l d)- GHC.RuleD d -> markLocated (GHC.L l d)- GHC.VectD d -> markLocated (GHC.L l d)- GHC.SpliceD d -> markLocated (GHC.L l d)- GHC.DocD d -> markLocated (GHC.L l d)- GHC.RoleAnnotD d -> markLocated (GHC.L l d)-#if __GLASGOW_HASKELL__ < 711- GHC.QuasiQuoteD d -> markLocated (GHC.L l d)-#endif--instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.HsDecl name) where- markAST l d = markLHsDecl (GHC.L l d)---- -----------------------------------------------------------------------instance (Annotate name)- => Annotate (GHC.RoleAnnotDecl name) where- markAST _ (GHC.RoleAnnotDecl ln mr) = do- mark GHC.AnnType- mark GHC.AnnRole- markLocated ln- mapM_ markLocated mr--instance Annotate (Maybe GHC.Role) where- markAST l Nothing = markExternal l GHC.AnnVal "_"- markAST l (Just r) = markExternal l GHC.AnnVal (GHC.unpackFS $ GHC.fsFromRole r)---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.SpliceDecl name) where- markAST _ (GHC.SpliceDecl e _flag) = do- mark GHC.AnnOpenPE- markLocated e- mark GHC.AnnCloseP- markTrailingSemi--{--- data SpliceExplicitFlag = ExplicitSplice | -- <=> $(f x y)-- ImplicitSplice -- <=> f x y, i.e. a naked-- top level expression----}---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.VectDecl name) where- markAST _ (GHC.HsVect src ln e) = do- markWithString GHC.AnnOpen src -- "{-# VECTORISE"- markLocated ln- mark GHC.AnnEqual- markLocated e- markWithString GHC.AnnClose "#-}" -- "#-}"-- markAST _ (GHC.HsNoVect src ln) = do- markWithString GHC.AnnOpen src -- "{-# NOVECTORISE"- markLocated ln- markWithString GHC.AnnClose "#-}" -- "#-}"-- markAST _ (GHC.HsVectTypeIn src _b ln mln) = do- markWithString GHC.AnnOpen src -- "{-# VECTORISE" or "{-# VECTORISE SCALAR"- mark GHC.AnnType- markLocated ln- mark GHC.AnnEqual- markMaybe mln- markWithString GHC.AnnClose "#-}" -- "#-}"-- markAST _ (GHC.HsVectTypeOut {}) =- traceM "warning: HsVectTypeOut appears after renaming"-- markAST _ (GHC.HsVectClassIn src ln) = do- markWithString GHC.AnnOpen src -- "{-# VECTORISE"- mark GHC.AnnClass- markLocated ln- markWithString GHC.AnnClose "#-}" -- "#-}"-- markAST _ (GHC.HsVectClassOut {}) =- traceM "warning: HsVecClassOut appears after renaming"- markAST _ (GHC.HsVectInstIn {}) =- traceM "warning: HsVecInstsIn appears after renaming"- markAST _ (GHC.HsVectInstOut {}) =- traceM "warning: HsVecInstOut appears after renaming"---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.RuleDecls name) where- markAST _ (GHC.HsRules src rules) = do- markWithString GHC.AnnOpen src- mapM_ markLocated rules- markWithString GHC.AnnClose "#-}"- markTrailingSemi---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.RuleDecl name) where- markAST _ (GHC.HsRule ln act bndrs lhs _ rhs _) = do- markLocated ln- markActivation act-- mark GHC.AnnForall- mapM_ markLocated bndrs- mark GHC.AnnDot-- markLocated lhs- mark GHC.AnnEqual- markLocated rhs- markTrailingSemi---- -----------------------------------------------------------------------markActivation :: GHC.Activation -> Annotated ()-markActivation act = do- mark GHC.AnnOpenS -- '['- mark GHC.AnnTilde -- ~-#if __GLASGOW_HASKELL__ <= 710- case act of- GHC.ActiveBefore n -> do- markWithString GHC.AnnVal (show n)- GHC.ActiveAfter n -> do- markWithString GHC.AnnVal (show n)- _ -> return ()-#else- case act of- GHC.ActiveBefore src _ -> do- mark GHC.AnnTilde -- ~- markWithString GHC.AnnVal src- GHC.ActiveAfter src _ -> do- markWithString GHC.AnnVal src- _ -> return ()-#endif- mark GHC.AnnCloseS -- ']'---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.RuleBndr name) where- markAST _ (GHC.RuleBndr ln) = markLocated ln-#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.RuleBndrSig ln (GHC.HsWB thing _ _ _)) = do- mark GHC.AnnOpenP -- "("- markLocated ln- mark GHC.AnnDcolon- markLocated thing- mark GHC.AnnCloseP -- ")"-#else- markAST _ (GHC.RuleBndrSig ln st) = do- mark GHC.AnnOpenP -- "("- markLocated ln- mark GHC.AnnDcolon- markLHsSigWcType st- mark GHC.AnnCloseP -- ")"-#endif--- ----------------------------------------------------------------------#if __GLASGOW_HASKELL__ <= 710-#else-markLHsSigWcType :: (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => GHC.LHsSigWcType name -> Annotated ()-markLHsSigWcType (GHC.HsIB _ (GHC.HsWC _ mwc ty)) = do- case mwc of- Nothing -> markLocated ty- Just lwc -> do- -- let sorted = lexicalSortLocated (GHC.L lwc GHC.HsWildCardTy:[ty])- -- markLocated (GHC.L lc sorted)- applyListAnnotations ([(lwc,markExternal lwc GHC.AnnVal "_")]- ++ prepareListAnnotation [ty]- )-#endif--- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.AnnDecl name) where- markAST _ (GHC.HsAnnotation src prov e) = do- markWithString GHC.AnnOpen src- mark GHC.AnnType- mark GHC.AnnModule- case prov of- (GHC.ValueAnnProvenance n) -> markLocated n- (GHC.TypeAnnProvenance n) -> markLocated n- (GHC.ModuleAnnProvenance) -> return ()-- markLocated e- markWithString GHC.AnnClose "#-}"- markTrailingSemi---- -----------------------------------------------------------------------instance Annotate name => Annotate (GHC.WarnDecls name) where- markAST _ (GHC.Warnings src warns) = do- markWithString GHC.AnnOpen src- mapM_ markLocated warns- markWithString GHC.AnnClose "#-}"---- -----------------------------------------------------------------------instance (Annotate name)- => Annotate (GHC.WarnDecl name) where- markAST _ (GHC.Warning lns txt) = do- mapM_ markLocated lns- mark GHC.AnnOpenS -- "["- case txt of- GHC.WarningTxt _src ls -> mapM_ markLocated ls- GHC.DeprecatedTxt _src ls -> mapM_ markLocated ls- mark GHC.AnnCloseS -- "]"--instance Annotate GHC.FastString where- -- TODO: https://ghc.haskell.org/trac/ghc/ticket/10313 applies.- markAST l fs = markExternal l GHC.AnnVal (show (GHC.unpackFS fs))- -- markAST l fs = markExternal l GHC.AnnVal ('"':(GHC.unpackFS fs++"\""))---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.ForeignDecl name) where-#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.ForeignImport ln typ _- (GHC.CImport cconv safety@(GHC.L ll _) _mh _imp (GHC.L ls src))) = do-#else- markAST _ (GHC.ForeignImport ln (GHC.HsIB _ typ) _- (GHC.CImport cconv safety@(GHC.L ll _) _mh _imp (GHC.L ls src))) = do-{-- = ForeignImport- { fd_name :: Located name -- defines this name- , fd_sig_ty :: LHsSigType name -- sig_ty- , fd_co :: PostTc name Coercion -- rep_ty ~ sig_ty- , fd_fi :: ForeignImport }---}-#endif- mark GHC.AnnForeign- mark GHC.AnnImport- markLocated cconv- if ll == GHC.noSrcSpan- then return ()- else markLocated safety- -- markMaybe mh-#if __GLASGOW_HASKELL__ <= 710- markExternal ls GHC.AnnVal (show src)-#else- if GHC.unLoc cconv == GHC.PrimCallConv- then markExternal ls GHC.AnnVal src- else markExternal ls GHC.AnnVal (show src)-#endif- markLocated ln- mark GHC.AnnDcolon- markLocated typ- markTrailingSemi---#if __GLASGOW_HASKELL__ <= 710- markAST _l (GHC.ForeignExport ln typ _ (GHC.CExport spec (GHC.L ls src))) = do-#else- markAST _l (GHC.ForeignExport ln (GHC.HsIB _ typ) _ (GHC.CExport spec (GHC.L ls src))) = do-#endif- mark GHC.AnnForeign- mark GHC.AnnExport- markLocated spec- markExternal ls GHC.AnnVal (show src)- markLocated ln- mark GHC.AnnDcolon- markLocated typ----- -----------------------------------------------------------------------instance (Annotate GHC.CExportSpec) where-#if __GLASGOW_HASKELL__ <= 710- markAST l (GHC.CExportStatic _ cconv) = markAST l cconv-#else- markAST l (GHC.CExportStatic _src _ cconv) = markAST l cconv-#endif---- -----------------------------------------------------------------------instance (Annotate GHC.CCallConv) where- markAST l GHC.StdCallConv = markExternal l GHC.AnnVal "stdcall"- markAST l GHC.CCallConv = markExternal l GHC.AnnVal "ccall"- markAST l GHC.CApiConv = markExternal l GHC.AnnVal "capi"- markAST l GHC.PrimCallConv = markExternal l GHC.AnnVal "prim"- markAST l GHC.JavaScriptCallConv = markExternal l GHC.AnnVal "javascript"---- -----------------------------------------------------------------------instance (Annotate GHC.Safety) where- markAST l GHC.PlayRisky = markExternal l GHC.AnnVal "unsafe"- markAST l GHC.PlaySafe = markExternal l GHC.AnnVal "safe"- markAST l GHC.PlayInterruptible = markExternal l GHC.AnnVal "interruptible"---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.DerivDecl name) where--#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.DerivDecl typ mov) = do-#else- markAST _ (GHC.DerivDecl (GHC.HsIB _ typ) mov) = do-#endif- mark GHC.AnnDeriving- mark GHC.AnnInstance- markMaybe mov- markLocated typ---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.DefaultDecl name) where-- markAST _ (GHC.DefaultDecl typs) = do- mark GHC.AnnDefault- mark GHC.AnnOpenP -- '('- mapM_ markLocated typs- mark GHC.AnnCloseP -- ')'- markTrailingSemi---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.InstDecl name) where-- markAST l (GHC.ClsInstD cid) = markAST l cid- markAST l (GHC.DataFamInstD dfid) = markAST l dfid- markAST l (GHC.TyFamInstD tfid) = markAST l tfid---- -----------------------------------------------------------------------instance Annotate GHC.OverlapMode where- markAST _ (GHC.NoOverlap src) = do- markWithString GHC.AnnOpen src- markWithString GHC.AnnClose "#-}"-- markAST _ (GHC.Overlappable src) = do- markWithString GHC.AnnOpen src- markWithString GHC.AnnClose "#-}"-- markAST _ (GHC.Overlapping src) = do- markWithString GHC.AnnOpen src- markWithString GHC.AnnClose "#-}"-- markAST _ (GHC.Overlaps src) = do- markWithString GHC.AnnOpen src- markWithString GHC.AnnClose "#-}"-- markAST _ (GHC.Incoherent src) = do- markWithString GHC.AnnOpen src- markWithString GHC.AnnClose "#-}"---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.ClsInstDecl name) where--#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.ClsInstDecl poly binds sigs tyfams datafams mov) = do-#else- markAST _ (GHC.ClsInstDecl (GHC.HsIB _ poly) binds sigs tyfams datafams mov) = do-#endif- mark GHC.AnnInstance- markMaybe mov- markLocated poly- mark GHC.AnnWhere- mark GHC.AnnOpenC -- '{'- markInside GHC.AnnSemi-- applyListAnnotations (prepareListAnnotation (GHC.bagToList binds)- ++ prepareListAnnotation sigs- ++ prepareListAnnotation tyfams- ++ prepareListAnnotation datafams- )-- mark GHC.AnnCloseC -- '}'- markTrailingSemi---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.TyFamInstDecl name) where-- markAST _ (GHC.TyFamInstDecl eqn _) = do- mark GHC.AnnType- mark GHC.AnnInstance- markLocated eqn- markTrailingSemi---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.DataFamInstDecl name) where--#if __GLASGOW_HASKELL__ <= 710- markAST l (GHC.DataFamInstDecl ln (GHC.HsWB pats _ _ _) defn _) = do-#else- markAST l (GHC.DataFamInstDecl ln (GHC.HsIB _ pats) defn _) = do-#endif- mark GHC.AnnData- mark GHC.AnnNewtype- mark GHC.AnnInstance- mark GHC.AnnOpenP-- applyListAnnotations (prepareListAnnotation [ln]- ++ prepareListAnnotation pats- )-- mark GHC.AnnCloseP-#if __GLASGOW_HASKELL__ > 710- mark GHC.AnnDcolon- markMaybe (GHC.dd_kindSig defn)-#endif- mark GHC.AnnWhere- mark GHC.AnnEqual- markDataDefn l defn---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.HsBind name) where-#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.FunBind (GHC.L _ln _n) _ (GHC.MG matches _ _ _) _ _ _) = do-#else- markAST _ (GHC.FunBind (GHC.L _ln _n) (GHC.MG (GHC.L _ matches) _ _ _) _ _ _) = do-#endif- mapM_ markLocated matches--#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.PatBind lhs (GHC.GRHSs grhs lb) _typ _fvs _ticks) = do-#else- markAST _ (GHC.PatBind lhs (GHC.GRHSs grhs (GHC.L _ lb)) _typ _fvs _ticks) = do-#endif- markLocated lhs- mark GHC.AnnEqual- mapM_ markLocated grhs- mark GHC.AnnWhere-- markLocalBindsWithLayout lb- markTrailingSemi-- markAST _ (GHC.VarBind _n rhse _) =- -- Note: this bind is introduced by the typechecker- markLocated rhse-- markAST l (GHC.PatSynBind (GHC.PSB ln _fvs args def dir)) = do- mark GHC.AnnPattern- case args of- GHC.InfixPatSyn la lb -> do- markLocated la- markLocated ln- markLocated lb- GHC.PrefixPatSyn ns -> do- markLocated ln- mapM_ markLocated ns-#if __GLASGOW_HASKELL__ <= 710-#else- GHC.RecordPatSyn fs -> do- markLocated ln- mark GHC.AnnOpenC -- '{'- mapM_ (markLocated . GHC.recordPatSynSelectorId) fs- mark GHC.AnnCloseC -- '}'-#endif- mark GHC.AnnEqual- mark GHC.AnnLarrow- markLocated def- case dir of- GHC.Unidirectional -> return ()- GHC.ImplicitBidirectional -> return ()- GHC.ExplicitBidirectional mg -> do- mark GHC.AnnWhere- mark GHC.AnnOpenC -- '{'- markMatchGroup l mg- mark GHC.AnnCloseC -- '}'-- mark GHC.AnnWhere- mark GHC.AnnOpenC -- '{'- mark GHC.AnnCloseC -- '}'- markTrailingSemi-- -- Introduced after renaming.- markAST _ (GHC.AbsBinds _ _ _ _ _) =- traceM "warning: AbsBinds introduced after renaming"--#if __GLASGOW_HASKELL__ > 710- -- Introduced after renaming.- markAST _ GHC.AbsBindsSig{} =- traceM "warning: AbsBindsSig introduced after renaming"-#endif---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.IPBind name) where- markAST _ (GHC.IPBind en e) = do- case en of- Left n -> markLocated n- Right _i -> return ()- mark GHC.AnnEqual- markLocated e- markTrailingSemi---- -----------------------------------------------------------------------instance Annotate GHC.HsIPName where- markAST l (GHC.HsIPName n) = markExternal l (GHC.AnnVal) ("?" ++ GHC.unpackFS n)---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name,- Annotate body)- => Annotate (GHC.Match name (GHC.Located body)) where--#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.Match mln pats _typ (GHC.GRHSs grhs lb)) = do-#else- markAST _ (GHC.Match mln pats _typ (GHC.GRHSs grhs (GHC.L _ lb))) = do-#endif- let-#if __GLASGOW_HASKELL__ <= 710- get_infix Nothing = False- get_infix (Just (_,f)) = f-#else- get_infix GHC.NonFunBindMatch = False- get_infix (GHC.FunBindMatch _ f) = f-#endif- case (get_infix mln,pats) of- (True, a:b:xs) -> do- mark GHC.AnnOpenP- markLocated a- case mln of-#if __GLASGOW_HASKELL__ <= 710- Nothing -> return ()- Just (n,_) -> markLocated n-#else- GHC.NonFunBindMatch -> return ()- GHC.FunBindMatch n _ -> markLocated n-#endif- markLocated b- mark GHC.AnnCloseP- mapM_ markLocated xs- _ -> do- annotationsToComments [GHC.AnnOpenP,GHC.AnnCloseP]-#if __GLASGOW_HASKELL__ <= 710- case mln of- Nothing -> mark GHC.AnnFunId- Just (n,_) -> markLocated n- mapM_ markLocated pats-#else- case mln of- GHC.NonFunBindMatch -> mark GHC.AnnFunId- GHC.FunBindMatch n _ -> markLocated n- mapM_ markLocated pats-#endif-- -- TODO: The AnnEqual annotation actually belongs in the first GRHS value- mark GHC.AnnEqual- mark GHC.AnnRarrow -- For HsLam-- mapM_ markLocated grhs-- mark GHC.AnnWhere- mark GHC.AnnOpenC -- '{'- markInside GHC.AnnSemi- markLocalBindsWithLayout lb- mark GHC.AnnCloseC -- '}'- markTrailingSemi---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,- Annotate name, Annotate body)- => Annotate (GHC.GRHS name (GHC.Located body)) where- markAST _ (GHC.GRHS guards expr) = do- case guards of- [] -> return ()- (_:_) -> mark GHC.AnnVbar >> mapM_ markLocated guards- mark GHC.AnnEqual- cntL <- countAnns GHC.AnnLam- cntP <- countAnns GHC.AnnProc- when (cntL == 0 && cntP == 0) $ mark GHC.AnnRarrow -- For HsLam- markLocated expr---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.Sig name) where--#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.TypeSig lns typ _) = do-#else- markAST _ (GHC.TypeSig lns st) = do-#endif- mapM_ markLocated lns- mark GHC.AnnDcolon-#if __GLASGOW_HASKELL__ <= 710- markLocated typ-#else- markLHsSigWcType st-#endif- markTrailingSemi--#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.PatSynSig ln (_,GHC.HsQTvs _ns bndrs) ctx1 ctx2 typ) = do- mark GHC.AnnPattern- markLocated ln- mark GHC.AnnDcolon-- -- Note: The 'forall' bndrs '.' may occur multiple times- mark GHC.AnnForall- mapM_ markLocated bndrs- mark GHC.AnnDot-- markLocated ctx1- markOffset GHC.AnnDarrow 0- markLocated ctx2- markOffset GHC.AnnDarrow 1- markLocated typ- markTrailingSemi-#else- markAST _ (GHC.PatSynSig ln (GHC.HsIB _ typ)) = do- mark GHC.AnnPattern- markLocated ln- mark GHC.AnnDcolon- markLocated typ- markTrailingSemi-#endif--#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.GenericSig ns typ) = do-#else- markAST _ (GHC.ClassOpSig _ ns (GHC.HsIB _ typ)) = do-#endif- mark GHC.AnnDefault- mapM_ markLocated ns- mark GHC.AnnDcolon- markLocated typ- markTrailingSemi-- markAST _ (GHC.IdSig _) =- traceM "warning: Introduced after renaming"-- -- FixSig (FixitySig name)-#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.FixSig (GHC.FixitySig lns (GHC.Fixity v fdir))) = do-#else- markAST _ (GHC.FixSig (GHC.FixitySig lns (GHC.Fixity src _v fdir))) = do-#endif- let fixstr = case fdir of- GHC.InfixL -> "infixl"- GHC.InfixR -> "infixr"- GHC.InfixN -> "infix"- markWithString GHC.AnnInfix fixstr-#if __GLASGOW_HASKELL__ <= 710- markWithString GHC.AnnVal (show v)-#else- markWithString GHC.AnnVal src-#endif- mapM_ markLocated lns- markTrailingSemi-- -- InlineSig (Located name) InlinePragma- -- '{-# INLINE' activation qvar '#-}'- markAST _ (GHC.InlineSig ln inl) = do- markWithString GHC.AnnOpen (GHC.inl_src inl) -- '{-# INLINE'- markActivation (GHC.inl_act inl)- markLocated ln- markWithString GHC.AnnClose "#-}" -- '#-}'- markTrailingSemi--#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.SpecSig ln typs inl) = do-#else- markAST _ (GHC.SpecSig ln typs inl) = do-{-- | SpecSig (Located name) -- Specialise a function or datatype ...- [LHsSigType name] -- ... to these types- InlinePragma -- The pragma on SPECIALISE_INLINE form.- -- If it's just defaultInlinePragma, then we said- -- SPECIALISE, not SPECIALISE_INLINE---}-#endif- markWithString GHC.AnnOpen (GHC.inl_src inl)- markActivation (GHC.inl_act inl)- markLocated ln- mark GHC.AnnDcolon -- '::'-#if __GLASGOW_HASKELL__ <= 710- mapM_ markLocated typs-#else- mapM_ markLHsSigType typs-#endif- markWithString GHC.AnnClose "#-}" -- '#-}'- markTrailingSemi--- -- '{-# SPECIALISE' 'instance' inst_type '#-}'- markAST _ (GHC.SpecInstSig src typ) = do- markWithString GHC.AnnOpen src- mark GHC.AnnInstance-#if __GLASGOW_HASKELL__ <= 710- markLocated typ-#else- markLHsSigType typ-#endif- markWithString GHC.AnnClose "#-}" -- '#-}'- markTrailingSemi---- -- MinimalSig (BooleanFormula (Located name))- markAST l (GHC.MinimalSig src formula) = do- markWithString GHC.AnnOpen src- annotationsToComments [GHC.AnnOpenP,GHC.AnnCloseP,GHC.AnnComma,GHC.AnnVbar]-#if __GLASGOW_HASKELL__ <= 710- markAST l formula-#else- markLocated formula-#endif- markWithString GHC.AnnClose "#-}"- markTrailingSemi---- ----------------------------------------------------------------------#if __GLASGOW_HASKELL__ <= 710-#else-markLHsSigType :: (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => GHC.LHsSigType name -> Annotated ()-markLHsSigType (GHC.HsIB _ typ) = markLocated typ--instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate [GHC.LHsSigType name] where- markAST l ls = do- mark GHC.AnnDeriving- markMany GHC.AnnOpenP- mapM_ markLHsSigType ls- markMany GHC.AnnCloseP-#endif---- ----------------------------------------------------------------------#if __GLASGOW_HASKELL__ <= 710--- In practice, due to the way the BooleanFormula is constructed in the parser,--- we will get the following variants--- a | b : Or [a,b]--- a , b : And [a,b]--- ( a ) : a--- A bottom level Located RdrName is captured in a Var. This is the only part--- with a location in it.------ So the best strategy might be to convert all the annotations into comments,--- and then just print the names. DONE-instance (Annotate name) => Annotate (GHC.BooleanFormula (GHC.Located name)) where- markAST _ (GHC.Var x) = markLocated x- markAST l (GHC.Or ls) = mapM_ (markAST l) ls- markAST l (GHC.And ls) = mapM_ (markAST l) ls-#else-instance (Annotate name) => Annotate (GHC.BooleanFormula (GHC.Located name)) where- markAST _ (GHC.Var x) = do- markLocated x- mark GHC.AnnVbar -- '|'- markAST l (GHC.Or ls) = mapM_ markLocated ls- markAST l (GHC.And ls) = do- mapM_ markLocated ls- mark GHC.AnnVbar -- '|'- markAST _ (GHC.Parens x) = do- mark GHC.AnnOpenP -- '('- markLocated x- mark GHC.AnnCloseP -- ')'- mark GHC.AnnVbar -- '|'-#endif---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.HsTyVarBndr name) where- markAST l (GHC.UserTyVar n) = do-#if __GLASGOW_HASKELL__ <= 710- markAST l n-#else- markLocated n-#endif-- markAST _ (GHC.KindedTyVar n ty) = do- mark GHC.AnnOpenP -- '('- markLocated n- mark GHC.AnnDcolon -- '::'- markLocated ty- mark GHC.AnnCloseP -- '('---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.HsType name) where--#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.HsForAllTy _f mwc (GHC.HsQTvs _kvs tvs) ctx@(GHC.L lc ctxs) typ) = do- mark GHC.AnnOpenP -- "("- mark GHC.AnnForall- mapM_ markLocated tvs- mark GHC.AnnDot-- case mwc of- Nothing -> if lc /= GHC.noSrcSpan then markLocated ctx else return ()- Just lwc -> do- let sorted = lexicalSortLocated (GHC.L lwc GHC.HsWildcardTy:ctxs)- markLocated (GHC.L lc sorted)-- mark GHC.AnnDarrow- markLocated typ- mark GHC.AnnCloseP -- ")"-#else- markAST _ (GHC.HsForAllTy tvs typ) = do- mark GHC.AnnOpenP -- "("- mark GHC.AnnForall- mapM_ markLocated tvs- mark GHC.AnnDot- markLocated typ- mark GHC.AnnCloseP -- ")"--{-- = HsForAllTy -- See Note [HsType binders]- { hst_bndrs :: [LHsTyVarBndr name] -- Explicit, user-supplied 'forall a b c'- , hst_body :: LHsType name -- body type- }---}-#endif--#if __GLASGOW_HASKELL__ <= 710-#else- markAST l (GHC.HsQualTy cxt ty) = do- mark GHC.AnnDcolon -- for HsKind, alias for HsType- markLocated cxt- mark GHC.AnnDarrow- markLocated ty-{-- | HsQualTy -- See Note [HsType binders]- { hst_ctxt :: LHsContext name -- Context C => blah- , hst_body :: LHsType name }--}-#endif-- markAST l (GHC.HsTyVar name) = do- mark GHC.AnnDcolon -- for HsKind, alias for HsType- n <- countAnns GHC.AnnSimpleQuote- case n of- 1 -> do- mark GHC.AnnSimpleQuote- mark GHC.AnnOpenC-#if __GLASGOW_HASKELL__ <= 710- markLocatedFromKw GHC.AnnName name- _ -> markAST l name-#else- markLocatedFromKw GHC.AnnName (GHC.unLoc name)- _ -> markLocated name-#endif--#if __GLASGOW_HASKELL__ > 710- markAST _ (GHC.HsAppsTy ts) = do- mapM_ markLocated ts-#endif-- markAST _ (GHC.HsAppTy t1 t2) = do- mark GHC.AnnDcolon -- for HsKind, alias for HsType- markLocated t1- markLocated t2-- markAST _ (GHC.HsFunTy t1 t2) = do- mark GHC.AnnDcolon -- for HsKind, alias for HsType- markLocated t1- mark GHC.AnnRarrow- markLocated t2-- markAST _ (GHC.HsListTy t) = do- mark GHC.AnnDcolon -- for HsKind, alias for HsType- mark GHC.AnnOpenS -- '['- markLocated t- mark GHC.AnnCloseS -- ']'-- markAST _ (GHC.HsPArrTy t) = do- markWithString GHC.AnnOpen "[:" -- '[:'- markLocated t- markWithString GHC.AnnClose ":]" -- ':]'-- markAST _ (GHC.HsTupleTy _tt ts) = do- mark GHC.AnnDcolon -- for HsKind, alias for HsType- markWithString GHC.AnnOpen "(#" -- '(#'- mark GHC.AnnOpenP -- '('- mapM_ markLocated ts- mark GHC.AnnCloseP -- ')'- markWithString GHC.AnnClose "#)" -- '#)'--#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.HsOpTy t1 (_,lo) t2) = do-#else- markAST _ (GHC.HsOpTy t1 lo t2) = do- -- HsOpTy (LHsType name) (Located name) (LHsType name)-#endif- markLocated t1- mark GHC.AnnSimpleQuote- markLocated lo- markLocated t2-- markAST _ (GHC.HsParTy t) = do- mark GHC.AnnDcolon -- for HsKind, alias for HsType- mark GHC.AnnOpenP -- '('- markLocated t- mark GHC.AnnCloseP -- ')'--- mark GHC.AnnDarrow -- May appear after context in a ConDecl-- markAST _ (GHC.HsIParamTy (GHC.HsIPName n) t) = do- markWithString GHC.AnnVal ("?" ++ (GHC.unpackFS n))- mark GHC.AnnDcolon- markLocated t-- markAST _ (GHC.HsEqTy t1 t2) = do- markLocated t1- mark GHC.AnnTilde- markLocated t2-- markAST _ (GHC.HsKindSig t k) = do- mark GHC.AnnOpenP -- '('- markLocated t- mark GHC.AnnDcolon -- '::'- markLocated k- mark GHC.AnnCloseP -- ')'-- markAST l (GHC.HsSpliceTy s _) = do- mark GHC.AnnOpenPE- markAST l s- mark GHC.AnnCloseP-- markAST _ (GHC.HsDocTy t ds) = do- markLocated t- markLocated ds--#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.HsBangTy b t) = do- case b of- (GHC.HsSrcBang ms (Just True) _) -> do- markWithString GHC.AnnOpen (maybe "{-# UNPACK" id ms)- markWithString GHC.AnnClose "#-}"- (GHC.HsSrcBang ms (Just False) _) -> do- markWithString GHC.AnnOpen (maybe "{-# NOUNPACK" id ms)- markWithString GHC.AnnClose "#-}"- _ -> return ()- mark GHC.AnnBang- markLocated t-#else- markAST _ (GHC.HsBangTy (GHC.HsSrcBang mt _up _str) t) = do- case mt of- Nothing -> return ()- Just src -> do- markWithString GHC.AnnOpen src- markWithString GHC.AnnClose "#-}"- mark GHC.AnnBang- mark GHC.AnnTilde- markLocated t-{-- | HsBangTy HsSrcBang (LHsType name) -- Bang-style type annotations-data HsSrcBang =- HsSrcBang (Maybe SourceText) -- Note [Pragma source text] in BasicTypes- SrcUnpackedness- SrcStrictness-data SrcStrictness = SrcLazy -- ^ Lazy, ie '~'- | SrcStrict -- ^ Strict, ie '!'- | NoSrcStrict -- ^ no strictness annotation--data SrcUnpackedness = SrcUnpack -- ^ {-# UNPACK #-} specified- | SrcNoUnpack -- ^ {-# NOUNPACK #-} specified- | NoSrcUnpack -- ^ no unpack pragma---}-#endif-- -- HsRecTy [LConDeclField name]- markAST _ (GHC.HsRecTy cons) = do- mark GHC.AnnOpenC -- '{'- mapM_ markLocated cons- mark GHC.AnnCloseC -- '}'-- -- HsCoreTy Type- markAST _ (GHC.HsCoreTy _t) =- traceM "warning: HsCoreTy Introduced after renaming"-- markAST _ (GHC.HsExplicitListTy _ ts) = do- mark GHC.AnnSimpleQuote- mark GHC.AnnOpenS -- "["- mapM_ markLocated ts- mark GHC.AnnCloseS -- ']'-- markAST _ (GHC.HsExplicitTupleTy _ ts) = do- mark GHC.AnnSimpleQuote- mark GHC.AnnOpenP- mapM_ markLocated ts- mark GHC.AnnCloseP-- -- HsTyLit HsTyLit- markAST l (GHC.HsTyLit lit) = do- case lit of- (GHC.HsNumTy s _) ->- markExternal l GHC.AnnVal s- (GHC.HsStrTy s _) ->- markExternal l GHC.AnnVal s-- -- HsWrapTy HsTyAnnotated (HsType name)-#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.HsWrapTy _ _) =- traceM "warning: HsWrapTyy Introduced after renaming"-#endif--#if __GLASGOW_HASKELL__ <= 710- markAST l (GHC.HsWildcardTy) = do- markExternal l GHC.AnnVal "_"- markAST l (GHC.HsNamedWildcardTy n) = do- markExternal l GHC.AnnVal (showGhc n)-#else- markAST l (GHC.HsWildCardTy (GHC.AnonWildCard _)) = do- markExternal l GHC.AnnVal "_"- -- markAST l (GHC.HsWildCardTy (GHC.NamedWildCard n)) = do- -- markExternal l GHC.AnnVal (showGhc n)-#endif--#if __GLASGOW_HASKELL__ <= 710- markAST l (GHC.HsQuasiQuoteTy n) = do- markAST l n-#endif---- ----------------------------------------------------------------------#if __GLASGOW_HASKELL__ <= 710-#else-instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.HsAppType name) where- markAST _ (GHC.HsAppInfix t) = do- mark GHC.AnnSimpleQuote- markLocated t- markAST _ (GHC.HsAppPrefix t) = do- mark GHC.AnnTilde- markLocated t-#endif--- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.HsSplice name) where-#if __GLASGOW_HASKELL__ > 710- markAST l c =- case c of- GHC.HsQuasiQuote _ n _pos fs -> do- markExternal l GHC.AnnVal- ("[" ++ (showGhc n) ++ "|" ++ (GHC.unpackFS fs) ++ "|]")--#if __GLASGOW_HASKELL__ <= 710- GHC.HsTypedSplice _n b@(GHC.L _ (GHC.HsVar n)) -> do-#else- GHC.HsTypedSplice _n b@(GHC.L _ (GHC.HsVar (GHC.L _ n))) -> do-#endif- markWithString GHC.AnnThIdTySplice ("$$" ++ (GHC.occNameString (GHC.occName n)))- markLocated b- GHC.HsTypedSplice _n b -> do- mark GHC.AnnOpenPTE- markLocated b- mark GHC.AnnCloseP--#if __GLASGOW_HASKELL__ <= 710- GHC.HsUntypedSplice _n b@(GHC.L _ (GHC.HsVar n)) -> do-#else- GHC.HsUntypedSplice _n b@(GHC.L _ (GHC.HsVar (GHC.L _ n))) -> do-#endif- markWithString GHC.AnnThIdSplice ("$" ++ (GHC.occNameString (GHC.occName n)))- markLocated b- GHC.HsUntypedSplice _n b -> do- mark GHC.AnnThIdSplice- mark GHC.AnnOpenPE- markLocated b- mark GHC.AnnCloseP-#else- markAST _ c =- case c of- GHC.HsSplice _n b@(GHC.L _ (GHC.HsVar n)) -> do- markWithString GHC.AnnThIdSplice ("$" ++ (GHC.occNameString (GHC.occName n)))- markWithString GHC.AnnThIdTySplice ("$$" ++ (GHC.occNameString (GHC.occName n)))- markLocated b- GHC.HsSplice _n b -> do- mark GHC.AnnThIdSplice- mark GHC.AnnOpenPTE- mark GHC.AnnOpenPE- markLocated b- mark GHC.AnnCloseP-#endif--#if __GLASGOW_HASKELL__ <= 710-instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.HsQuasiQuote name) where- markAST l (GHC.HsQuasiQuote n _pos fs) = do- markExternal l GHC.AnnVal- ("[" ++ (showGhc n) ++ "|" ++ (GHC.unpackFS fs) ++ "|]")-#endif---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name) =>- Annotate (GHC.ConDeclField name) where- markAST _ (GHC.ConDeclField ns ty mdoc) = do-{--data ConDeclField name -- Record fields have Haddoc docs on them- = ConDeclField { cd_fld_names :: [LFieldOcc name],- -- ^ See Note [ConDeclField names]- cd_fld_type :: LBangType name,- cd_fld_doc :: Maybe LHsDocString }---}- mapM_ markLocated ns- mark GHC.AnnDcolon- markLocated ty- markMaybe mdoc---- -----------------------------------------------------------------------#if __GLASGOW_HASKELL__ > 710-instance (GHC.DataId name)- => Annotate (GHC.FieldOcc name) where- markAST l (GHC.FieldOcc rn _) = markLocated rn-#endif---- -----------------------------------------------------------------------instance Annotate GHC.HsDocString where- markAST l (GHC.HsDocString s) = do- markExternal l GHC.AnnVal (GHC.unpackFS s)---- ----------------------------------------------------------------------instance (GHC.DataId name,Annotate name,GHC.OutputableBndr name,GHC.HasOccName name)- => Annotate (GHC.Pat name) where- markAST l (GHC.WildPat _) = markExternal l GHC.AnnVal "_"- markAST l (GHC.VarPat n) = do-#if __GLASGOW_HASKELL__ <= 710- markAST l n-#else- markAST l (GHC.unLoc n)-#endif- markAST _ (GHC.LazyPat p) = do- mark GHC.AnnTilde- markLocated p-- markAST _ (GHC.AsPat ln p) = do- markLocated ln- mark GHC.AnnAt- markLocated p-- markAST _ (GHC.ParPat p) = do- mark GHC.AnnOpenP- markLocated p- mark GHC.AnnCloseP-- markAST _ (GHC.BangPat p) = do- mark GHC.AnnBang- markLocated p-- markAST _ (GHC.ListPat ps _ _) = do- mark GHC.AnnOpenS- mapM_ markLocated ps- mark GHC.AnnCloseS-- markAST _ (GHC.TuplePat pats b _) = do- if b == GHC.Boxed then mark GHC.AnnOpenP- else markWithString GHC.AnnOpen "(#"- mapM_ markLocated pats- if b == GHC.Boxed then mark GHC.AnnCloseP- else markWithString GHC.AnnClose "#)"-- markAST _ (GHC.PArrPat ps _) = do- markWithString GHC.AnnOpen "[:"- mapM_ markLocated ps- markWithString GHC.AnnClose ":]"-- markAST _ (GHC.ConPatIn n dets) = do- markHsConPatDetails n dets-- markAST _ (GHC.ConPatOut {}) =- traceM "warning: ConPatOut Introduced after renaming"-- -- ViewPat (LHsExpr id) (LPat id) (PostTc id Type)- markAST _ (GHC.ViewPat e pat _) = do- markLocated e- mark GHC.AnnRarrow- markLocated pat-- -- SplicePat (HsSplice id)- markAST l (GHC.SplicePat s) = do- mark GHC.AnnOpenPE- markAST l s- mark GHC.AnnCloseP-- -- LitPat HsLit- markAST l (GHC.LitPat lp) = markExternal l GHC.AnnVal (hsLit2String lp)-- -- NPat (HsOverLit id) (Maybe (SyntaxExpr id)) (SyntaxExpr id)-#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.NPat ol _ _) = do-#else- markAST _ (GHC.NPat ol _ _ _) = do-#endif- mark GHC.AnnMinus- markLocated ol-- -- NPlusKPat (Located id) (HsOverLit id) (SyntaxExpr id) (SyntaxExpr id)-#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.NPlusKPat ln ol _ _) = do-#else- markAST _ (GHC.NPlusKPat ln ol _ _ _ _) = do-#endif- markLocated ln- markWithString GHC.AnnVal "+" -- "+"- markLocated ol---#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.SigPatIn pat (GHC.HsWB ty _ _ _)) = do- markLocated pat- mark GHC.AnnDcolon- markLocated ty-#else- markAST _ (GHC.SigPatIn pat ty) = do- markLocated pat- mark GHC.AnnDcolon- markLHsSigWcType ty-#endif-- markAST _ (GHC.SigPatOut {}) =- traceM "warning: SigPatOut introduced after renaming"-- -- CoPat HsAnnotated (Pat id) Type- markAST _ (GHC.CoPat {}) =- traceM "warning: CoPat introduced after renaming"--#if __GLASGOW_HASKELL__ <= 710- markAST l (GHC.QuasiQuotePat p) = markAST l p-#endif---- ----------------------------------------------------------------------hsLit2String :: GHC.HsLit -> GHC.SourceText-hsLit2String lit =- case lit of- GHC.HsChar src _ -> src- -- It should be included here- -- https://github.com/ghc/ghc/blob/master/compiler/parser/Lexer.x#L1471- GHC.HsCharPrim src _ -> src ++ "#"- GHC.HsString src _ -> src- GHC.HsStringPrim src _ -> src- GHC.HsInt src _ -> src- GHC.HsIntPrim src _ -> src- GHC.HsWordPrim src _ -> src- GHC.HsInt64Prim src _ -> src- GHC.HsWord64Prim src _ -> src- GHC.HsInteger src _ _ -> src- GHC.HsRat (GHC.FL src _) _ -> src- GHC.HsFloatPrim (GHC.FL src _) -> src ++ "#"- GHC.HsDoublePrim (GHC.FL src _) -> src ++ "##"--markHsConPatDetails :: (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => GHC.Located name -> GHC.HsConPatDetails name -> Annotated ()-markHsConPatDetails ln dets = do- case dets of- GHC.PrefixCon args -> do- markLocated ln- mapM_ markLocated args- GHC.RecCon (GHC.HsRecFields fs _) -> do- markLocated ln- mark GHC.AnnOpenC -- '{'- mapM_ markLocated fs- mark GHC.AnnDotdot- mark GHC.AnnCloseC -- '}'- GHC.InfixCon a1 a2 -> do- markLocated a1- markLocated ln- markLocated a2--markHsConDeclDetails :: (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => [GHC.Located name] -> GHC.HsConDeclDetails name -> Annotated ()-markHsConDeclDetails lns dets = do- case dets of- GHC.PrefixCon args -> mapM_ markLocated args- GHC.RecCon fs -> do- mark GHC.AnnOpenC- markLocated fs- mark GHC.AnnCloseC- GHC.InfixCon a1 a2 -> do- markLocated a1- mapM_ markLocated lns- markLocated a2---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate [GHC.LConDeclField name] where- markAST _ fs = do- mark GHC.AnnOpenC -- '{'- mapM_ markLocated fs- mark GHC.AnnDotdot- mark GHC.AnnCloseC -- '}'- mark GHC.AnnRarrow---- -----------------------------------------------------------------------instance (GHC.DataId name) => Annotate (GHC.HsOverLit name) where- markAST l ol =- let str = case GHC.ol_val ol of- GHC.HsIntegral src _ -> src- GHC.HsFractional l2 -> (GHC.fl_text l2)- GHC.HsIsString src _ -> src- in- markExternal l GHC.AnnVal str---- -----------------------------------------------------------------------#if __GLASGOW_HASKELL__ <= 710-instance (GHC.DataId name,Annotate arg)- => Annotate (GHC.HsWithBndrs name (GHC.Located arg)) where- markAST _ (GHC.HsWB thing _ _ _) = do- markLocated thing-#else-instance (GHC.DataId name,Annotate arg)- => Annotate (GHC.HsImplicitBndrs name (GHC.Located arg)) where- markAST _ (GHC.HsIB _ thing) = do- markLocated thing-#endif---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,Annotate name- ,GHC.HasOccName name,Annotate body)- => Annotate (GHC.Stmt name (GHC.Located body)) where--#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.LastStmt body _) = markLocated body-#else- markAST _ (GHC.LastStmt body _ _) = markLocated body-#endif--#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.BindStmt pat body _ _) = do-#else- markAST _ (GHC.BindStmt pat body _ _ _) = do-#endif- markLocated pat- mark GHC.AnnLarrow- markLocated body- mark GHC.AnnVbar -- possible in list comprehension- markTrailingSemi--#if __GLASGOW_HASKELL__ > 710- markAST _ GHC.ApplicativeStmt{}- = error "ApplicativeStmt should not appear in ParsedSource"-#endif-- markAST _ (GHC.BodyStmt body _ _ _) = do- markLocated body- mark GHC.AnnVbar -- possible in list comprehension- markTrailingSemi--#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.LetStmt lb) = do-#else- markAST _ (GHC.LetStmt (GHC.L l lb)) = do-#endif- -- return () `debug` ("markP.LetStmt entered")- mark GHC.AnnLet- mark GHC.AnnOpenC -- '{'- markInside GHC.AnnSemi- markLocalBindsWithLayout lb- mark GHC.AnnCloseC -- '}'- -- return () `debug` ("markP.LetStmt done")- mark GHC.AnnVbar -- possible in list comprehension- markTrailingSemi--#if __GLASGOW_HASKELL__ <= 710- markAST l (GHC.ParStmt pbs _ _) = do-#else- markAST l (GHC.ParStmt pbs _ _ _) = do-#endif- mapM_ (markAST l) pbs- mark GHC.AnnVbar -- possible in list comprehension- markTrailingSemi--#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.TransStmt form stmts _b using by _ _ _) = do-#else- markAST _ (GHC.TransStmt form stmts _b using by _ _ _ _) = do-#endif- mapM_ markLocated stmts- case form of- GHC.ThenForm -> do- mark GHC.AnnThen- markLocated using- case by of- Just b -> mark GHC.AnnBy >> markLocated b- Nothing -> return ()- GHC.GroupForm -> do- mark GHC.AnnThen- mark GHC.AnnGroup- case by of- Just b -> mark GHC.AnnBy >> markLocated b- Nothing -> return ()- mark GHC.AnnUsing- markLocated using- mark GHC.AnnVbar -- possible in list comprehension- markTrailingSemi--#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.RecStmt stmts _ _ _ _ _ _ _ _) = do-#else- markAST _ (GHC.RecStmt stmts _ _ _ _ _ _ _ _ _) = do-#endif- mark GHC.AnnRec- mark GHC.AnnOpenC- markInside GHC.AnnSemi- mapM_ markLocated stmts- mark GHC.AnnCloseC- mark GHC.AnnVbar -- possible in list comprehension- markTrailingSemi---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.ParStmtBlock name name) where- markAST _ (GHC.ParStmtBlock stmts _ns _) =- mapM_ markLocated stmts---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.HsLocalBinds name) where- markAST _ lb = markHsLocalBinds lb---- -----------------------------------------------------------------------markHsLocalBinds :: (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => (GHC.HsLocalBinds name) -> Annotated ()-markHsLocalBinds (GHC.HsValBinds (GHC.ValBindsIn binds sigs)) =- applyListAnnotations (prepareListAnnotation (GHC.bagToList binds)- ++ prepareListAnnotation sigs- )-markHsLocalBinds (GHC.HsValBinds (GHC.ValBindsOut {}))- = traceM "warning: ValBindsOut introduced after renaming"--markHsLocalBinds (GHC.HsIPBinds (GHC.IPBinds binds _)) = mapM_ markLocated (reverse binds)-markHsLocalBinds (GHC.EmptyLocalBinds) = return ()---- -----------------------------------------------------------------------markMatchGroup :: (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name,- Annotate body)- => GHC.SrcSpan -> GHC.MatchGroup name (GHC.Located body)- -> Annotated ()-#if __GLASGOW_HASKELL__ <= 710-markMatchGroup _ (GHC.MG matches _ _ _)-#else-markMatchGroup _ (GHC.MG (GHC.L _ matches) _ _ _)-#endif- = markListWithLayout matches---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name,- Annotate body)- => Annotate [GHC.Located (GHC.Match name (GHC.Located body))] where- markAST _ ls = mapM_ markLocated ls---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.HsExpr name) where-#if __GLASGOW_HASKELL__ <= 710- markAST l (GHC.HsVar n) = markAST l n-#else- markAST l (GHC.HsVar n) = markAST l (GHC.unLoc n)-#endif--#if __GLASGOW_HASKELL__ <= 710-#else- markAST l (GHC.HsRecFld f) = markAST l f-- markAST l (GHC.HsOverLabel fs)- = markExternal l GHC.AnnVal ("#" ++ GHC.unpackFS fs)-#endif-- markAST l (GHC.HsIPVar (GHC.HsIPName v)) =- markExternal l GHC.AnnVal ("?" ++ GHC.unpackFS v)- markAST l (GHC.HsOverLit ov) = markAST l ov- markAST l (GHC.HsLit lit) = markAST l lit-- markAST _ (GHC.HsLam match) = do- mark GHC.AnnLam- -- TODO: Change this, HsLam binds do not need obey layout rules.-#if __GLASGOW_HASKELL__ <= 710- mapM_ markLocated (GHC.mg_alts match)-#else- mapM_ markLocated (GHC.unLoc $ GHC.mg_alts match)-#endif-- markAST l (GHC.HsLamCase _ match) = do- mark GHC.AnnLam- mark GHC.AnnCase- mark GHC.AnnOpenC- markMatchGroup l match- mark GHC.AnnCloseC-- markAST _ (GHC.HsApp e1 e2) = do- markLocated e1- markLocated e2-- markAST _ (GHC.OpApp e1 e2 _ e3) = do- markLocated e1- markLocated e2- markLocated e3-- markAST _ (GHC.NegApp e _) = do- mark GHC.AnnMinus- markLocated e-- markAST _ (GHC.HsPar e) = do- mark GHC.AnnOpenP -- '('- markLocated e- mark GHC.AnnCloseP -- ')'-- markAST _ (GHC.SectionL e1 e2) = do- markLocated e1- markLocated e2-- markAST _ (GHC.SectionR e1 e2) = do- markLocated e1- markLocated e2-- markAST _ (GHC.ExplicitTuple args b) = do- if b == GHC.Boxed then mark GHC.AnnOpenP- else markWithString GHC.AnnOpen "(#"-- mapM_ markLocated args-- if b == GHC.Boxed then mark GHC.AnnCloseP- else markWithString GHC.AnnClose "#)"--- markAST l (GHC.HsCase e1 matches) = setRigidFlag $ do- mark GHC.AnnCase- markLocated e1- mark GHC.AnnOf- mark GHC.AnnOpenC- markInside GHC.AnnSemi- markMatchGroup l matches- mark GHC.AnnCloseC-- -- We set the layout for HsIf even though it need not obey layout rules as- -- when moving these expressions it's useful that they maintain "internal- -- integrity", that is to say the subparts remain indented relative to each- -- other.- markAST _ (GHC.HsIf _ e1 e2 e3) = setRigidFlag $ do- mark GHC.AnnIf- markLocated e1- markOffset GHC.AnnSemi 0- mark GHC.AnnThen- markLocated e2- markOffset GHC.AnnSemi 1- mark GHC.AnnElse- markLocated e3-- markAST _ (GHC.HsMultiIf _ rhs) = do- mark GHC.AnnIf- mark GHC.AnnOpenC- mapM_ markLocated rhs- mark GHC.AnnCloseC--#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.HsLet binds e) = do-#else- markAST _ (GHC.HsLet (GHC.L _ binds) e) = do-#endif- setLayoutFlag (do -- Make sure the 'in' gets indented too- mark GHC.AnnLet- mark GHC.AnnOpenC- markInside GHC.AnnSemi- markLocalBindsWithLayout binds- mark GHC.AnnCloseC- mark GHC.AnnIn- markLocated e)--#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.HsDo cts es _) = do-#else- markAST _ (GHC.HsDo cts (GHC.L _ es) _) = do-#endif- mark GHC.AnnDo- mark GHC.AnnMdo- let (ostr,cstr,_isComp) =- if isListComp cts- then case cts of- GHC.PArrComp -> ("[:",":]",True)- _ -> ("[", "]",True)- else ("{","}",False)-- markWithString GHC.AnnOpen ostr- mark GHC.AnnOpenS- mark GHC.AnnOpenC- markInside GHC.AnnSemi- if isListComp cts- then do- markLocated (last es)- mark GHC.AnnVbar- mapM_ markLocated (init es)- else do- markListWithLayout es- mark GHC.AnnCloseS- mark GHC.AnnCloseC- markWithString GHC.AnnClose cstr-- markAST _ (GHC.ExplicitList _ _ es) = do- mark GHC.AnnOpenS- mapM_ markLocated es- mark GHC.AnnCloseS-- markAST _ (GHC.ExplicitPArr _ es) = do- markWithString GHC.AnnOpen "[:"- mapM_ markLocated es- markWithString GHC.AnnClose ":]"--#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.RecordCon n _ (GHC.HsRecFields fs _)) = do-#else- markAST _ (GHC.RecordCon n _ _ (GHC.HsRecFields fs _)) = do-#endif- markLocated n- mark GHC.AnnOpenC- mapM_ markLocated fs- mark GHC.AnnDotdot- mark GHC.AnnCloseC--#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.RecordUpd e (GHC.HsRecFields fs _) _cons _ _) = do-#else- markAST _ (GHC.RecordUpd e fs _cons _ _ _) = do-#endif- markLocated e- mark GHC.AnnOpenC- mapM_ markLocated fs- mark GHC.AnnDotdot- mark GHC.AnnCloseC--#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.ExprWithTySig e typ _) = do-#else- markAST _ (GHC.ExprWithTySig e typ) = do-#endif- markLocated e- mark GHC.AnnDcolon-#if __GLASGOW_HASKELL__ <= 710- markLocated typ-#else- markLHsSigWcType typ-#endif-- markAST _ (GHC.ExprWithTySigOut e typ) = do- markLocated e- mark GHC.AnnDcolon-#if __GLASGOW_HASKELL__ <= 710- markLocated typ-#else- markLHsSigWcType typ-#endif-- markAST _ (GHC.ArithSeq _ _ seqInfo) = do- mark GHC.AnnOpenS -- '['- case seqInfo of- GHC.From e -> do- markLocated e- mark GHC.AnnDotdot- GHC.FromTo e1 e2 -> do- markLocated e1- mark GHC.AnnDotdot- markLocated e2- GHC.FromThen e1 e2 -> do- markLocated e1- mark GHC.AnnComma- markLocated e2- mark GHC.AnnDotdot- GHC.FromThenTo e1 e2 e3 -> do- markLocated e1- mark GHC.AnnComma- markLocated e2- mark GHC.AnnDotdot- markLocated e3- mark GHC.AnnCloseS -- ']'-- markAST _ (GHC.PArrSeq _ seqInfo) = do- markWithString GHC.AnnOpen "[:" -- '[:'- case seqInfo of- GHC.From e -> do- markLocated e- mark GHC.AnnDotdot- GHC.FromTo e1 e2 -> do- markLocated e1- mark GHC.AnnDotdot- markLocated e2- GHC.FromThen e1 e2 -> do- markLocated e1- mark GHC.AnnComma- markLocated e2- mark GHC.AnnDotdot- GHC.FromThenTo e1 e2 e3 -> do- markLocated e1- mark GHC.AnnComma- markLocated e2- mark GHC.AnnDotdot- markLocated e3- markWithString GHC.AnnClose ":]" -- ':]'-- markAST _ (GHC.HsSCC src csFStr e) = do- markWithString GHC.AnnOpen src -- "{-# SCC"-#if __GLASGOW_HASKELL__ <= 710- markWithString GHC.AnnVal (GHC.unpackFS csFStr)- markWithString GHC.AnnValStr ("\"" ++ GHC.unpackFS csFStr ++ "\"")-#else- markWithString GHC.AnnVal (GHC.sl_st csFStr)- markWithString GHC.AnnValStr (GHC.sl_st csFStr)-#endif- markWithString GHC.AnnClose "#-}"- markLocated e-- markAST _ (GHC.HsCoreAnn src csFStr e) = do- markWithString GHC.AnnOpen src -- "{-# CORE"-#if __GLASGOW_HASKELL__ <= 710- markWithString GHC.AnnVal ("\"" ++ GHC.unpackFS csFStr ++ "\"")-#else- markWithString GHC.AnnVal (GHC.sl_st csFStr)-#endif- markWithString GHC.AnnClose "#-}"- markLocated e- -- TODO: make monomorphic- markAST _ (GHC.HsBracket (GHC.VarBr _single v)) = do- mark GHC.AnnSimpleQuote- mark GHC.AnnThTyQuote- markLocatedFromKw GHC.AnnName v- markAST _ (GHC.HsBracket (GHC.DecBrL ds)) = do- markWithString GHC.AnnOpen "[d|"- mark GHC.AnnOpenC- mapM_ markLocated ds- mark GHC.AnnCloseC- markWithString GHC.AnnClose "|]"- -- Introduced after the renamer- markAST _ (GHC.HsBracket (GHC.DecBrG _)) =- traceM "warning: DecBrG introduced after renamer"- markAST _ (GHC.HsBracket (GHC.ExpBr e)) = do-#if __GLASGOW_HASKELL__ <= 710- -- This exists like this as the lexer collapses [e| and [| into the- -- same construtor- workOutString GHC.AnnOpen- (\ss -> if spanLength ss == 2- then "[|"- else "[e|")-#else- markWithString GHC.AnnOpen "[|"- mark GHC.AnnOpenE -- "[e|"-#endif- markLocated e- markWithString GHC.AnnClose "|]"- markAST _ (GHC.HsBracket (GHC.TExpBr e)) = do-#if __GLASGOW_HASKELL__ <= 710- -- This exists like this as the lexer collapses [e|| and [|| into the- -- same construtor- workOutString GHC.AnnOpen- (\ss -> if spanLength ss == 3- then "[||"- else "[e||")-#else- markWithString GHC.AnnOpen "[||"- markWithString GHC.AnnOpenE "[e||"-#endif- markLocated e- markWithString GHC.AnnClose "||]"- markAST _ (GHC.HsBracket (GHC.TypBr e)) = do- markWithString GHC.AnnOpen "[t|"- markLocated e- markWithString GHC.AnnClose "|]"- markAST _ (GHC.HsBracket (GHC.PatBr e)) = do- markWithString GHC.AnnOpen "[p|"- markLocated e- markWithString GHC.AnnClose "|]"-- markAST _ (GHC.HsRnBracketOut _ _) =- traceM "warning: HsRnBracketOut introduced after renamer"- markAST _ (GHC.HsTcBracketOut _ _) =- traceM "warning: HsTcBracketOut introduced after renamer"--#if __GLASGOW_HASKELL__ > 710- markAST l (GHC.HsSpliceE e) = do- mark GHC.AnnOpenPE- markAST l e- mark GHC.AnnCloseP-#else- markAST l (GHC.HsSpliceE _ e) = do- mark GHC.AnnOpenPE- markAST l e- mark GHC.AnnCloseP-- markAST l (GHC.HsQuasiQuoteE e) = do- markAST l e-#endif-- markAST _ (GHC.HsProc p c) = do- mark GHC.AnnProc- markLocated p- mark GHC.AnnRarrow- markLocated c-- markAST _ (GHC.HsStatic e) = do- mark GHC.AnnStatic- markLocated e-- markAST _ (GHC.HsArrApp e1 e2 _ _ isRightToLeft) = do- -- isRightToLeft True => right-to-left (f -< arg)- -- False => left-to-right (arg >- f)- if isRightToLeft- then markLocated e1- else markLocated e2- -- only one of the next 4 will be present- mark GHC.Annlarrowtail- mark GHC.Annrarrowtail- mark GHC.AnnLarrowtail- mark GHC.AnnRarrowtail-- if isRightToLeft- then markLocated e2- else markLocated e1-- markAST _ (GHC.HsArrForm e _ cs) = do- markWithString GHC.AnnOpen "(|"- markLocated e- mapM_ markLocated cs- markWithString GHC.AnnClose "|)"-- markAST _ (GHC.HsTick _ _) = return ()- markAST _ (GHC.HsBinTick _ _ _) = return ()--#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.HsTickPragma src (str,(v1,v2),(v3,v4)) e) = do- -- '{-# GENERATED' STRING INTEGER ':' INTEGER '-' INTEGER ':' INTEGER '#-}'- markWithString GHC.AnnOpen src- markOffsetWithString GHC.AnnVal 0 (show (GHC.unpackFS str)) -- STRING- markOffsetWithString GHC.AnnVal 1 (show v1) -- INTEGER- markOffset GHC.AnnColon 0 -- ':'- markOffsetWithString GHC.AnnVal 2 (show v2) -- INTEGER- mark GHC.AnnMinus -- '-'- markOffsetWithString GHC.AnnVal 3 (show v3) -- INTEGER- markOffset GHC.AnnColon 1 -- ':'- markOffsetWithString GHC.AnnVal 4 (show v4) -- INTEGER- markWithString GHC.AnnClose "#-}"- markLocated e-#else- markAST _ (GHC.HsTickPragma src (str,_,_) ((v1,v2),(v3,v4)) e) = do- -- '{-# GENERATED' STRING INTEGER ':' INTEGER '-' INTEGER ':' INTEGER '#-}'- markWithString GHC.AnnOpen src- markOffsetWithString GHC.AnnVal 0 (GHC.sl_st str) -- STRING- markOffsetWithString GHC.AnnVal 1 v1 -- INTEGER- markOffset GHC.AnnColon 0 -- ':'- markOffsetWithString GHC.AnnVal 2 v2 -- INTEGER- mark GHC.AnnMinus -- '-'- markOffsetWithString GHC.AnnVal 3 v3 -- INTEGER- markOffset GHC.AnnColon 1 -- ':'- markOffsetWithString GHC.AnnVal 4 v4 -- INTEGER- markWithString GHC.AnnClose "#-}"- markLocated e-#endif-- markAST l (GHC.EWildPat) = do- markExternal l GHC.AnnVal "_"-- markAST _ (GHC.EAsPat ln e) = do- markLocated ln- mark GHC.AnnAt- markLocated e-- markAST _ (GHC.EViewPat e1 e2) = do- markLocated e1- mark GHC.AnnRarrow- markLocated e2-- markAST _ (GHC.ELazyPat e) = do- mark GHC.AnnTilde- markLocated e--#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.HsType ty) = markLocated ty-#else- markAST _ (GHC.HsAppType e ty) = do- markLocated e- mark GHC.AnnAt- markLHsWcType ty- markAST _ (GHC.HsAppTypeOut _ _) =- traceM "warning: HsAppTypeOut introduced after renaming"-#endif-- markAST _ (GHC.HsWrap _ _) =- traceM "warning: HsWrap introduced after renaming"- markAST _ (GHC.HsUnboundVar _) =- traceM "warning: HsUnboundVar introduced after renaming"----- ----------------------------------------------------------------------#if __GLASGOW_HASKELL__ > 710-markLHsWcType :: (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => GHC.LHsWcType name -> Annotated ()-markLHsWcType (GHC.HsWC _ mwc ty) = do- case mwc of- Nothing -> markLocated ty- Just lwc -> do- -- let sorted = lexicalSortLocated (GHC.L lwc GHC.HsWildCardTy:[ty])- -- markLocated (GHC.L lc sorted)- applyListAnnotations ([(lwc,markExternal lwc GHC.AnnVal "_")]- ++ prepareListAnnotation [ty]- )-#endif--- -----------------------------------------------------------------------instance Annotate GHC.HsLit where- markAST l lit = markExternal l GHC.AnnVal (hsLit2String lit)---- ----------------------------------------------------------------------#if __GLASGOW_HASKELL__ > 710-instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.HsRecUpdField name) where- markAST _ (GHC.HsRecField lbl expr _isPun) = do- markLocated lbl- mark GHC.AnnEqual- markLocated expr-{--type HsRecUpdField id = HsRecField' (AmbiguousFieldOcc id) (LHsExpr id)---- | - 'ApiAnnotation.AnnKeywordId' : 'ApiAnnotation.AnnEqual',------ For details on above see note [Api annotations] in ApiAnnotation-data HsRecField' id arg = HsRecField {- hsRecFieldLbl :: Located id,- hsRecFieldArg :: arg, -- ^ Filled in by renamer when punning- hsRecPun :: Bool -- ^ Note [Punning]- } deriving (Data, Typeable)---}--instance (GHC.DataId name)- => Annotate (GHC.AmbiguousFieldOcc name) where- markAST l (GHC.Unambiguous n _) = markLocated n- markAST l (GHC.Ambiguous n _) = markLocated n-#endif--- ------------------------------------------------------------------------- |Used for declarations that need to be aligned together, e.g. in a--- do or let .. in statement/expr-instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate ([GHC.ExprLStmt name]) where- markAST _ ls = mapM_ markLocated ls---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.HsTupArg name) where- markAST _ (GHC.Present e) = do- markLocated e-- markAST _ (GHC.Missing _) = do- mark GHC.AnnComma---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.HsCmdTop name) where- markAST _ (GHC.HsCmdTop cmd _ _ _) = markLocated cmd--instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.HsCmd name) where- markAST _ (GHC.HsCmdArrApp e1 e2 _ _ isRightToLeft) = do- -- isRightToLeft True => right-to-left (f -< arg)- -- False => left-to-right (arg >- f)- if isRightToLeft- then markLocated e1- else markLocated e2- -- only one of the next 4 will be present- mark GHC.Annlarrowtail- mark GHC.Annrarrowtail- mark GHC.AnnLarrowtail- mark GHC.AnnRarrowtail-- if isRightToLeft- then markLocated e2- else markLocated e1-- markAST _ (GHC.HsCmdArrForm e _mf cs) = do- markWithString GHC.AnnOpen "(|"- -- This may be an infix operation- applyListAnnotations (prepareListAnnotation [e]- ++ prepareListAnnotation cs)- -- markLocated e- -- mapM_ markLocated cs- markWithString GHC.AnnClose "|)"-- markAST _ (GHC.HsCmdApp e1 e2) = do- markLocated e1- markLocated e2-- markAST l (GHC.HsCmdLam match) = do- mark GHC.AnnLam- markMatchGroup l match-- markAST _ (GHC.HsCmdPar e) = do- mark GHC.AnnOpenP- markLocated e- mark GHC.AnnCloseP -- ')'-- markAST l (GHC.HsCmdCase e1 matches) = do- mark GHC.AnnCase- markLocated e1- mark GHC.AnnOf- mark GHC.AnnOpenC- markMatchGroup l matches- mark GHC.AnnCloseC-- markAST _ (GHC.HsCmdIf _ e1 e2 e3) = do- mark GHC.AnnIf- markLocated e1- markOffset GHC.AnnSemi 0- mark GHC.AnnThen- markLocated e2- markOffset GHC.AnnSemi 1- mark GHC.AnnElse- markLocated e3--#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.HsCmdLet binds e) = do-#else- markAST _ (GHC.HsCmdLet (GHC.L _ binds) e) = do-#endif- mark GHC.AnnLet- mark GHC.AnnOpenC- markLocalBindsWithLayout binds- mark GHC.AnnCloseC- mark GHC.AnnIn- markLocated e--#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.HsCmdDo es _) = do-#else- markAST _ (GHC.HsCmdDo (GHC.L _ es) _) = do-#endif- mark GHC.AnnDo- mark GHC.AnnOpenC- markListWithLayout es- mark GHC.AnnCloseC--#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.HsCmdCast {}) =- traceM "warning: HsCmdCast introduced after renaming"-#endif--#if __GLASGOW_HASKELL__ > 710- markAST _ (GHC.HsCmdWrap {}) =- traceM "warning: HsCmdWrap introduced after renaming"-{-- | HsCmdWrap HsWrapper- (HsCmd id) -- If cmd :: arg1 --> res- -- wrap :: arg1 "->" arg2- -- Then (HsCmdWrap wrap cmd) :: arg2 --> res--}-#endif---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate [GHC.Located (GHC.StmtLR name name (GHC.LHsCmd name))] where- markAST _ ls = mapM_ markLocated ls---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (GHC.TyClDecl name) where-- markAST l (GHC.FamDecl famdecl) = markAST l famdecl--#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.SynDecl ln (GHC.HsQTvs _ tyvars) typ _) = do-#else- markAST _ (GHC.SynDecl ln (GHC.HsQTvs _ tyvars _) typ _) = do-#endif- -- There may be arbitrary parens around parts of the constructor that are- -- infix.- -- Turn these into comments so that they feed into the right place automatically- annotationsToComments [GHC.AnnOpenP,GHC.AnnCloseP]- mark GHC.AnnType- -- ln may be used infix, in which case rearrange the order. It may be- -- simplest to just sort ln:tyvars- applyListAnnotations (prepareListAnnotation [ln]- ++ prepareListAnnotation tyvars)- -- markMany GHC.AnnCloseP- mark GHC.AnnEqual- markLocated typ- markTrailingSemi--#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.DataDecl ln (GHC.HsQTvs _ns tyVars)- (GHC.HsDataDefn _ ctx mctyp mk cons mderivs) _) = do-#else- markAST _ (GHC.DataDecl ln (GHC.HsQTvs _ns tyVars _)- (GHC.HsDataDefn _ ctx mctyp mk cons mderivs) _ _) = do-#endif- mark GHC.AnnData- mark GHC.AnnNewtype- markMaybe mctyp- markLocated ctx- mark GHC.AnnDarrow- markTyClass ln tyVars- mark GHC.AnnDcolon- markMaybe mk- mark GHC.AnnEqual- mark GHC.AnnWhere- mark GHC.AnnOpenC- mapM_ markLocated cons- mark GHC.AnnCloseC- markMaybe mderivs- markTrailingSemi-- -- -------------------------------------#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.ClassDecl ctx ln (GHC.HsQTvs _ns tyVars) fds- sigs meths ats atdefs docs _) = do-#else- markAST _ (GHC.ClassDecl ctx ln (GHC.HsQTvs _ns tyVars _) fds- sigs meths ats atdefs docs _) = do-#endif- mark GHC.AnnClass- markLocated ctx-- markTyClass ln tyVars-- mark GHC.AnnVbar- mapM_ markLocated fds- mark GHC.AnnWhere- mark GHC.AnnOpenC -- '{'- markInside GHC.AnnSemi- applyListAnnotations (prepareListAnnotation sigs- ++ prepareListAnnotation (GHC.bagToList meths)- ++ prepareListAnnotation ats- ++ prepareListAnnotation atdefs- ++ prepareListAnnotation docs- )- mark GHC.AnnCloseC -- '}'- markTrailingSemi---- -----------------------------------------------------------------------markTyClass :: (Annotate a, Annotate ast)- => GHC.Located a -> [GHC.Located ast] -> Annotated ()-markTyClass ln tyVars = do- markMany GHC.AnnOpenP- applyListAnnotations (prepareListAnnotation [ln]- ++ prepareListAnnotation (take 2 tyVars))- markMany GHC.AnnCloseP- mapM_ markLocated (drop 2 tyVars)---- -----------------------------------------------------------------------instance (GHC.DataId name,Annotate name, GHC.OutputableBndr name,GHC.HasOccName name)- => Annotate (GHC.FamilyDecl name) where-#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.FamilyDecl info ln (GHC.HsQTvs _ tyvars) mkind) = do-#else- markAST _ (GHC.FamilyDecl info ln (GHC.HsQTvs _ tyvars _) rsig minj) = do-{--data FamilyDecl name = FamilyDecl- { fdInfo :: FamilyInfo name -- type/data, closed/open- , fdLName :: Located name -- type constructor- , fdTyVars :: LHsQTyVars name -- type variables- , fdResultSig :: LFamilyResultSig name -- result signature- , fdInjectivityAnn :: Maybe (LInjectivityAnn name) -- optional injectivity ann- }--}-#endif- mark GHC.AnnType- mark GHC.AnnData- mark GHC.AnnFamily- mark GHC.AnnOpenP- applyListAnnotations (prepareListAnnotation [ln]- ++ prepareListAnnotation tyvars)- mark GHC.AnnCloseP- mark GHC.AnnDcolon-#if __GLASGOW_HASKELL__ <= 710- markMaybe mkind-#else- mark GHC.AnnEqual- markLocated rsig- mark GHC.AnnVbar- markMaybe minj-#endif- mark GHC.AnnWhere- mark GHC.AnnOpenC -- {- mark GHC.AnnDotdot- case info of-#if __GLASGOW_HASKELL__ > 710- GHC.ClosedTypeFamily (Just eqns) -> mapM_ markLocated eqns-#else- GHC.ClosedTypeFamily eqns -> mapM_ markLocated eqns-#endif- _ -> return ()- mark GHC.AnnCloseC -- }- markTrailingSemi---- -----------------------------------------------------------------------#if __GLASGOW_HASKELL__ <= 710-#else-instance (GHC.DataId name,Annotate name,GHC.OutputableBndr name,GHC.HasOccName name)- => Annotate (GHC.FamilyResultSig name) where- markAST _ (GHC.NoSig) = return ()- markAST _ (GHC.KindSig k) = markLocated k- markAST _ (GHC.TyVarSig ltv) = markLocated ltv-#endif---- -----------------------------------------------------------------------#if __GLASGOW_HASKELL__ <= 710-#else-instance (GHC.DataId name,Annotate name)- => Annotate (GHC.InjectivityAnn name) where- markAST l (GHC.InjectivityAnn ln lns) = do- mark GHC.AnnVbar- markLocated ln- mark GHC.AnnRarrow- mapM_ markLocated lns-#endif---- -----------------------------------------------------------------------instance (GHC.DataId name,Annotate name,GHC.OutputableBndr name,GHC.HasOccName name)- => Annotate (GHC.TyFamInstEqn name) where-#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.TyFamEqn ln (GHC.HsWB pats _ _ _) typ) = do-#else- markAST _ (GHC.TyFamEqn ln (GHC.HsIB _ pats) typ) = do-#endif- mark GHC.AnnOpenP- applyListAnnotations (prepareListAnnotation [ln]- ++ prepareListAnnotation pats)- mark GHC.AnnCloseP- mark GHC.AnnEqual- markLocated typ---- -----------------------------------------------------------------------instance (GHC.DataId name,Annotate name,GHC.OutputableBndr name,GHC.HasOccName name)- => Annotate (GHC.TyFamDefltEqn name) where-#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.TyFamEqn ln (GHC.HsQTvs _ns bndrs) typ) = do-#else- markAST _ (GHC.TyFamEqn ln (GHC.HsQTvs _ns bndrs _) typ) = do-#endif- mark GHC.AnnType- mark GHC.AnnInstance- applyListAnnotations (prepareListAnnotation [ln]- ++ prepareListAnnotation bndrs- )- mark GHC.AnnEqual- markLocated typ---- ------------------------------------------------------------------------- TODO: modify lexer etc, in the meantime to not set haddock flag-instance Annotate GHC.DocDecl where- markAST l v =- let str =- case v of- (GHC.DocCommentNext (GHC.HsDocString fs)) -> (GHC.unpackFS fs)- (GHC.DocCommentPrev (GHC.HsDocString fs)) -> (GHC.unpackFS fs)- (GHC.DocCommentNamed _s (GHC.HsDocString fs)) -> (GHC.unpackFS fs)- (GHC.DocGroup _i (GHC.HsDocString fs)) -> (GHC.unpackFS fs)- in- markExternal l (GHC.AnnVal) str---- -----------------------------------------------------------------------markDataDefn :: (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => GHC.SrcSpan -> GHC.HsDataDefn name -> Annotated ()-markDataDefn _ (GHC.HsDataDefn _ ctx typ mk cons mderivs) = do- markLocated ctx- markMaybe typ-#if __GLASGOW_HASKELL__ <= 710- markMaybe mk-#endif- mapM_ markLocated cons- case mderivs of- Nothing -> return ()- Just d -> markLocated d---- ------------------------------------------------------------------------- Note: GHC.HsContext name aliases to here too-instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate [GHC.LHsType name] where- markAST _ ts = do-#if __GLASGOW_HASKELL__ <= 710- mark GHC.AnnDeriving-#endif- markMany GHC.AnnOpenP -- may be nested parens around context- mapM_ markLocated ts- markMany GHC.AnnCloseP -- may be nested parens around context- markOutside GHC.AnnDarrow (G GHC.AnnDarrow)---- -----------------------------------------------------------------------instance (GHC.DataId name,Annotate name,GHC.OutputableBndr name,GHC.HasOccName name)- => Annotate (GHC.ConDecl name) where-#if __GLASGOW_HASKELL__ <= 710- markAST _ (GHC.ConDecl lns _expr (GHC.HsQTvs _ns bndrs) ctx- dets res _ depc_syntax) = do- case res of- GHC.ResTyH98 -> do-- mark GHC.AnnForall- mapM_ markLocated bndrs- mark GHC.AnnDot-- markLocated ctx- mark GHC.AnnDarrow- case dets of- GHC.InfixCon _ _ -> return ()- _ -> mapM_ markLocated lns-- markHsConDeclDetails lns dets-- GHC.ResTyGADT ls ty -> do- -- only print names if not infix- case dets of- GHC.InfixCon _ _ -> return ()- _ -> mapM_ markLocated lns-- if depc_syntax- then ( do- markHsConDeclDetails lns dets- mark GHC.AnnDcolon- markMany GHC.AnnOpenP- )-- else ( do- mark GHC.AnnDcolon- markLocated (GHC.L ls (ResTyGADTHook bndrs))- markMany GHC.AnnOpenP- markLocated ctx- mark GHC.AnnDarrow- markHsConDeclDetails lns dets )-- markLocated ty-- markMany GHC.AnnCloseP--- mark GHC.AnnVbar- markTrailingSemi-#else- markAST _ (GHC.ConDeclH98 ln mqtvs ctx- dets _ ) = do-{-- | ConDeclH98- { con_name :: Located name-- , con_qvars :: Maybe (LHsQTyVars name)- -- User-written forall (if any), and its implicit- -- kind variables- -- Non-Nothing needs -XExistentialQuantification- -- e.g. data T a = forall b. MkT b (b->a)- -- con_qvars = {b}-- , con_cxt :: Maybe (LHsContext name)- -- ^ User-written context (if any)-- , con_details :: HsConDeclDetails name- -- ^ Arguments-- , con_doc :: Maybe LHsDocString- -- ^ A possible Haddock comment.---}- case mqtvs of- Nothing -> return ()-#if __GLASGOW_HASKELL__ <= 710- Just (GHC.HsQTvs _ns bndrs) -> do-#else- Just (GHC.HsQTvs _ns bndrs _) -> do-#endif- mark GHC.AnnForall- mapM_ markLocated bndrs- mark GHC.AnnDot-- markMaybe ctx- mark GHC.AnnDarrow- case dets of- GHC.InfixCon _ _ -> return ()- _ -> markLocated ln-- markHsConDeclDetails [ln] dets-- mark GHC.AnnVbar- markTrailingSemi- markAST _ (GHC.ConDeclGADT lns (GHC.HsIB _ typ) _) = do- mapM_ markLocated lns- mark GHC.AnnDcolon- markLocated typ- markTrailingSemi-#endif---- ResTyGADT has a SrcSpan for the original sigtype, we need to create--- a type for exactPC and annotatePC-data ResTyGADTHook name = ResTyGADTHook [GHC.LHsTyVarBndr name]- deriving (Typeable)-deriving instance (GHC.DataId name) => Data (ResTyGADTHook name)-deriving instance (Show (GHC.LHsTyVarBndr name)) => Show (ResTyGADTHook name)--instance (GHC.OutputableBndr name) => GHC.Outputable (ResTyGADTHook name) where- ppr (ResTyGADTHook bs) = GHC.text "ResTyGADTHook" GHC.<+> GHC.ppr bs---#if __GLASGOW_HASKELL__ > 710--- WildCardAnon exists because the GHC anonymous wildcard type is defined as--- = AnonWildCard (PostRn name Name)--- We need to reconstruct this from the typed hole SrcSpan in an HsForAllTy, but--- the instance doing this is parameterised on name, so we cannot put a value in--- for the (PostRn name Name) field. This is used instead.-data WildCardAnon = WildCardAnon deriving (Show,Data,Typeable)--instance Annotate WildCardAnon where- markAST l WildCardAnon = do- markExternal l GHC.AnnVal "_"-#endif---- -----------------------------------------------------------------------instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)- => Annotate (ResTyGADTHook name) where- markAST _ (ResTyGADTHook bndrs) = do- mark GHC.AnnForall- mapM_ markLocated bndrs- mark GHC.AnnDot---- -----------------------------------------------------------------------instance (Annotate name, GHC.DataId name, GHC.OutputableBndr name,GHC.HasOccName name)- => Annotate (GHC.HsRecField name (GHC.LPat name)) where- markAST _ (GHC.HsRecField n e _) = do- markLocated n- mark GHC.AnnEqual- markLocated e---instance (Annotate name, GHC.DataId name, GHC.OutputableBndr name,GHC.HasOccName name)- => Annotate (GHC.HsRecField name (GHC.LHsExpr name)) where- markAST _ (GHC.HsRecField n e _) = do- markLocated n- mark GHC.AnnEqual- markLocated e---- -----------------------------------------------------------------------instance (GHC.DataId name,Annotate name)- => Annotate (GHC.FunDep (GHC.Located name)) where-- markAST _ (ls,rs) = do- mapM_ markLocated ls- mark GHC.AnnRarrow- mapM_ markLocated rs---- -----------------------------------------------------------------------instance Annotate (GHC.CType) where+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveFunctor #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE UndecidableInstances #-} -- Needed for the DataId constraint on ResTyGADTHook+-- | 'annotate' is a function which given a GHC AST fragment, constructs+-- a syntax tree which indicates which annotations belong to each specific+-- part of the fragment.+--+-- "Delta" and "Print" provide two interpreters for this structure. You+-- should probably use those unless you know what you're doing!+--+-- The functor 'AnnotationF' has a number of constructors which correspond+-- to different sitations which annotations can arise. It is hoped that in+-- future versions of GHC these can be simplified by making suitable+-- modifications to the AST.++module Language.Haskell.GHC.ExactPrint.Annotate+ (+ annotate+ , AnnotationF(..)+ , Annotated+ , Annotate(..)+ , withSortKeyContextsHelper+ ) where++#if __GLASGOW_HASKELL__ <= 710+import Data.Ord ( comparing )+import Data.List ( sortBy )+#endif++import Language.Haskell.GHC.ExactPrint.Types+import Language.Haskell.GHC.ExactPrint.Utils++import qualified Bag as GHC+import qualified BasicTypes as GHC+import qualified BooleanFormula as GHC+import qualified Class as GHC+import qualified CoAxiom as GHC+import qualified FastString as GHC+import qualified ForeignCall as GHC+import qualified GHC as GHC+#if __GLASGOW_HASKELL__ > 710+import qualified Lexeme as GHC+#endif+import qualified Name as GHC+import qualified RdrName as GHC+import qualified Outputable as GHC++import Control.Monad.Trans.Free+import Control.Monad.Free.TH (makeFreeCon)+import Control.Monad.Identity+import Data.Data+import Data.Maybe++import qualified Data.Set as Set++import Debug.Trace+++{-# ANN module "HLint: ignore Eta reduce" #-}+{-# ANN module "HLint: ignore Redundant do" #-}+{-# ANN module "HLint: ignore Reduce duplication" #-}+-- ---------------------------------------------------------------------++-- | ['MarkPrim'] The main constructor. Marks that a specific AnnKeywordId could+-- appear with an optional String which is used when printing.+-- ['MarkPPOptional'] Used to flag elements, such as optional braces, that are+-- not used in the pretty printer. This functions identically to 'MarkPrim'+-- for the other interpreters.+-- ['MarkEOF']+-- Special constructor which marks the end of file marker.+-- ['MarkExternal'] TODO+-- ['MarkOutside'] A @AnnKeywordId@ which is precisely located but not inside the+-- current context. This is usually used to reassociated located+-- @RdrName@ which are more naturally associated with their parent than+-- in their own annotation.+-- ['MarkInside']+-- The dual of MarkOutside. If we wish to mark a non-separating comma+-- or semi-colon then we must use this constructor.+-- ['MarkMany'] Some syntax elements allow an arbritary number of puncuation marks+-- without reflection in the AST. This construction greedily takes all of+-- the specified @AnnKeywordId@.+-- ['MarkOffsetPrim'] Some syntax elements have repeated @AnnKeywordId@ which are+-- seperated by different @AnnKeywordId@. Thus using MarkMany is+-- unsuitable and instead we provide an index to specify which specific+-- instance to choose each time.+-- ['WithAST'] TODO+-- ['CountAnns'] Sometimes the AST does not reflect the concrete source code and the+-- only way to tell what the concrete source was is to count a certain+-- kind of @AnnKeywordId@.+-- ['WithSortKey'] There are many places where the syntactic ordering of elements is+-- thrown away by the AST. This constructor captures the original+-- ordering and reflects any changes in ordered as specified by the+-- @annSortKey@ field in @Annotation@.+-- ['SetLayoutFlag'] It is important to know precisely where layout rules apply. This+-- constructor wraps a computation to indicate that LayoutRules apply to+-- the corresponding construct.+-- ['StoreOriginalSrcSpan'] TODO+-- ['GetSrcSpanFromKw'] TODO+-- ['StoreString'] TODO+-- ['AnnotationsToComments'] Used when the AST is sufficiently vague that there is no other+-- option but to convert a fragment of source code into a comment. This+-- means it is impossible to edit such a fragment but means that+-- processing files with such fragments is still possible.+data AnnotationF next where+ MarkPrim :: GHC.AnnKeywordId -> Maybe String -> next -> AnnotationF next+ MarkPPOptional :: GHC.AnnKeywordId -> Maybe String -> next -> AnnotationF next+ MarkEOF :: next -> AnnotationF next+ MarkExternal :: GHC.SrcSpan -> GHC.AnnKeywordId -> String -> next -> AnnotationF next+ MarkOutside :: GHC.AnnKeywordId -> KeywordId -> next -> AnnotationF next+ MarkInside :: GHC.AnnKeywordId -> next -> AnnotationF next+ MarkMany :: GHC.AnnKeywordId -> next -> AnnotationF next+ MarkManyOptional :: GHC.AnnKeywordId -> next -> AnnotationF next+ MarkOffsetPrim :: GHC.AnnKeywordId -> Int -> Maybe String -> next -> AnnotationF next+ MarkOffsetPrimOptional :: GHC.AnnKeywordId -> Int -> Maybe String -> next -> AnnotationF next+ WithAST :: Data a => GHC.Located a+ -> Annotated b -> next -> AnnotationF next+ CountAnns :: GHC.AnnKeywordId -> (Int -> next) -> AnnotationF next+ WithSortKey :: [(GHC.SrcSpan, Annotated ())] -> next -> AnnotationF next++ SetLayoutFlag :: Rigidity -> Annotated () -> next -> AnnotationF next++ -- Required to work around deficiencies in the GHC AST+ StoreOriginalSrcSpan :: GHC.SrcSpan -> AnnKey -> (AnnKey -> next) -> AnnotationF next+ GetSrcSpanForKw :: GHC.SrcSpan -> GHC.AnnKeywordId -> (GHC.SrcSpan -> next) -> AnnotationF next+#if __GLASGOW_HASKELL__ <= 710+ StoreString :: String -> GHC.SrcSpan -> next -> AnnotationF next+#endif+ AnnotationsToComments :: [GHC.AnnKeywordId] -> next -> AnnotationF next+#if __GLASGOW_HASKELL__ <= 710+ AnnotationsToCommentsBF :: (GHC.Outputable a) => GHC.BooleanFormula (GHC.Located a) -> [GHC.AnnKeywordId] -> next -> AnnotationF next+ FinalizeBF :: GHC.SrcSpan -> next -> AnnotationF next+#endif++ -- AZ experimenting with pretty printing+ -- Set the context for child element+ SetContextLevel :: Set.Set AstContext -> Int -> Annotated () -> next -> AnnotationF next+ UnsetContext :: AstContext -> Annotated () -> next -> AnnotationF next+ -- Query the context while in a child element+ IfInContext :: Set.Set AstContext -> Annotated () -> Annotated () -> next -> AnnotationF next+ WithSortKeyContexts :: ListContexts -> [(GHC.SrcSpan, Annotated ())] -> next -> AnnotationF next+ --+ TellContext :: Set.Set AstContext -> next -> AnnotationF next++deriving instance Functor AnnotationF++type Annotated = FreeT AnnotationF Identity+++-- ---------------------------------------------------------------------++makeFreeCon 'MarkEOF+makeFreeCon 'MarkPrim+makeFreeCon 'MarkPPOptional+makeFreeCon 'MarkOutside+makeFreeCon 'MarkInside+makeFreeCon 'MarkExternal+makeFreeCon 'MarkMany+makeFreeCon 'MarkManyOptional+makeFreeCon 'MarkOffsetPrim+makeFreeCon 'MarkOffsetPrimOptional+makeFreeCon 'CountAnns+makeFreeCon 'StoreOriginalSrcSpan+makeFreeCon 'GetSrcSpanForKw+#if __GLASGOW_HASKELL__ <= 710+makeFreeCon 'StoreString+#endif+makeFreeCon 'AnnotationsToComments+#if __GLASGOW_HASKELL__ <= 710+makeFreeCon 'AnnotationsToCommentsBF+makeFreeCon 'FinalizeBF+#endif+makeFreeCon 'WithSortKey+makeFreeCon 'SetContextLevel+makeFreeCon 'UnsetContext+makeFreeCon 'IfInContext+makeFreeCon 'WithSortKeyContexts+makeFreeCon 'TellContext++-- ---------------------------------------------------------------------++setContext :: Set.Set AstContext -> Annotated () -> Annotated ()+setContext ctxt action = liftF (SetContextLevel ctxt 3 action ())++setLayoutFlag :: Annotated () -> Annotated ()+setLayoutFlag action = liftF (SetLayoutFlag NormalLayout action ())++setRigidFlag :: Annotated () -> Annotated ()+setRigidFlag action = liftF (SetLayoutFlag RigidLayout action ())++-- | Construct a syntax tree which represent which KeywordIds must appear+-- where.+annotate :: (Annotate ast) => GHC.Located ast -> Annotated ()+annotate = markLocated++inContext :: Set.Set AstContext -> Annotated () -> Annotated ()+inContext ctxt action = liftF (IfInContext ctxt action (return ()) ())++-- ---------------------------------------------------------------------++#if __GLASGOW_HASKELL__ <= 710+workOutString :: GHC.SrcSpan -> GHC.AnnKeywordId -> (GHC.SrcSpan -> String) -> Annotated ()+workOutString l kw f = do+ ss <- getSrcSpanForKw l kw+ storeString (f ss) ss+#endif++-- ---------------------------------------------------------------------++-- |Main driver point for annotations.+withAST :: Data a => GHC.Located a -> Annotated () -> Annotated ()+withAST lss action = liftF (WithAST lss action ())++-- ---------------------------------------------------------------------+-- Additional smart constructors++mark :: GHC.AnnKeywordId -> Annotated ()+mark kwid = markPrim kwid Nothing++markOptional :: GHC.AnnKeywordId -> Annotated ()+markOptional kwid = markPPOptional kwid Nothing++markWithString :: GHC.AnnKeywordId -> String -> Annotated ()+markWithString kwid s = markPrim kwid (Just s)++markWithStringOptional :: GHC.AnnKeywordId -> String -> Annotated ()+markWithStringOptional kwid s = markPPOptional kwid (Just s)++markOffsetWithString :: GHC.AnnKeywordId -> Int -> String -> Annotated ()+markOffsetWithString kwid n s = markOffsetPrim kwid n (Just s)++markOffset :: GHC.AnnKeywordId -> Int -> Annotated ()+markOffset kwid n = markOffsetPrim kwid n Nothing++markOffsetOptional :: GHC.AnnKeywordId -> Int -> Annotated ()+markOffsetOptional kwid n = markOffsetPrimOptional kwid n Nothing++markTrailingSemi :: Annotated ()+markTrailingSemi = markOutside GHC.AnnSemi AnnSemiSep++-- ---------------------------------------------------------------------++-- | Constructs a syntax tree which contains information about which+-- annotations are required by each element.+markLocated :: (Annotate ast) => GHC.Located ast -> Annotated ()+markLocated ast =+ case cast ast :: Maybe (GHC.LHsDecl GHC.RdrName) of+ Just d -> markLHsDecl d+ Nothing -> withLocated ast markAST++withLocated :: Data a+ => GHC.Located a+ -> (GHC.SrcSpan -> a -> Annotated ())+ -> Annotated ()+withLocated a@(GHC.L l ast) action =+ withAST a (action l ast)++-- ---------------------------------------------------------------------++-- |When adding missing annotations, do not put a preceding space in front of a list+markListNoPrecedingSpace :: Annotate ast => Bool -> [GHC.Located ast] -> Annotated ()+markListNoPrecedingSpace intercal ls =+ case ls of+ [] -> return ()+ (l:ls') -> do+ if intercal+ then do+ if null ls'+ then setContext (Set.fromList [NoPrecedingSpace ]) $ markLocated l+ else setContext (Set.fromList [NoPrecedingSpace,Intercalate]) $ markLocated l+ markListIntercalate ls'+ else do+ setContext (Set.singleton NoPrecedingSpace) $ markLocated l+ mapM_ markLocated ls'++-- ---------------------------------------------------------------------+++-- |Mark a list, with the given keyword as a list item separator+markListIntercalate :: Annotate ast => [GHC.Located ast] -> Annotated ()+markListIntercalate ls = markListIntercalateWithFun markLocated ls++markListIntercalateWithFun :: (t -> Annotated ()) -> [t] -> Annotated ()+markListIntercalateWithFun f ls = markListIntercalateWithFunLevel f 2 ls++markListIntercalateWithFunLevel :: (t -> Annotated ()) -> Int -> [t] -> Annotated ()+markListIntercalateWithFunLevel f level ls = markListIntercalateWithFunLevelCtx f level Intercalate ls++markListIntercalateWithFunLevelCtx :: (t -> Annotated ()) -> Int -> AstContext -> [t] -> Annotated ()+markListIntercalateWithFunLevelCtx f level ctx ls = go ls+ where+ go [] = return ()+ go [x] = f x+ go (x:xs) = do+ setContextLevel (Set.singleton ctx) level $ f x+ go xs++-- ---------------------------------------------------------------------++markListWithContexts :: Annotate ast => Set.Set AstContext -> Set.Set AstContext -> [GHC.Located ast] -> Annotated ()+markListWithContexts ctxInitial ctxRest ls =+ case ls of+ [] -> return ()+ [x] -> setContextLevel ctxInitial 2 $ markLocated x+ (x:xs) -> do+ setContextLevel ctxInitial 2 $ markLocated x+ setContextLevel ctxRest 2 $ mapM_ markLocated xs++-- ---------------------------------------------------------------------++-- Context for only if just one, else first item, middle ones, and last one+markListWithContexts' :: Annotate ast+ => ListContexts+ -> [GHC.Located ast] -> Annotated ()+markListWithContexts' (LC ctxOnly ctxInitial ctxMiddle ctxLast) ls =+ case ls of+ [] -> return ()+ [x] -> setContextLevel ctxOnly level $ markLocated x+ (x:xs) -> do+ setContextLevel ctxInitial level $ markLocated x+ go xs+ where+ level = 2+ go [] = return ()+ go [x] = setContextLevel ctxLast level $ markLocated x+ go (x:xs) = do+ setContextLevel ctxMiddle level $ markLocated x+ go xs+++markListWithContextsFunction ::+ ListContexts+ -> (t -> Annotated ())+ -> [t] -> Annotated ()+markListWithContextsFunction (LC ctxOnly ctxInitial ctxMiddle ctxLast) f ls =+ case ls of+ [] -> return ()+ [x] -> setContextLevel ctxOnly level $ f x+ (x:xs) -> do+ setContextLevel ctxInitial level $ f x+ go xs+ where+ level = 2+ go [] = return ()+ go [x] = setContextLevel ctxLast level $ f x+ go (x:xs) = do+ setContextLevel ctxMiddle level $ f x+ go xs++-- ---------------------------------------------------------------------+++-- Expects the kws to be ordered already+withSortKeyContextsHelper :: (Monad m) => (Annotated () -> m ()) -> ListContexts -> [(GHC.SrcSpan, Annotated ())] -> m ()+withSortKeyContextsHelper interpret (LC ctxOnly ctxInitial ctxMiddle ctxLast) kws = do+ case kws of+ [] -> return ()+ [x] -> interpret (setContextLevel (Set.insert (CtxPos 0) ctxOnly) level $ snd x)+ (x:xs) -> do+ interpret (setContextLevel (Set.insert (CtxPos 0) ctxInitial) level $ snd x)+ go 1 xs+ where+ level = 2+ go _ [] = return ()+ go n [x] = interpret (setContextLevel (Set.insert (CtxPos n) ctxLast) level $ snd x)+ go n (x:xs) = do+ interpret (setContextLevel (Set.insert (CtxPos n) ctxMiddle) level $ snd x)+ go (n+1) xs++-- ---------------------------------------------------------------------++markListWithLayout :: Annotate ast => [GHC.Located ast] -> Annotated ()+markListWithLayout ls =+ setLayoutFlag $ markList ls++-- ---------------------------------------------------------------------++markList :: Annotate ast => [GHC.Located ast] -> Annotated ()+markList ls =+ setContext (Set.singleton NoPrecedingSpace)+ $ markListWithContexts' listContexts' ls++markLocalBindsWithLayout :: (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => GHC.HsLocalBinds name -> Annotated ()+markLocalBindsWithLayout binds =+ markHsLocalBinds binds++-- ---------------------------------------------------------------------++-- |This function is used to get around shortcomings in the GHC AST for 7.10.1+markLocatedFromKw :: (Annotate ast) => GHC.AnnKeywordId -> GHC.Located ast -> Annotated ()+markLocatedFromKw kw (GHC.L l a) = do+ -- Note: l is needed so that the pretty printer can make something up+ ss <- getSrcSpanForKw l kw+ AnnKey ss' _ <- storeOriginalSrcSpan l (mkAnnKey (GHC.L ss a))+ markLocated (GHC.L ss' a)++-- ---------------------------------------------------------------------++markMaybe :: (Annotate ast) => Maybe (GHC.Located ast) -> Annotated ()+markMaybe Nothing = return ()+markMaybe (Just ast) = markLocated ast++-- ---------------------------------------------------------------------+-- Managing lists which have been separated, e.g. Sigs and Binds++prepareListAnnotation :: Annotate a => [GHC.Located a] -> [(GHC.SrcSpan,Annotated ())]+prepareListAnnotation ls = map (\b -> (GHC.getLoc b,markLocated b)) ls++-- prepareListAnnotationWithContext :: Annotate a => Set.Set AstContext+-- -> [GHC.Located a] -> [(GHC.SrcSpan,Annotated ())]+-- prepareListAnnotationWithContext ctx ls = map (\b -> (GHC.getLoc b,setContext ctx (markLocated b))) ls++applyListAnnotations :: [(GHC.SrcSpan, Annotated ())] -> Annotated ()+applyListAnnotations ls = withSortKey ls++applyListAnnotationsContexts :: ListContexts -> [(GHC.SrcSpan, Annotated ())] -> Annotated ()+applyListAnnotationsContexts ctxt ls = withSortKeyContexts ctxt ls++#if __GLASGOW_HASKELL__ <= 710+lexicalSortLocated :: [GHC.Located a] -> [GHC.Located a]+lexicalSortLocated = sortBy (comparing GHC.getLoc)+#endif++applyListAnnotationsLayout :: [(GHC.SrcSpan, Annotated ())] -> Annotated ()+applyListAnnotationsLayout ls = setLayoutFlag $ setContext (Set.singleton NoPrecedingSpace)+ $ withSortKeyContexts listContexts ls++listContexts :: ListContexts+listContexts = LC (Set.fromList [CtxOnly,ListStart])+ (Set.fromList [CtxFirst,ListStart,Intercalate])+ (Set.fromList [CtxMiddle,ListItem,Intercalate])+ (Set.fromList [CtxLast,ListItem])++listContexts' :: ListContexts+listContexts' = LC (Set.fromList [CtxOnly, ListStart])+ (Set.fromList [CtxFirst, ListStart])+ (Set.fromList [CtxMiddle,ListItem])+ (Set.fromList [CtxLast, ListItem])++-- ---------------------------------------------------------------------++class Data ast => Annotate ast where+ markAST :: GHC.SrcSpan -> ast -> Annotated ()++-- ---------------------------------------------------------------------++instance Annotate (GHC.HsModule GHC.RdrName) where+ markAST _ (GHC.HsModule mmn mexp imps decs mdepr _haddock) = do++ case mmn of+ Nothing -> return ()+ Just (GHC.L ln mn) -> do+ mark GHC.AnnModule+ markExternal ln GHC.AnnVal (GHC.moduleNameString mn)++ forM_ mdepr markLocated+ forM_ mexp markLocated++ mark GHC.AnnWhere++ markOptional GHC.AnnOpenC -- Possible '{'+ markManyOptional GHC.AnnSemi -- possible leading semis+ setContextLevel (Set.singleton TopLevel) 2 $ markListWithLayout imps++ setContextLevel (Set.singleton TopLevel) 2 $ markListWithLayout decs++ markOptional GHC.AnnCloseC -- Possible '}'++ markEOF++-- ---------------------------------------------------------------------++instance Annotate GHC.WarningTxt where+ markAST _ (GHC.WarningTxt (GHC.L ls txt) lss) = do+ markExternal ls GHC.AnnOpen txt+ mark GHC.AnnOpenS+ markListIntercalate lss+ mark GHC.AnnCloseS+ markWithString GHC.AnnClose "#-}"++ markAST _ (GHC.DeprecatedTxt (GHC.L ls txt) lss) = do+ markExternal ls GHC.AnnOpen txt+ mark GHC.AnnOpenS+ markListIntercalate lss+ mark GHC.AnnCloseS+ markWithString GHC.AnnClose "#-}"++-- ---------------------------------------------------------------------+#if __GLASGOW_HASKELL__ > 710+instance Annotate GHC.StringLiteral where+ markAST l (GHC.StringLiteral src _) = do+ markExternal l GHC.AnnVal src+ inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma+#endif++-- ---------------------------------------------------------------------++instance Annotate (GHC.SourceText,GHC.FastString) where+ markAST l (src,_fs) = do+ markExternal l GHC.AnnVal src++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.HasOccName name,Annotate name)+ => Annotate [GHC.LIE name] where+ markAST _ ls = do+ inContext (Set.singleton HasHiding) $ mark GHC.AnnHiding -- in an import decl+ mark GHC.AnnOpenP -- '('+ -- Can't use markListIntercalate, there can be trailing commas, but only in imports.+ markListIntercalateWithFunLevel markLocated 2 ls++ mark GHC.AnnCloseP -- ')'++instance (GHC.DataId name,GHC.HasOccName name, Annotate name)+ => Annotate (GHC.IE name) where+ markAST _ ie = do++ case ie of+ (GHC.IEVar ln) -> do+ -- TODO: I am pretty sure this criterion is inadequate+ if GHC.isDataOcc $ GHC.occName $ GHC.unLoc ln+ then mark GHC.AnnPattern+ else markOptional GHC.AnnPattern+ setContext (Set.fromList [PrefixOp,InIE]) $ markLocated ln++ (GHC.IEThingAbs ln@(GHC.L _ n)) -> do+ {-+ At the moment (7.10.2) GHC does not cleanly represent an export of the form+ "type Foo"+ and it only captures the name "Foo".++ The Api Annotations workaround is to have the IEThingAbs SrcSpan+ extend across both the "type" and "Foo", and then to capture the+ individual item locations in an AnnType and AnnVal annotation.++ This need to be fixed for 7.12.++ -}++#if __GLASGOW_HASKELL__ <= 710+ if GHC.isTcOcc (GHC.occName n) && GHC.isSymOcc (GHC.occName n)+#else+ if ((GHC.isTcOcc $ GHC.occName n) && (GHC.isSymOcc $ GHC.occName n))+ && (not $ GHC.isLexConSym $ GHC.occNameFS $ GHC.occName n) -- rule out (:-$) etc+#endif+ then do+ mark GHC.AnnType+ setContext (Set.singleton PrefixOp) $ markLocatedFromKw GHC.AnnVal ln+ else setContext (Set.singleton PrefixOp) $ markLocated ln++#if __GLASGOW_HASKELL__ <= 710+ (GHC.IEThingWith ln ns) -> do+#else+ (GHC.IEThingWith ln wc ns _lfs) -> do+{-+ | IEThingWith (Located name)+ IEWildcard+ [Located name]+ [Located (FieldLbl name)]+ -- ^ Class/Type plus some methods/constructors+ -- and record fields; see Note [IEThingWith]++-}+#endif+ setContext (Set.singleton PrefixOp) $ markLocated ln+ mark GHC.AnnOpenP+#if __GLASGOW_HASKELL__ <= 710+ setContext (Set.singleton PrefixOp) $ markListIntercalate ns+#else+ case wc of+ GHC.NoIEWildcard -> unsetContext Intercalate $ setContext (Set.fromList [PrefixOp]) $ markListIntercalate ns+ GHC.IEWildcard n -> do+ setContext (Set.fromList [PrefixOp,Intercalate]) $ mapM_ markLocated (take n ns)+ mark GHC.AnnDotdot+ case drop n ns of+ [] -> return ()+ ns' -> do+ mark GHC.AnnComma+ setContext (Set.singleton PrefixOp) $ mapM_ markLocated ns'+#endif+ mark GHC.AnnCloseP++ (GHC.IEThingAll ln) -> do+ setContext (Set.fromList [PrefixOp]) $ markLocated ln+ mark GHC.AnnOpenP+ mark GHC.AnnDotdot+ mark GHC.AnnCloseP++ (GHC.IEModuleContents (GHC.L lm mn)) -> do+ mark GHC.AnnModule+ markExternal lm GHC.AnnVal (GHC.moduleNameString mn)++ -- Only used in Haddock mode so we can ignore them.+ (GHC.IEGroup _ _) -> return ()++ (GHC.IEDoc _) -> return ()++ (GHC.IEDocNamed _) -> return ()+ ifInContext (Set.fromList [Intercalate])+ (mark GHC.AnnComma)+ (markOptional GHC.AnnComma)++-- ---------------------------------------------------------------------+{-+-- For details on above see note [Api annotations] in ApiAnnotation+data RdrName+ = Unqual OccName+ -- ^ Used for ordinary, unqualified occurrences, e.g. @x@, @y@ or @Foo@.+ -- Create such a 'RdrName' with 'mkRdrUnqual'++ | Qual ModuleName OccName+ -- ^ A qualified name written by the user in+ -- /source/ code. The module isn't necessarily+ -- the module where the thing is defined;+ -- just the one from which it is imported.+ -- Examples are @Bar.x@, @Bar.y@ or @Bar.Foo@.+ -- Create such a 'RdrName' with 'mkRdrQual'++ | Orig Module OccName+ -- ^ An original name; the module is the /defining/ module.+ -- This is used when GHC generates code that will be fed+ -- into the renamer (e.g. from deriving clauses), but where+ -- we want to say \"Use Prelude.map dammit\". One of these+ -- can be created with 'mkOrig'++ | Exact Name+ -- ^ We know exactly the 'Name'. This is used:+ --+ -- (1) When the parser parses built-in syntax like @[]@+ -- and @(,)@, but wants a 'RdrName' from it+ --+ -- (2) By Template Haskell, when TH has generated a unique name+ --+ -- Such a 'RdrName' can be created by using 'getRdrName' on a 'Name'+ deriving (Data, Typeable)+-}++isSymRdr :: GHC.RdrName -> Bool+isSymRdr n = GHC.isSymOcc (GHC.rdrNameOcc n) || rdrName2String n == "."++instance Annotate GHC.RdrName where+ markAST l n = do+ let+ str = rdrName2String n+ isSym = isSymRdr n+ canParen = isSym && rdrName2String n /= "$"+ doNormalRdrName = do+ let str' = case str of+ -- TODO: unicode support?+ "forall" -> if spanLength l == 1 then "∀" else str+ _ -> str+ when (GHC.isTcClsNameSpace $ GHC.rdrNameSpace n) $ inContext (Set.singleton InIE) $ mark GHC.AnnType+ markOptional GHC.AnnType+ let str'' = if isSym && (GHC.isTcClsNameSpace $ GHC.rdrNameSpace n)+ then -- Horrible hack until GHC 8.2 with https://phabricator.haskell.org/D3016+ if spanLength l - length str' > 6 -- length of "type" + 2 parens+ then "(" ++ str' ++ ")"+ else str'+ else str'++ let+ markParen :: GHC.AnnKeywordId -> Annotated ()+ markParen pa = do+ if canParen+ then ifInContext (Set.singleton PrefixOp)+ (mark pa) -- '('+ (markOptional pa)+ else if isSym+ then ifInContext (Set.singleton PrefixOpDollar)+ (mark pa)+ (markOptional pa)+ else markOptional pa++ markParen GHC.AnnOpenP+ unless isSym $ inContext (Set.fromList [InfixOp]) $ markOffset GHC.AnnBackquote 0+ cnt <- countAnns GHC.AnnVal+ case cnt of+ 0 -> markExternal l GHC.AnnVal str'+ 1 -> markWithString GHC.AnnVal str''+ _ -> traceM $ "Printing RdrName, more than 1 AnnVal:" ++ showGhc (l,n)+ unless isSym $ inContext (Set.fromList [InfixOp]) $ markOffset GHC.AnnBackquote 1+ markParen GHC.AnnCloseP++ case n of+ GHC.Unqual _ -> doNormalRdrName+ GHC.Qual _ _ -> doNormalRdrName+#if __GLASGOW_HASKELL__ <= 710+ GHC.Orig _ _ -> markExternal l GHC.AnnVal str+#else+ GHC.Orig _ _ -> if str == "~"+ then doNormalRdrName+ else markExternal l GHC.AnnVal str+#endif+ GHC.Exact n' -> do+ case str of+ -- Special handling for Exact RdrNames, which are built-in Names+ "[]" -> do+ mark GHC.AnnOpenS -- '['+ mark GHC.AnnCloseS -- ']'+ "()" -> do+ mark GHC.AnnOpenP -- '('+ mark GHC.AnnCloseP -- ')'+ ('(':'#':_) -> do+ markWithString GHC.AnnOpen "(#" -- '(#'+ let cnt = length $ filter (==',') str+ replicateM_ cnt (mark GHC.AnnCommaTuple)+ markWithString GHC.AnnClose "#)"-- '#)'+ "[::]" -> do+ markWithString GHC.AnnOpen "[:" -- '[:'+ markWithString GHC.AnnClose ":]" -- ':]'+ "(->)" -> do+ mark GHC.AnnOpenP -- '('+ mark GHC.AnnRarrow+ mark GHC.AnnCloseP -- ')'+ "~#" -> do+ mark GHC.AnnOpenP -- '('+ mark GHC.AnnTildehsh+ mark GHC.AnnCloseP+ "*" -> do+ markExternal l GHC.AnnVal str+ "★" -> do -- Note: unicode star+ markExternal l GHC.AnnVal str+ ":" -> do+ -- Note: The OccName for ":" has the following attributes (via occAttributes)+ -- (d, Data DataSym Sym Val )+ -- consDataConName = mkWiredInDataConName BuiltInSyntax gHC_TYPES (fsLit ":") consDataConKey consDataCon+ doNormalRdrName+ -- trace ("RdrName.checking :" ++ (occAttributes $ GHC.occName n)) doNormalRdrName+ ('(':',':_) -> do+ mark GHC.AnnOpenP+ let cnt = length $ filter (==',') str+ replicateM_ cnt (mark GHC.AnnCommaTuple)+ mark GHC.AnnCloseP -- ')'+#if __GLASGOW_HASKELL__ <= 710+ "~" -> do+ mark GHC.AnnOpenP+ mark GHC.AnnTilde+ mark GHC.AnnCloseP+#endif+ _ -> do+ let isSym' = isSymRdr (GHC.nameRdrName n')+ when isSym' $ mark GHC.AnnOpenP -- '('+ markWithString GHC.AnnVal str+ when isSym $ mark GHC.AnnCloseP -- ')'+ inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma `debug` ("AnnComma in RdrName")++-- ---------------------------------------------------------------------++-- TODO: What is this used for? Not in ExactPrint+instance Annotate GHC.Name where+ markAST l n = do+ markExternal l GHC.AnnVal (showGhc n)++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.ImportDecl name) where+ markAST _ imp@(GHC.ImportDecl msrc modname mpkg src safeflag qualFlag _impl _as hiding) = do++ -- 'import' maybe_src maybe_safe optqualified maybe_pkg modid maybeas maybeimpspec+ mark GHC.AnnImport++ -- "{-# SOURCE" and "#-}"+ when src (markWithString GHC.AnnOpen (fromMaybe "{-# SOURCE" msrc)+ >> markWithString GHC.AnnClose "#-}")+ when safeflag (mark GHC.AnnSafe)+ when qualFlag (unsetContext TopLevel $ mark GHC.AnnQualified)+ case mpkg of+ Nothing -> return ()+#if __GLASGOW_HASKELL__ <= 710+ Just pkg -> markWithString GHC.AnnPackageName (show (GHC.unpackFS pkg))+#else+ Just (GHC.StringLiteral srcPkg _) -> markWithString GHC.AnnPackageName srcPkg+#endif++ markLocated modname++ case GHC.ideclAs imp of+ Nothing -> return ()+ Just mn -> do+ mark GHC.AnnAs+ markWithString GHC.AnnVal (GHC.moduleNameString mn)++ case hiding of+ Nothing -> return ()+ Just (isHiding,lie) -> do+ if isHiding+ then setContext (Set.singleton HasHiding) $+ markLocated lie+ else markLocated lie+ markTrailingSemi++-- ---------------------------------------------------------------------++instance Annotate GHC.ModuleName where+ markAST l mname =+ markExternal l GHC.AnnVal (GHC.moduleNameString mname)++-- ---------------------------------------------------------------------++markLHsDecl :: (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => GHC.LHsDecl name -> Annotated ()+markLHsDecl (GHC.L l decl) =+ case decl of+ GHC.TyClD d -> markLocated (GHC.L l d)+ GHC.InstD d -> markLocated (GHC.L l d)+ GHC.DerivD d -> markLocated (GHC.L l d)+ GHC.ValD d -> markLocated (GHC.L l d)+ GHC.SigD d -> markLocated (GHC.L l d)+ GHC.DefD d -> markLocated (GHC.L l d)+ GHC.ForD d -> markLocated (GHC.L l d)+ GHC.WarningD d -> markLocated (GHC.L l d)+ GHC.AnnD d -> markLocated (GHC.L l d)+ GHC.RuleD d -> markLocated (GHC.L l d)+ GHC.VectD d -> markLocated (GHC.L l d)+ GHC.SpliceD d -> markLocated (GHC.L l d)+ GHC.DocD d -> markLocated (GHC.L l d)+ GHC.RoleAnnotD d -> markLocated (GHC.L l d)+#if __GLASGOW_HASKELL__ < 711+ GHC.QuasiQuoteD d -> markLocated (GHC.L l d)+#endif++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.HsDecl name) where+ markAST l d = markLHsDecl (GHC.L l d)++-- ---------------------------------------------------------------------++instance (Annotate name)+ => Annotate (GHC.RoleAnnotDecl name) where+ markAST _ (GHC.RoleAnnotDecl ln mr) = do+ mark GHC.AnnType+ mark GHC.AnnRole+ markLocated ln+ mapM_ markLocated mr++instance Annotate (Maybe GHC.Role) where+ markAST l Nothing = markExternal l GHC.AnnVal "_"+ markAST l (Just r) = markExternal l GHC.AnnVal (GHC.unpackFS $ GHC.fsFromRole r)++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.SpliceDecl name) where+#if __GLASGOW_HASKELL__ > 710+ markAST _ (GHC.SpliceDecl e@(GHC.L _ (GHC.HsQuasiQuote{})) _flag) = do+ setContext (Set.singleton InSpliceDecl) $ markLocated e+ markTrailingSemi+#endif+ markAST _ (GHC.SpliceDecl e flag) = do+ case flag of+ GHC.ExplicitSplice -> mark GHC.AnnOpenPE+ GHC.ImplicitSplice -> return ()++ setContext (Set.singleton InSpliceDecl) $ markLocated e++ case flag of+ GHC.ExplicitSplice -> mark GHC.AnnCloseP+ GHC.ImplicitSplice -> return ()++ markTrailingSemi++{-+- data SpliceExplicitFlag = ExplicitSplice | -- <=> $(f x y)+- ImplicitSplice -- <=> f x y, i.e. a naked+- top level expression+-+-}++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.VectDecl name) where+ markAST _ (GHC.HsVect src ln e) = do+ markWithString GHC.AnnOpen src -- "{-# VECTORISE"+ markLocated ln+ mark GHC.AnnEqual+ markLocated e+ markWithString GHC.AnnClose "#-}" -- "#-}"++ markAST _ (GHC.HsNoVect src ln) = do+ markWithString GHC.AnnOpen src -- "{-# NOVECTORISE"+ markLocated ln+ markWithString GHC.AnnClose "#-}" -- "#-}"++ markAST _ (GHC.HsVectTypeIn src _b ln mln) = do+ markWithString GHC.AnnOpen src -- "{-# VECTORISE" or "{-# VECTORISE SCALAR"+ mark GHC.AnnType+ markLocated ln+ case mln of+ Nothing -> return ()+ Just lnn -> do+ mark GHC.AnnEqual+ markLocated lnn+ markWithString GHC.AnnClose "#-}" -- "#-}"++ markAST _ GHC.HsVectTypeOut {} =+ traceM "warning: HsVectTypeOut appears after renaming"++ markAST _ (GHC.HsVectClassIn src ln) = do+ markWithString GHC.AnnOpen src -- "{-# VECTORISE"+ mark GHC.AnnClass+ markLocated ln+ markWithString GHC.AnnClose "#-}" -- "#-}"++ markAST _ GHC.HsVectClassOut {} =+ traceM "warning: HsVecClassOut appears after renaming"+ markAST _ GHC.HsVectInstIn {} =+ traceM "warning: HsVecInstsIn appears after renaming"+ markAST _ GHC.HsVectInstOut {} =+ traceM "warning: HsVecInstOut appears after renaming"++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.RuleDecls name) where+ markAST _ (GHC.HsRules src rules) = do+ markWithString GHC.AnnOpen src+ setLayoutFlag $ markListIntercalateWithFunLevel markLocated 2 rules+ markWithString GHC.AnnClose "#-}"+ markTrailingSemi++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.RuleDecl name) where+ markAST _ (GHC.HsRule ln act bndrs lhs _ rhs _) = do+ markLocated ln+ setContext (Set.singleton ExplicitNeverActive) $ markActivation act++ unless (null bndrs) $ do+ mark GHC.AnnForall+ mapM_ markLocated bndrs+ mark GHC.AnnDot++ markLocated lhs+ mark GHC.AnnEqual+ markLocated rhs+ inContext (Set.singleton Intercalate) $ mark GHC.AnnSemi+ markTrailingSemi++-- ---------------------------------------------------------------------++markActivation :: GHC.Activation -> Annotated ()+markActivation act = do+#if __GLASGOW_HASKELL__ <= 710+ case act of+ GHC.ActiveBefore n -> do+ mark GHC.AnnOpenS -- '['+ mark GHC.AnnTilde -- ~+ markWithString GHC.AnnVal (show n)+ mark GHC.AnnCloseS -- ']'+ GHC.ActiveAfter n -> do+ mark GHC.AnnOpenS -- '['+ markWithString GHC.AnnVal (show n)+ mark GHC.AnnCloseS -- ']'+ GHC.NeverActive -> do+ inContext (Set.singleton ExplicitNeverActive) $ do+ mark GHC.AnnOpenS -- '['+ mark GHC.AnnTilde -- ~+ mark GHC.AnnCloseS -- ']'+ _ -> return ()+#else+ case act of+ GHC.ActiveBefore src _ -> do+ mark GHC.AnnOpenS -- '['+ mark GHC.AnnTilde -- ~+ markWithString GHC.AnnVal src+ mark GHC.AnnCloseS -- ']'+ GHC.ActiveAfter src _ -> do+ mark GHC.AnnOpenS -- '['+ markWithString GHC.AnnVal src+ mark GHC.AnnCloseS -- ']'+ GHC.NeverActive -> do+ inContext (Set.singleton ExplicitNeverActive) $ do+ mark GHC.AnnOpenS -- '['+ mark GHC.AnnTilde -- ~+ mark GHC.AnnCloseS -- ']'+ _ -> return ()+#endif++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.RuleBndr name) where+ markAST _ (GHC.RuleBndr ln) = markLocated ln+#if __GLASGOW_HASKELL__ <= 710+ markAST _ (GHC.RuleBndrSig ln (GHC.HsWB thing _ _ _)) = do+ mark GHC.AnnOpenP -- "("+ markLocated ln+ mark GHC.AnnDcolon+ markLocated thing+ mark GHC.AnnCloseP -- ")"+#else+ markAST _ (GHC.RuleBndrSig ln st) = do+ mark GHC.AnnOpenP -- "("+ markLocated ln+ mark GHC.AnnDcolon+ markLHsSigWcType st+ mark GHC.AnnCloseP -- ")"+#endif+-- ---------------------------------------------------------------------+#if __GLASGOW_HASKELL__ > 710+markLHsSigWcType :: (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => GHC.LHsSigWcType name -> Annotated ()+markLHsSigWcType (GHC.HsIB _ (GHC.HsWC _ mwc ty)) = do+ case mwc of+ Nothing -> markLocated ty+ Just lwc -> do+ applyListAnnotations ([(lwc,markExternal lwc GHC.AnnVal "_")]+ ++ prepareListAnnotation [ty]+ )+#endif+-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.AnnDecl name) where+ markAST _ (GHC.HsAnnotation src prov e) = do+ markWithString GHC.AnnOpen src+ case prov of+ (GHC.ValueAnnProvenance n) -> markLocated n+ (GHC.TypeAnnProvenance n) -> do+ mark GHC.AnnType+ markLocated n+ GHC.ModuleAnnProvenance -> mark GHC.AnnModule++ markLocated e+ markWithString GHC.AnnClose "#-}"+ markTrailingSemi++-- ---------------------------------------------------------------------++instance Annotate name => Annotate (GHC.WarnDecls name) where+ markAST _ (GHC.Warnings src warns) = do+ markWithString GHC.AnnOpen src+ mapM_ markLocated warns+ markWithString GHC.AnnClose "#-}"++-- ---------------------------------------------------------------------++instance (Annotate name)+ => Annotate (GHC.WarnDecl name) where+ markAST _ (GHC.Warning lns txt) = do+ markListIntercalate lns+ mark GHC.AnnOpenS -- "["+ case txt of+ GHC.WarningTxt _src ls -> markListIntercalate ls+ GHC.DeprecatedTxt _src ls -> markListIntercalate ls+ mark GHC.AnnCloseS -- "]"++instance Annotate GHC.FastString where+ -- TODO: https://ghc.haskell.org/trac/ghc/ticket/10313 applies.+ markAST l fs = do+ markExternal l GHC.AnnVal (show (GHC.unpackFS fs))+ inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.ForeignDecl name) where+#if __GLASGOW_HASKELL__ <= 710+ markAST _ (GHC.ForeignImport ln typ _+ (GHC.CImport cconv safety@(GHC.L ll _) _mh _imp (GHC.L ls src))) = do+#else+ markAST _ (GHC.ForeignImport ln (GHC.HsIB _ typ) _+ (GHC.CImport cconv safety@(GHC.L ll _) _mh _imp (GHC.L ls src))) = do+{-+ = ForeignImport+ { fd_name :: Located name -- defines this name+ , fd_sig_ty :: LHsSigType name -- sig_ty+ , fd_co :: PostTc name Coercion -- rep_ty ~ sig_ty+ , fd_fi :: ForeignImport }++-}+#endif+ mark GHC.AnnForeign+ mark GHC.AnnImport+ markLocated cconv+ unless (ll == GHC.noSrcSpan) $ markLocated safety+#if __GLASGOW_HASKELL__ <= 710+ markExternal ls GHC.AnnVal (show src)+#else+ if GHC.unLoc cconv == GHC.PrimCallConv+ then markExternal ls GHC.AnnVal src+#if defined(MIN_VERSION_GLASGOW_HASKELL) && (MIN_VERSION_GLASGOW_HASKELL(8,0,1,1))+ else markExternal ls GHC.AnnVal src+#else+ else markExternal ls GHC.AnnVal (show src)+#endif+#endif+ markLocated ln+ mark GHC.AnnDcolon+ markLocated typ+ markTrailingSemi+++#if __GLASGOW_HASKELL__ <= 710+ markAST _l (GHC.ForeignExport ln typ _ (GHC.CExport spec (GHC.L ls src))) = do+#else+ markAST _l (GHC.ForeignExport ln (GHC.HsIB _ typ) _ (GHC.CExport spec (GHC.L ls src))) = do+#endif+ mark GHC.AnnForeign+ mark GHC.AnnExport+ markLocated spec+ markExternal ls GHC.AnnVal (show src)+ setContext (Set.singleton PrefixOp) $ markLocated ln+ mark GHC.AnnDcolon+ markLocated typ+++-- ---------------------------------------------------------------------++instance (Annotate GHC.CExportSpec) where+#if __GLASGOW_HASKELL__ <= 710+ markAST l (GHC.CExportStatic _ cconv) = markAST l cconv+#else+ markAST l (GHC.CExportStatic _src _ cconv) = markAST l cconv+#endif++-- ---------------------------------------------------------------------++instance (Annotate GHC.CCallConv) where+ markAST l GHC.StdCallConv = markExternal l GHC.AnnVal "stdcall"+ markAST l GHC.CCallConv = markExternal l GHC.AnnVal "ccall"+ markAST l GHC.CApiConv = markExternal l GHC.AnnVal "capi"+ markAST l GHC.PrimCallConv = markExternal l GHC.AnnVal "prim"+ markAST l GHC.JavaScriptCallConv = markExternal l GHC.AnnVal "javascript"++-- ---------------------------------------------------------------------++instance (Annotate GHC.Safety) where+ markAST l GHC.PlayRisky = markExternal l GHC.AnnVal "unsafe"+ markAST l GHC.PlaySafe = markExternal l GHC.AnnVal "safe"+ markAST l GHC.PlayInterruptible = markExternal l GHC.AnnVal "interruptible"++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.DerivDecl name) where++#if __GLASGOW_HASKELL__ <= 710+ markAST _ (GHC.DerivDecl typ mov) = do+#else+ markAST _ (GHC.DerivDecl (GHC.HsIB _ typ) mov) = do+#endif+ mark GHC.AnnDeriving+ mark GHC.AnnInstance+ markMaybe mov+ markLocated typ+ markTrailingSemi++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.DefaultDecl name) where++ markAST _ (GHC.DefaultDecl typs) = do+ mark GHC.AnnDefault+ mark GHC.AnnOpenP -- '('+ markListIntercalate typs+ mark GHC.AnnCloseP -- ')'+ markTrailingSemi++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.InstDecl name) where++ markAST l (GHC.ClsInstD cid) = markAST l cid+ markAST l (GHC.DataFamInstD dfid) = markAST l dfid+ markAST l (GHC.TyFamInstD tfid) = markAST l tfid++-- ---------------------------------------------------------------------++instance Annotate GHC.OverlapMode where+ markAST _ (GHC.NoOverlap src) = do+ markWithString GHC.AnnOpen src+ markWithString GHC.AnnClose "#-}"++ markAST _ (GHC.Overlappable src) = do+ markWithString GHC.AnnOpen src+ markWithString GHC.AnnClose "#-}"++ markAST _ (GHC.Overlapping src) = do+ markWithString GHC.AnnOpen src+ markWithString GHC.AnnClose "#-}"++ markAST _ (GHC.Overlaps src) = do+ markWithString GHC.AnnOpen src+ markWithString GHC.AnnClose "#-}"++ markAST _ (GHC.Incoherent src) = do+ markWithString GHC.AnnOpen src+ markWithString GHC.AnnClose "#-}"++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.ClsInstDecl name) where++#if __GLASGOW_HASKELL__ <= 710+ markAST _ (GHC.ClsInstDecl poly binds sigs tyfams datafams mov) = do+#else+ markAST _ (GHC.ClsInstDecl (GHC.HsIB _ poly) binds sigs tyfams datafams mov) = do+#endif+ mark GHC.AnnInstance+ markMaybe mov+ markLocated poly+ mark GHC.AnnWhere+ markOptional GHC.AnnOpenC -- '{'+ markInside GHC.AnnSemi++ applyListAnnotationsLayout (prepareListAnnotation (GHC.bagToList binds)+ ++ prepareListAnnotation sigs+ ++ prepareListAnnotation tyfams+ ++ prepareListAnnotation datafams+ )++ markOptional GHC.AnnCloseC -- '}'+ markTrailingSemi++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.TyFamInstDecl name) where++ markAST _ (GHC.TyFamInstDecl eqn _) = do+ mark GHC.AnnType+ inContext (Set.singleton TopLevel) $ mark GHC.AnnInstance -- Note: this keyword is optional+ markLocated eqn+ markTrailingSemi++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.DataFamInstDecl name) where++#if __GLASGOW_HASKELL__ <= 710+ markAST l (GHC.DataFamInstDecl ln (GHC.HsWB pats _ _ _)+ defn@(GHC.HsDataDefn nd ctx typ _mk cons mderivs) _) = do+#else+ markAST l (GHC.DataFamInstDecl ln (GHC.HsIB _ pats)+ defn@(GHC.HsDataDefn nd ctx typ _mk cons mderivs) _) = do+#endif+ case GHC.dd_ND defn of+ GHC.NewType -> mark GHC.AnnNewtype+ GHC.DataType -> mark GHC.AnnData+ inContext (Set.singleton TopLevel) $ mark GHC.AnnInstance++ markLocated ctx++ markTyClass ln pats++#if __GLASGOW_HASKELL__ > 710+ case (GHC.dd_kindSig defn) of+ Just s -> do+ mark GHC.AnnDcolon+ markLocated s+ Nothing -> return ()+#endif+ if isGadt $ GHC.dd_cons defn+ then mark GHC.AnnWhere+ else mark GHC.AnnEqual+ markDataDefn l (GHC.HsDataDefn nd (GHC.noLoc []) typ _mk cons mderivs)+ markTrailingSemi++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.HsBind name) where+#if __GLASGOW_HASKELL__ <= 710+ markAST _ (GHC.FunBind _ _ (GHC.MG matches _ _ _) _ _ _) = do+#else+ markAST _ (GHC.FunBind _ (GHC.MG (GHC.L _ matches) _ _ _) _ _ _) = do+#endif+ -- Note: from a layout perspective a FunBind should not exist, so the+ -- current context is passed through unchanged to the matches.+ -- TODO: perhaps bring the edp from the first match up to the annotation for+ -- the FunBind.+ let+ tlFun =+ ifInContext (Set.fromList [CtxOnly,CtxFirst])+ (markListWithContexts' listContexts matches)+ (markListWithContexts (lcMiddle listContexts) (lcLast listContexts) matches)+ ifInContext (Set.singleton TopLevel)+ (setContextLevel (Set.singleton TopLevel) 2 tlFun)+ tlFun++#if __GLASGOW_HASKELL__ <= 710+ markAST _ (GHC.PatBind lhs (GHC.GRHSs grhs lb) _typ _fvs _ticks) = do+#else+ markAST _ (GHC.PatBind lhs (GHC.GRHSs grhs (GHC.L _ lb)) _typ _fvs _ticks) = do+#endif+ markLocated lhs+ case grhs of+ (GHC.L _ (GHC.GRHS [] _):_) -> mark GHC.AnnEqual -- empty guards+ _ -> return ()+ markListIntercalateWithFunLevel markLocated 2 grhs+ unless (GHC.isEmptyLocalBinds lb) $ mark GHC.AnnWhere+ markOptional GHC.AnnWhere++ markLocalBindsWithLayout lb+ markTrailingSemi++ markAST _ (GHC.VarBind _n rhse _) =+ -- Note: this bind is introduced by the typechecker+ markLocated rhse++ markAST l (GHC.PatSynBind (GHC.PSB ln _fvs args def dir)) = do+ mark GHC.AnnPattern+ case args of+ GHC.InfixPatSyn la lb -> do+ markLocated la+ setContext (Set.singleton InfixOp) $ markLocated ln+ markLocated lb+ GHC.PrefixPatSyn ns -> do+ markLocated ln+ mapM_ markLocated ns+#if __GLASGOW_HASKELL__ > 710+ GHC.RecordPatSyn fs -> do+ markLocated ln+ mark GHC.AnnOpenC -- '{'+ markListIntercalateWithFun (markLocated . GHC.recordPatSynSelectorId) fs+ mark GHC.AnnCloseC -- '}'+#endif+ case dir of+ GHC.ImplicitBidirectional -> mark GHC.AnnEqual+ _ -> mark GHC.AnnLarrow++ markLocated def+ case dir of+ GHC.Unidirectional -> return ()+ GHC.ImplicitBidirectional -> return ()+ GHC.ExplicitBidirectional mg -> do+ mark GHC.AnnWhere+ mark GHC.AnnOpenC -- '{'+ markMatchGroup l mg+ mark GHC.AnnCloseC -- '}'++ markTrailingSemi++ -- Introduced after renaming.+ markAST _ (GHC.AbsBinds _ _ _ _ _) =+ traceM "warning: AbsBinds introduced after renaming"++#if __GLASGOW_HASKELL__ > 710+ -- Introduced after renaming.+ markAST _ GHC.AbsBindsSig{} =+ traceM "warning: AbsBindsSig introduced after renaming"+#endif++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.IPBind name) where+ markAST _ (GHC.IPBind en e) = do+ case en of+ Left n -> markLocated n+ Right _i -> return ()+ mark GHC.AnnEqual+ markLocated e+ markTrailingSemi++-- ---------------------------------------------------------------------++instance Annotate GHC.HsIPName where+ markAST l (GHC.HsIPName n) = markExternal l GHC.AnnVal ("?" ++ GHC.unpackFS n)++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name,+ Annotate body)+ => Annotate (GHC.Match name (GHC.Located body)) where++#if __GLASGOW_HASKELL__ <= 710+ markAST _ (GHC.Match mln pats _typ (GHC.GRHSs grhs lb)) = do+#else+ markAST _ (GHC.Match mln pats _typ (GHC.GRHSs grhs (GHC.L _ lb))) = do+#endif+ let+#if __GLASGOW_HASKELL__ <= 710+ get_infix Nothing = False+ get_infix (Just (_,f)) = f+#else+ get_infix GHC.NonFunBindMatch = False+ get_infix (GHC.FunBindMatch _ f) = f+#endif+#if __GLASGOW_HASKELL__ <= 710+ isFunBind = isJust+#else+ isFunBind GHC.NonFunBindMatch = False+ isFunBind GHC.FunBindMatch{} = True+#endif+ case (get_infix mln,pats) of+ (True, a:b:xs) -> do+ if null xs+ then markOptional GHC.AnnOpenP+ else mark GHC.AnnOpenP+ markLocated a+ case mln of+#if __GLASGOW_HASKELL__ <= 710+ Nothing -> return ()+ Just (n,_) -> setContext (Set.singleton InfixOp) $ markLocated n+#else+ GHC.NonFunBindMatch -> return ()+ GHC.FunBindMatch n _ -> setContext (Set.singleton InfixOp) $ markLocated n+#endif+ markLocated b+ if null xs+ then markOptional GHC.AnnCloseP+ else mark GHC.AnnCloseP+ mapM_ markLocated xs+ _ -> do+ annotationsToComments [GHC.AnnOpenP,GHC.AnnCloseP]+ inContext (Set.fromList [LambdaExpr]) $ do mark GHC.AnnLam -- For HsLam+#if __GLASGOW_HASKELL__ <= 710+ case mln of+ -- Nothing -> mark GHC.AnnFunId+ Nothing -> markListNoPrecedingSpace False pats+ Just (n,_) -> do+ setContext (Set.fromList [NoPrecedingSpace,PrefixOp]) $ markLocated n+ mapM_ markLocated pats+ -- markListNoPrecedingSpace pats+#else+ case mln of+ -- GHC.NonFunBindMatch -> mark GHC.AnnFunId+ GHC.NonFunBindMatch -> markListNoPrecedingSpace False pats+ GHC.FunBindMatch n _ -> do+ -- setContext (Set.singleton NoPrecedingSpace) $ markLocated n+ setContext (Set.fromList [NoPrecedingSpace,PrefixOp]) $ markLocated n+ mapM_ markLocated pats+#endif++ -- TODO: The AnnEqual annotation actually belongs in the first GRHS value+ case grhs of+ (GHC.L _ (GHC.GRHS [] _):_) -> when (isFunBind mln) $ mark GHC.AnnEqual -- empty guards+ _ -> return ()+ inContext (Set.fromList [LambdaExpr]) $ mark GHC.AnnRarrow -- For HsLam+ mapM_ markLocated grhs++ case lb of+ GHC.EmptyLocalBinds -> return ()+ _ -> do+ mark GHC.AnnWhere+ markOptional GHC.AnnOpenC -- '{'+ markInside GHC.AnnSemi+ markLocalBindsWithLayout lb+ markOptional GHC.AnnCloseC -- '}'+ markTrailingSemi++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,+ Annotate name, Annotate body)+ => Annotate (GHC.GRHS name (GHC.Located body)) where+ markAST _ (GHC.GRHS guards expr) = do+ case guards of+ [] -> return ()+ (_:_) -> do+ mark GHC.AnnVbar+ unsetContext Intercalate $ setContext (Set.fromList [LeftMost,PrefixOp]) $ markListIntercalate guards+ ifInContext (Set.fromList [CaseAlt])+ (return ())+ (mark GHC.AnnEqual)++ markOptional GHC.AnnEqual -- For apply-refact Structure8.hs test++ inContext (Set.fromList [CaseAlt]) $ mark GHC.AnnRarrow -- For HsLam+ setContextLevel (Set.fromList [LeftMost,PrefixOp]) 2 $ markLocated expr++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.Sig name) where++#if __GLASGOW_HASKELL__ <= 710+ markAST _ (GHC.TypeSig lns typ _) = do+#else+ markAST _ (GHC.TypeSig lns st) = do+#endif+ setContext (Set.singleton PrefixOp) $ markListNoPrecedingSpace True lns+ mark GHC.AnnDcolon+#if __GLASGOW_HASKELL__ <= 710+ markLocated typ+#else+ markLHsSigWcType st+#endif+ markTrailingSemi+ tellContext (Set.singleton FollowingLine)++#if __GLASGOW_HASKELL__ <= 710+ markAST _ (GHC.PatSynSig ln (_ef,GHC.HsQTvs _ns bndrs) ctx1 ctx2 typ) = do+ mark GHC.AnnPattern+ markLocated ln+ mark GHC.AnnDcolon++ -- Note: The 'forall' bndrs '.' may occur multiple times+ unless (null bndrs) $ do+ mark GHC.AnnForall+ mapM_ markLocated bndrs+ mark GHC.AnnDot++ when (GHC.getLoc ctx1 /= GHC.noSrcSpan) $ do+ setContext (Set.fromList [Parens,NoDarrow]) $ markLocated ctx1+ markOffset GHC.AnnDarrow 0+ when (GHC.getLoc ctx2 /= GHC.noSrcSpan) $ do+ setContext (Set.fromList [Parens,NoDarrow]) $ markLocated ctx2+ markOffset GHC.AnnDarrow 1+ markLocated typ+ markTrailingSemi+#else+ markAST _ (GHC.PatSynSig ln (GHC.HsIB _ typ)) = do+ mark GHC.AnnPattern+ markLocated ln+ mark GHC.AnnDcolon+ markLocated typ+ markTrailingSemi+#endif++#if __GLASGOW_HASKELL__ <= 710+ markAST _ (GHC.GenericSig ns typ) = do+ mark GHC.AnnDefault+#else+ markAST _ (GHC.ClassOpSig isDefault ns (GHC.HsIB _ typ)) = do+ when isDefault $ mark GHC.AnnDefault+#endif+ -- markListIntercalate ns+ setContext (Set.singleton PrefixOp) $ markListIntercalate ns+ mark GHC.AnnDcolon+ markLocated typ+ markTrailingSemi++ markAST _ (GHC.IdSig _) =+ traceM "warning: Introduced after renaming"++ -- FixSig (FixitySig name)+#if __GLASGOW_HASKELL__ <= 710+ markAST _ (GHC.FixSig (GHC.FixitySig lns (GHC.Fixity v fdir))) = do+#else+ markAST _ (GHC.FixSig (GHC.FixitySig lns (GHC.Fixity src _v fdir))) = do+#endif+ let fixstr = case fdir of+ GHC.InfixL -> "infixl"+ GHC.InfixR -> "infixr"+ GHC.InfixN -> "infix"+ markWithString GHC.AnnInfix fixstr+#if __GLASGOW_HASKELL__ <= 710+ markWithString GHC.AnnVal (show v)+#else+ markWithString GHC.AnnVal src+#endif+ setContext (Set.singleton InfixOp) $ markListIntercalate lns+ markTrailingSemi++ -- InlineSig (Located name) InlinePragma+ -- '{-# INLINE' activation qvar '#-}'+ markAST _ (GHC.InlineSig ln inl) = do+ markWithString GHC.AnnOpen (GHC.inl_src inl) -- '{-# INLINE'+ markActivation (GHC.inl_act inl)+ setContext (Set.singleton PrefixOp) $ markLocated ln+ markWithString GHC.AnnClose "#-}" -- '#-}'+ markTrailingSemi++#if __GLASGOW_HASKELL__ <= 710+ markAST _ (GHC.SpecSig ln typs inl) = do+#else+ markAST _ (GHC.SpecSig ln typs inl) = do+{-+ | SpecSig (Located name) -- Specialise a function or datatype ...+ [LHsSigType name] -- ... to these types+ InlinePragma -- The pragma on SPECIALISE_INLINE form.+ -- If it's just defaultInlinePragma, then we said+ -- SPECIALISE, not SPECIALISE_INLINE++-}+#endif+ markWithString GHC.AnnOpen (GHC.inl_src inl)+ markActivation (GHC.inl_act inl)+ markLocated ln+ mark GHC.AnnDcolon -- '::'+#if __GLASGOW_HASKELL__ <= 710+ markListIntercalate typs+#else+ markListIntercalateWithFunLevel markLHsSigType 2 typs+#endif+ markWithString GHC.AnnClose "#-}" -- '#-}'+ markTrailingSemi+++ -- '{-# SPECIALISE' 'instance' inst_type '#-}'+ markAST _ (GHC.SpecInstSig src typ) = do+ markWithString GHC.AnnOpen src+ mark GHC.AnnInstance+#if __GLASGOW_HASKELL__ <= 710+ markLocated typ+#else+ markLHsSigType typ+#endif+ markWithString GHC.AnnClose "#-}" -- '#-}'+ markTrailingSemi++++ -- MinimalSig (BooleanFormula (Located name))+ markAST _l (GHC.MinimalSig src formula) = do+ markWithString GHC.AnnOpen src+#if __GLASGOW_HASKELL__ <= 710+ annotationsToCommentsBF formula [GHC.AnnOpenP,GHC.AnnCloseP,GHC.AnnComma,GHC.AnnVbar]+ markAST _l formula+ finalizeBF _l+#else+ markLocated formula+#endif+ markWithString GHC.AnnClose "#-}"+ markTrailingSemi++-- --------------------------------------------------------------------++#if __GLASGOW_HASKELL__ > 710+markLHsSigType :: (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => GHC.LHsSigType name -> Annotated ()+markLHsSigType (GHC.HsIB _ typ) = markLocated typ++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate [GHC.LHsSigType name] where+ markAST _ ls = do+ mark GHC.AnnDeriving+ -- Mote: a single item in parens is parsed as a HsAppsTy. Without parens it+ -- is a HsTyVar. So for round trip pretty printing we need to take this into+ -- account.+ case ls of+ [] -> markManyOptional GHC.AnnOpenP+ [GHC.HsIB _ (GHC.L _ GHC.HsAppsTy{})] -> markMany GHC.AnnOpenP+ [_] -> markManyOptional GHC.AnnOpenP+ _ -> markMany GHC.AnnOpenP+ markListIntercalateWithFun markLHsSigType ls+ case ls of+ [] -> markManyOptional GHC.AnnCloseP+ [GHC.HsIB _ (GHC.L _ GHC.HsAppsTy{})] -> markMany GHC.AnnCloseP+ [_] -> markManyOptional GHC.AnnCloseP+ _ -> markMany GHC.AnnCloseP+#endif++-- --------------------------------------------------------------------++#if __GLASGOW_HASKELL__ <= 710+-- In practice, due to the way the BooleanFormula is constructed in the parser,+-- we will get the following variants+-- a | b : Or [a,b]+-- a , b : And [a,b]+-- ( a ) : a+-- A bottom level Located RdrName is captured in a Var. This is the only part+-- with a location in it.+--+-- So the best strategy might be to convert all the annotations into comments,+-- and then just print the names. DONE+instance (Annotate name) => Annotate (GHC.BooleanFormula (GHC.Located name)) where+ -- markAST _ (GHC.Var x) = markLocated x+ markAST _ (GHC.Var x) = setContext (Set.singleton PrefixOp) $ markLocated x+ markAST l (GHC.Or ls) = mapM_ (markAST l) ls+ markAST l (GHC.And ls) = mapM_ (markAST l) ls+#else+instance (Annotate name) => Annotate (GHC.BooleanFormula (GHC.Located name)) where+ markAST _ (GHC.Var x) = do+ setContext (Set.singleton PrefixOp) $ markLocated x+ inContext (Set.fromList [AddVbar]) $ mark GHC.AnnVbar+ inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma+ -- markAST l (GHC.Or ls) = mapM_ markLocated ls+ markAST _ (GHC.Or ls) = markListIntercalateWithFunLevelCtx markLocated 2 AddVbar ls+ markAST _ (GHC.And ls) = do+ markListIntercalateWithFunLevel markLocated 2 ls+ inContext (Set.fromList [AddVbar]) $ mark GHC.AnnVbar+ inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma+ markAST _ (GHC.Parens x) = do+ mark GHC.AnnOpenP -- '('+ markLocated x+ mark GHC.AnnCloseP -- ')'+ inContext (Set.fromList [AddVbar]) $ mark GHC.AnnVbar+ inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma+#endif++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.HsTyVarBndr name) where+ markAST _l (GHC.UserTyVar n) = do+#if __GLASGOW_HASKELL__ <= 710+ markAST _l n+#else+ markLocated n+#endif++ markAST _ (GHC.KindedTyVar n ty) = do+ mark GHC.AnnOpenP -- '('+ markLocated n+ mark GHC.AnnDcolon -- '::'+ markLocated ty+ mark GHC.AnnCloseP -- '('++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.HsType name) where+ markAST loc ty = do+ markType loc ty+ inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma+ where++ -- markType :: GHC.SrcSpan -> ast -> Annotated ()+#if __GLASGOW_HASKELL__ <= 710+ markType _ (GHC.HsForAllTy _f mwc (GHC.HsQTvs _kvs tvs) ctx@(GHC.L lc ctxs) typ) = do+ unless (null tvs) $ do+ mark GHC.AnnForall+ mapM_ markLocated tvs+ mark GHC.AnnDot++ case mwc of+ Nothing -> when (lc /= GHC.noSrcSpan) $ markLocated ctx+ Just lwc -> do+ let sorted = lexicalSortLocated (GHC.L lwc GHC.HsWildcardTy:ctxs)+ markLocated (GHC.L lc sorted)++ markLocated typ+ -- mark GHC.AnnCloseP -- ")"+#else+ markType _ (GHC.HsForAllTy tvs typ) = do+ mark GHC.AnnForall+ mapM_ markLocated tvs+ mark GHC.AnnDot+ markLocated typ++ {-+ = HsForAllTy -- See Note [HsType binders]+ { hst_bndrs :: [LHsTyVarBndr name] -- Explicit, user-supplied 'forall a b c'+ , hst_body :: LHsType name -- body type+ }++ -}+#endif++#if __GLASGOW_HASKELL__ > 710+ markType _ (GHC.HsQualTy cxt typ) = do+ markLocated cxt+ markLocated typ+ {-+ | HsQualTy -- See Note [HsType binders]+ { hst_ctxt :: LHsContext name -- Context C => blah+ , hst_body :: LHsType name }+ -}+#endif++ markType _l (GHC.HsTyVar name) = do+#if __GLASGOW_HASKELL__ <= 710+ if GHC.isDataOcc $ GHC.occName name+ then do+ mark GHC.AnnSimpleQuote+ markLocatedFromKw GHC.AnnName (GHC.L _l name)+ else unsetContext Intercalate $ markAST _l name+#else+ -- TODO: Should the isExactName test move into the RdrName Annotate instanced?+ if ((GHC.isDataOcc $ GHC.occName $ GHC.unLoc name) && ((not $ isExactName $ GHC.unLoc name)))+ || (showGhc name == "()")+ then do+ mark GHC.AnnSimpleQuote+ markLocatedFromKw GHC.AnnName name+ else markLocated name+#endif++#if __GLASGOW_HASKELL__ > 710+ markType _ (GHC.HsAppsTy ts) = do+ mapM_ markLocated ts+#endif++ markType _ (GHC.HsAppTy t1 t2) = do+ setContext (Set.singleton PrefixOp) $ markLocated t1+ markLocated t2++ markType _ (GHC.HsFunTy t1 t2) = do+ markLocated t1+ mark GHC.AnnRarrow+ markLocated t2++ markType _ (GHC.HsListTy t) = do+ mark GHC.AnnOpenS -- '['+ markLocated t+ mark GHC.AnnCloseS -- ']'++ markType _ (GHC.HsPArrTy t) = do+ markWithString GHC.AnnOpen "[:" -- '[:'+ markLocated t+ markWithString GHC.AnnClose ":]" -- ':]'++ markType _ (GHC.HsTupleTy tt ts) = do+ case tt of+ GHC.HsBoxedOrConstraintTuple -> mark GHC.AnnOpenP -- '('+ _ -> markWithString GHC.AnnOpen "(#" -- '(#'+ markListIntercalateWithFunLevel markLocated 2 ts+ case tt of+ GHC.HsBoxedOrConstraintTuple -> mark GHC.AnnCloseP -- ')'+ _ -> markWithString GHC.AnnClose "#)" -- '#)'++#if __GLASGOW_HASKELL__ <= 710+ markType _ (GHC.HsOpTy t1 (_,lo) t2) = do+#else+ markType _ (GHC.HsOpTy t1 lo t2) = do+ -- HsOpTy (LHsType name) (Located name) (LHsType name)+#endif+ markLocated t1+ if (GHC.isTcOcc $ GHC.occName $ GHC.unLoc lo)+ then do+ markOptional GHC.AnnSimpleQuote+ else do+ mark GHC.AnnSimpleQuote+ unsetContext PrefixOp $ setContext (Set.singleton InfixOp) $ markLocated lo+ markLocated t2++ markType _ (GHC.HsParTy t) = do+ mark GHC.AnnOpenP -- '('+ markLocated t+ mark GHC.AnnCloseP -- ')'++ markType _ (GHC.HsIParamTy (GHC.HsIPName n) t) = do+ markWithString GHC.AnnVal ("?" ++ (GHC.unpackFS n))+ mark GHC.AnnDcolon+ markLocated t++ markType _ (GHC.HsEqTy t1 t2) = do+ markLocated t1+ mark GHC.AnnTilde+ markLocated t2++ markType _ (GHC.HsKindSig t k) = do+ mark GHC.AnnOpenP -- '('+ markLocated t+ mark GHC.AnnDcolon -- '::'+ markLocated k+ mark GHC.AnnCloseP -- ')'++ markType l (GHC.HsSpliceTy s _) = do+#if __GLASGOW_HASKELL__ <= 710+ mark GHC.AnnOpenPE+ markAST l s+ mark GHC.AnnCloseP+#else+ markAST l s+#endif++ markType _ (GHC.HsDocTy t ds) = do+ markLocated t+ markLocated ds++#if __GLASGOW_HASKELL__ <= 710+ markType _ (GHC.HsBangTy b t) = do+ case b of+ (GHC.HsSrcBang ms (Just True) _) -> do+ markWithString GHC.AnnOpen (fromMaybe "{-# UNPACK" ms)+ markWithString GHC.AnnClose "#-}"+ (GHC.HsSrcBang ms (Just False) _) -> do+ markWithString GHC.AnnOpen (fromMaybe "{-# NOUNPACK" ms)+ markWithString GHC.AnnClose "#-}"+ _ -> return ()+ mark GHC.AnnBang+ markLocated t+#else+ markType _ (GHC.HsBangTy (GHC.HsSrcBang mt _up str) t) = do+ case mt of+ Nothing -> return ()+ Just src -> do+ markWithString GHC.AnnOpen src+ markWithString GHC.AnnClose "#-}"+ case str of+ GHC.SrcLazy -> mark GHC.AnnTilde+ GHC.SrcStrict -> mark GHC.AnnBang+ GHC.NoSrcStrict -> return ()++ markLocated t+ {-+ | HsBangTy HsSrcBang (LHsType name) -- Bang-style type annotations+ data HsSrcBang =+ HsSrcBang (Maybe SourceText) -- Note [Pragma source text] in BasicTypes+ SrcUnpackedness+ SrcStrictness+ data SrcStrictness = SrcLazy -- ^ Lazy, ie '~'+ | SrcStrict -- ^ Strict, ie '!'+ | NoSrcStrict -- ^ no strictness annotation++ data SrcUnpackedness = SrcUnpack -- ^ {-# UNPACK #-} specified+ | SrcNoUnpack -- ^ {-# NOUNPACK #-} specified+ | NoSrcUnpack -- ^ no unpack pragma++ -}+#endif++ markType _ (GHC.HsRecTy cons) = do+ mark GHC.AnnOpenC -- '{'+ markListIntercalate cons+ mark GHC.AnnCloseC -- '}'++ -- HsCoreTy Type+ markType _ (GHC.HsCoreTy _t) =+ traceM "warning: HsCoreTy Introduced after renaming"++ markType _ (GHC.HsExplicitListTy _ ts) = do+ mark GHC.AnnSimpleQuote+ mark GHC.AnnOpenS -- "["+ markListIntercalate ts+ mark GHC.AnnCloseS -- ']'++ markType _ (GHC.HsExplicitTupleTy _ ts) = do+ mark GHC.AnnSimpleQuote+ mark GHC.AnnOpenP+ markListIntercalate ts+ mark GHC.AnnCloseP++ -- HsTyLit HsTyLit+ markType l (GHC.HsTyLit lit) = do+ case lit of+ (GHC.HsNumTy s _) ->+ markExternal l GHC.AnnVal s+ (GHC.HsStrTy s _) ->+ markExternal l GHC.AnnVal s++ -- HsWrapTy HsTyAnnotated (HsType name)+#if __GLASGOW_HASKELL__ <= 710+ markType _ (GHC.HsWrapTy _ _) =+ traceM "warning: HsWrapTyy Introduced after renaming"+#endif++#if __GLASGOW_HASKELL__ <= 710+ markType l GHC.HsWildcardTy = do+ markExternal l GHC.AnnVal "_"+ markType l (GHC.HsNamedWildcardTy n) = do+ markExternal l GHC.AnnVal (showGhc n)+#else+ markType l (GHC.HsWildCardTy (GHC.AnonWildCard _)) = do+ markExternal l GHC.AnnVal "_"+#endif++#if __GLASGOW_HASKELL__ <= 710+ markType l (GHC.HsQuasiQuoteTy n) = do+ markAST l n+#endif++-- ---------------------------------------------------------------------+#if __GLASGOW_HASKELL__ > 710+instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.HsAppType name) where+ markAST _ (GHC.HsAppInfix n) = do+ when (GHC.isDataOcc $ GHC.occName $ GHC.unLoc n) $ mark GHC.AnnSimpleQuote+ setContext (Set.singleton InfixOp) $ markLocated n+ markAST _ (GHC.HsAppPrefix t) = do+ markOptional GHC.AnnTilde+ setContext (Set.singleton PrefixOp) $ markLocated t+#endif+-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.HsSplice name) where+#if __GLASGOW_HASKELL__ > 710+ markAST l c =+ case c of+ GHC.HsQuasiQuote _ n _pos fs -> do+ markExternal l GHC.AnnVal+ ("[" ++ (showGhc n) ++ "|" ++ (GHC.unpackFS fs) ++ "|]")++ GHC.HsTypedSplice _n (GHC.L _ (GHC.HsVar (GHC.L _ n))) -> do+ markWithString GHC.AnnThIdTySplice ("$$" ++ (GHC.occNameString (GHC.occName n)))+ GHC.HsTypedSplice _n b -> do+ mark GHC.AnnOpenPTE+ markLocated b+ mark GHC.AnnCloseP++ GHC.HsUntypedSplice _n b@(GHC.L _ (GHC.HsVar (GHC.L _ n))) -> do+ ifInContext (Set.singleton InSpliceDecl)+ (return ())+ (mark GHC.AnnOpenPE)+ -- TODO: We do not seem to have any way to distinguish between which of+ -- the next two lines will emit output. If AnnThIdSplice is there, the+ -- markLocated b ends up with a negative offset so emits nothing.+ markWithStringOptional GHC.AnnThIdSplice ("$" ++ (GHC.occNameString (GHC.occName n)))+ markLocated b+ ifInContext (Set.singleton InSpliceDecl)+ (return ())+ (mark GHC.AnnCloseP)+ GHC.HsUntypedSplice _n b -> do+ -- TODO: when is this not optional?+ markOptional GHC.AnnThIdSplice+ ifInContext (Set.singleton InSpliceDecl)+ (return ())+ (mark GHC.AnnOpenPE)+ markLocated b+ ifInContext (Set.singleton InSpliceDecl)+ (return ())+ (mark GHC.AnnCloseP)+#if defined(MIN_VERSION_GLASGOW_HASKELL) && (MIN_VERSION_GLASGOW_HASKELL(8,0,1,1))+ GHC.HsSpliced{} -> error "HsSpliced only exists between renamer and typechecker in GHC"+#endif+#else+ markAST _ c =+ case c of+ GHC.HsSplice _n b@(GHC.L _ (GHC.HsVar n)) -> do+ -- TODO: We do not seem to have any way to distinguish between which of+ -- the next two lines will emit output. If AnnThIdSplice is there, the+ markWithStringOptional GHC.AnnThIdSplice ("$" ++ (GHC.occNameString (GHC.occName n)))+ markLocated b+ GHC.HsSplice _n b@(GHC.L _ (GHC.HsBracket _)) -> do+ markLocated b+ GHC.HsSplice _n b -> do+ markLocated b+#endif++#if __GLASGOW_HASKELL__ <= 710+instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.HsQuasiQuote name) where+ markAST l (GHC.HsQuasiQuote n _pos fs) = do+ markExternal l GHC.AnnVal+ ("[" ++ showGhc n ++ "|" ++ GHC.unpackFS fs ++ "|]")+#endif++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name) =>+ Annotate (GHC.ConDeclField name) where+ markAST _ (GHC.ConDeclField ns ty mdoc) = do+{-+data ConDeclField name -- Record fields have Haddoc docs on them+ = ConDeclField { cd_fld_names :: [LFieldOcc name],+ -- ^ See Note [ConDeclField names]+ cd_fld_type :: LBangType name,+ cd_fld_doc :: Maybe LHsDocString }++-}+ unsetContext Intercalate $ do+ markListIntercalate ns+ mark GHC.AnnDcolon+ markLocated ty+ markMaybe mdoc+ inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma++-- ---------------------------------------------------------------------++#if __GLASGOW_HASKELL__ > 710+instance (GHC.DataId name)+ => Annotate (GHC.FieldOcc name) where+ markAST _ (GHC.FieldOcc rn _) = do+ markLocated rn+ inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma+#endif++-- ---------------------------------------------------------------------++instance Annotate GHC.HsDocString where+ markAST l (GHC.HsDocString s) = do+ markExternal l GHC.AnnVal (GHC.unpackFS s)++-- ---------------------------------------------------------------------+instance (GHC.DataId name,Annotate name,GHC.OutputableBndr name,GHC.HasOccName name)+ => Annotate (GHC.Pat name) where+ markAST loc typ = do+ markPat loc typ+ inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma `debug` ("AnnComma in Pat")+ where+ markPat l (GHC.WildPat _) = markExternal l GHC.AnnVal "_"+ markPat l (GHC.VarPat n) = do+ -- The parser inserts a placeholder value for a record pun rhs. This must be+ -- filtered out until https://ghc.haskell.org/trac/ghc/ticket/12224 is+ -- resolved, particularly for pretty printing where annotations are added.+ let pun_RDR = "pun-right-hand-side"+ when (showGhc n /= pun_RDR) $+#if __GLASGOW_HASKELL__ <= 710+ unsetContext Intercalate $ setContext (Set.singleton PrefixOp) $ markAST l n+#else+ unsetContext Intercalate $ setContext (Set.singleton PrefixOp) $ markAST l (GHC.unLoc n)+#endif+ markPat _ (GHC.LazyPat p) = do+ mark GHC.AnnTilde+ markLocated p++ markPat _ (GHC.AsPat ln p) = do+ markLocated ln+ mark GHC.AnnAt+ markLocated p++ markPat _ (GHC.ParPat p) = do+ mark GHC.AnnOpenP+ markLocated p+ mark GHC.AnnCloseP++ markPat _ (GHC.BangPat p) = do+ mark GHC.AnnBang+ markLocated p++ markPat _ (GHC.ListPat ps _ _) = do+ mark GHC.AnnOpenS+ markListIntercalateWithFunLevel markLocated 2 ps+ mark GHC.AnnCloseS++ markPat _ (GHC.TuplePat pats b _) = do+ if b == GHC.Boxed then mark GHC.AnnOpenP+ else markWithString GHC.AnnOpen "(#"+ markListIntercalateWithFunLevel markLocated 2 pats+ if b == GHC.Boxed then mark GHC.AnnCloseP+ else markWithString GHC.AnnClose "#)"++ markPat _ (GHC.PArrPat ps _) = do+ markWithString GHC.AnnOpen "[:"+ mapM_ markLocated ps+ markWithString GHC.AnnClose ":]"++ markPat _ (GHC.ConPatIn n dets) = do+ markHsConPatDetails n dets++ markPat _ GHC.ConPatOut {} =+ traceM "warning: ConPatOut Introduced after renaming"++ -- ViewPat (LHsExpr id) (LPat id) (PostTc id Type)+ markPat _ (GHC.ViewPat e pat _) = do+ markLocated e+ mark GHC.AnnRarrow+ markLocated pat++ -- SplicePat (HsSplice id)+ markPat l (GHC.SplicePat s) = do+#if __GLASGOW_HASKELL__ <= 710+ mark GHC.AnnOpenPE+ markAST l s+ mark GHC.AnnCloseP+#else+ markAST l s+#endif++ -- LitPat HsLit+ markPat l (GHC.LitPat lp) = markExternal l GHC.AnnVal (hsLit2String lp)++ -- NPat (HsOverLit id) (Maybe (SyntaxExpr id)) (SyntaxExpr id)+#if __GLASGOW_HASKELL__ <= 710+ markPat _ (GHC.NPat ol mn _) = do+#else+ markPat _ (GHC.NPat ol mn _ _) = do+#endif+ -- markOptional GHC.AnnMinus+ when (isJust mn) $ mark GHC.AnnMinus+ markLocated ol++ -- NPlusKPat (Located id) (HsOverLit id) (SyntaxExpr id) (SyntaxExpr id)+#if __GLASGOW_HASKELL__ <= 710+ markPat _ (GHC.NPlusKPat ln ol _ _) = do+#else+ markPat _ (GHC.NPlusKPat ln ol _ _ _ _) = do+#endif+ markLocated ln+ markWithString GHC.AnnVal "+" -- "+"+ markLocated ol+++#if __GLASGOW_HASKELL__ <= 710+ markPat _ (GHC.SigPatIn pat (GHC.HsWB ty _ _ _)) = do+ markLocated pat+ mark GHC.AnnDcolon+ markLocated ty+#else+ markPat _ (GHC.SigPatIn pat ty) = do+ markLocated pat+ mark GHC.AnnDcolon+ markLHsSigWcType ty+#endif++ markPat _ GHC.SigPatOut {} =+ traceM "warning: SigPatOut introduced after renaming"++ -- CoPat HsAnnotated (Pat id) Type+ markPat _ GHC.CoPat {} =+ traceM "warning: CoPat introduced after renaming"++#if __GLASGOW_HASKELL__ <= 710+ markPat l (GHC.QuasiQuotePat p) = markAST l p+#endif++-- ---------------------------------------------------------------------+hsLit2String :: GHC.HsLit -> GHC.SourceText+hsLit2String lit =+ case lit of+ GHC.HsChar src _ -> src+ -- It should be included here+ -- https://github.com/ghc/ghc/blob/master/compiler/parser/Lexer.x#L1471+ GHC.HsCharPrim src _ -> src ++ "#"+ GHC.HsString src _ -> src+ GHC.HsStringPrim src _ -> src+ GHC.HsInt src _ -> src+ GHC.HsIntPrim src _ -> src+ GHC.HsWordPrim src _ -> src+ GHC.HsInt64Prim src _ -> src+ GHC.HsWord64Prim src _ -> src+ GHC.HsInteger src _ _ -> src+ GHC.HsRat (GHC.FL src _) _ -> src+ GHC.HsFloatPrim (GHC.FL src _) -> src ++ "#"+ GHC.HsDoublePrim (GHC.FL src _) -> src ++ "##"++markHsConPatDetails :: (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => GHC.Located name -> GHC.HsConPatDetails name -> Annotated ()+markHsConPatDetails ln dets = do+ case dets of+ GHC.PrefixCon args -> do+ setContext (Set.singleton PrefixOp) $ markLocated ln+ mapM_ markLocated args+ GHC.RecCon (GHC.HsRecFields fs dd) -> do+ markLocated ln+ mark GHC.AnnOpenC -- '{'+ case dd of+ Nothing -> markListIntercalateWithFunLevel markLocated 2 fs+ Just _ -> do+ setContext (Set.singleton Intercalate) $ mapM_ markLocated fs+ mark GHC.AnnDotdot+ mark GHC.AnnCloseC -- '}'+ GHC.InfixCon a1 a2 -> do+ markLocated a1+ setContext (Set.singleton InfixOp) $ markLocated ln+ markLocated a2++markHsConDeclDetails :: (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Bool -> Bool -> [GHC.Located name] -> GHC.HsConDeclDetails name -> Annotated ()++markHsConDeclDetails isDeprecated inGadt lns dets = do+ case dets of+ GHC.PrefixCon args -> setContext (Set.singleton PrefixOp) $ mapM_ markLocated args+ GHC.RecCon fs -> do+ mark GHC.AnnOpenC+ if inGadt+ then do+ if isDeprecated+ then setContext (Set.fromList [InGadt]) $ markLocated fs+ else setContext (Set.fromList [InGadt,InRecCon]) $ markLocated fs+ else do+ if isDeprecated+ then markLocated fs+ else setContext (Set.fromList [InRecCon]) $ markLocated fs+ GHC.InfixCon a1 a2 -> do+ markLocated a1+ setContext (Set.singleton InfixOp) $ mapM_ markLocated lns+ markLocated a2++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate [GHC.LConDeclField name] where+ markAST _ fs = do+ markOptional GHC.AnnOpenC -- '{'+ markListIntercalate fs+ markOptional GHC.AnnDotdot+ inContext (Set.singleton InRecCon) $ mark GHC.AnnCloseC -- '}'+ inContext (Set.singleton InGadt) $ do+ mark GHC.AnnRarrow++-- ---------------------------------------------------------------------++instance (GHC.DataId name) => Annotate (GHC.HsOverLit name) where+ markAST l ol =+ let str = case GHC.ol_val ol of+ GHC.HsIntegral src _ -> src+ GHC.HsFractional l2 -> GHC.fl_text l2+ GHC.HsIsString src _ -> src+ in+ markExternal l GHC.AnnVal str++-- ---------------------------------------------------------------------++#if __GLASGOW_HASKELL__ <= 710+instance (GHC.DataId name,Annotate arg)+ => Annotate (GHC.HsWithBndrs name (GHC.Located arg)) where+ markAST _ (GHC.HsWB thing _ _ _) = do+ markLocated thing+#else+instance (GHC.DataId name,Annotate arg)+ => Annotate (GHC.HsImplicitBndrs name (GHC.Located arg)) where+ markAST _ (GHC.HsIB _ thing) = do+ markLocated thing+#endif++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,Annotate name+ ,GHC.HasOccName name,Annotate body)+ => Annotate (GHC.Stmt name (GHC.Located body)) where++#if __GLASGOW_HASKELL__ <= 710+ markAST _ (GHC.LastStmt body _) = setContextLevel (Set.fromList [LeftMost,PrefixOp]) 2 $ markLocated body+#else+ markAST _ (GHC.LastStmt body _ _) = setContextLevel (Set.fromList [LeftMost,PrefixOp]) 2 $ markLocated body+#endif++#if __GLASGOW_HASKELL__ <= 710+ markAST _ (GHC.BindStmt pat body _ _) = do+#else+ markAST _ (GHC.BindStmt pat body _ _ _) = do+#endif+ unsetContext Intercalate $ setContext (Set.singleton PrefixOp) $ markLocated pat+ mark GHC.AnnLarrow+ unsetContext Intercalate $ setContextLevel (Set.fromList [LeftMost,PrefixOp]) 2 $ markLocated body++ ifInContext (Set.singleton Intercalate)+ (mark GHC.AnnComma)+ (inContext (Set.singleton AddVbar) $ mark GHC.AnnVbar)+ markTrailingSemi++#if __GLASGOW_HASKELL__ > 710+ markAST _ GHC.ApplicativeStmt{}+ = error "ApplicativeStmt should not appear in ParsedSource"+#endif++ markAST _ (GHC.BodyStmt body _ _ _) = do+ unsetContext Intercalate $ markLocated body+ inContext (Set.singleton AddVbar) $ mark GHC.AnnVbar+ inContext (Set.singleton Intercalate) $ mark GHC.AnnComma+ markTrailingSemi++#if __GLASGOW_HASKELL__ <= 710+ markAST _ (GHC.LetStmt lb) = do+#else+ markAST _ (GHC.LetStmt (GHC.L _ lb)) = do+#endif+ mark GHC.AnnLet+ markOptional GHC.AnnOpenC -- '{'+ markInside GHC.AnnSemi+ markLocalBindsWithLayout lb+ markOptional GHC.AnnCloseC -- '}'+ ifInContext (Set.singleton Intercalate)+ (mark GHC.AnnComma)+ (inContext (Set.singleton AddVbar) $ mark GHC.AnnVbar)+ markTrailingSemi++#if __GLASGOW_HASKELL__ <= 710+ markAST l (GHC.ParStmt pbs _ _) = do+#else+ markAST l (GHC.ParStmt pbs _ _ _) = do+#endif+ -- Within a given parallel list comprehension,one of the sections to be done+ -- in parallel. It is a normal list comprehension, so has a list of+ -- ParStmtBlock, one for each part of the sub- list comprehension+++ ifInContext (Set.singleton Intercalate)+ (++ unsetContext Intercalate $+ markListWithContextsFunction+ (LC (Set.singleton Intercalate) -- only+ Set.empty -- first+ Set.empty -- middle+ (Set.singleton Intercalate) -- last+ ) (markAST l) pbs+ )+ (+ unsetContext Intercalate $+ markListWithContextsFunction+ (LC Set.empty -- only+ (Set.fromList [AddVbar]) -- first+ (Set.fromList [AddVbar]) -- middle+ Set.empty -- last+ ) (markAST l) pbs+ )+ markTrailingSemi++#if __GLASGOW_HASKELL__ <= 710+ markAST _ (GHC.TransStmt form stmts _b using by _ _ _) = do+#else+ markAST _ (GHC.TransStmt form stmts _b using by _ _ _ _) = do+#endif+ setContext (Set.singleton Intercalate) $ mapM_ markLocated stmts+ case form of+ GHC.ThenForm -> do+ mark GHC.AnnThen+ unsetContext Intercalate $ markLocated using+ case by of+ Just b -> do+ mark GHC.AnnBy+ unsetContext Intercalate $ markLocated b+ Nothing -> return ()+ GHC.GroupForm -> do+ mark GHC.AnnThen+ mark GHC.AnnGroup+ case by of+ Just b -> mark GHC.AnnBy >> markLocated b+ Nothing -> return ()+ mark GHC.AnnUsing+ markLocated using+ inContext (Set.singleton AddVbar) $ mark GHC.AnnVbar+ inContext (Set.singleton Intercalate) $ mark GHC.AnnComma+ markTrailingSemi++#if __GLASGOW_HASKELL__ <= 710+ markAST _ (GHC.RecStmt stmts _ _ _ _ _ _ _ _) = do+#else+ markAST _ (GHC.RecStmt stmts _ _ _ _ _ _ _ _ _) = do+#endif+ mark GHC.AnnRec+ markOptional GHC.AnnOpenC+ markInside GHC.AnnSemi+ mapM_ markLocated stmts+ markOptional GHC.AnnCloseC+ inContext (Set.singleton AddVbar) $ mark GHC.AnnVbar+ inContext (Set.singleton Intercalate) $ mark GHC.AnnComma+ markTrailingSemi++-- ---------------------------------------------------------------------++-- Note: We never have a located ParStmtBlock, so have nothing to hang the+-- annotation on. This means there is no pushing of context from the parent ParStmt.+instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.ParStmtBlock name name) where+ markAST _ (GHC.ParStmtBlock stmts _ns _) = do+ markListIntercalate stmts++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.HsLocalBinds name) where+ markAST _ lb = markHsLocalBinds lb++-- ---------------------------------------------------------------------++markHsLocalBinds :: (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => GHC.HsLocalBinds name -> Annotated ()+markHsLocalBinds (GHC.HsValBinds (GHC.ValBindsIn binds sigs)) =+ applyListAnnotationsLayout+ (prepareListAnnotation (GHC.bagToList binds)+ ++ prepareListAnnotation sigs+ )+markHsLocalBinds (GHC.HsValBinds GHC.ValBindsOut {})+ = traceM "warning: ValBindsOut introduced after renaming"++markHsLocalBinds (GHC.HsIPBinds (GHC.IPBinds binds _)) = markListWithLayout (reverse binds)+markHsLocalBinds GHC.EmptyLocalBinds = return ()++-- ---------------------------------------------------------------------++markMatchGroup :: (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name,+ Annotate body)+ => GHC.SrcSpan -> GHC.MatchGroup name (GHC.Located body)+ -> Annotated ()+#if __GLASGOW_HASKELL__ <= 710+markMatchGroup _ (GHC.MG matches _ _ _)+#else+markMatchGroup _ (GHC.MG (GHC.L _ matches) _ _ _)+#endif+ = setContextLevel (Set.singleton AdvanceLine) 2 $ markListWithLayout matches++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name,+ Annotate body)+ => Annotate [GHC.Located (GHC.Match name (GHC.Located body))] where+ markAST _ ls = mapM_ markLocated ls++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.HsExpr name) where+ markAST loc expr = do+ markExpr loc expr+ inContext (Set.singleton AddVbar) $ mark GHC.AnnVbar+ -- TODO: If the AnnComma is not needed, revert to markAST+ inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma+ where+#if __GLASGOW_HASKELL__ <= 710+ markExpr l (GHC.HsVar n) = unsetContext Intercalate $ markAST l n+#else+ markExpr _ (GHC.HsVar n) = unsetContext Intercalate $ do+ ifInContext (Set.singleton PrefixOp)+ (setContext (Set.singleton PrefixOp) $ markLocated n)+ (ifInContext (Set.singleton InfixOp)+ (setContext (Set.singleton InfixOp) $ markLocated n)+ (markLocated n)+ )+#endif++#if __GLASGOW_HASKELL__ <= 710+#else+ markExpr l (GHC.HsRecFld f) = markAST l f++ markExpr l (GHC.HsOverLabel fs)+ = markExternal l GHC.AnnVal ("#" ++ GHC.unpackFS fs)+#endif++ markExpr l (GHC.HsIPVar (GHC.HsIPName v)) =+ markExternal l GHC.AnnVal ("?" ++ GHC.unpackFS v)+ markExpr l (GHC.HsOverLit ov) = markAST l ov+ markExpr l (GHC.HsLit lit) = markAST l lit++#if __GLASGOW_HASKELL__ <= 710+ markExpr _ (GHC.HsLam (GHC.MG [match] _ _ _)) = do+#else+ markExpr _ (GHC.HsLam (GHC.MG (GHC.L _ [match]) _ _ _)) = do+#endif+ setContext (Set.singleton LambdaExpr) $ do+ -- TODO: Change this, HsLam binds do not need obey layout rules.+ -- And will only ever have a single match+ markLocated match+ markExpr _ (GHC.HsLam _) = error $ "HsLam with other than one match"++ markExpr l (GHC.HsLamCase _ match) = do+ mark GHC.AnnLam+ mark GHC.AnnCase+ markOptional GHC.AnnOpenC+ setContext (Set.singleton CaseAlt) $ do+ markMatchGroup l match+ markOptional GHC.AnnCloseC++ markExpr _ (GHC.HsApp e1 e2) = do+ -- markLocated e1+ setContext (Set.singleton PrefixOp) $ markLocated e1+ -- markLocated e2+ setContext (Set.singleton PrefixOp) $ markLocated e2++ markExpr _ (GHC.OpApp e1 e2 _ e3) = do+ let+ isInfix = case e2 of+ -- TODO: generalise this. Is it a fixity thing?+ GHC.L _ (GHC.HsVar _) -> True+ _ -> False++ normal =+ -- When it is the leftmost item in a GRHS, e1 needs to have PrefixOp context+ ifInContext (Set.singleton LeftMost)+ (setContextLevel (Set.fromList [LeftMost,PrefixOp]) 2 $ markLocated e1)+ (markLocated e1)++ if isInfix+ then setContextLevel (Set.singleton PrefixOp) 2 $ markLocated e1+ else normal++ unsetContext PrefixOp $ setContext (Set.singleton InfixOp) $ markLocated e2++ if isInfix+ then setContextLevel (Set.singleton PrefixOp) 2 $ markLocated e3+ else markLocated e3++ markExpr _ (GHC.NegApp e _) = do+ mark GHC.AnnMinus+ markLocated e++ markExpr _ (GHC.HsPar e) = do+ mark GHC.AnnOpenP -- '('+ markLocated e+ mark GHC.AnnCloseP -- ')'++ markExpr _ (GHC.SectionL e1 e2) = do+ markLocated e1+ setContext (Set.singleton InfixOp) $ markLocated e2++ markExpr _ (GHC.SectionR e1 e2) = do+ setContext (Set.singleton InfixOp) $ markLocated e1+ markLocated e2++ markExpr _ (GHC.ExplicitTuple args b) = do+ if b == GHC.Boxed then mark GHC.AnnOpenP+ else markWithString GHC.AnnOpen "(#"++ setContext (Set.singleton PrefixOp) $ markListIntercalateWithFunLevel markLocated 2 args++ if b == GHC.Boxed then mark GHC.AnnCloseP+ else markWithString GHC.AnnClose "#)"+++ markExpr l (GHC.HsCase e1 matches) = setRigidFlag $ do+ mark GHC.AnnCase+ setContextLevel (Set.singleton PrefixOp) 2 $ markLocated e1+ mark GHC.AnnOf+ markOptional GHC.AnnOpenC+ markInside GHC.AnnSemi+ setContext (Set.singleton CaseAlt) $ markMatchGroup l matches+ markOptional GHC.AnnCloseC++ -- We set the layout for HsIf even though it need not obey layout rules as+ -- when moving these expressions it's useful that they maintain "internal+ -- integrity", that is to say the subparts remain indented relative to each+ -- other.+ markExpr _ (GHC.HsIf _ e1 e2 e3) = setLayoutFlag $ do+ -- markExpr _ (GHC.HsIf _ e1 e2 e3) = setRigidFlag $ do+ mark GHC.AnnIf+ markLocated e1+ markOffsetOptional GHC.AnnSemi 0+ mark GHC.AnnThen+ setContextLevel (Set.singleton ListStart) 2 $ markLocated e2+ markOffsetOptional GHC.AnnSemi 1+ mark GHC.AnnElse+ setContextLevel (Set.singleton ListStart) 2 $ markLocated e3++ markExpr _ (GHC.HsMultiIf _ rhs) = do+ mark GHC.AnnIf+ markOptional GHC.AnnOpenC+ setContext (Set.singleton CaseAlt) $ do+ -- mapM_ markLocated rhs+ markListWithLayout rhs+ markOptional GHC.AnnCloseC++#if __GLASGOW_HASKELL__ <= 710+ markExpr _ (GHC.HsLet binds e) = do+#else+ markExpr _ (GHC.HsLet (GHC.L _ binds) e) = do+#endif+ setLayoutFlag (do -- Make sure the 'in' gets indented too+ mark GHC.AnnLet+ markOptional GHC.AnnOpenC+ markInside GHC.AnnSemi+ markLocalBindsWithLayout binds+ markOptional GHC.AnnCloseC+ mark GHC.AnnIn+ markLocated e)++ -- -------------------------------++#if __GLASGOW_HASKELL__ <= 710+ markExpr _ (GHC.HsDo cts es _) = do+#else+ markExpr _ (GHC.HsDo cts (GHC.L _ es) _) = do+#endif+ case cts of+ GHC.DoExpr -> mark GHC.AnnDo+ GHC.MDoExpr -> mark GHC.AnnMdo+ _ -> return ()+ let (ostr,cstr) =+ if isListComp cts+ then case cts of+ GHC.PArrComp -> ("[:",":]")+ _ -> ("[", "]")+ else ("{","}")++ when (isListComp cts) $ markWithString GHC.AnnOpen ostr+ markOptional GHC.AnnOpenS+ markOptional GHC.AnnOpenC+ markInside GHC.AnnSemi+ if isListComp cts+ then do+ markLocated (last es)+ mark GHC.AnnVbar+ setLayoutFlag (markListIntercalate (init es))+ else do+ markListWithLayout es+ markOptional GHC.AnnCloseS+ markOptional GHC.AnnCloseC+ when (isListComp cts) $ markWithString GHC.AnnClose cstr++ -- -------------------------------++ markExpr _ (GHC.ExplicitList _ _ es) = do+ mark GHC.AnnOpenS+ setContext (Set.singleton PrefixOp) $ markListIntercalateWithFunLevel markLocated 2 es+ mark GHC.AnnCloseS++ markExpr _ (GHC.ExplicitPArr _ es) = do+ markWithString GHC.AnnOpen "[:"+ mapM_ markLocated es+ markWithString GHC.AnnClose ":]"++#if __GLASGOW_HASKELL__ <= 710+ markExpr _ (GHC.RecordCon n _ (GHC.HsRecFields fs dd)) = do+#else+ markExpr _ (GHC.RecordCon n _ _ (GHC.HsRecFields fs dd)) = do+#endif+ markLocated n+ mark GHC.AnnOpenC+ case dd of+ Nothing -> markListIntercalate fs+ Just _ -> do+ setContext (Set.singleton Intercalate) $ mapM_ markLocated fs+ mark GHC.AnnDotdot+ mark GHC.AnnCloseC++#if __GLASGOW_HASKELL__ <= 710+ markExpr _ (GHC.RecordUpd e (GHC.HsRecFields fs _) _cons _ _) = do+#else+ markExpr _ (GHC.RecordUpd e fs _cons _ _ _) = do+#endif+ markLocated e+ mark GHC.AnnOpenC+ markListIntercalate fs+ mark GHC.AnnCloseC++#if __GLASGOW_HASKELL__ <= 710+ markExpr _ (GHC.ExprWithTySig e typ _) = do+#else+ markExpr _ (GHC.ExprWithTySig e typ) = do+#endif+ setContextLevel (Set.singleton PrefixOp) 2 $ markLocated e+ mark GHC.AnnDcolon+#if __GLASGOW_HASKELL__ <= 710+ markLocated typ+#else+ markLHsSigWcType typ+#endif++ markExpr _ (GHC.ExprWithTySigOut e typ) = do+ markLocated e+ mark GHC.AnnDcolon+#if __GLASGOW_HASKELL__ <= 710+ markLocated typ+#else+ markLHsSigWcType typ+#endif++ markExpr _ (GHC.ArithSeq _ _ seqInfo) = do+ mark GHC.AnnOpenS -- '['+ case seqInfo of+ GHC.From e -> do+ markLocated e+ mark GHC.AnnDotdot+ GHC.FromTo e1 e2 -> do+ markLocated e1+ mark GHC.AnnDotdot+ markLocated e2+ GHC.FromThen e1 e2 -> do+ markLocated e1+ mark GHC.AnnComma+ markLocated e2+ mark GHC.AnnDotdot+ GHC.FromThenTo e1 e2 e3 -> do+ markLocated e1+ mark GHC.AnnComma+ markLocated e2+ mark GHC.AnnDotdot+ markLocated e3+ mark GHC.AnnCloseS -- ']'++ markExpr _ (GHC.PArrSeq _ seqInfo) = do+ markWithString GHC.AnnOpen "[:" -- '[:'+ case seqInfo of+ GHC.From e -> do+ markLocated e+ mark GHC.AnnDotdot+ GHC.FromTo e1 e2 -> do+ markLocated e1+ mark GHC.AnnDotdot+ markLocated e2+ GHC.FromThen e1 e2 -> do+ markLocated e1+ mark GHC.AnnComma+ markLocated e2+ mark GHC.AnnDotdot+ GHC.FromThenTo e1 e2 e3 -> do+ markLocated e1+ mark GHC.AnnComma+ markLocated e2+ mark GHC.AnnDotdot+ markLocated e3+ markWithString GHC.AnnClose ":]" -- ':]'++ markExpr _ (GHC.HsSCC src csFStr e) = do+ markWithString GHC.AnnOpen src -- "{-# SCC"+#if __GLASGOW_HASKELL__ <= 710+ markWithStringOptional GHC.AnnVal (GHC.unpackFS csFStr)+ markWithString GHC.AnnValStr ("\"" ++ GHC.unpackFS csFStr ++ "\"")+#else+ markWithStringOptional GHC.AnnVal (GHC.sl_st csFStr)+ markWithString GHC.AnnValStr (GHC.sl_st csFStr)+#endif+ markWithString GHC.AnnClose "#-}"+ markLocated e++ markExpr _ (GHC.HsCoreAnn src csFStr e) = do+ markWithString GHC.AnnOpen src -- "{-# CORE"+#if __GLASGOW_HASKELL__ <= 710+ markWithString GHC.AnnVal ("\"" ++ GHC.unpackFS csFStr ++ "\"")+#else+ markWithString GHC.AnnVal (GHC.sl_st csFStr)+#endif+ markWithString GHC.AnnClose "#-}"+ markLocated e+ -- TODO: make monomorphic+ markExpr l (GHC.HsBracket (GHC.VarBr True v)) = do+ mark GHC.AnnSimpleQuote+ setContext (Set.singleton PrefixOpDollar) $ markLocatedFromKw GHC.AnnName (GHC.L l v)+ markExpr l (GHC.HsBracket (GHC.VarBr False v)) = do+ mark GHC.AnnThTyQuote+ markLocatedFromKw GHC.AnnName (GHC.L l v)+ markExpr _ (GHC.HsBracket (GHC.DecBrL ds)) = do+ markWithString GHC.AnnOpen "[d|"+ markOptional GHC.AnnOpenC+ setContext (Set.singleton NoAdvanceLine)+ $ setContextLevel (Set.singleton TopLevel) 2 $ markListWithLayout ds+ markOptional GHC.AnnCloseC+ markWithString GHC.AnnClose "|]"+ -- Introduced after the renamer+ markExpr _ (GHC.HsBracket (GHC.DecBrG _)) =+ traceM "warning: DecBrG introduced after renamer"+ markExpr _l (GHC.HsBracket (GHC.ExpBr e)) = do+#if __GLASGOW_HASKELL__ <= 710+ -- This exists like this as the lexer collapses [e| and [| into the+ -- same construtor+ workOutString _l GHC.AnnOpen+ (\ss -> if spanLength ss == 2+ then "[|"+ else "[e|")+#else+ markWithString GHC.AnnOpen "[|"+ markOptional GHC.AnnOpenE -- "[e|"+#endif+ markLocated e+ markWithString GHC.AnnClose "|]"+ markExpr _l (GHC.HsBracket (GHC.TExpBr e)) = do+#if __GLASGOW_HASKELL__ <= 710+ -- This exists like this as the lexer collapses [e|| and [|| into the+ -- same construtor+ workOutString _l GHC.AnnOpen+ (\ss -> if spanLength ss == 3+ then "[||"+ else "[e||")+#else+ markWithString GHC.AnnOpen "[||"+ markWithStringOptional GHC.AnnOpenE "[e||"+#endif+ markLocated e+ markWithString GHC.AnnClose "||]"+ markExpr _ (GHC.HsBracket (GHC.TypBr e)) = do+ markWithString GHC.AnnOpen "[t|"+ markLocated e+ markWithString GHC.AnnClose "|]"+ markExpr _ (GHC.HsBracket (GHC.PatBr e)) = do+ markWithString GHC.AnnOpen "[p|"+ markLocated e+ markWithString GHC.AnnClose "|]"++ markExpr _ (GHC.HsRnBracketOut _ _) =+ traceM "warning: HsRnBracketOut introduced after renamer"+ markExpr _ (GHC.HsTcBracketOut _ _) =+ traceM "warning: HsTcBracketOut introduced after renamer"++#if __GLASGOW_HASKELL__ > 710+ markExpr l (GHC.HsSpliceE e) = do+ markOptional GHC.AnnOpenPE+ markAST l e+ markOptional GHC.AnnCloseP+#else+ markExpr _ (GHC.HsSpliceE isTyped e) = do+ case e of+ GHC.HsSplice _n b@(GHC.L _ (GHC.HsVar n)) -> do+ if isTyped+ then do+ mark GHC.AnnOpenPTE+ markWithStringOptional GHC.AnnThIdTySplice ("$$" ++ (GHC.occNameString (GHC.occName n)))+ else do+ mark GHC.AnnOpenPE+ markWithStringOptional GHC.AnnThIdSplice ("$" ++ (GHC.occNameString (GHC.occName n)))+ markLocated b+ mark GHC.AnnCloseP+ GHC.HsSplice _n b -> do+ if isTyped+ then do+ markOptional GHC.AnnThIdSplice+ mark GHC.AnnOpenPTE+ else mark GHC.AnnOpenPE+ markLocated b+ mark GHC.AnnCloseP++ markExpr l (GHC.HsQuasiQuoteE e) = do+ markAST l e+#endif++ markExpr _ (GHC.HsProc p c) = do+ mark GHC.AnnProc+ markLocated p+ mark GHC.AnnRarrow+ markLocated c++ markExpr _ (GHC.HsStatic e) = do+ mark GHC.AnnStatic+ markLocated e++ markExpr _ (GHC.HsArrApp e1 e2 _ o isRightToLeft) = do+ -- isRightToLeft True => right-to-left (f -< arg)+ -- False => left-to-right (arg >- f)+ if isRightToLeft+ then do+ markLocated e1+ case o of+ GHC.HsFirstOrderApp -> mark GHC.Annlarrowtail+ GHC.HsHigherOrderApp -> mark GHC.AnnLarrowtail+ else do+ markLocated e2+ case o of+ GHC.HsFirstOrderApp -> mark GHC.Annrarrowtail+ GHC.HsHigherOrderApp -> mark GHC.AnnRarrowtail++ if isRightToLeft+ then markLocated e2+ else markLocated e1++ markExpr _ (GHC.HsArrForm e _ cs) = do+ markWithString GHC.AnnOpen "(|"+ markLocated e+ mapM_ markLocated cs+ markWithString GHC.AnnClose "|)"++ markExpr _ (GHC.HsTick _ _) = return ()+ markExpr _ (GHC.HsBinTick _ _ _) = return ()++#if __GLASGOW_HASKELL__ <= 710+ markExpr _ (GHC.HsTickPragma src (str,(v1,v2),(v3,v4)) e) = do+ -- '{-# GENERATED' STRING INTEGER ':' INTEGER '-' INTEGER ':' INTEGER '#-}'+ markWithString GHC.AnnOpen src+ markOffsetWithString GHC.AnnVal 0 (show (GHC.unpackFS str)) -- STRING+ markOffsetWithString GHC.AnnVal 1 (show v1) -- INTEGER+ markOffset GHC.AnnColon 0 -- ':'+ markOffsetWithString GHC.AnnVal 2 (show v2) -- INTEGER+ mark GHC.AnnMinus -- '-'+ markOffsetWithString GHC.AnnVal 3 (show v3) -- INTEGER+ markOffset GHC.AnnColon 1 -- ':'+ markOffsetWithString GHC.AnnVal 4 (show v4) -- INTEGER+ markWithString GHC.AnnClose "#-}"+ markLocated e+#else+ markExpr _ (GHC.HsTickPragma src (str,_,_) ((v1,v2),(v3,v4)) e) = do+ -- '{-# GENERATED' STRING INTEGER ':' INTEGER '-' INTEGER ':' INTEGER '#-}'+ markWithString GHC.AnnOpen src+ markOffsetWithString GHC.AnnVal 0 (GHC.sl_st str) -- STRING+ markOffsetWithString GHC.AnnVal 1 v1 -- INTEGER+ markOffset GHC.AnnColon 0 -- ':'+ markOffsetWithString GHC.AnnVal 2 v2 -- INTEGER+ mark GHC.AnnMinus -- '-'+ markOffsetWithString GHC.AnnVal 3 v3 -- INTEGER+ markOffset GHC.AnnColon 1 -- ':'+ markOffsetWithString GHC.AnnVal 4 v4 -- INTEGER+ markWithString GHC.AnnClose "#-}"+ markLocated e+#endif++ markExpr l GHC.EWildPat = do+ markExternal l GHC.AnnVal "_"++ markExpr _ (GHC.EAsPat ln e) = do+ markLocated ln+ mark GHC.AnnAt+ markLocated e++ markExpr _ (GHC.EViewPat e1 e2) = do+ markLocated e1+ mark GHC.AnnRarrow+ markLocated e2++ markExpr _ (GHC.ELazyPat e) = do+ mark GHC.AnnTilde+ markLocated e++#if __GLASGOW_HASKELL__ <= 710+ markExpr _ (GHC.HsType ty) = markLocated ty+#else+ markExpr _ (GHC.HsAppType e ty) = do+ markLocated e+ mark GHC.AnnAt+ markLHsWcType ty+ markExpr _ (GHC.HsAppTypeOut _ _) =+ traceM "warning: HsAppTypeOut introduced after renaming"+#endif++ markExpr _ (GHC.HsWrap _ _) =+ traceM "warning: HsWrap introduced after renaming"+ markExpr _ (GHC.HsUnboundVar _) =+ traceM "warning: HsUnboundVar introduced after renaming"+++-- ---------------------------------------------------------------------+#if __GLASGOW_HASKELL__ > 710+markLHsWcType :: (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => GHC.LHsWcType name -> Annotated ()+markLHsWcType (GHC.HsWC _ mwc ty) = do+ case mwc of+ Nothing -> markLocated ty+ Just lwc -> do+ -- let sorted = lexicalSortLocated (GHC.L lwc GHC.HsWildCardTy:[ty])+ -- markLocated (GHC.L lc sorted)+ applyListAnnotations ([(lwc,markExternal lwc GHC.AnnVal "_")]+ ++ prepareListAnnotation [ty]+ )+#endif+-- ---------------------------------------------------------------------++instance Annotate GHC.HsLit where+ markAST l lit = markExternal l GHC.AnnVal (hsLit2String lit)++-- ---------------------------------------------------------------------+#if __GLASGOW_HASKELL__ > 710+instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.HsRecUpdField name) where+ markAST _ (GHC.HsRecField lbl expr punFlag) = do+ unsetContext Intercalate $ markLocated lbl+ when (punFlag == False) $ do+ mark GHC.AnnEqual+ unsetContext Intercalate $ markLocated expr+ inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma+{-+type HsRecUpdField id = HsRecField' (AmbiguousFieldOcc id) (LHsExpr id)++-- | - 'ApiAnnotation.AnnKeywordId' : 'ApiAnnotation.AnnEqual',+--+-- For details on above see note [Api annotations] in ApiAnnotation+data HsRecField' id arg = HsRecField {+ hsRecFieldLbl :: Located id,+ hsRecFieldArg :: arg, -- ^ Filled in by renamer when punning+ hsRecPun :: Bool -- ^ Note [Punning]+ } deriving (Data, Typeable)++-}++instance (GHC.DataId name)+ => Annotate (GHC.AmbiguousFieldOcc name) where+ markAST _ (GHC.Unambiguous n _) = markLocated n+ markAST _ (GHC.Ambiguous n _) = markLocated n+#endif+-- ---------------------------------------------------------------------++-- |Used for declarations that need to be aligned together, e.g. in a+-- do or let .. in statement/expr+instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate [GHC.ExprLStmt name] where+ markAST _ ls = mapM_ markLocated ls++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.HsTupArg name) where+ markAST _ (GHC.Present (GHC.L l e)) = do+ markLocated (GHC.L l e)+ inContext (Set.fromList [Intercalate]) $ markOutside GHC.AnnComma (G GHC.AnnComma)++ markAST _ (GHC.Missing _) = do+ inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.HsCmdTop name) where+ markAST _ (GHC.HsCmdTop cmd _ _ _) = markLocated cmd++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.HsCmd name) where+ markAST _ (GHC.HsCmdArrApp e1 e2 _ o isRightToLeft) = do+ -- isRightToLeft True => right-to-left (f -< arg)+ -- False => left-to-right (arg >- f)+ if isRightToLeft+ then do+ markLocated e1+ case o of+ GHC.HsFirstOrderApp -> mark GHC.Annlarrowtail+ GHC.HsHigherOrderApp -> mark GHC.AnnLarrowtail+ else do+ markLocated e2+ case o of+ GHC.HsFirstOrderApp -> mark GHC.Annrarrowtail+ GHC.HsHigherOrderApp -> mark GHC.AnnRarrowtail++ if isRightToLeft+ then markLocated e2+ else markLocated e1++ markAST _ (GHC.HsCmdArrForm e _mf cs) = do+ -- The AnnOpen should be marked for a prefix usage, not for a postfix one,+ -- due to the way checkCmd maps both HsArrForm and OpApp to HsCmdArrForm++ -- TODO: This test assumes no auto-generated SrcSpans+ let isPrefixOp = case cs of+ [] -> True+ (GHC.L h _:_) -> GHC.getLoc e < h+ when isPrefixOp $ markWithString GHC.AnnOpen "(|"+ -- This may be an infix operation+ applyListAnnotationsContexts (LC (Set.singleton PrefixOp) (Set.singleton PrefixOp)+ (Set.singleton InfixOp) (Set.singleton InfixOp))+ (prepareListAnnotation [e]+ ++ prepareListAnnotation cs)+ when isPrefixOp $ markWithString GHC.AnnClose "|)"++ markAST _ (GHC.HsCmdApp e1 e2) = do+ markLocated e1+ markLocated e2++ markAST l (GHC.HsCmdLam match) = do+ setContext (Set.singleton LambdaExpr) $ do markMatchGroup l match++ markAST _ (GHC.HsCmdPar e) = do+ mark GHC.AnnOpenP+ markLocated e+ mark GHC.AnnCloseP -- ')'++ markAST l (GHC.HsCmdCase e1 matches) = do+ mark GHC.AnnCase+ markLocated e1+ mark GHC.AnnOf+ markOptional GHC.AnnOpenC+ setContext (Set.singleton CaseAlt) $ do+ markMatchGroup l matches+ markOptional GHC.AnnCloseC++ markAST _ (GHC.HsCmdIf _ e1 e2 e3) = do+ mark GHC.AnnIf+ markLocated e1+ markOffset GHC.AnnSemi 0+ mark GHC.AnnThen+ markLocated e2+ markOffset GHC.AnnSemi 1+ mark GHC.AnnElse+ markLocated e3++#if __GLASGOW_HASKELL__ <= 710+ markAST _ (GHC.HsCmdLet binds e) = do+#else+ markAST _ (GHC.HsCmdLet (GHC.L _ binds) e) = do+#endif+ mark GHC.AnnLet+ markOptional GHC.AnnOpenC+ markLocalBindsWithLayout binds+ markOptional GHC.AnnCloseC+ mark GHC.AnnIn+ markLocated e++#if __GLASGOW_HASKELL__ <= 710+ markAST _ (GHC.HsCmdDo es _) = do+#else+ markAST _ (GHC.HsCmdDo (GHC.L _ es) _) = do+#endif+ mark GHC.AnnDo+ markOptional GHC.AnnOpenC+ markListWithLayout es+ markOptional GHC.AnnCloseC++#if __GLASGOW_HASKELL__ <= 710+ markAST _ GHC.HsCmdCast {} =+ traceM "warning: HsCmdCast introduced after renaming"+#endif++#if __GLASGOW_HASKELL__ > 710+ markAST _ (GHC.HsCmdWrap {}) =+ traceM "warning: HsCmdWrap introduced after renaming"+{-+ | HsCmdWrap HsWrapper+ (HsCmd id) -- If cmd :: arg1 --> res+ -- wrap :: arg1 "->" arg2+ -- Then (HsCmdWrap wrap cmd) :: arg2 --> res+-}+#endif++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate [GHC.Located (GHC.StmtLR name name (GHC.LHsCmd name))] where+ markAST _ ls = mapM_ markLocated ls++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (GHC.TyClDecl name) where++ markAST l (GHC.FamDecl famdecl) = markAST l famdecl >> markTrailingSemi++#if __GLASGOW_HASKELL__ <= 710+ markAST _ (GHC.SynDecl ln (GHC.HsQTvs _ tyvars) typ _) = do+#else+ markAST _ (GHC.SynDecl ln (GHC.HsQTvs _ tyvars _) typ _) = do+#endif+ -- There may be arbitrary parens around parts of the constructor that are+ -- infix.+ -- Turn these into comments so that they feed into the right place automatically+ -- annotationsToComments [GHC.AnnOpenP,GHC.AnnCloseP]+ mark GHC.AnnType++ markTyClass ln tyvars+ mark GHC.AnnEqual+ markLocated typ+ markTrailingSemi++#if __GLASGOW_HASKELL__ <= 710+ markAST _ (GHC.DataDecl ln (GHC.HsQTvs _ns tyVars)+ (GHC.HsDataDefn nd ctx mctyp mk cons mderivs) _) = do+#else+ markAST _ (GHC.DataDecl ln (GHC.HsQTvs _ns tyVars _)+ (GHC.HsDataDefn nd ctx mctyp mk cons mderivs) _ _) = do+#endif+ if nd == GHC.DataType+ then mark GHC.AnnData+ else mark GHC.AnnNewtype+ markMaybe mctyp+ if null (GHC.unLoc ctx)+ then markOptional GHC.AnnDarrow+ else markLocated ctx+ markTyClass ln tyVars+ case mk of+ Nothing -> return ()+ Just k -> do+ mark GHC.AnnDcolon+ markLocated k+ if isGadt cons+ then mark GHC.AnnWhere+ else unless (null cons) $ mark GHC.AnnEqual+ markOptional GHC.AnnWhere+ markOptional GHC.AnnOpenC+ setLayoutFlag $ setContext (Set.singleton NoPrecedingSpace)+ $ markListWithContexts' listContexts cons+ markOptional GHC.AnnCloseC+ setContext (Set.fromList [Deriving,NoDarrow]) $ markMaybe mderivs+ markTrailingSemi++ -- -----------------------------------++#if __GLASGOW_HASKELL__ <= 710+ markAST _ (GHC.ClassDecl ctx ln (GHC.HsQTvs _ns tyVars) fds+ sigs meths ats atdefs docs _) = do+#else+ markAST _ (GHC.ClassDecl ctx ln (GHC.HsQTvs _ns tyVars _) fds+ sigs meths ats atdefs docs _) = do+#endif+ mark GHC.AnnClass+ unless (null $ GHC.unLoc ctx) $ markLocated ctx++ markTyClass ln tyVars++ unless (null fds) $ do+ mark GHC.AnnVbar+ markListIntercalateWithFunLevel markLocated 2 fds+ mark GHC.AnnWhere+ markOptional GHC.AnnOpenC -- '{'+ markInside GHC.AnnSemi+ -- AZ:TODO: we end up with both the tyVars and the following body of the+ -- class defn in annSortKey for the class. This could cause problems when+ -- changing things.+ setContext (Set.singleton InClassDecl) $+ applyListAnnotationsLayout+ (prepareListAnnotation sigs+ ++ prepareListAnnotation (GHC.bagToList meths)+ ++ prepareListAnnotation ats+ ++ prepareListAnnotation atdefs+ ++ prepareListAnnotation docs+ )+ markOptional GHC.AnnCloseC -- '}'+ markTrailingSemi++-- ---------------------------------------------------------------------++markTyClass :: (Annotate a, Annotate ast,GHC.HasOccName a)+ => GHC.Located a -> [GHC.Located ast] -> Annotated ()+markTyClass ln tyVars = do+ markManyOptional GHC.AnnOpenP++ let+ parensNeeded = GHC.isSymOcc (GHC.occName $ GHC.unLoc ln) && length tyVars > 2+ lnFun = do+ ifInContext (Set.singleton CtxMiddle)+ (setContext (Set.singleton InfixOp) $ markLocated ln)+ (markLocated ln)+ listFun b = do+ if parensNeeded+ then ifInContext (Set.singleton (CtxPos 0))+ (markMany GHC.AnnOpenP)+ (return ())+ else ifInContext (Set.singleton (CtxPos 0))+ (markManyOptional GHC.AnnOpenP)+ (return ())++ markLocated b++ if parensNeeded+ then ifInContext (Set.singleton (CtxPos 2))+ (markMany GHC.AnnCloseP)+ (return ())+ else ifInContext (Set.singleton (CtxPos 2))+ (markManyOptional GHC.AnnCloseP)+ (return ())++ prepareListFun ls = map (\b -> (GHC.getLoc b, listFun b )) ls++ unsetContext CtxMiddle $+ applyListAnnotationsContexts (LC (Set.fromList [CtxOnly,PrefixOp]) (Set.fromList [CtxFirst,PrefixOp])+ (Set.singleton CtxMiddle) (Set.singleton CtxLast))+ ([(GHC.getLoc ln,lnFun)]+ ++ prepareListFun tyVars)+ markManyOptional GHC.AnnCloseP++-- ---------------------------------------------------------------------++instance (GHC.DataId name,Annotate name, GHC.OutputableBndr name,GHC.HasOccName name)+ => Annotate (GHC.FamilyDecl name) where+#if __GLASGOW_HASKELL__ <= 710+ markAST _ (GHC.FamilyDecl info ln (GHC.HsQTvs _ tyvars) mkind) = do+#else+ markAST _ (GHC.FamilyDecl info ln (GHC.HsQTvs _ tyvars _) rsig minj) = do+{-+data FamilyDecl name = FamilyDecl+ { fdInfo :: FamilyInfo name -- type/data, closed/open+ , fdLName :: Located name -- type constructor+ , fdTyVars :: LHsQTyVars name -- type variables+ , fdResultSig :: LFamilyResultSig name -- result signature+ , fdInjectivityAnn :: Maybe (LInjectivityAnn name) -- optional injectivity ann+ }+-}+#endif+ case info of+ GHC.DataFamily -> mark GHC.AnnData+ _ -> mark GHC.AnnType++#if __GLASGOW_HASKELL__ <= 710+ mark GHC.AnnFamily+#else+ -- ifInContext (Set.singleton InClassDecl) (return ()) (mark GHC.AnnFamily)+ mark GHC.AnnFamily+#endif++ markTyClass ln tyvars+#if __GLASGOW_HASKELL__ <= 710+ case mkind of+ Nothing -> return ()+ Just k -> do+ mark GHC.AnnDcolon+ markLocated k+#else+ case GHC.unLoc rsig of+ GHC.NoSig -> return ()+ GHC.KindSig _ -> do+ mark GHC.AnnDcolon+ markLocated rsig+ GHC.TyVarSig _ -> do+ mark GHC.AnnEqual+ markLocated rsig+ case minj of+ Nothing -> return ()+ Just inj -> do+ mark GHC.AnnVbar+ markLocated inj+#endif+ case info of+#if __GLASGOW_HASKELL__ > 710+ GHC.ClosedTypeFamily (Just eqns) -> do+ mark GHC.AnnWhere+ markOptional GHC.AnnOpenC -- {+ markListWithLayout eqns+ markOptional GHC.AnnCloseC -- }+ GHC.ClosedTypeFamily Nothing -> do+ mark GHC.AnnWhere+ mark GHC.AnnOpenC -- {+ mark GHC.AnnDotdot+ mark GHC.AnnCloseC -- }+#else+ GHC.ClosedTypeFamily eqns -> do+ mark GHC.AnnWhere+ markOptional GHC.AnnOpenC -- {+ markListWithLayout eqns+ markOptional GHC.AnnCloseC -- }+#endif+ _ -> return ()+ markTrailingSemi++-- ---------------------------------------------------------------------++#if __GLASGOW_HASKELL__ <= 710+#else+instance (GHC.DataId name,Annotate name,GHC.OutputableBndr name,GHC.HasOccName name)+ => Annotate (GHC.FamilyResultSig name) where+ markAST _ (GHC.NoSig) = return ()+ markAST _ (GHC.KindSig k) = markLocated k+ markAST _ (GHC.TyVarSig ltv) = markLocated ltv+#endif++-- ---------------------------------------------------------------------++#if __GLASGOW_HASKELL__ > 710+instance (GHC.DataId name,Annotate name)+ => Annotate (GHC.InjectivityAnn name) where+ markAST _ (GHC.InjectivityAnn ln lns) = do+ markLocated ln+ mark GHC.AnnRarrow+ mapM_ markLocated lns+#endif++-- ---------------------------------------------------------------------++instance (GHC.DataId name,Annotate name,GHC.OutputableBndr name,GHC.HasOccName name)+ => Annotate (GHC.TyFamInstEqn name) where+#if __GLASGOW_HASKELL__ <= 710+ markAST _ (GHC.TyFamEqn ln (GHC.HsWB pats _ _ _) typ) = do+#else+ markAST _ (GHC.TyFamEqn ln (GHC.HsIB _ pats) typ) = do+#endif+ markTyClass ln pats+ -- let+ -- fun = ifInContext (Set.singleton (CtxPos 0))+ -- (setContext (Set.singleton PrefixOp) $ markLocated ln)+ -- (markLocated ln)+ -- markOptional GHC.AnnOpenP+ -- applyListAnnotationsContexts (LC Set.empty Set.empty Set.empty Set.empty)+ -- ([(GHC.getLoc ln, fun)]+ -- ++ prepareListAnnotationWithContext (Set.singleton PrefixOp) pats)+ -- markOptional GHC.AnnCloseP+ mark GHC.AnnEqual+ markLocated typ++-- ---------------------------------------------------------------------++instance (GHC.DataId name,Annotate name,GHC.OutputableBndr name,GHC.HasOccName name)+ => Annotate (GHC.TyFamDefltEqn name) where+#if __GLASGOW_HASKELL__ <= 710+ markAST _ (GHC.TyFamEqn ln (GHC.HsQTvs _ns bndrs) typ) = do+#else+ markAST _ (GHC.TyFamEqn ln (GHC.HsQTvs _ns bndrs _) typ) = do+#endif+ mark GHC.AnnType+ mark GHC.AnnInstance+ applyListAnnotations (prepareListAnnotation [ln]+ ++ prepareListAnnotation bndrs+ )+ mark GHC.AnnEqual+ markLocated typ++-- ---------------------------------------------------------------------++-- TODO: modify lexer etc, in the meantime to not set haddock flag+instance Annotate GHC.DocDecl where+ markAST l v =+ let str =+ case v of+ (GHC.DocCommentNext (GHC.HsDocString fs)) -> GHC.unpackFS fs+ (GHC.DocCommentPrev (GHC.HsDocString fs)) -> GHC.unpackFS fs+ (GHC.DocCommentNamed _s (GHC.HsDocString fs)) -> GHC.unpackFS fs+ (GHC.DocGroup _i (GHC.HsDocString fs)) -> GHC.unpackFS fs+ in+ markExternal l GHC.AnnVal str >> markTrailingSemi++-- ---------------------------------------------------------------------++markDataDefn :: (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => GHC.SrcSpan -> GHC.HsDataDefn name -> Annotated ()+markDataDefn _ (GHC.HsDataDefn _ ctx typ _mk cons mderivs) = do+ markLocated ctx+ markMaybe typ+#if __GLASGOW_HASKELL__ <= 710+ markMaybe _mk+#endif+ if isGadt cons+ then markListWithLayout cons+ else markListIntercalateWithFunLevel markLocated 2 cons+ case mderivs of+ Nothing -> return ()+ Just d -> setContext (Set.singleton Deriving) $ markLocated d++-- ---------------------------------------------------------------------++-- Note: GHC.HsContext name aliases to here too+instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate [GHC.LHsType name] where+ markAST l ts = do+#if __GLASGOW_HASKELL__ <= 710+ inContext (Set.singleton Deriving) $ mark GHC.AnnDeriving+#endif+ -- Mote: A single item in parens in a deriving clause is parsed as a+ -- HsSigType, which is always a HsForAllTy. Without parens it is always a+ -- HsVar. So for round trip pretty printing we need to take this into+ -- account.+ let+ parenIfNeeded' pa =+ case ts of+ [] -> if l == GHC.noSrcSpan+ then markManyOptional pa+ else markMany pa+ [GHC.L _ GHC.HsForAllTy{}] -> markMany pa+ [_] -> markManyOptional pa+ _ -> markMany pa++ parenIfNeeded'' pa =+ ifInContext (Set.singleton Parens)+ (markMany pa)+ (parenIfNeeded' pa)++ parenIfNeeded pa =+ case ts of+ [GHC.L _ GHC.HsParTy{}] -> markOptional pa+ _ -> parenIfNeeded'' pa++ -- -------------++ parenIfNeeded GHC.AnnOpenP++ unsetContext Intercalate $ markListIntercalateWithFunLevel markLocated 2 ts++ parenIfNeeded GHC.AnnCloseP++ ifInContext (Set.singleton NoDarrow)+ (return ())+ (if null ts && (l == GHC.noSrcSpan)+ then markOptional GHC.AnnDarrow+ else mark GHC.AnnDarrow)++-- ---------------------------------------------------------------------++instance (GHC.DataId name,Annotate name,GHC.OutputableBndr name,GHC.HasOccName name)+ => Annotate (GHC.ConDecl name) where+#if __GLASGOW_HASKELL__ <= 710+ markAST _ (GHC.ConDecl lns _expr (GHC.HsQTvs _ns bndrs) ctx+ dets res _ depc_syntax) = do+ case res of+ GHC.ResTyH98 -> do++ unless (null bndrs) $ do+ mark GHC.AnnForall+ mapM_ markLocated bndrs+ mark GHC.AnnDot++ unless (null $ GHC.unLoc ctx) $ do+ setContext (Set.fromList [NoDarrow]) $ markLocated ctx+ mark GHC.AnnDarrow+ case dets of+ GHC.InfixCon _ _ -> return ()+ _ -> setContext (Set.singleton PrefixOp) $ markListIntercalate lns++ markHsConDeclDetails False False lns dets++ GHC.ResTyGADT ls ty -> do+ -- only print names if not infix+ case dets of+ GHC.InfixCon _ _ -> return ()+ _ -> markListIntercalate lns++ if depc_syntax+ then do+ markHsConDeclDetails True False lns dets+ mark GHC.AnnCloseC+ mark GHC.AnnDcolon+ markManyOptional GHC.AnnOpenP++ else do+ mark GHC.AnnDcolon+ markLocated (GHC.L ls (ResTyGADTHook bndrs))+ markManyOptional GHC.AnnOpenP+ unless (null $ GHC.unLoc ctx) $ do+ markLocated ctx+ markHsConDeclDetails False True lns dets++ markLocated ty++ markManyOptional GHC.AnnCloseP+++ case res of+ GHC.ResTyH98 -> inContext (Set.fromList [Intercalate]) $ mark GHC.AnnVbar+ _ -> return ()+ markTrailingSemi+#else+ markAST _ (GHC.ConDeclH98 ln mqtvs mctx+ dets _ ) = do+{-+ | ConDeclH98+ { con_name :: Located name++ , con_qvars :: Maybe (LHsQTyVars name)+ -- User-written forall (if any), and its implicit+ -- kind variables+ -- Non-Nothing needs -XExistentialQuantification+ -- e.g. data T a = forall b. MkT b (b->a)+ -- con_qvars = {b}++ , con_cxt :: Maybe (LHsContext name)+ -- ^ User-written context (if any)++ , con_details :: HsConDeclDetails name+ -- ^ Arguments++ , con_doc :: Maybe LHsDocString+ -- ^ A possible Haddock comment.++-}+ case mqtvs of+ Nothing -> return ()+ Just (GHC.HsQTvs _ns bndrs _) -> do+ mark GHC.AnnForall+ mapM_ markLocated bndrs+ mark GHC.AnnDot++ case mctx of+ Just ctx -> do+ setContext (Set.fromList [NoDarrow]) $ markLocated ctx+ unless (null $ GHC.unLoc ctx) $ mark GHC.AnnDarrow+ Nothing -> return ()++ case dets of+ GHC.InfixCon _ _ -> return ()+ _ -> setContext (Set.singleton PrefixOp) $ markLocated ln++ markHsConDeclDetails False False [ln] dets++ inContext (Set.fromList [Intercalate]) $ mark GHC.AnnVbar+ markTrailingSemi+ markAST _ (GHC.ConDeclGADT lns (GHC.HsIB _ typ) _) = do+ setContext (Set.singleton PrefixOp) $ markListIntercalate lns+ mark GHC.AnnDcolon+ markLocated typ+ markTrailingSemi+#endif++-- ResTyGADT has a SrcSpan for the original sigtype, we need to create+-- a type for exactPC and annotatePC+data ResTyGADTHook name = ResTyGADTHook [GHC.LHsTyVarBndr name]+ deriving (Typeable)+deriving instance (GHC.DataId name) => Data (ResTyGADTHook name)+deriving instance (Show (GHC.LHsTyVarBndr name)) => Show (ResTyGADTHook name)++instance (GHC.OutputableBndr name) => GHC.Outputable (ResTyGADTHook name) where+ ppr (ResTyGADTHook bs) = GHC.text "ResTyGADTHook" GHC.<+> GHC.ppr bs+++#if __GLASGOW_HASKELL__ > 710+-- WildCardAnon exists because the GHC anonymous wildcard type is defined as+-- = AnonWildCard (PostRn name Name)+-- We need to reconstruct this from the typed hole SrcSpan in an HsForAllTy, but+-- the instance doing this is parameterised on name, so we cannot put a value in+-- for the (PostRn name Name) field. This is used instead.+data WildCardAnon = WildCardAnon deriving (Show,Data,Typeable)++instance Annotate WildCardAnon where+ markAST l WildCardAnon = do+ markExternal l GHC.AnnVal "_"+#endif++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+ => Annotate (ResTyGADTHook name) where+ markAST _ (ResTyGADTHook bndrs) = do+ unless (null bndrs) $ do+ mark GHC.AnnForall+ mapM_ markLocated bndrs+ mark GHC.AnnDot++-- ---------------------------------------------------------------------++instance (Annotate name, GHC.DataId name, GHC.OutputableBndr name,GHC.HasOccName name)+ => Annotate (GHC.HsRecField name (GHC.LPat name)) where+ markAST _ (GHC.HsRecField n e punFlag) = do+ unsetContext Intercalate $ markLocated n+ unless punFlag $ do+ mark GHC.AnnEqual+ unsetContext Intercalate $ markLocated e+ inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma+++instance (Annotate name, GHC.DataId name, GHC.OutputableBndr name,GHC.HasOccName name)+ => Annotate (GHC.HsRecField name (GHC.LHsExpr name)) where+ markAST _ (GHC.HsRecField n e punFlag) = do+ unsetContext Intercalate $ markLocated n+ unless punFlag $ do+ mark GHC.AnnEqual+ unsetContext Intercalate $ markLocated e+ inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma++-- ---------------------------------------------------------------------++instance (GHC.DataId name,Annotate name)+ => Annotate (GHC.FunDep (GHC.Located name)) where++ markAST _ (ls,rs) = do+ mapM_ markLocated ls+ mark GHC.AnnRarrow+ mapM_ markLocated rs+ inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma++-- ---------------------------------------------------------------------++instance Annotate GHC.CType where markAST _ (GHC.CType src mh f) = do markWithString GHC.AnnOpen src case mh of
src/Language/Haskell/GHC/ExactPrint/Delta.hs view
@@ -1,6 +1,5 @@ {-# LANGUAGE CPP #-} {-# LANGUAGE NamedFieldPuns #-}-{-# LANGUAGE BangPatterns #-} -- | This module converts 'GHC.ApiAnns' into 'Anns' by traversing a -- structure created by the "Annotate" modue. --@@ -60,6 +59,7 @@ , normalLayout ) where +-- import Control.Exception import Control.Monad.RWS import Control.Monad.Trans.Free @@ -73,19 +73,18 @@ import Language.Haskell.GHC.ExactPrint.Lookup #endif import Language.Haskell.GHC.ExactPrint.Types-import Language.Haskell.GHC.ExactPrint.Annotate (AnnotationF(..), Annotated- , annotate, Annotate(..))+import Language.Haskell.GHC.ExactPrint.Annotate import qualified GHC-import qualified SrcLoc as GHC import qualified Data.Map as Map-#if __GLASGOW_HASKELL__ <= 710 import qualified Data.Set as Set-#endif -- import Debug.Trace +{-# ANN module "HLint: ignore Eta reduce" #-}+{-# ANN module "HLint: ignore Redundant do" #-}+{-# ANN module "HLint: ignore Reduce duplication" #-} -- --------------------------------------------------------------------- -- | Transform concrete annotations into relative annotations which are@@ -139,17 +138,21 @@ -- --------------------------------------------------------------------- +-- TODO: rename this, it is the R part of the RWS data DeltaOptions = DeltaOptions { -- | Current `SrcSpan, part of current AnnKey`- curSrcSpan :: !GHC.SrcSpan+ curSrcSpan :: !GHC.SrcSpan -- | Constuctor of current AST element, part of current AnnKey- , annConName :: !AnnConName+ , annConName :: !AnnConName -- | Whether to use rigid or normal layout rules- , drRigidity :: Rigidity+ , drRigidity :: !Rigidity + -- | Current higher level context. e.g. whether a Match is part of a+ -- LambdaExpr or a FunBind+ , drContext :: !AstContextSet } data DeltaWriter = DeltaWriter@@ -186,6 +189,7 @@ { curSrcSpan = GHC.noSrcSpan , annConName = annGetConstr () , drRigidity = ridigity+ , drContext = defaultACS } normalLayout :: DeltaOptions@@ -202,11 +206,7 @@ } where cs :: [Comment]- cs = flattenedComments ga-- flattenedComments :: GHC.ApiAnns -> [Comment]- flattenedComments (_,cm) =- map tokComment . GHC.sortLocated . concat $ Map.elems cm+ cs = extractComments ga -- Writer helpers@@ -239,25 +239,38 @@ go :: AnnotationF (Delta a) -> Delta a go (MarkEOF next) = addEofAnnotation >> next go (MarkPrim kwid _ next) = addDeltaAnnotation kwid >> next+ go (MarkPPOptional kwid _ next) = addDeltaAnnotation kwid >> next go (MarkOutside akwid kwid next) = addDeltaAnnotationsOutside akwid kwid >> next go (MarkInside akwid next) = addDeltaAnnotationsInside akwid >> next go (MarkMany akwid next) = addDeltaAnnotations akwid >> next+ go (MarkManyOptional akwid next) = addDeltaAnnotations akwid >> next go (MarkOffsetPrim akwid n _ next) = addDeltaAnnotationLs akwid n >> next+ go (MarkOffsetPrimOptional akwid n _ next) = addDeltaAnnotationLs akwid n >> next go (WithAST lss prog next) = withAST lss (deltaInterpret prog) >> next go (CountAnns kwid next) = countAnnsDelta kwid >>= next go (SetLayoutFlag r action next) = do rigidity <- asks drRigidity- (if (r <= rigidity) then setLayoutFlag else id) (deltaInterpret action)+ (if r <= rigidity then setLayoutFlag else id) (deltaInterpret action) next go (MarkExternal ss akwid _ next) = addDeltaAnnotationExt ss akwid >> next- go (StoreOriginalSrcSpan key next) = storeOriginalSrcSpanDelta key >>= next- go (GetSrcSpanForKw kw next) = getSrcSpanForKw kw >>= next+ go (StoreOriginalSrcSpan _ key next) = storeOriginalSrcSpanDelta key >>= next+ go (GetSrcSpanForKw ss kw next) = getSrcSpanForKw ss kw >>= next #if __GLASGOW_HASKELL__ <= 710 go (StoreString s ss next) = storeString s ss >> next #endif- go (AnnotationsToComments kws next) = annotationsToCommentsDelta kws >> next- go (WithSortKey kws next) = withSortKey kws >> next+ go (AnnotationsToComments kws next) = annotationsToCommentsDelta kws >> next+#if __GLASGOW_HASKELL__ <= 710+ go (AnnotationsToCommentsBF _ kws next) = annotationsToCommentsDelta kws >> next+ go (FinalizeBF _ next) = next+#endif+ go (WithSortKey kws next) = withSortKey kws >> next+ go (WithSortKeyContexts ctx kws next) = withSortKeyContexts ctx kws >> next + go (SetContextLevel ctxt lvl action next) = setContextDelta ctxt lvl (deltaInterpret action) >> next+ go (UnsetContext _ctxt action next) = deltaInterpret action >> next+ go (IfInContext ctxt ifAction elseAction next) = ifInContextDelta ctxt ifAction elseAction >> next+ go (TellContext _ next) = next+ withSortKey :: [(GHC.SrcSpan, Annotated b)] -> Delta () withSortKey kws = let order = sortBy (comparing fst) kws@@ -266,6 +279,14 @@ mapM_ (deltaInterpret . snd) order +withSortKeyContexts :: ListContexts -> [(GHC.SrcSpan, Annotated ())] -> Delta ()+withSortKeyContexts ctxts kws = do+ tellSortKey (map fst order)+ withSortKeyContextsHelper deltaInterpret ctxts order+ where+ order = sortBy (comparing fst) kws++ setLayoutFlag :: Delta () -> Delta () setLayoutFlag action = do oldLay <- gets apLayoutStart@@ -275,7 +296,20 @@ , apLayoutStart = oldLay }) action <* reset +-- --------------------------------------------------------------------- +setContextDelta :: Set.Set AstContext -> Int -> Delta () -> Delta ()+setContextDelta ctxt lvl =+ local (\s -> s { drContext = setAcsWithLevel ctxt lvl (drContext s) } )++ifInContextDelta :: Set.Set AstContext -> Annotated () -> Annotated () -> Delta ()+ifInContextDelta ctxt ifAction elseAction = do+ cur <- asks drContext+ let inContext = inAcs ctxt cur+ if inContext+ then deltaInterpret ifAction+ else deltaInterpret elseAction+ -- --------------------------------------------------------------------- storeOriginalSrcSpanDelta :: AnnKey -> Delta AnnKey@@ -311,8 +345,8 @@ -- --------------------------------------------------------------------- -- | This function exists to overcome a shortcoming in the GHC AST for 7.10.1-getSrcSpanForKw :: GHC.AnnKeywordId -> Delta GHC.SrcSpan-getSrcSpanForKw kw = do+getSrcSpanForKw :: GHC.SrcSpan -> GHC.AnnKeywordId -> Delta GHC.SrcSpan+getSrcSpanForKw _ kw = do ga <- gets apAnns ss <- getSrcSpan case GHC.getAnnotation ga ss kw of@@ -328,6 +362,8 @@ withSrcSpanDelta (GHC.L l a) = local (\s -> s { curSrcSpan = l , annConName = annGetConstr a+ , drContext = pushAcs (drContext s)+ `debug` ("withSrcSpanDelta: (l,annConName,drContext)=" ++ showGhc (l,annGetConstr a, pushAcs (drContext s))) }) @@ -360,7 +396,7 @@ setPriorEndAST :: GHC.SrcSpan -> Delta () setPriorEndAST pe = do setLayoutStart (snd (ss2pos pe))- modify (\s -> s { priorEndPosition = (ss2posEnd pe) } )+ modify (\s -> s { priorEndPosition = ss2posEnd pe } ) setLayoutStart :: Int -> Delta () setLayoutStart p = do@@ -382,6 +418,7 @@ let unicodeAnns = case unicodeEquivalent an of [] -> [] [kw] -> GHC.getAnnotation ga ss kw+ (kw:_) -> GHC.getAnnotation ga ss kw -- Keep exhaustiveness checker happy return $ unicodeAnns ++ GHC.getAnnotation ga ss an #endif @@ -485,17 +522,17 @@ off (ss2delta priorEndAfterComments ss) -- Preparation complete, perform the action when (GHC.isGoodSrcSpan ss && priorEndAfterComments < ss2pos ss) (do- modify (\s -> s { priorEndPosition = (ss2pos ss) } ))+ modify (\s -> s { priorEndPosition = ss2pos ss } )) (res, w) <- censor maskWriter (listen action) let kds = annKds w an = Ann- { annEntryDelta = edp- , annPriorComments = cs+ { annEntryDelta = edp+ , annPriorComments = cs , annFollowingComments = [] -- only used in Transform and Print- , annsDP = kds- , annSortKey = sortKeys w- , annCapturedSpan = getFirst $ dwCapturedSpan w }+ , annsDP = kds+ , annSortKey = sortKeys w+ , annCapturedSpan = getFirst $ dwCapturedSpan w } addAnnotationsDelta an `debug` ("leaveAST:(annkey,an)=" ++ show (mkAnnKey lss,an))@@ -553,7 +590,7 @@ if kw `Set.member` unicodeSyntax then let s = keywordToString gkw in- if (length s /= spanLength ss)+ if length s /= spanLength ss then AnnUnicode kw else gkw else@@ -610,7 +647,7 @@ let p = ss2delta pe pa p' <- adjustDeltaForOffsetM p setPriorEnd (ss2posEnd pa)- return $ (c, p')+ return (c, p') addDeltaComment :: Comment -> DeltaPos -> Delta () addDeltaComment d p = do@@ -635,7 +672,7 @@ addDeltaAnnotationLs ann off = do ss <- getSrcSpan ma <- peekAnnotationDelta ann- let ma' = filter (\s -> (GHC.isSubspanOf s ss)) ma+ let ma' = filter (\s -> GHC.isSubspanOf s ss) ma case drop off ma' of [] -> return () `debug` ("addDeltaAnnotationLs:missed:(off,ann,ma)=" ++ showGhc (off,ss,ann))@@ -695,6 +732,7 @@ addAnnDeltaPos (G GHC.AnnEofPos) (DP (r, c - 1)) setPriorEndAST pa `warn` ("Trailing annotations after Eof: " ++ showGhc pss) +-- --------------------------------------------------------------------- countAnnsDelta :: GHC.AnnKeywordId -> Delta Int countAnnsDelta ann = do
src/Language/Haskell/GHC/ExactPrint/Parsers.hs view
@@ -33,7 +33,13 @@ -- * Internal + , ghcWrapper++ , initDynFlags+ , initDynFlagsPure , parseModuleApiAnnsWithCpp+ , parseModuleApiAnnsWithCppInternal+ , postParseTransform ) where import Language.Haskell.GHC.ExactPrint.Annotate@@ -65,6 +71,9 @@ import qualified Data.Map as Map +{-# ANN module "HLint: ignore Eta reduce" #-}+{-# ANN module "HLint: ignore Redundant do" #-}+{-# ANN module "HLint: ignore Reduce duplication" #-} -- --------------------------------------------------------------------- -- | Wrapper function which returns Annotations along with the parsed@@ -99,12 +108,10 @@ -- myParser fname expr = withDynFlags (\\d -> parseExpr d fname expr) -- @ withDynFlags :: (GHC.DynFlags -> a) -> IO a-withDynFlags action =- GHC.defaultErrorHandler GHC.defaultFatalMessager GHC.defaultFlushOut $- GHC.runGhc (Just libdir) $ do- dflags <- GHC.getSessionDynFlags- void $ GHC.setSessionDynFlags dflags- return (action dflags)+withDynFlags action = ghcWrapper $ do+ dflags <- GHC.getSessionDynFlags+ void $ GHC.setSessionDynFlags dflags+ return (action dflags) -- --------------------------------------------------------------------- @@ -151,25 +158,23 @@ -- @ -- -- Note: 'GHC.ParsedSource' is a synonym for 'GHC.Located' ('GHC.HsModule' 'GHC.RdrName')-parseModule :: FilePath- -> IO (Either (GHC.SrcSpan, String)- (Anns, GHC.ParsedSource))+parseModule+ :: FilePath -> IO (Either (GHC.SrcSpan, String) (Anns, GHC.ParsedSource)) parseModule = parseModuleWithCpp defaultCppOptions normalLayout + -- | This entry point will work out which language extensions are -- required but will _not_ perform CPP processing. -- In contrast to `parseModoule` the input source is read from the provided -- string; the `FilePath` parameter solely exists to provide a name -- in source location annotations.-parseModuleFromString :: FilePath- -> String- -> IO (Either (GHC.SrcSpan, String)- (Anns, GHC.ParsedSource))-parseModuleFromString fp s = do- GHC.defaultErrorHandler GHC.defaultFatalMessager GHC.defaultFlushOut $- GHC.runGhc (Just libdir) $ do- dflags <- initDynFlagsPure fp s- return $ parseWith dflags fp GHC.parseModule s+parseModuleFromString+ :: FilePath+ -> String+ -> IO (Either (GHC.SrcSpan, String) (Anns, GHC.ParsedSource))+parseModuleFromString fp s = ghcWrapper $ do+ dflags <- initDynFlagsPure fp s+ return $ parseWith dflags fp GHC.parseModule s parseModuleWithOptions :: DeltaOptions -> FilePath@@ -180,57 +185,89 @@ -- | Parse a module with specific instructions for the C pre-processor.-parseModuleWithCpp :: CppOptions- -> DeltaOptions- -> FilePath- -> IO (Either (GHC.SrcSpan, String) (Anns, GHC.ParsedSource))+parseModuleWithCpp+ :: CppOptions+ -> DeltaOptions+ -> FilePath+ -> IO (Either (GHC.SrcSpan, String) (Anns, GHC.ParsedSource)) parseModuleWithCpp cpp opts fp = do res <- parseModuleApiAnnsWithCpp cpp fp- return (either Left mkAnns res)- where- mkAnns (apianns, cs, _, m) =- Right (relativiseApiAnnsWithOptions opts cs m apianns, m)+ return $ postParseTransform res opts +-- ---------------------------------------------------------------------+ -- | Low level function which is used in the internal tests. -- It is advised to use 'parseModule' or 'parseModuleWithCpp' instead of -- this function.-parseModuleApiAnnsWithCpp :: CppOptions- -> FilePath- -> IO (Either (GHC.SrcSpan, String)- (GHC.ApiAnns, [Comment], GHC.DynFlags, GHC.ParsedSource))-parseModuleApiAnnsWithCpp cppOptions file =- GHC.defaultErrorHandler GHC.defaultFatalMessager GHC.defaultFlushOut $- GHC.runGhc (Just libdir) $ do- dflags <- initDynFlags file+parseModuleApiAnnsWithCpp+ :: CppOptions+ -> FilePath+ -> IO+ ( Either+ (GHC.SrcSpan, String)+ (GHC.ApiAnns, [Comment], GHC.DynFlags, GHC.ParsedSource)+ )+parseModuleApiAnnsWithCpp cppOptions file = ghcWrapper $ do+ dflags <- initDynFlags file+ parseModuleApiAnnsWithCppInternal cppOptions dflags file++-- | Internal function. Default runner of GHC.Ghc action in IO.+ghcWrapper :: GHC.Ghc a -> IO a+ghcWrapper =+ GHC.defaultErrorHandler GHC.defaultFatalMessager GHC.defaultFlushOut+ . GHC.runGhc (Just libdir)++-- | Internal function. Exposed if you want to muck with DynFlags+-- before parsing.+parseModuleApiAnnsWithCppInternal+ :: GHC.GhcMonad m+ => CppOptions+ -> GHC.DynFlags+ -> FilePath+ -> m+ ( Either+ (GHC.SrcSpan, String)+ (GHC.ApiAnns, [Comment], GHC.DynFlags, GHC.ParsedSource)+ )+parseModuleApiAnnsWithCppInternal cppOptions dflags file = do #if __GLASGOW_HASKELL__ <= 710- let useCpp = GHC.xopt GHC.Opt_Cpp dflags+ let useCpp = GHC.xopt GHC.Opt_Cpp dflags #else- let useCpp = GHC.xopt LangExt.Cpp dflags+ let useCpp = GHC.xopt LangExt.Cpp dflags #endif- (fileContents, injectedComments, dflags') <-- if useCpp- then do- (contents,dflags1) <- getPreprocessedSrcDirect cppOptions file- cppComments <- getCppTokensAsComments cppOptions file- return (contents,cppComments,dflags1)- else do- txt <- GHC.liftIO $ readFileGhc file- let (contents1,lp) = stripLinePragmas txt- return (contents1,lp,dflags)- return $- case parseFile dflags' file fileContents of- GHC.PFailed ss m -> Left $ (ss, (GHC.showSDoc dflags m))- GHC.POk (mkApiAnns -> apianns) pmod ->- Right $ (apianns, injectedComments, dflags', pmod)+ (fileContents, injectedComments, dflags') <-+ if useCpp+ then do+ (contents,dflags1) <- getPreprocessedSrcDirect cppOptions file+ cppComments <- getCppTokensAsComments cppOptions file+ return (contents,cppComments,dflags1)+ else do+ txt <- GHC.liftIO $ readFileGhc file+ let (contents1,lp) = stripLinePragmas txt+ return (contents1,lp,dflags)+ return $+ case parseFile dflags' file fileContents of+ GHC.PFailed ss m -> Left $ (ss, (GHC.showSDoc dflags m))+ GHC.POk (mkApiAnns -> apianns) pmod ->+ Right $ (apianns, injectedComments, dflags', pmod) --- ---------------------------------------------------------------------+-- | Internal function. Exposed if you want to much with DynFlags+-- before parsing. Or after parsing.+postParseTransform+ :: Either a (GHC.ApiAnns, [Comment], GHC.DynFlags, GHC.ParsedSource)+ -> DeltaOptions+ -> Either a (Anns, GHC.ParsedSource)+postParseTransform parseRes opts = either Left mkAnns parseRes+ where+ mkAnns (apianns, cs, _, m) =+ Right (relativiseApiAnnsWithOptions opts cs m apianns, m) +-- | Internal function. Initializes DynFlags value for parsing. initDynFlags :: GHC.GhcMonad m => FilePath -> m GHC.DynFlags initDynFlags file = do- dflags0 <- GHC.getSessionDynFlags- src_opts <- GHC.liftIO $ GHC.getOptionsFromFile dflags0 file- (dflags1, _, _)- <- GHC.parseDynamicFilePragma dflags0 src_opts+ dflags0 <- GHC.getSessionDynFlags+ src_opts <- GHC.liftIO $ GHC.getOptionsFromFile dflags0 file+ (dflags1, _, _) <- GHC.parseDynamicFilePragma dflags0 src_opts -- Turn this on last to avoid T10942 let dflags2 = dflags1 `GHC.gopt_set` GHC.Opt_KeepRawTokenStream void $ GHC.setSessionDynFlags dflags2@@ -246,12 +283,8 @@ -- as long as `parseDynamicFilePragma` is impure there seems to be -- no reason to use it. dflags0 <- GHC.getSessionDynFlags- let pragmaInfo = GHC.getOptions- dflags0- (GHC.stringToStringBuffer $ s)- fp- (dflags1, _, _)- <- GHC.parseDynamicFilePragma dflags0 pragmaInfo+ let pragmaInfo = GHC.getOptions dflags0 (GHC.stringToStringBuffer $ s) fp+ (dflags1, _, _) <- GHC.parseDynamicFilePragma dflags0 pragmaInfo -- Turn this on last to avoid T10942 let dflags2 = dflags1 `GHC.gopt_set` GHC.Opt_KeepRawTokenStream void $ GHC.setSessionDynFlags dflags2@@ -262,4 +295,4 @@ mkApiAnns :: GHC.PState -> GHC.ApiAnns mkApiAnns pstate = ( Map.fromListWith (++) . GHC.annotations $ pstate- , Map.fromList ((GHC.noSrcSpan, GHC.comment_q pstate) : (GHC.annotations_comments pstate)))+ , Map.fromList ((GHC.noSrcSpan, GHC.comment_q pstate) : GHC.annotations_comments pstate))
src/Language/Haskell/GHC/ExactPrint/Preprocess.hs view
@@ -40,6 +40,12 @@ -- import Debug.Trace --+{-# ANN module ("HLint: ignore Eta reduce" :: String) #-}+{-# ANN module ("HLint: ignore Redundant do" :: String) #-}+{-# ANN module ("HLint: ignore Reduce duplication" :: String) #-}++-- ---------------------------------------------------------------------+ data CppOptions = CppOptions { cppDefine :: [String] -- ^ CPP #define macros , cppInclude :: [FilePath] -- ^ CPP Includes directory@@ -106,9 +112,14 @@ do let toks = GHC.addSourceToTokens startLoc source ts cppCommentToks = getCppTokens directiveToks nonDirectiveToks toks- return $ map (tokComment . commentToAnnotation . fst) cppCommentToks+ return $ filter goodComment+ $ map (tokComment . commentToAnnotation . fst) cppCommentToks GHC.PFailed sspan err -> parseError flags2 sspan err +goodComment :: Comment -> Bool+goodComment (Comment "" _ _) = False+goodComment _ = True+ -- --------------------------------------------------------------------- -- | Combine the three sets of tokens to produce a single set that@@ -137,7 +148,7 @@ -- GHC.Token does not have Ord, can't use a set directly origSpans = map (\(GHC.L l _,_) -> l) origSrcToks m1Spans = map (\(GHC.L l _,_) -> l) m1Toks- missingSpans = (Set.fromList origSpans) Set.\\ (Set.fromList m1Spans)+ missingSpans = Set.fromList origSpans Set.\\ Set.fromList m1Spans missingToks = filter (\(GHC.L l _,_) -> Set.member l missingSpans) origSrcToks
+ src/Language/Haskell/GHC/ExactPrint/Pretty.hs view
@@ -0,0 +1,576 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE NamedFieldPuns #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}++-----------------------------------------------------------------------------+-- |+-- Module : Language.Haskell.GHC.ExactPrint.Pretty+--+-- This module adds default annotations to an AST fragment that does not have+-- them, to be able to exactprint it in a way that preserves the orginal AST+-- when re-parsed.+--+-----------------------------------------------------------------------------++module Language.Haskell.GHC.ExactPrint.Pretty+ (+ addAnnotationsForPretty+ ) where++import Language.Haskell.GHC.ExactPrint.Types+import Language.Haskell.GHC.ExactPrint.Utils+import Language.Haskell.GHC.ExactPrint.Annotate++import Control.Monad.RWS+import Control.Monad.Trans.Free+import Data.Generics+import Data.List+import Data.Ord (comparing)+++#if __GLASGOW_HASKELL__ <= 710+import qualified BooleanFormula as GHC+import qualified Outputable as GHC+#endif+import qualified GHC++import qualified Data.Map as Map+import qualified Data.Set as Set++import Debug.Trace++{-# ANN module "HLint: ignore Eta reduce" #-}+{-# ANN module "HLint: ignore Redundant do" #-}+{-# ANN module "HLint: ignore Reduce duplication" #-}++-- ---------------------------------------------------------------------++-- |Add any missing annotations so that the full AST element will exactprint+-- properly when done.+addAnnotationsForPretty :: (Annotate a) => [Comment] -> GHC.Located a -> Anns -> Anns+addAnnotationsForPretty cs ast ans+ = runPrettyWithComments opts cs (annotate ast) ans (0,0)+ where+ opts = prettyOptions NormalLayout++-- ---------------------------------------------------------------------+--+-- | Type used in the Pretty Monad.+type Pretty a = RWS PrettyOptions PrettyWriter PrettyState a++runPrettyWithComments :: PrettyOptions -> [Comment] -> Annotated () -> Anns -> Pos -> Anns+runPrettyWithComments opts cs action ans priorEnd =+ mkAnns . snd+ . (\next -> execRWS next opts (defaultPrettyState cs priorEnd ans))+ . prettyInterpret $ action+ where+ mkAnns :: PrettyWriter -> Anns+ mkAnns = f . dwAnns+ f :: Monoid a => Endo a -> a+ f = ($ mempty) . appEndo++-- ---------------------------------------------------------------------++-- TODO: rename this, it is the R part of the RWS+data PrettyOptions = PrettyOptions+ {+ -- | Current `SrcSpan, part of current AnnKey`+ curSrcSpan :: !GHC.SrcSpan++ -- | Constuctor of current AST element, part of current AnnKey+ , annConName :: !AnnConName++ -- | Whether to use rigid or normal layout rules+ , drRigidity :: !Rigidity++ -- | Current higher level context. e.g. whether a Match is part of a+ -- LambdaExpr or a FunBind+ , prContext :: !AstContextSet+ } deriving Show++data PrettyWriter = PrettyWriter+ { -- | Final list of annotations, and sort keys+ dwAnns :: Endo (Map.Map AnnKey Annotation)++ -- | Used locally to pass Keywords, delta pairs relevant to a specific+ -- subtree to the parent.+ , annKds :: ![(KeywordId, DeltaPos)]+ , sortKeys :: !(Maybe [GHC.SrcSpan])+ , dwCapturedSpan :: !(First AnnKey)+ , prLayoutContext :: !(ACS' AstContext)+ }++data PrettyState = PrettyState+ { -- | Position reached when processing the last element+ priorEndPosition :: !Pos++ -- | Ordered list of comments still to be allocated+ , apComments :: ![Comment]++ , apMarkLayout :: Bool+ , apLayoutStart :: LayoutStartCol++ , apNoPrecedingSpace :: Bool++ }++instance Monoid PrettyWriter where+ mempty = PrettyWriter mempty mempty mempty mempty mempty+ (PrettyWriter a b e g i) `mappend` (PrettyWriter c d f h j)+ = PrettyWriter (a <> c) (b <> d) (e <> f) (g <> h) (i <> j)++-- ---------------------------------------------------------------------++prettyOptions :: Rigidity -> PrettyOptions+prettyOptions ridigity =+ PrettyOptions+ { curSrcSpan = GHC.noSrcSpan+ , annConName = annGetConstr ()+ , drRigidity = ridigity+ , prContext = defaultACS+ }++defaultPrettyState :: [Comment] -> Pos -> Anns -> PrettyState+defaultPrettyState injectedComments priorEnd _ans =+ PrettyState+ { priorEndPosition = priorEnd+ , apComments = cs ++ injectedComments+ , apLayoutStart = 1+ , apMarkLayout = False+ , apNoPrecedingSpace = False+ }+ where+ cs :: [Comment]+ cs = []++-- ---------------------------------------------------------------------+-- Free Monad Interpretation code++prettyInterpret :: Annotated a -> Pretty a+prettyInterpret = iterTM go+ where+ go :: AnnotationF (Pretty a) -> Pretty a+ go (MarkPrim kwid _ next) = addPrettyAnnotation (G kwid) >> next+ go (MarkPPOptional _kwid _ next) = next+ go (MarkEOF next) = addEofAnnotation >> next+ go (MarkExternal _ss akwid _ next) = addPrettyAnnotation (G akwid) >> next+ go (MarkOutside akwid kwid next) = addPrettyAnnotationsOutside akwid kwid >> next+ -- go (MarkOutside akwid kwid next) = addPrettyAnnotation kwid >> next+ go (MarkInside akwid next) = addPrettyAnnotationsInside akwid >> next+ go (MarkMany akwid next) = addPrettyAnnotation (G akwid) >> next+ go (MarkManyOptional _akwid next) = next+ go (MarkOffsetPrim akwid n _ next) = addPrettyAnnotationLs akwid n >> next+ go (MarkOffsetPrimOptional _akwid _n _ next) = next+ go (WithAST lss prog next) = withAST lss (prettyInterpret prog) >> next+ go (CountAnns kwid next) = countAnnsPretty kwid >>= next+ go (WithSortKey kws next) = withSortKey kws >> next+ go (WithSortKeyContexts ctx kws next) = withSortKeyContexts ctx kws >> next+ go (SetLayoutFlag r action next) = do+ rigidity <- asks drRigidity+ (if r <= rigidity then setLayoutFlag else id) (prettyInterpret action)+ next+ go (StoreOriginalSrcSpan l key next) = storeOriginalSrcSpanPretty l key >>= next+ go (GetSrcSpanForKw ss kw next) = getSrcSpanForKw ss kw >>= next+#if __GLASGOW_HASKELL__ <= 710+ go (StoreString s ss next) = storeString s ss >> next+#endif+ go (AnnotationsToComments kws next) = annotationsToCommentsPretty kws >> next+#if __GLASGOW_HASKELL__ <= 710+ go (AnnotationsToCommentsBF bf kws next) = annotationsToCommentsBFPretty bf kws >> next+ go (FinalizeBF l next) = finalizeBFPretty l >> next+#endif++ go (SetContextLevel ctxt lvl action next) = setContextPretty ctxt lvl (prettyInterpret action) >> next+ go (UnsetContext ctxt action next) = unsetContextPretty ctxt (prettyInterpret action) >> next+ go (IfInContext ctxt ia ea next) = ifInContextPretty ctxt ia ea >> next+ go (TellContext c next) = tellContext c >> next++-- ---------------------------------------------------------------------++addEofAnnotation :: Pretty ()+addEofAnnotation = do+ tellKd (G GHC.AnnEofPos, DP (1,0))++-- ---------------------------------------------------------------------++addPrettyAnnotation :: KeywordId -> Pretty ()+addPrettyAnnotation ann = do+ noPrec <- gets apNoPrecedingSpace+ ctx <- asks prContext+ _ <- trace ("Pretty.addPrettyAnnotation:=" ++ showGhc (ann,noPrec,ctx)) $ asks prContext+ let+ dp = case ann of+ (G GHC.AnnAs) -> tellKd (ann,DP (0,1))+ (G GHC.AnnAt) -> tellKd (ann,DP (0,1))+ (G GHC.AnnBang) -> tellKd (ann,DP (0,1))+ (G GHC.AnnBy) -> tellKd (ann,DP (0,1))+ (G GHC.AnnCase ) -> tellKd (ann,DP (0,1))+ (G GHC.AnnClass) -> tellKd (ann,DP (0,1))+ (G GHC.AnnClose) -> tellKd (ann,DP (0,1))+ (G GHC.AnnCloseC) -> tellKd (ann,DP (0,0))+ (G GHC.AnnDcolon) -> tellKd (ann,DP (0,1))+ (G GHC.AnnDeriving) -> tellKd (ann,DP (0,1))+ (G GHC.AnnDo) -> tellKd (ann,DP (0,1))+ (G GHC.AnnElse) -> tellKd (ann,DP (1,2))+ (G GHC.AnnEqual) -> tellKd (ann,DP (0,1))+ (G GHC.AnnExport) -> tellKd (ann,DP (0,1))+ (G GHC.AnnFamily) -> tellKd (ann,DP (0,1))+ (G GHC.AnnForall) -> tellKd (ann,DP (0,1))+ (G GHC.AnnGroup) -> tellKd (ann,DP (0,1))+ (G GHC.AnnHiding) -> tellKd (ann,DP (0,1))+ (G GHC.AnnImport) -> tellKd (ann,DP (0,1))+ (G GHC.AnnIn) -> tellKd (ann,DP (1,0))+ (G GHC.AnnInstance) -> tellKd (ann,DP (0,1))+ (G GHC.AnnLam) -> tellKd (ann,DP (0,1))+ (G GHC.AnnMinus) -> tellKd (ann,DP (0,1)) -- need to separate from preceding operator+ (G GHC.AnnModule) -> tellKd (ann,DP (0,1))+ (G GHC.AnnOf) -> tellKd (ann,DP (0,1))+ (G GHC.AnnOpenC) -> tellKd (ann,DP (0,0))+ (G GHC.AnnOpenPE) -> tellKd (ann,DP (0,1))+ (G GHC.AnnQualified) -> tellKd (ann,DP (0,1))+ (G GHC.AnnRarrow) -> tellKd (ann,DP (0,1))+ (G GHC.AnnRole) -> tellKd (ann,DP (0,1))+ (G GHC.AnnSafe) -> tellKd (ann,DP (0,1))+ (G GHC.AnnSimpleQuote) -> tellKd (ann,DP (0,1))+ (G GHC.AnnThTyQuote) -> tellKd (ann,DP (0,1))+ (G GHC.AnnThen) -> tellKd (ann,DP (1,2))+ (G GHC.AnnTilde) -> tellKd (ann,DP (0,1))+ (G GHC.AnnType) -> tellKd (ann,DP (0,1))+ (G GHC.AnnUsing) -> tellKd (ann,DP (0,1))+ (G GHC.AnnVal) -> tellKd (ann,DP (0,1))+ (G GHC.AnnValStr) -> tellKd (ann,DP (0,1))+ (G GHC.AnnVbar) -> tellKd (ann,DP (0,1))+ -- (G GHC.AnnWhere) -> tellKd (ann,DP (0,1))+ (G GHC.AnnWhere) -> tellKd (ann,DP (1,2))+ _ -> tellKd (ann,DP (0,0))+ fromNoPrecedingSpace (tellKd (ann,DP (0,0))) dp++-- ---------------------------------------------------------------------++addPrettyAnnotationsOutside :: GHC.AnnKeywordId -> KeywordId -> Pretty ()+addPrettyAnnotationsOutside _akwid _kwid = return ()++-- ---------------------------------------------------------------------++addPrettyAnnotationsInside :: GHC.AnnKeywordId -> Pretty ()+addPrettyAnnotationsInside _ann = return ()++-- ---------------------------------------------------------------------++addPrettyAnnotationLs :: GHC.AnnKeywordId -> Int -> Pretty ()+addPrettyAnnotationLs ann _off = addPrettyAnnotation (G ann)++-- ---------------------------------------------------------------------++#if __GLASGOW_HASKELL__ <= 710+getUnallocatedComments :: Pretty [Comment]+getUnallocatedComments = gets apComments++putUnallocatedComments :: [Comment] -> Pretty ()+putUnallocatedComments cs = modify (\s -> s { apComments = cs } )+#endif++-- ---------------------------------------------------------------------++withSrcSpanPretty :: Data a => GHC.Located a -> Pretty b -> Pretty b+withSrcSpanPretty (GHC.L l a) action = do+ -- peek into the current state of the output, to extract the layout context+ -- flags passed up from subelements of the AST.+ (_,w) <- listen (return () :: Pretty ())++ _ <- trace ("withSrcSpanPretty: prLayoutContext w=" ++ show (prLayoutContext w) ) (return ())++ local (\s -> s { curSrcSpan = l+ , annConName = annGetConstr a+ -- , prContext = pushAcs (prContext s)+ , prContext = (pushAcs (prContext s)) <> (prLayoutContext w)+ })+ action++-- ---------------------------------------------------------------------++-- | Enter a new AST element. Maintain SrcSpan stack+withAST :: Data a+ => GHC.Located a+ -> Pretty b -> Pretty b+withAST lss@(GHC.L ss t) action = do+ return () `debug` ("Pretty.withAST:enter 1:(ss)=" ++ showGhc (ss,showConstr (toConstr t)))+ -- Calculate offset required to get to the start of the SrcSPan+ -- off <- gets apLayoutStart+ withSrcSpanPretty lss $ do+ return () `debug` ("Pretty.withAST:enter:(ss)=" ++ showGhc (ss,showConstr (toConstr t)))++ let maskWriter s = s { annKds = []+ , sortKeys = Nothing+ , dwCapturedSpan = mempty+ -- , prLayoutContext = pushAcs (prLayoutContext s)+ }++#if __GLASGOW_HASKELL__ <= 710+ let spanStart = ss2pos ss+ cs <- do+ if GHC.isGoodSrcSpan ss+ then+ commentAllocation (priorComment spanStart) return+ else+ return []+#else+ let cs = []+#endif++ -- uncs <- getUnallocatedComments+ -- ctx <- trace ("Pretty.withAST:cs:(ss,cs,uncs)=" ++ showGhc (ss,cs,uncs)) $ asks prContext+ ctx <- asks prContext++ noPrec <- gets apNoPrecedingSpace+ edp <- trace ("Pretty.withAST:enter:(ss,constr,noPrec,ctx)=" ++ showGhc (ss,showConstr (toConstr t),noPrec,ctx)) $ entryDpFor ctx t+ -- edp <- entryDpFor ctx t++ let ctx1 = trace ("Pretty.withAST:edp:(ss,constr,edp)=" ++ showGhc (ss,showConstr (toConstr t),edp)) ctx+ (res, w) <- if inAcs (Set.fromList [ListItem,TopLevel]) ctx1+ then+ -- trace ("Pretty.withAST:setNoPrecedingSpace") $+ censor maskWriter (listen (setNoPrecedingSpace action))+ else+ -- trace ("Pretty.withAST:setNoPrecedingSpace") $+ censor maskWriter (listen action)++ let kds = annKds w+ an = Ann+ { annEntryDelta = edp+ , annPriorComments = cs+ , annFollowingComments = [] -- only used in Transform and Print+ , annsDP = kds+ , annSortKey = sortKeys w+ , annCapturedSpan = getFirst $ dwCapturedSpan w+ }++ addAnnotationsPretty an+ `debug` ("Pretty.withAST:(annkey,an)=" ++ show (mkAnnKey lss,an))+ return res++-- ---------------------------------------------------------------------++entryDpFor :: Typeable a => AstContextSet -> a -> Pretty DeltaPos+entryDpFor ctx a = (def `extQ` grhs) a+ where+ lineDefault = if inAcs (Set.singleton AdvanceLine) ctx+ then 1 else 0+ noAdvanceLine = inAcs (Set.singleton NoAdvanceLine) ctx &&+ inAcs (Set.singleton ListStart) ctx++ def :: a -> Pretty DeltaPos+ def _ =+ trace ("entryDpFor:(topLevel,listStart,inList,noAdvanceLine,ctx)=" ++ show (topLevel,listStart,inList,noAdvanceLine,ctx)) $+ if noAdvanceLine+ then return (DP (0,1))+ else+ if listStart+ then return (DP (1,2))+ else if inList+ then if topLevel then return (DP (2,0)) else return (DP (1,0))+ else if topLevel then return (DP (2,0)) else return (DP (lineDefault,0))++ topLevel = inAcs (Set.singleton TopLevel) ctx+ listStart = inAcs (Set.singleton ListStart) ctx+ && not (inAcs (Set.singleton TopLevel) ctx)+ inList = inAcs (Set.singleton ListItem) ctx+ inLambda = inAcs (Set.singleton LambdaExpr) ctx+++ grhs :: GHC.GRHS GHC.RdrName (GHC.LHsExpr GHC.RdrName) -> Pretty DeltaPos+ grhs _ = do+ if inLambda+ then return (DP (0,1))+ else return (DP (1,2))++-- ---------------------------------------------------------------------++fromNoPrecedingSpace :: Pretty a -> Pretty a -> Pretty a+fromNoPrecedingSpace def lay = do+ PrettyState{apNoPrecedingSpace} <- get+ -- ctx <- asks prContext+ if apNoPrecedingSpace+ then do+ modify (\s -> s { apNoPrecedingSpace = False+ })+ trace ("fromNoPrecedingSpace:def") def+ -- def+ else+ -- lay+ trace ("fromNoPrecedingSpace:lay") lay+++-- ---------------------------------------------------------------------++-- |Add some annotation to the currently active SrcSpan+addAnnotationsPretty :: Annotation -> Pretty ()+addAnnotationsPretty ann = do+ l <- ask+ return () `debug` ("addAnnotationsPretty:=" ++ showGhc (curSrcSpan l,prContext l))+ tellFinalAnn (getAnnKey l,ann)++getAnnKey :: PrettyOptions -> AnnKey+getAnnKey PrettyOptions {curSrcSpan, annConName}+ = AnnKey curSrcSpan annConName++-- ---------------------------------------------------------------------++countAnnsPretty :: GHC.AnnKeywordId -> Pretty Int+countAnnsPretty _ann = return 0++-- ---------------------------------------------------------------------++withSortKey :: [(GHC.SrcSpan, Annotated b)] -> Pretty ()+withSortKey kws =+ let order = sortBy (comparing fst) kws+ in do+ tellSortKey (map fst order)+ mapM_ (prettyInterpret . snd) order++withSortKeyContexts :: ListContexts -> [(GHC.SrcSpan, Annotated ())] -> Pretty ()+withSortKeyContexts ctxts kws =+ let order = sortBy (comparing fst) kws+ in do+ tellSortKey (map fst order)+ withSortKeyContextsHelper prettyInterpret ctxts order++-- ---------------------------------------------------------------------++storeOriginalSrcSpanPretty :: GHC.SrcSpan -> AnnKey -> Pretty AnnKey+storeOriginalSrcSpanPretty _s key = do+ tellCapturedSpan key+ return key++-- ---------------------------------------------------------------------++getSrcSpanForKw :: GHC.SrcSpan -> GHC.AnnKeywordId -> Pretty GHC.SrcSpan+getSrcSpanForKw ss _kw = return ss++-- ---------------------------------------------------------------------++#if __GLASGOW_HASKELL__ <= 710+storeString :: String -> GHC.SrcSpan -> Pretty ()+storeString s _ss = addPrettyAnnotation (AnnString s)+#endif++-- ---------------------------------------------------------------------++setLayoutFlag :: Pretty () -> Pretty ()+setLayoutFlag action = do+ oldLay <- gets apLayoutStart+ modify (\s -> s { apMarkLayout = True } )+ let reset = modify (\s -> s { apMarkLayout = False+ , apLayoutStart = oldLay })+ action <* reset++-- ---------------------------------------------------------------------++setNoPrecedingSpace :: Pretty a -> Pretty a+setNoPrecedingSpace action = do+ oldVal <- gets apNoPrecedingSpace+ modify (\s -> s { apNoPrecedingSpace = True } )+ let reset = modify (\s -> s { apNoPrecedingSpace = oldVal })+ action <* reset++-- ---------------------------------------------------------------------++setContextPretty :: Set.Set AstContext -> Int -> Pretty () -> Pretty ()+setContextPretty ctxt lvl =+ local (\s -> s { prContext = setAcsWithLevel ctxt lvl (prContext s) } )++unsetContextPretty :: AstContext -> Pretty () -> Pretty ()+unsetContextPretty ctxt =+ local (\s -> s { prContext = unsetAcs ctxt (prContext s) } )+++ifInContextPretty :: Set.Set AstContext -> Annotated () -> Annotated () -> Pretty ()+ifInContextPretty ctxt ifAction elseAction = do+ cur <- asks prContext+ let inContext = inAcs ctxt cur+ if inContext+ then prettyInterpret ifAction+ else prettyInterpret elseAction++-- ---------------------------------------------------------------------++annotationsToCommentsPretty :: [GHC.AnnKeywordId] -> Pretty ()+annotationsToCommentsPretty _kws = return ()++-- ---------------------------------------------------------------------++#if __GLASGOW_HASKELL__ <= 710+annotationsToCommentsBFPretty :: (GHC.Outputable a) => GHC.BooleanFormula (GHC.Located a) -> [GHC.AnnKeywordId] -> Pretty ()+annotationsToCommentsBFPretty bf _kws = do+ -- cs <- gets apComments+ cs <- trace ("annotationsToCommentsBFPretty:" ++ showGhc (bf,makeBooleanFormulaAnns bf)) $ gets apComments+ -- return$ trace ("annotationsToCommentsBFPretty:" ++ showGhc (bf,makeBooleanFormulaAnns bf)) ()+ -- error ("annotationsToCommentsBFPretty:" ++ showGhc (bf,makeBooleanFormulaAnns bf))+ let+ kws = makeBooleanFormulaAnns bf+ newComments = map (uncurry mkKWComment ) kws+ putUnallocatedComments (cs ++ newComments)+++finalizeBFPretty :: GHC.SrcSpan -> Pretty ()+finalizeBFPretty _ss = do+ commentAllocation (const True) (mapM_ (uncurry addPrettyComment))+ return ()+#endif++-- ---------------------------------------------------------------------+#if __GLASGOW_HASKELL__ <= 710+-- |Split the ordered list of comments into ones that occur prior to+-- the give SrcSpan and the rest+priorComment :: Pos -> Comment -> Bool+priorComment start c = (ss2pos . commentIdentifier $ c) < start++-- TODO:AZ: We scan the entire comment list here. It may be better to impose an+-- invariant that the comments are sorted, and consume them as the pos+-- advances. It then becomes a process of using `takeWhile p` rather than a full+-- partition.+allocateComments :: (Comment -> Bool) -> [Comment] -> ([Comment], [Comment])+allocateComments = partition+#endif++-- ---------------------------------------------------------------------++#if __GLASGOW_HASKELL__ <= 710+commentAllocation :: (Comment -> Bool)+ -> ([(Comment, DeltaPos)] -> Pretty a)+ -> Pretty a+commentAllocation p k = do+ cs <- getUnallocatedComments+ let (allocated,cs') = allocateComments p cs+ putUnallocatedComments cs'+ k =<< mapM makeDeltaComment (sortBy (comparing commentIdentifier) allocated)++makeDeltaComment :: Comment -> Pretty (Comment, DeltaPos)+makeDeltaComment c = do+ return (c, DP (0,1))++addPrettyComment :: Comment -> DeltaPos -> Pretty ()+addPrettyComment d p = do+ tellKd (AnnComment d, p)+#endif++-- ---------------------------------------------------------------------++-- Writer helpers++tellFinalAnn :: (AnnKey, Annotation) -> Pretty ()+tellFinalAnn (k, v) =+ tell (mempty { dwAnns = Endo (Map.insert k v) })++tellCapturedSpan :: AnnKey -> Pretty ()+tellCapturedSpan key = tell ( mempty { dwCapturedSpan = First $ Just key })++tellKd :: (KeywordId, DeltaPos) -> Pretty ()+tellKd kd = tell (mempty { annKds = [kd] })++tellSortKey :: [GHC.SrcSpan] -> Pretty ()+tellSortKey xs = tell (mempty { sortKeys = Just xs } )++tellContext :: Set.Set AstContext -> Pretty ()+tellContext lc = tell (mempty { prLayoutContext = setAcsWithLevel lc 2 mempty} )
src/Language/Haskell/GHC/ExactPrint/Print.hs view
@@ -28,9 +28,9 @@ import Language.Haskell.GHC.ExactPrint.Types import Language.Haskell.GHC.ExactPrint.Utils import Language.Haskell.GHC.ExactPrint.Annotate- (AnnotationF(..), Annotated, Annotate(..), annotate) import Language.Haskell.GHC.ExactPrint.Lookup +-- import Control.Exception import Control.Monad.Identity import Control.Monad.RWS import Control.Monad.Trans.Free@@ -39,9 +39,14 @@ import Data.Maybe (fromMaybe) import Data.Ord (comparing) +import qualified Data.Set as Set+ import qualified GHC -------------------------------------------------------------------------------+{-# ANN module "HLint: ignore Eta reduce" #-}+{-# ANN module "HLint: ignore Redundant do" #-}+{-# ANN module "HLint: ignore Reduce duplication" #-}+-- --------------------------------------------------------------------- -- Printing of source elements -- | Print an AST with a map of potential modified `Anns`. The usual way to@@ -73,6 +78,7 @@ , epTokenPrint :: String -> m a , epWhitespacePrint :: String -> m a , epRigidity :: Rigidity+ , epContext :: !AstContextSet } -- | Helper to create a 'PrintOptions'@@ -89,6 +95,7 @@ , epWhitespacePrint = wsPrint , epTokenPrint = tokenPrint , epRigidity = rigidity+ , epContext = defaultACS } -- | Options which can be used to print as a normal String.@@ -147,38 +154,49 @@ printStringAtMaybeAnn (G GHC.AnnEofPos) (Just "") >> next go (MarkPrim kwid mstr next) = markPrim (G kwid) mstr >> next- -- let annString = fromMaybe (keywordToString kwid) mstr in- -- printStringAtMaybeAnn (G kwid) annString >> next+ go (MarkPPOptional kwid mstr next) =+ markPrim (G kwid) mstr >> next go (MarkOutside _ kwid next) =- -- markPrim kwid Nothing >> next- -- let annString = keywordToString kwid in printStringAtMaybeAnnAll kwid Nothing >> next- -- printStringAtMaybeAnnAll kwid ";" >> next go (MarkInside akwid next) = allAnns akwid >> next go (MarkMany akwid next) = allAnns akwid >> next+ go (MarkManyOptional akwid next) =+ allAnns akwid >> next go (MarkOffsetPrim kwid _ mstr next) = printStringAtMaybeAnn (G kwid) mstr >> next+ go (MarkOffsetPrimOptional kwid _ mstr next) =+ printStringAtMaybeAnn (G kwid) mstr >> next go (WithAST lss action next) = exactPC lss (printInterpret action) >> next go (CountAnns kwid next) = countAnnsEP (G kwid) >>= next go (SetLayoutFlag r action next) = do rigidity <- asks epRigidity- (if (r <= rigidity) then setLayout else id) (printInterpret action)+ (if r <= rigidity then setLayout else id) (printInterpret action) next go (MarkExternal _ akwid s next) = printStringAtMaybeAnn (G akwid) (Just s) >> next- go (StoreOriginalSrcSpan _ next) = storeOriginalSrcSpanPrint >>= next- go (GetSrcSpanForKw _ next) = return GHC.noSrcSpan >>= next+ go (StoreOriginalSrcSpan _ _ next) = storeOriginalSrcSpanPrint >>= next+ go (GetSrcSpanForKw _ _ next) = return GHC.noSrcSpan >>= next #if __GLASGOW_HASKELL__ <= 710 go (StoreString _ _ next) = printStoredString >> next #endif- go (AnnotationsToComments _ next) = next- go (WithSortKey ks next) = withSortKey ks >> next+ go (AnnotationsToComments _ next) = next+#if __GLASGOW_HASKELL__ <= 710+ go (AnnotationsToCommentsBF _ _ next) = next+ go (FinalizeBF _ next) = next+#endif+ go (WithSortKey ks next) = withSortKey ks >> next+ go (WithSortKeyContexts ctx ks next) = withSortKeyContexts ctx ks >> next + go (SetContextLevel ctxt lvl action next) = setContextPrint ctxt lvl (printInterpret action) >> next+ go (UnsetContext _ctxt action next) = printInterpret action >> next+ go (IfInContext ctxt ifAction elseAction next) = ifInContextPrint ctxt ifAction elseAction >> next+ go (TellContext _ next) = next+ ------------------------------------------------------------------------- storeOriginalSrcSpanPrint :: (Monad m, Monoid w) => EP w m AnnKey@@ -206,17 +224,45 @@ withSortKey xs = do Ann{..} <- asks epAnn let ordered = case annSortKey of- Nothing -> map snd xs+ Nothing -> xs Just keys -> orderByKey xs keys `debug` ("withSortKey:" ++ showGhc (map fst (sortBy (comparing (flip elemIndex keys . fst)) xs), map fst xs, keys) )- mapM_ printInterpret ordered+ mapM_ (printInterpret . snd) ordered --------------------------------------------------------------------------+withSortKeyContexts :: (Monad m, Monoid w) => ListContexts -> [(GHC.SrcSpan, Annotated ())] -> EP w m ()+withSortKeyContexts ctxts xs = do+ Ann{..} <- asks epAnn+ let ordered = case annSortKey of+ Nothing -> xs+ Just keys -> orderByKey xs keys+ `debug` ("withSortKey:" +++ showGhc (map fst (sortBy (comparing (flip elemIndex keys . fst)) xs),+ map fst xs,+ keys)+ )+ -- mapM_ printInterpret ordered+ withSortKeyContextsHelper printInterpret ctxts ordered +-- ---------------------------------------------------------------------++setContextPrint :: (Monad m, Monoid w) => Set.Set AstContext -> Int -> EP w m () -> EP w m ()+setContextPrint ctxt lvl =+ local (\s -> s { epContext = setAcsWithLevel ctxt lvl (epContext s) } )++ifInContextPrint :: (Monad m, Monoid w) => Set.Set AstContext -> Annotated () -> Annotated () -> EP w m ()+ifInContextPrint ctxt ifAction elseAction = do+ cur <- asks epContext+ let inContext = inAcs ctxt cur+ if inContext+ then printInterpret ifAction+ else printInterpret elseAction++-- ---------------------------------------------------------------------+ allAnns :: (Monad m, Monoid w) => GHC.AnnKeywordId -> EP w m () allAnns kwid = printStringAtMaybeAnnAll (G kwid) Nothing @@ -256,12 +302,10 @@ printWhitespace (undelta p cl colOffset) getAndRemoveAnnotation :: (Monad m, Monoid w, Data a) => GHC.Located a -> EP w m (Maybe Annotation)-getAndRemoveAnnotation a = gets ((getAnnotationEP a) . epAnns)+getAndRemoveAnnotation a = gets (getAnnotationEP a . epAnns) markPrim :: (Monad m, Monoid w) => KeywordId -> Maybe String -> EP w m () markPrim kwid mstr =- -- let annString = fromMaybe (keywordToString kwid) mstr- -- in printStringAtMaybeAnn kwid annString printStringAtMaybeAnn kwid mstr withContext :: (Monad m, Monoid w)@@ -277,7 +321,7 @@ -- withOffset :: (Monad m, Monoid w) => Annotation -> (EP w m a -> EP w m a) withOffset a =- local (\s -> s { epAnn = a })+ local (\s -> s { epAnn = a, epContext = pushAcs (epContext s) }) -- ---------------------------------------------------------------------@@ -403,21 +447,14 @@ isGoodDeltaWithOffset :: DeltaPos -> LayoutStartCol -> Bool isGoodDeltaWithOffset dp colOffset = isGoodDelta (DP (undelta (0,0) dp colOffset)) --- AZ:TODO: harvest the commonality between this and printStringAtLsDelta printQueuedComment :: (Monad m, Monoid w) => Comment -> DeltaPos -> EP w m () printQueuedComment Comment{commentContents} dp = do p <- getPos colOffset <- getLayoutOffset let (dr,dc) = undelta (0,0) dp colOffset -- do not lose comments against the left margin- when (isGoodDelta (DP (dr,max 0 dc)))- (do- printCommentAt (undelta p dp colOffset) commentContents- let commentDP@(DP (cr,_cc)) = dpFromString commentContents- if cr == 0- then setPos (undelta p (dp `addDP` commentDP) colOffset)- else setPos (undelta p (dp `addDP` commentDP) 1)- )+ when (isGoodDelta (DP (dr,max 0 dc))) $+ printCommentAt (undelta p dp colOffset) commentContents -- --------------------------------------------------------------------- @@ -438,17 +475,23 @@ printString :: (Monad m, Monoid w) => Bool -> String -> EP w m () printString layout str = do- EPState{epPos = (l,c), epMarkLayout} <- get+ EPState{epPos = (_,c), epMarkLayout} <- get PrintOptions{epTokenPrint, epWhitespacePrint} <- ask- when (epMarkLayout && layout) (- modify (\s -> s { epLHS = LayoutStartCol c, epMarkLayout = False } ))- setPos (l, c + length str)- --- -- tell (mempty {output = Endo $ showString str })+ when (epMarkLayout && layout) $+ modify (\s -> s { epLHS = LayoutStartCol c, epMarkLayout = False } ) + -- Advance position, taking care of any newlines in the string+ let strDP@(DP (cr,_cc)) = dpFromString str+ p <- getPos+ colOffset <- getLayoutOffset+ if cr == 0+ then setPos (undelta p strDP colOffset)+ else setPos (undelta p strDP 1)++ -- if not layout && c == 0- then lift (epWhitespacePrint str) >>= \s -> tell (EPWriter { output = s})- else lift (epTokenPrint str) >>= \s -> tell (EPWriter { output = s})+ then lift (epWhitespacePrint str) >>= \s -> tell EPWriter { output = s}+ else lift (epTokenPrint str) >>= \s -> tell EPWriter { output = s} newLine :: (Monad m, Monoid w) => EP w m ()
src/Language/Haskell/GHC/ExactPrint/Transform.hs view
@@ -1001,7 +1001,7 @@ return decls Just keys -> do let ds = map (\s -> (GHC.getLoc s,s)) decls- ordered = orderByKey ds keys+ ordered = map snd $ orderByKey ds keys return ordered -- ---------------------------------------------------------------------
src/Language/Haskell/GHC/ExactPrint/Types.hs view
@@ -1,9 +1,11 @@ {-# LANGUAGE CPP #-} {-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeSynonymInstances #-} module Language.Haskell.GHC.ExactPrint.Types ( -- * Core Types Anns@@ -26,6 +28,9 @@ -- * Other , Rigidity(..)+ , AstContext(..),AstContextSet,defaultACS+ , ACS'(..)+ , ListContexts(..) -- * Internal Types , LayoutStartCol(..)@@ -36,11 +41,12 @@ import Data.Data (Data, Typeable, toConstr,cast) -import qualified DynFlags as GHC+import qualified DynFlags as GHC import qualified GHC import qualified Outputable as GHC import qualified Data.Map as Map+import qualified Data.Set as Set -- --------------------------------------------------------------------- @@ -50,6 +56,10 @@ data Comment = Comment { commentContents :: !String -- ^ The contents of the comment including separators++ -- AZ:TODO: commentIdentifier is a misnomer, should be commentSrcSpan, it is+ -- the thing we use to decide where in the output stream the comment should+ -- go. , commentIdentifier :: !GHC.SrcSpan -- ^ Needed to uniquely identify two comments with the same contents , commentOrigin :: !(Maybe GHC.AnnKeywordId) -- ^ We sometimes turn syntax into comments in order to process them properly. }@@ -135,7 +145,7 @@ -- a as the key, to store the standard annotation. -- These are used to maintain context in the AP and EP monads data AnnKey = AnnKey GHC.SrcSpan AnnConName- deriving (Eq, Ord)+ deriving (Eq, Ord, Data) -- More compact Show instance instance Show AnnKey where@@ -153,7 +163,7 @@ -- Holds the name of a constructor data AnnConName = CN { unConName :: String }- deriving (Eq,Ord)+ deriving (Eq, Ord, Data) -- More compact show instance instance Show AnnConName where@@ -174,7 +184,7 @@ #if __GLASGOW_HASKELL__ <= 710 | AnnUnicode GHC.AnnKeywordId -- ^ Used to indicate that we should print using unicode syntax if possible. #endif- deriving (Eq,Ord)+ deriving (Eq, Ord, Data) instance Show KeywordId where show (G gc) = "(G " ++ show gc ++ ")"@@ -190,7 +200,7 @@ instance GHC.Outputable KeywordId where ppr k = GHC.text (show k) -instance GHC.Outputable (AnnConName) where+instance GHC.Outputable AnnConName where ppr tr = GHC.text (show tr) instance GHC.Outputable Annotation where@@ -205,7 +215,117 @@ -- --------------------------------------------------------------------- -- -- Flag used to control whether we use rigid or normal layout rules.+-- NOTE: check is done via comparison of enumeration order, be careful with any changes data Rigidity = NormalLayout | RigidLayout deriving (Eq, Ord, Show)+{-++Rigidity logic. The same type is used for two different things++1. As a flag in Annotate to the "SetLayoutFlag" operation, which specifies+ NormalLayout - Layout should be captured unconditionally++ RigidLayout - Layout should be captured or not depending on a parameter kept+ in the interpreter Read state++2. As the controlling parameter for the optional (Rigid) layout++The nett effect is the following, where flag is the hard-coded flag value in+Annotate, and param is the interpreter param set when the interpreter is run++ flag | param | result+ -------------+--------------+--------------------+ NormalLayout | either | layout captured+ RigidLayout | NormalLayout | layout NOT captured+ RigidLayout | RigidLayout | layout captured++The flag is only used on HsIf and HsCase++So++ state | HsCase | HsIf+ ----------------------------|-----------+------+ before rigidity flag (AZ) | no layout | layout+ param NormalLayout | no layout | no layout+ param RigidLayout | layout | layout+ ----------------------------+-----------+-------+ desired future HaRe | no layout | layout+ desired future apply-refact | layout | layout+-}++-- ---------------------------------------------------------------------++data ACS' a = ACS+ { acs :: !(Map.Map a Int) -- ^ how many levels each AstContext should+ -- propagate down the AST. Removed when it hits zero+ } deriving (Show)++instance Monoid (ACS' AstContext) where+ mempty = ACS mempty+ -- ACS a `mappend` ACS b = ACS (a `mappend` b)+ ACS a `mappend` ACS b = ACS (Map.unionWith max a b)+ -- For Data.Map, mappend == union, which is a left-biased replace for key collisions++type AstContextSet = ACS' AstContext+-- data AstContextSet = ACS+-- { acs :: !(Map.Map AstContext Int) -- ^ how many levels each AstContext should+-- -- propagate down the AST. Removed when it+-- -- hits zero+-- } deriving (Show)++defaultACS :: AstContextSet+defaultACS = ACS Map.empty++-- instance GHC.Outputable AstContextSet where+instance (Show a) => GHC.Outputable (ACS' a) where+ ppr x = GHC.text $ show x++data AstContext = LambdaExpr+ | CaseAlt+ | NoPrecedingSpace+ | HasHiding+ | AdvanceLine+ | NoAdvanceLine+ | Intercalate -- This item may have a list separator following+ | InIE -- possible 'type' or 'pattern'+ | PrefixOp+ | PrefixOpDollar+ | InfixOp -- RdrName may be used as an infix operator+ | ListStart -- Identifies first element of a list in layout, so its indentation can me managed differently+ | ListItem -- Identifies subsequent elements of a list in layout+ | TopLevel -- top level declaration+ | NoDarrow+ | AddVbar+ | Deriving+ | Parens -- TODO: Not currently used?+ | ExplicitNeverActive+ | InGadt+ | InRecCon+ | InClassDecl+ | InSpliceDecl+ | LeftMost -- Is this the leftmost operator in a chain of OpApps?++ -- Next four used to identify current list context+ | CtxOnly+ | CtxFirst+ | CtxMiddle+ | CtxLast+ | CtxPos Int -- 0 for first, increasing for subsequent++ -- Next are used in tellContext to push context up the tree+ | FollowingLine+ deriving (Eq, Ord, Show)+++data ListContexts = LC { lcOnly,lcInitial,lcMiddle,lcLast :: !(Set.Set AstContext) }+ deriving (Eq,Show)++-- ---------------------------------------------------------------------++-- data LayoutContext = FollowingLine -- ^Indicates that an item such as a SigD+-- -- should not have blank lines after it+-- deriving (Eq, Ord, Show)++-- --------------------------------------------------------------------- declFun :: (forall a . Data a => GHC.Located a -> b) -> GHC.LHsDecl GHC.RdrName -> b declFun f (GHC.L l de) =
src/Language/Haskell/GHC/ExactPrint/Utils.hs view
@@ -20,6 +20,7 @@ , mkKWComment , dpFromString , comment2dp+ , extractComments -- * GHC Functions , srcSpanStartLine@@ -30,6 +31,8 @@ , isSymbolRdrName , tokComment , isListComp+ , isGadt+ , isExactName -- * Manipulating Annotations@@ -42,13 +45,28 @@ , orderByKey + -- * AST Context management+ , setAcs, setAcsWithLevel+ , unsetAcs+ , inAcs+ , pushAcs+ , bumpAcs++#if __GLASGOW_HASKELL__ <= 710+ -- * for boolean formulas in GHC 7.10.3+ -- ,LBooleanFormula, BooleanFormula(..)+ , makeBooleanFormulaAnns+#endif+ -- * For tests , debug , debugM , warn , showGhc , showAnnData+ , occAttributes + , showSDoc_, showSDocDebug_ -- AZ's baggage , ghead,glast,gtail,gfromJust ) where@@ -56,35 +74,39 @@ import Control.Monad.State import qualified Data.ByteString as B-import Data.Data (Data, toConstr, showConstr, cast)-import Data.Generics (extQ, ext1Q, ext2Q, gmapQ)-import Data.List (intercalate, sortBy, elemIndex)+import Data.Generics import Data.Ord (comparing) import Language.Haskell.GHC.ExactPrint.Types import Language.Haskell.GHC.ExactPrint.Lookup --import qualified GHC import qualified Bag as GHC+#if __GLASGOW_HASKELL__ <= 710+import qualified BooleanFormula as GHC+#endif import qualified DynFlags as GHC import qualified FastString as GHC+import qualified GHC import qualified Name as GHC import qualified NameSet as GHC import qualified Outputable as GHC import qualified RdrName as GHC+import qualified SrcLoc as GHC import qualified Var as GHC -import qualified OccName(occNameString)+import qualified OccName(OccName(..),occNameString,pprNameSpaceBrief) import Control.Arrow ---import qualified Data.Generics as SYB- import qualified Data.Map as Map+import qualified Data.Set as Set+import Data.List import Debug.Trace +{-# ANN module "HLint: ignore Eta reduce" #-}+{-# ANN module "HLint: ignore Redundant do" #-}+{-# ANN module "HLint: ignore Reduce duplication" #-} -- --------------------------------------------------------------------- -- |Global switch to enable debug tracing in ghc-exactprint@@ -214,13 +236,13 @@ -- |Given a list of items and a list of keys, returns a list of items -- ordered by their position in the list of keys.-orderByKey :: [(GHC.SrcSpan,a)] -> [GHC.SrcSpan] -> [a]+orderByKey :: [(GHC.SrcSpan,a)] -> [GHC.SrcSpan] -> [(GHC.SrcSpan,a)] orderByKey keys order -- AZ:TODO: if performance becomes a problem, consider a Map of the order -- SrcSpan to an index, and do a lookup instead of elemIndex. -- Items not in the ordering are placed to the start- = map snd (sortBy (comparing (flip elemIndex order . fst)) keys)+ = sortBy (comparing (flip elemIndex order . fst)) keys -- --------------------------------------------------------------------- @@ -241,6 +263,23 @@ -- --------------------------------------------------------------------- +isGadt :: [GHC.LConDecl name] -> Bool+isGadt [] = False+#if __GLASGOW_HASKELL__ <= 710+isGadt (GHC.L _ GHC.ConDecl{GHC.con_res=GHC.ResTyGADT _ _}:_) = True+#else+isGadt ((GHC.L _ (GHC.ConDeclGADT{})):_) = True+#endif+isGadt _ = False++-- ---------------------------------------------------------------------++-- Is a RdrName of type Exact? SYB query, so can be extended to other types too+isExactName :: (Data name) => name -> Bool+isExactName = False `mkQ` GHC.isExact++-- ---------------------------------------------------------------------+ ghcCommentText :: GHC.Located GHC.AnnotationComment -> String ghcCommentText (GHC.L _ (GHC.AnnDocCommentNext s)) = s ghcCommentText (GHC.L _ (GHC.AnnDocCommentPrev s)) = s@@ -264,6 +303,11 @@ comment2dp :: (Comment, DeltaPos) -> (KeywordId, DeltaPos) comment2dp = first AnnComment +extractComments :: GHC.ApiAnns -> [Comment]+extractComments (_,cm)+ -- cm has type :: Map SrcSpan [Located AnnotationComment]+ = map tokComment . GHC.sortLocated . concat $ Map.elems cm+ getAnnotationEP :: (Data a) => GHC.Located a -> Anns -> Maybe Annotation getAnnotationEP la as = Map.lookup (mkAnnKey la) as@@ -314,15 +358,128 @@ case r of GHC.Unqual occ -> GHC.occNameString occ GHC.Qual modname occ -> GHC.moduleNameString modname ++ "."- ++ GHC.occNameString occ- GHC.Orig _ occ -> GHC.occNameString occ- GHC.Exact _ -> error $ "GHC.Exact introduced after renaming" ++ showGhc r+ ++ GHC.occNameString occ+ GHC.Orig _ occ -> GHC.occNameString occ+ GHC.Exact n -> GHC.getOccString n name2String :: GHC.Name -> String name2String = showGhc -- --------------------------------------------------------------------- +-- | Put the provided context elements into the existing set with fresh level+-- counts+setAcs :: Set.Set AstContext -> AstContextSet -> AstContextSet+setAcs ctxt acs = setAcsWithLevel ctxt 3 acs++-- | Put the provided context elements into the existing set with given level+-- counts+-- setAcsWithLevel :: Set.Set AstContext -> Int -> AstContextSet -> AstContextSet+-- setAcsWithLevel ctxt level (ACS a) = ACS a'+-- where+-- upd s (k,v) = Map.insert k v s+-- a' = foldl' upd a $ zip (Set.toList ctxt) (repeat level)+setAcsWithLevel :: (Ord a) => Set.Set a -> Int -> ACS' a -> ACS' a+setAcsWithLevel ctxt level (ACS a) = ACS a'+ where+ upd s (k,v) = Map.insert k v s+ a' = foldl' upd a $ zip (Set.toList ctxt) (repeat level)++-- ---------------------------------------------------------------------+-- | Remove the provided context element from the existing set+-- unsetAcs :: AstContext -> AstContextSet -> AstContextSet+unsetAcs :: (Ord a) => a -> ACS' a -> ACS' a+unsetAcs ctxt (ACS a) = ACS $ Map.delete ctxt a++-- ---------------------------------------------------------------------++-- | Are any of the contexts currently active?+-- inAcs :: Set.Set AstContext -> AstContextSet -> Bool+inAcs :: (Ord a) => Set.Set a -> ACS' a -> Bool+inAcs ctxt (ACS a) = not $ Set.null $ Set.intersection ctxt (Set.fromList $ Map.keys a)++-- | propagate the ACS down a level, dropping all values which hit zero+-- pushAcs :: AstContextSet -> AstContextSet+pushAcs :: ACS' a -> ACS' a+pushAcs (ACS a) = ACS $ Map.mapMaybe f a+ where+ f n+ | n <= 1 = Nothing+ | otherwise = Just (n - 1)++-- |Sometimes we have to pass the context down unchanged. Bump each count up by+-- one so that it is unchanged after a @pushAcs@ call.+-- bumpAcs :: AstContextSet -> AstContextSet+bumpAcs :: ACS' a -> ACS' a+bumpAcs (ACS a) = ACS $ Map.mapMaybe f a+ where+ f n = Just (n + 1)++-- ---------------------------------------------------------------------++#if __GLASGOW_HASKELL__ <= 710++ -- to be called in annotationsToCommentsBF by the pretty printer+makeBooleanFormulaAnns :: (GHC.Outputable a)+ => GHC.BooleanFormula (GHC.Located a) -> [(GHC.AnnKeywordId,GHC.SrcSpan)]+makeBooleanFormulaAnns bf = go 1 bf+ where+ go :: (GHC.Outputable a)+ => Int -> GHC.BooleanFormula (GHC.Located a) -> [(GHC.AnnKeywordId,GHC.SrcSpan)]+ go _ (GHC.Var _) = []+ go l v@(GHC.And [a,b]) =+ go 3 a +++ go 3 b +++ (if l > 3 then addParensIfNeeded v else []) +++ [(GHC.AnnComma, ssAfter (getBoolSrcSpan a))]+ go l v@(GHC.Or [a,b]) =+ go 2 a +++ go 2 b +++ (if l > 2 then addParensIfNeeded v else []) +++ [(GHC.AnnVbar, ssAfter (getBoolSrcSpan a) )]+ go _ x = error $ "makeBooleanFormulaAnns: unexpected case:" ++ showGhc x+++addParensIfNeeded :: GHC.Outputable a+ => GHC.BooleanFormula (GHC.Located a)+ -> [(GHC.AnnKeywordId, GHC.SrcSpan)]+addParensIfNeeded (GHC.Var _) = []+addParensIfNeeded a = [(GHC.AnnOpenP,opp),(GHC.AnnCloseP,cpp)]+ where+ ss = getBoolSrcSpan a+ opp = ssBefore ss+ cpp = ssAfter ss+++-- ssFor a b = GHC.combineSrcSpans (getBoolSrcSpan a) (getBoolSrcSpan b)++-- | Generate a SrcSpan of single char length before the given one+ssBefore :: GHC.SrcSpan -> GHC.SrcSpan+ssBefore a = GHC.mkSrcSpan (GHC.RealSrcLoc s) (GHC.RealSrcLoc e)+ where+ GHC.RealSrcLoc as = GHC.srcSpanStart a+ s = GHC.mkRealSrcLoc (GHC.srcLocFile as) (GHC.srcLocLine as) (GHC.srcLocCol as - 2)+ e = GHC.mkRealSrcLoc (GHC.srcLocFile as) (GHC.srcLocLine as) (GHC.srcLocCol as - 1)++-- | Generate a SrcSpan of single char length after the given one+ssAfter :: GHC.SrcSpan -> GHC.SrcSpan+ssAfter a = GHC.mkSrcSpan (GHC.RealSrcLoc s) (GHC.RealSrcLoc e)+ where+ GHC.RealSrcLoc ae = GHC.srcSpanEnd a+ s = ae+ e = GHC.advanceSrcLoc s ' '+++getBoolSrcSpan :: (GHC.Outputable a) => GHC.BooleanFormula (GHC.Located a) -> GHC.SrcSpan+getBoolSrcSpan (GHC.Var (GHC.L ss _)) = ss+getBoolSrcSpan (GHC.And [a,b]) = GHC.combineSrcSpans (getBoolSrcSpan a) (getBoolSrcSpan b)+getBoolSrcSpan (GHC.Or [a,b]) = GHC.combineSrcSpans (getBoolSrcSpan a) (getBoolSrcSpan b)+getBoolSrcSpan x = error $ "getBoolSrcSpan: unexpected case:" ++ showGhc x++#endif++-- ---------------------------------------------------------------------+ -- | Show a GHC AST with interleaved Annotation information. showAnnData :: Data a => Anns -> Int -> a -> String showAnnData anns n =@@ -348,7 +505,8 @@ ++ intercalate "," (map (showAnnData anns (n+1)) l) ++ "]" name = ("{Name: "++) . (++"}") . showSDocDebug_ . GHC.ppr :: GHC.Name -> String- occName = ("{OccName: "++) . (++"}") . OccName.occNameString+ -- occName = ("{OccName: "++) . (++"}") . OccName.occNameString+ occName o = "{OccName: "++ OccName.occNameString o ++ " " ++ occAttributes o ++ "}" moduleName = ("{ModuleName: "++) . (++"}") . showSDoc_ . GHC.ppr :: GHC.ModuleName -> String -- srcSpan = ("{"++) . (++"}") . showSDoc_ . GHC.ppr :: GHC.SrcSpan -> String@@ -392,16 +550,27 @@ ++ showAnnData anns (n+1) a ++ ")" -{-- showWrappedDeclAnns :: (Data a) => GHC.Located a -> Maybe String- showWrappedDeclAnns t = everything mappend (Nothing `mkQ` showDecl) t- where- showDecl :: GHC.LHsDecl GHC.RdrName -> Maybe String- showDecl d = Just $ declFun doShowAnn d - doShowAnn :: (Data a) => GHC.Located a -> String- doShowAnn a = show (getAnnotationEP a anns)+occAttributes :: OccName.OccName -> String+occAttributes o = "(" ++ ns ++ vo ++ tv ++ tc ++ d ++ ds ++ s ++ v ++ ")"+ where+ ns = (GHC.showSDocUnsafe $ OccName.pprNameSpaceBrief $ GHC.occNameSpace o) ++ ", "+ vo = if GHC.isVarOcc o then "Var " else ""+ tv = if GHC.isTvOcc o then "Tv " else ""+ tc = if GHC.isTcOcc o then "Tc " else ""+ d = if GHC.isDataOcc o then "Data " else ""+ ds = if GHC.isDataSymOcc o then "DataSym " else ""+ s = if GHC.isSymOcc o then "Sym " else ""+ v = if GHC.isValOcc o then "Val " else ""++{-+data NameSpace = VarName -- Variables, including "real" data constructors+ | DataName -- "Source" data constructors+ | TvName -- Type variables+ | TcClsName -- Type constructors and classes; Haskell has them+ -- in the same name space for now. -}+ -- --------------------------------------------------------------------- showSDoc_ :: GHC.SDoc -> String
tests/PrepareHackage.hs view
@@ -19,7 +19,7 @@ main = do packages <- allCabalPackages -- packages <- allCabalPackagesTest- echo (T.pack $ "number of packages:" ++ (show $ length packages))+ myecho (T.pack $ "number of packages:" ++ (show $ length packages)) packageDirsFull <- drop 2 <$> getDirectoryContents hackageWorkDir let cond c = c == '.' || c == '-' || isDigit c let packageDirs = map (T.dropWhileEnd cond . T.pack) packageDirsFull@@ -35,19 +35,19 @@ preparePackage :: Set.Set Text -> Text -> IO () preparePackage alreadyUnpacked package = do- echo $ "preparePackage:" <> package+ myecho $ "preparePackage:" <> package if Set.member package alreadyUnpacked- then echo $ "already unpacked:" <> package+ then myecho $ "already unpacked:" <> package else preparePackage' package preparePackage' :: Text -> IO () preparePackage' package = do (ec,dir) <- shellStrict ("cabal get --destdir=" <> T.pack hackageWorkDir <> " " <> package) empty- -- echo (T.pack $ "cabal get:" ++ show dir)- echo (T.pack $ show ec)+ -- myecho (T.pack $ "cabal get:" ++ show dir)+ myecho (T.pack $ show ec) when (ec == ExitSuccess) $ do let bits = T.splitOn " " (head $ T.lines dir)- echo (T.pack $ "cabal get:dir=" ++ show (last bits))+ myecho (T.pack $ "cabal get:dir=" ++ show (last bits)) cleanPackage (last bits) return () @@ -57,28 +57,25 @@ cleanPackage :: Text -> IO () cleanPackage dir = do- echo ("cleaning:" <> dir)+ myecho ("cleaning:" <> dir) fs <- findSrcFiles (T.unpack dir) let doOne :: FilePath -> IO () doOne fn = do- echo ("doOne:" <> T.pack fn)+ myecho ("doOne:" <> T.pack fn) let tmpFn = fn <.> "clean" clean <- cleanupWhiteSpace fn writeFile tmpFn clean- -- writeFileUtf8 tmpFn clean- -- T.writeFile tmpFn (T.pack clean) -- convert to Text to deal with encoding issues of is8859 euro symbol removeFile fn renameFile tmpFn fn return () mapM_ doOne fs- echo ("cleaned up:" <> dir)+ myecho ("cleaned up:" <> dir) -- --------------------------------------------------------------------- -- | The computation 'writeFile' @file str@ function writes the string @str@, -- to the file @file@. writeFileUtf8 :: FilePath -> String -> IO ()--- writeFileUtf8 ff txt = withFile ff WriteMode (\ hdl -> hSetEncoding hdl utf8 >> hPutStr hdl txt) writeFileUtf8 ff txt = withFile ff WriteMode (\ hdl -> hSetEncoding hdl utf8 >> GHC.hPutStr hdl txt) -- ---------------------------------------------------------------------@@ -95,7 +92,7 @@ let cmd = "cabal list --simple-output | awk '{ print $1 }' | sort | uniq" (_ec,r) <- shellStrict cmd empty let packages = T.lines r- echo (T.pack $ show $ take 5 packages)+ myecho (T.pack $ show $ take 5 packages) return packages -- ---------------------------------------------------------------------@@ -106,13 +103,7 @@ contents <- readFileGhc file let cleaned = map cleanupOneLine (lines $ contents) return (unlines cleaned)-{--cleanupWhiteSpace :: FilePath -> IO T.Text-cleanupWhiteSpace file = do- contents <- readFileGhc file- let cleaned = map cleanupOneLine (T.lines $ T.pack contents)- return (T.unlines cleaned)--}+ tabWidth :: Int tabWidth = 8 @@ -138,28 +129,6 @@ (c:cur') ->go (col + 1) (c:res) cur' str1 = go 0 [] str str' = reverse $ dropWhile isSpace str1-{--cleanupOneLine :: T.Text -> T.Text-cleanupOneLine str = str'- where- numSpacesForTab n = tabWidth - (n `mod` tabWidth)- -- loop over the line, keeping current pos. Where a tab is found, insert- -- spaces until the next tab stop. Discard any trailing whitespace.- go col res cur =- if T.null cur- then res- else- case T.head cur of- '\t' -> go (col + toAdd) (res <> T.replicate toAdd " ") (T.tail cur)- where- toAdd = numSpacesForTab col- '\xa0' -> go (col + 1) (T.snoc res ' ') (T.tail cur)- -- nonBreakingSpace -> go (col + 1) (T.snoc res ' ') (T.tail cur)- c -> go (col + 1) (T.snoc res c) (T.tail cur)- str1 = go 0 T.empty str- -- str2 = T.map (\c -> if c == nonBreakingSpace then ' ' else c) str1- str' = T.dropWhileEnd isSpace str1--} -- --------------------------------------------------------------------- @@ -187,6 +156,11 @@ testList :: String -> [Test] -> Test testList str ts = TestLabel str (TestList ts)++-- ---------------------------------------------------------------------++myecho :: T.Text -> IO ()+myecho t = mapM_ echo (textToLines t) -- ---------------------------------------------------------------------
tests/Test.hs view
@@ -5,13 +5,7 @@ -- | Use "runhaskell Setup.hs test" or "cabal test" to run these tests. module Main where -import Language.Haskell.GHC.ExactPrint.Utils ( showGhc )---- import qualified FastString as GHC--- import qualified GHC as GHC---- import qualified Data.Generics as SYB--- import qualified GHC.SYB.Utils as SYB+-- import Language.Haskell.GHC.ExactPrint.Utils ( showGhc ) import Control.Monad import System.Directory@@ -24,6 +18,7 @@ import System.IO.Silently import Test.Common+import Test.NoAnnotations import Test.Transform import Test.HUnit@@ -73,8 +68,19 @@ -- --------------------------------------------------------------------- findTests :: IO Test-findTests = testList "Round-trip tests" <$> mapM findTestsDir testDirs+findTests = testList "Round-trip tests" <$> mapM (findTestsDir mkParserTest) testDirs +findPrettyTests :: IO Test+findPrettyTests = testList "Default Annotations round-trip tests" <$> mapM (findTestsDir mkPrettyRoundtrip) testDirs++findTestsDir :: (FilePath -> FilePath -> Test) -> FilePath -> IO Test+findTestsDir mkTestFn dir = do+ let fp = testPrefix </> dir+ fs <- getDirectoryContents fp+ let testFiles = sort $ filter (".hs" `isSuffixOf`) fs+ -- return $ testList dir (map (mkTestFn dir) testFiles)+ return $ testList dir (map (\fn -> TestLabel fn (mkTestFn dir fn)) testFiles)+ listTests :: IO () listTests = do let@@ -86,18 +92,15 @@ files <- mapM ftd testDirs putStrLn $ "round trip tests:" ++ show (zip testDirs files) -findTestsDir :: FilePath -> IO Test-findTestsDir dir = do- let fp = testPrefix </> dir- fs <- getDirectoryContents fp- let testFiles = sort $ filter (".hs" `isSuffixOf`) fs- return $ testList dir (map (mkParserTest dir) testFiles)- mkTests :: IO Test mkTests = do -- listTests roundTripTests <- findTests- return $ TestList [internalTests,roundTripTests, transformTests, failingTests]+ prettyRoundTripTests <- findPrettyTests+ return $ TestList [+ internalTests, roundTripTests, transformTests, failingTests, noAnnotationTests+ -- , prettyRoundTripTests+ ] -- Tests that will fail until https://phabricator.haskell.org/D907 lands in a -- future GHC@@ -106,9 +109,12 @@ [ -- Tests requiring future GHC modifications mkTestModBad "InfixOperator.hs"+ , mkTestModBad "CtorOp.hs" -- Should be fixed in GHC 8.2 #if __GLASGOW_HASKELL__ > 710 , mkTestModBad "overloadedlabelsrun04.hs"+ , mkTestModBad "TensorTests.hs" -- Should be fixed in GHC 8.2+ , mkTestModBad "List2.hs" -- Should be fixed in GHC 8.2 #else , mkTestModBad "UnicodeSyntax.hs" , mkTestModBad "UnicodeRules.hs"@@ -121,19 +127,7 @@ mkParserTest :: FilePath -> FilePath -> Test-mkParserTest dir fp =- let basename = testPrefix </> dir </> fp- writeFailure = writeFile (basename <.> "out")- writeHsPP = writeFile (basename <.> "hspp")- writeIncons s = writeFile (basename <.> "incons") (showGhc s)- in- TestCase (do r <- either (\(ParseFailure _ s) -> error (s ++ basename)) id- <$> roundTripTest basename- writeFailure (debugTxt r)- forM_ (inconsistent r) writeIncons- forM_ (cppStatus r) writeHsPP- assertBool fp (status r == Success))-+mkParserTest dir fp = mkParsingTest roundTripTest dir fp -- --------------------------------------------------------------------- @@ -147,29 +141,32 @@ putStrLn "Fail" mapM_ (putStrLn . fst) fs) +tr :: IO (Counts,Int)+tr = hSilence [stderr] $ do+ prettyRoundTripTests <- findPrettyTests+ runTestText (putTextToHandle stdout True) prettyRoundTripTests+ tt' :: IO (Counts,Int) tt' = runTestText (putTextToHandle stdout True) $ TestList [ -- mkParserTest "ghc710" "Unicode.hs" - -- , mkParserTest "ghc8" "BundleExport.hs"- -- , mkParserTest "ghc8" "ExportSyntax.hs"- -- , mkParserTest "ghc8" "T10689a.hs"- -- , mkParserTest "ghc8" "Test10313.hs"- -- , mkParserTest "ghc8" "Test11018.hs"- -- , mkParserTest "ghc8" "determ004.hs"- -- , mkParserTest "ghc8" "export-class.hs"- -- , mkParserTest "ghc8" "export-syntax.hs"- -- , mkParserTest "ghc8" "export-type.hs"- -- , mkParserTest "ghc8" "overloadedlabelsrun04.hs"- -- mkParserTest "ghc710" "RdrNames.hs"- mkParserTest "ghc710" "Process1.hs"- -- mkParserTest "ghc8" "T10620.hs"- -- mkParserTest "ghc8" "Vta1.hs"- -- , mkParserTest "ghc8" "Vta2.hs"- -- , mkParserTest "failing" "Deprecation.hs"- -- , mkParserTest "failing" "MultiLineWarningPragma.hs"- -- , mkParserTest "failing" "UnicodeRules.hs"- -- , mkParserTest "failing" "UnicodeSyntax.hs"+ -- mkPrettyRoundtrip "ghc8" "StringSource.hs"+ -- mkPrettyRoundtrip "ghc8" "records-prov-req.hs"+ -- mkPrettyRoundtrip "ghc8" "records-poly-update.hs"+ -- mkPrettyRoundtrip "ghc8" "poly-export-fail2.hs"+ mkPrettyRoundtrip "ghc8" "pmc007.hs"++ -- mkParserTest "ghc8" "DatatypeContexts.hs"+ -- mkParserTest "ghc8" "Families.hs"++ -- Needs GHC changes+ -- , mkParserTest "failing" "CtorOp.hs"+ -- mkParserTest "failing" "TensorTests.hs"+ -- mkParserTest "failing" "List2.hs"+++ -- mkParserTest "ghc710" "DroppedComma.hs"+ ] testsTT :: Test
tests/Test/Common.hs view
@@ -12,6 +12,7 @@ , ParseFailure(..) , ReportType(..) , roundTripTest+ , mkParsingTest , getModSummaryForFile , testList@@ -19,6 +20,7 @@ , Changer , genTest , noChange+ , mkDebugOutput ) where @@ -31,21 +33,22 @@ import qualified ApiAnnotation as GHC import qualified DynFlags as GHC-import qualified FastString as GHC+-- import qualified FastString as GHC import qualified GHC as GHC hiding (parseModule)-import qualified Lexer as GHC+-- import qualified Lexer as GHC import qualified MonadUtils as GHC-import qualified Parser as GHC-import qualified SrcLoc as GHC-import qualified StringBuffer as GHC+-- import qualified Parser as GHC+-- import qualified SrcLoc as GHC+-- import qualified StringBuffer as GHC #if __GLASGOW_HASKELL__ <= 710 #else import qualified GHC.LanguageExtensions as LangExt #endif -import qualified Data.Map as Map+-- import qualified Data.Map as Map +import Control.Monad import Data.List hiding (find) import System.Directory@@ -69,9 +72,9 @@ data RoundtripReport = Report- { debugTxt :: String- , status :: ReportType- , cppStatus :: Maybe String -- Result of CPP if invoked+ { debugTxt :: String+ , status :: ReportType+ , cppStatus :: Maybe String -- Result of CPP if invoked , inconsistent :: Maybe [(GHC.SrcSpan, (GHC.AnnKeywordId, [GHC.SrcSpan]))] } @@ -81,6 +84,7 @@ Success | RoundTripFailure deriving (Eq, Show) +{- runParser :: GHC.P a -> GHC.DynFlags -> FilePath -> String -> GHC.ParseResult a runParser parser flags filename str = GHC.unP parser parseState where@@ -97,10 +101,27 @@ removeSpaces :: String -> String removeSpaces = map (\case {'\160' -> ' '; s -> s})+-} roundTripTest :: FilePath -> IO Report roundTripTest f = genTest noChange f f ++mkParsingTest :: (FilePath -> IO Report) -> FilePath -> FilePath -> Test+mkParsingTest tester dir fp =+ let basename = testPrefix </> dir </> fp+ writeFailure = writeFile (basename <.> "out")+ writeHsPP = writeFile (basename <.> "hspp")+ writeIncons s = writeFile (basename <.> "incons") (showGhc s)+ in+ TestCase (do r <- either (\(ParseFailure _ s) -> error (s ++ basename)) id+ <$> tester basename+ writeFailure (debugTxt r)+ forM_ (inconsistent r) writeIncons+ forM_ (cppStatus r) writeHsPP+ assertBool fp (status r == Success))++ type Changer = (Anns -> GHC.ParsedSource -> IO (Anns,GHC.ParsedSource)) noChange :: Changer@@ -163,7 +184,8 @@ let !relAnns = relativiseApiAnnsWithComments cs parsedOrig anns (annsMod, pmod) <- f relAnns parsedOrig let !printed = exactPrint pmod annsMod- return (printed, relAnns, pmod)+ -- return (printed, relAnns, pmod)+ return (printed, annsMod, pmod) -- ---------------------------------------------------------------------`
+ tests/Test/NoAnnotations.hs view
@@ -0,0 +1,218 @@+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE NamedFieldPuns #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TupleSections #-}+module Test.NoAnnotations where++-- import Control.Monad.State+import Data.Algorithm.Diff+import Data.Algorithm.DiffOutput+import Data.Data (Data, toConstr, showConstr, cast)+import Data.Generics (extQ, ext1Q, ext2Q, gmapQ)+import Data.List+-- import Data.Ord (comparing)+import qualified Data.ByteString as B++import Language.Haskell.GHC.ExactPrint+-- import Language.Haskell.GHC.ExactPrint.Annotate+import Language.Haskell.GHC.ExactPrint.Parsers+import Language.Haskell.GHC.ExactPrint.Pretty+import Language.Haskell.GHC.ExactPrint.Types+import Language.Haskell.GHC.ExactPrint.Utils++import qualified ApiAnnotation as GHC+import qualified Bag as GHC+-- import qualified DynFlags as GHC+import qualified FastString as GHC+import qualified GHC as GHC hiding (parseModule)+-- import qualified Lexer as GHC+import qualified MonadUtils as GHC+-- import qualified Name as GHC+import qualified NameSet as GHC+-- import qualified OccName as GHC+import qualified Outputable as GHC+-- import qualified Parser as GHC+-- import qualified RdrName as GHC+import qualified SrcLoc as GHC+-- import qualified StringBuffer as GHC+import qualified Var as GHC++import qualified OccName(occNameString)++-- import qualified Data.Generics as SYB+-- import qualified GHC.SYB.Utils as SYB+++import System.Directory+import System.FilePath+-- import System.FilePath.Posix+-- import System.IO+import qualified Data.Map as Map+-- import Data.List+-- import Data.Maybe++import Test.Common++import Test.HUnit++{-# ANN module "HLint: ignore Eta reduce" #-}++-- ---------------------------------------------------------------------++noAnnotationTests :: Test+noAnnotationTests = TestLabel "no annotation tests" $ TestList+ [+ TestLabel "no annotations"+ (TestList noAnnTests)+ ]++noAnnTests :: [Test]+noAnnTests = [+ + ]++-- ---------------------------------------------------------------------++mkPrettyRoundtrip :: FilePath -> FilePath -> Test+mkPrettyRoundtrip dir fp = mkParsingTest prettyRoundtripTest dir fp++prettyRoundtripTest :: FilePath -> IO Report+prettyRoundtripTest origFile = do+ res <- parseModuleApiAnnsWithCpp defaultCppOptions origFile+ case res of+ Left (ss, m) -> return . Left $ ParseFailure ss m+ Right (apianns, injectedComments, _dflags, parsed) -> do+ res2 <- GHC.liftIO (runPrettyRoundTrip origFile apianns parsed injectedComments)+ case res2 of+ Left (ss, m) -> return . Left $ ParseFailure ss m+ Right (_anns', parsed') -> do+ let+ originalStructure = astStructure parsed []+ roundtripStructure = astStructure parsed' []+ (status,debugTxt') = if roundtripStructure == originalStructure+ then (Success, "ok")+ else (RoundTripFailure,diffText originalStructure roundtripStructure)+ cppStatus = Nothing+ inconsistent = Nothing+ !annsOrig = relativiseApiAnnsWithComments injectedComments parsed apianns+ debugTxt = intercalate sep [ debugTxt'+ , originalStructure+ , roundtripStructure+ , showAnnData annsOrig 0 parsed+ ]+ sep = "\n=====================================\n"+ return $ Right Report {debugTxt,status,cppStatus,inconsistent}++-- ---------------------------------------------------------------------++runPrettyRoundTrip :: FilePath -> GHC.ApiAnns -> GHC.ParsedSource+ -> [Comment]+ -> IO (Either (GHC.SrcSpan, String)(Anns, GHC.ParsedSource))+runPrettyRoundTrip origFile !anns !parsedOrig _cs = do+ let !newAnns = addAnnotationsForPretty [] parsedOrig mempty+ let comments = case Map.lookup GHC.noSrcSpan (snd anns) of+ Nothing -> []+ Just cl -> map tokComment $ GHC.sortLocated cl+ let pragmas = filter (\(Comment c _ _) -> isPrefixOf "{-#" c ) comments+ let pragmaStr = intercalate "\n" $ map commentContents pragmas++ let !printed = pragmaStr ++ "\n" ++ exactPrint parsedOrig newAnns+ -- let !printed = pragmaStr ++ "\n" ++ (showSDoc_ $ GHC.ppr parsedOrig)++ parseString origFile printed newAnns parsedOrig+++parseString :: FilePath -> String -> Anns -> GHC.ParsedSource+ -> IO (Either (GHC.SrcSpan, String) (Anns, GHC.ParsedSource))+parseString origFile src newAnns origParsed = do+ tmpDir <- getTemporaryDirectory+ let workDir = tmpDir </> "ghc-exactprint" </> "noannotations"+ -- putStrLn $ "workDir=" ++ workDir+ createDirectoryIfMissing True workDir+ let fileName = workDir </> takeFileName origFile+ writeFile (workDir </> takeFileName origFile <.> ".anns")+ (showAnnData newAnns 0 origParsed)+ writeFile fileName src+ parseModule fileName++-- ---------------------------------------------------------------------++diffText :: String -> String -> String+diffText f1 f2 = diff+ where+ d = getGroupedDiff (lines f1) (lines f2)+ diff = ppDiff d++-- ---------------------------------------------------------------------++-- |Convert an AST with comments into a string representing the structure only+-- (i.e. ignoring locations), to be used for comparisons between the original+-- AST and the one after pretty-print roundtripping.+-- Based on @showAnnData@+astStructure :: GHC.ParsedSource -> [Comment] -> String+astStructure parsed _cs = r+ where+ r = showAstData 0 parsed++++-- | Show a GHC AST with interleaved Annotation information.+showAstData :: Data a => Int -> a -> String+showAstData n =+ generic -- `ext1Q` located+ `ext1Q` list+ `extQ` string `extQ` fastString `extQ` srcSpan+ `extQ` bytestring+ `extQ` name `extQ` occName `extQ` moduleName `extQ` var `extQ` dataCon+ `extQ` overLit+ `extQ` bagName `extQ` bagRdrName `extQ` bagVar `extQ` nameSet+ `extQ` fixity+ `ext2Q` located+ where generic :: Data a => a -> String+ generic t = indent n ++ "(" ++ showConstr (toConstr t)+ ++ space (unwords (gmapQ (showAstData (n+1)) t)) ++ ")"+ space "" = ""+ space s = ' ':s+ indent i = "\n" ++ replicate i ' '+ string = show :: String -> String+ fastString = ("{FastString: "++) . (++"}") . show :: GHC.FastString -> String+ bytestring = show :: B.ByteString -> String+ list l = indent n ++ "["+ ++ intercalate "," (map (showAstData (n+1)) l) ++ "]"++ name = ("{Name: "++) . (++"}") . showSDocDebug_ . GHC.ppr :: GHC.Name -> String+ occName = ("{OccName: "++) . (++"}") . OccName.occNameString+ moduleName = ("{ModuleName: "++) . (++"}") . showSDoc_ . GHC.ppr :: GHC.ModuleName -> String++ srcSpan :: GHC.SrcSpan -> String+ srcSpan _ss = "{ "++ "ss" ++"}"++ var = ("{Var: "++) . (++"}") . showSDocDebug_ . GHC.ppr :: GHC.Var -> String+ dataCon = ("{DataCon: "++) . (++"}") . showSDoc_ . GHC.ppr :: GHC.DataCon -> String++ overLit :: GHC.HsOverLit GHC.RdrName -> String+ overLit = ("{HsOverLit:"++) . (++"}") . showSDoc_ . GHC.ppr++ bagRdrName:: GHC.Bag (GHC.Located (GHC.HsBind GHC.RdrName)) -> String+ bagRdrName = ("{Bag(Located (HsBind RdrName)): "++) . (++"}") . list . GHC.bagToList+ bagName :: GHC.Bag (GHC.Located (GHC.HsBind GHC.Name)) -> String+ bagName = ("{Bag(Located (HsBind Name)): "++) . (++"}") . list . GHC.bagToList+ bagVar :: GHC.Bag (GHC.Located (GHC.HsBind GHC.Var)) -> String+ bagVar = ("{Bag(Located (HsBind Var)): "++) . (++"}") . list . GHC.bagToList++ nameSet = ("{NameSet: "++) . (++"}") . list . GHC.nameSetElems++ fixity = ("{Fixity: "++) . (++"}") . showSDoc_ . GHC.ppr :: GHC.Fixity -> String++ located :: (Data b,Data loc) => GHC.GenLocated loc b -> String+ located (GHC.L ss a) =+ indent n ++ "("+ ++ case cast ss of+ Just (s :: GHC.SrcSpan) ->+ srcSpan s+ Nothing -> "nnnnnnnn"+ ++ showAstData (n+1) a+ ++ ")"++-- ---------------------------------------------------------------------
tests/Test/Transform.hs view
@@ -702,7 +702,8 @@ imp1' = imp1 { GHC.ideclHiding = Just (True,impHiding)} p' = p { GHC.hsmodImports = [GHC.L li imp1',imp2]} addSimpleAnnT impHiding (DP (0,1)) [((G GHC.AnnHiding),DP (0,0)),((G GHC.AnnOpenP),DP (0,1)),((G GHC.AnnCloseP),DP (0,0))]- addSimpleAnnT n1 (DP (0,0)) [((G GHC.AnnVal),DP (0,0)),((G GHC.AnnComma),DP (0,0))]+ addSimpleAnnT n1 (DP (0,0)) [((G GHC.AnnVal),DP (0,0))]+ addSimpleAnnT v1 (DP (0,0)) [((G GHC.AnnComma),DP (0,0))] addSimpleAnnT n2 (DP (0,0)) [((G GHC.AnnVal),DP (0,0))] return (GHC.L l p') @@ -719,16 +720,16 @@ let [GHC.L li imp1] = GHC.hsmodImports p Just (_,GHC.L lh ns) = GHC.ideclHiding imp1- (GHC.L _ (GHC.IEVar ln)) = last ns n1 = GHC.L l1 (GHC.mkVarUnqual (GHC.mkFastString "n1")) n2 = GHC.L l2 (GHC.mkVarUnqual (GHC.mkFastString "n2")) v1 = GHC.L l1 (GHC.IEVar n1) v2 = GHC.L l2 (GHC.IEVar n2) imp1' = imp1 { GHC.ideclHiding = Just (True,GHC.L lh (ns ++ [v1,v2]))} p' = p { GHC.hsmodImports = [GHC.L li imp1']}- addSimpleAnnT n1 (DP (0,0)) [((G GHC.AnnVal),DP (0,0)),((G GHC.AnnComma),DP (0,0))]+ addSimpleAnnT n1 (DP (0,0)) [((G GHC.AnnVal),DP (0,0))]+ addSimpleAnnT v1 (DP (0,0)) [((G GHC.AnnComma),DP (0,0))] addSimpleAnnT n2 (DP (0,0)) [((G GHC.AnnVal),DP (0,0))]- addTrailingCommaT ln+ addTrailingCommaT (last ns) return (GHC.L l p') let (lp',(ans',_),_w) = runTransform ans doTransform
+ tests/examples/failing/CtorOp.hs view
@@ -0,0 +1,11 @@+{-# LANGUAGE TypeOperators #-}+module Decl.CtorOp where++data a :+: b = a :+: b++data (a :!: b) c = a c :!: b c++data ((:-:) a) b = a :-: b++data (:*:) a b = a :*: b+
+ tests/examples/failing/CtorOp.hs.bad view
@@ -0,0 +1,11 @@+{-# LANGUAGE TypeOperators #-}+module Decl.CtorOp where++data a :+: b = a :+: b++data (a :!: b) c = a c :!: b c++data ((:-:) a b = a :-: b++data (:*:) a b = a :*: b+
+ tests/examples/failing/List2.hs view
@@ -0,0 +1,40 @@+{-# LANGUAGE TypeFamilyDependencies #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE GADTs #-}+-----------------------------------------------------------------------------+-- |+-- Module : Type.Family.List+-- Copyright : Copyright (C) 2015 Kyle Carter+-- License : BSD3+--+-- Maintainer : Kyle Carter <kylcarte@indiana.edu>+-- Stability : experimental+-- Portability : RankNTypes+--+-- Convenient aliases and type families for working with+-- type-level lists.+----------------------------------------------------------------------------++module Type.Family.List where++import Type.Family.Constraint+import Type.Family.Monoid+import Type.Family.Tuple hiding (type (<$>),type (<*>),type (<&>))+import Type.Class.Witness++type Ø = '[]+type (:<) = '(:)+infixr 5 :<+
+ tests/examples/failing/List2.hs.bad view
@@ -0,0 +1,40 @@+{-# LANGUAGE TypeFamilyDependencies #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE GADTs #-}+-----------------------------------------------------------------------------+-- |+-- Module : Type.Family.List+-- Copyright : Copyright (C) 2015 Kyle Carter+-- License : BSD3+--+-- Maintainer : Kyle Carter <kylcarte@indiana.edu>+-- Stability : experimental+-- Portability : RankNTypes+--+-- Convenient aliases and type families for working with+-- type-level lists.+----------------------------------------------------------------------------++module Type.Family.List where++import Type.Family.Constraint+import Type.Family.Monoid+import Type.Family.Tuple hiding (type (<$>),type (<*>),type (<&>))+import Type.Class.Witness++type Ø = '[]+type (:<) = (:)+infixr 5 :<+
+ tests/examples/failing/TensorTests.hs view
@@ -0,0 +1,41 @@+{-# LANGUAGE ConstraintKinds, FlexibleContexts, DataKinds, NoImplicitPrelude,+ RebindableSyntax, ScopedTypeVariables, TypeFamilies, TypeOperators,+ UndecidableInstances #-}++module TensorTests (tensorTests) where++import Apply.Cyc+import Tests+import Utils++import TestTypes++import Crypto.Lol+import Crypto.Lol.CRTrans+import Crypto.Lol.Cyclotomic.Tensor+import Crypto.Lol.Types++import Control.Applicative++import Data.Maybe++import Data.Singletons+import Data.Promotion.Prelude.Eq+import Data.Singletons.TypeRepStar ()++import qualified Test.Framework as TF++type TMRParams = ( '(,) <$> Tensors) <*> MRCombos+tmrParams :: Proxy TMRParams+tmrParams = Proxy++--type ExtParams = ( '(,) <$> Tensors) <*> MRExtCombos+type TrEmParams = ( '(,) <$> Tensors) <*> MM'RCombos+tremParams :: Proxy TrEmParams+tremParams = Proxy++type NormParams = ( '(,) <$> '[RT]) <*> (Filter Liftable MRCombos)++data Liftable :: TyFun (Factored, *) Bool -> *+type instance Apply Liftable '(m,zq) = Int64 :== (LiftOf zq)+
+ tests/examples/failing/TensorTests.hs.bad view
@@ -0,0 +1,41 @@+{-# LANGUAGE ConstraintKinds, FlexibleContexts, DataKinds, NoImplicitPrelude,+ RebindableSyntax, ScopedTypeVariables, TypeFamilies, TypeOperators,+ UndecidableInstances #-}++module TensorTests (tensorTests) where++import Apply.Cyc+import Tests+import Utils++import TestTypes++import Crypto.Lol+import Crypto.Lol.CRTrans+import Crypto.Lol.Cyclotomic.Tensor+import Crypto.Lol.Types++import Control.Applicative++import Data.Maybe++import Data.Singletons+import Data.Promotion.Prelude.Eq+import Data.Singletons.TypeRepStar ()++import qualified Test.Framework as TF++type TMRParams = ( (,) <$> Tensors) <*> MRCombos+tmrParams :: Proxy TMRParams+tmrParams = Proxy++--type ExtParams = ( '(,) <$> Tensors) <*> MRExtCombos+type TrEmParams = ( (,) <$> Tensors) <*> MM'RCombos+tremParams :: Proxy TrEmParams+tremParams = Proxy++type NormParams = ( (,) <$> '[RT]) <*> (Filter Liftable MRCombos)++data Liftable :: TyFun (Factored, *) Bool -> *+type instance Apply Liftable '(m,zq) = Int64 :== (LiftOf zq)+
+ tests/examples/ghc710/Case.hs view
@@ -0,0 +1,5 @@++foo x = case x of+ True -> "a"+ False -> "b"+
+ tests/examples/ghc710/Field1.hs view
@@ -0,0 +1,10 @@+module Field1 where++--Rename field name 'pointx' to 'pointx1'++data Point = Pt {pointx, pointy :: Float} deriving Show++absPoint :: Point -> Float+absPoint p = sqrt (pointx p * pointx p ++ pointy p * pointy p)+
tests/examples/ghc710/Mixed.hs view
@@ -17,7 +17,8 @@ g x = x + if True then 1 else 2 h x = x + 1::Int -{-# SPECIALISe j :: Int -> Int #-}+{-# SPECIALISe j :: Int -> Int+ , Integer -> Integer #-} j n = n + 1 test = let k x y = x+y in 1 `k` 2 `k` 3@@ -28,6 +29,7 @@ instance (Num a, Num b) => Num (a,b) where+ {-# Specialise instance Num (Int,Int) #-} negate (a,b) = (ng 'c' a, ng1 'c' b) where ng x y = negate y
+ tests/examples/ghc710/ModuleOnly.hs view
@@ -0,0 +1,1 @@+module ModuleOnly where
tests/examples/ghc710/RdrNames.hs view
@@ -117,6 +117,7 @@ -- The type constructor is special in that GHC pretends that it -- has kind (? -> ? -> Fact) rather than (* -> * -> *) data (~) a b = Eq# ((~#) a b)+data ( ~ ) a b = Eq# (( ~# ) a b) data Coercible a b = MkCoercible ((~#) a b) @@ -141,4 +142,8 @@ -- --------------------------------------------------------------------- -+{- From #haskell-emacs+gracjan> did you know that this is legal haskell:+<gracjan> (+ 1) ` fmap {- -} ` [1,2,3]+-}+xxx = (+ 1) ` fmap {- -} ` [1,2,3]
tests/examples/ghc710/Simple.hs view
@@ -1,4 +1,12 @@ -- blah+x :: (Int) x = 1 +(y) = 1++z :: t+z = do+ let+ a = 1+ return a
tests/examples/ghc710/Splice.hs view
@@ -31,6 +31,8 @@ class MyClass2 a b instance MyClass2 Int Bool +makeLenses '' PostscriptFont+ $(return []) main = do
+ tests/examples/ghc8/AddParams2.hs view
@@ -0,0 +1,9 @@+module AddParams2 where++collapse rightInner rightOuter = right+ where+ right = (rightInner, rightOuter)+ righ2 = (rightInner, (rightOuter baz bar))++baz = undefined+bar = undefined
+ tests/examples/ghc8/Class.hs view
@@ -0,0 +1,20 @@+{-# LANGUAGE UndecidableInstances #-}+module Servant.Auth.Server.Internal.Class where++import Servant.Auth+import Data.Monoid+import Servant hiding (BasicAuth)++import Servant.Auth.Server.Internal.Types+import Servant.Auth.Server.Internal.ConfigTypes+import Servant.Auth.Server.Internal.BasicAuth+import Servant.Auth.Server.Internal.Cookie+import Servant.Auth.Server.Internal.JWT++-- | @IsAuth a ctx v@ indicates that @a@ is an auth type that expects all+-- elements of @ctx@ to be the in the Context and whose authentication check+-- returns an @AuthCheck v@.+class IsAuth a v where+ type family AuthArgs a :: [*]+ runAuth :: proxy a -> proxy v -> Unapp (AuthArgs a) (AuthCheck v)+
+ tests/examples/ghc8/Collapse1.hs view
@@ -0,0 +1,16 @@+module LiftToTop3evel.Collapse1 where++collapse' _ _ [] = []+collapse' left space (t:ts) = new : collapse' right space rest+ where+ (_, leftInner) = left+ rightInner = leftInner + symbolSize t+ right = (rightInner, (rightOuter rightInner rights))+ (rights, rest) = span space ts+ new = (t, Bounds left right)++rightOuter rightInner rights = rightInner + symbolSize rights++data Bounds = Bounds (Int,Int) (Int,Int)+symbolSize t = 4+
+ tests/examples/ghc8/Compare.hs view
@@ -0,0 +1,23 @@+{-# LANGUAGE Trustworthy,+ TypeOperators,+ PolyKinds, DataKinds,+ TypeFamilies,+ UndecidableInstances #-}+++module Type.Compare where++import Data.Ord+import GHC.TypeLits++type family (a :: Ordering) $$ (b :: Ordering) :: Ordering where+ LT $$ b = LT+ GT $$ b = GT+ EQ $$ b = b+infixl 0 $$++-- | Compare two types of any (possibly different) kinds.+-- Since `Compare` itself is a closed type family, add instances to `CompareUser` if you want to compare other types.+type family Compare (a :: k) (b :: k') :: Ordering where++ Compare '() '() = EQ
+ tests/examples/ghc8/DatatypeContexts.hs view
@@ -0,0 +1,25 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE DatatypeContexts #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-}+-- I don't know how to silence the -XDatatypeContexts warnings otherwise...+{-# OPTIONS_GHC -w #-}++{-|+Module: Derived.DatatypeContexts+Copyright: (C) 2014-2016 Ryan Scott+License: BSD-style (see the file LICENSE)+Maintainer: Ryan Scott+Stability: Provisional+Portability: GHC++Defines data types with DatatypeContexts (which are gross, but still possible).+-}+module Derived.DatatypeContexts where+++data family TyFamily x y z :: *++data instance Ord a => TyFamily a b c = TyFamily a b c+ deriving Show+
+ tests/examples/ghc8/Decision.hs view
@@ -0,0 +1,726 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE ImpredicativeTypes #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE RecordWildCards #-}++module Airship.Internal.Decision+ ( flow+ , appendRequestPath+ ) where++import Airship.Internal.Date (parseRfc1123Date, utcTimeToRfc1123)+import Airship.Headers (addResponseHeader)+import Airship.Types ( Response(..)+ , ResponseBody(..)+ , Webmachine+ , etagToByteString+ , getResponseBody+ , getResponseHeaders+ , halt+ , pathInfo+ , putResponseBody+ , request+ , requestHeaders+ , requestMethod+ , requestTime )++import Airship.Resource(Resource(..), PostResponse(..))+import Airship.Internal.Parsers (parseEtagList)+#if __GLASGOW_HASKELL__ < 710+import Control.Applicative ((<$>))+#endif+import Control.Monad (when)+import Control.Monad.Trans (lift)+import Control.Monad.Trans.State.Strict (StateT(..), evalStateT,+ get, modify)+import Control.Monad.Writer.Class (tell)++import Blaze.ByteString.Builder (toByteString)+import Data.Maybe (isJust)+import Data.Text (Text)+import Data.Time.Clock (UTCTime)+import Data.ByteString (ByteString, intercalate)++import Network.HTTP.Media+import qualified Network.HTTP.Types as HTTP++------------------------------------------------------------------------------+-- HTTP Headers+-- These are headers not defined for us already in+-- Network.HTTP.Types+------------------------------------------------------------------------------+-- TODO this exist in http-types-0.9, see CHANGES.txt+hAcceptCharset :: HTTP.HeaderName+hAcceptCharset = "Accept-Charset"++hAcceptEncoding :: HTTP.HeaderName+hAcceptEncoding = "Accept-Encoding"++hIfMatch :: HTTP.HeaderName+hIfMatch = "If-Match"++hIfUnmodifiedSince :: HTTP.HeaderName+hIfUnmodifiedSince = "If-Unmodified-Since"++hIfNoneMatch :: HTTP.HeaderName+hIfNoneMatch = "If-None-Match"++------------------------------------------------------------------------------+-- FlowState: StateT used for recording information as we walk the decision+-- tree+------------------------------------------------------------------------------++data FlowState m = FlowState+ { _contentType :: Maybe (MediaType, Webmachine m ResponseBody) }++type FlowStateT m a = StateT (FlowState m) (Webmachine m) a++type Flow m = Resource m -> FlowStateT m Response++initFlowState :: FlowState m+initFlowState = FlowState Nothing++flow :: Monad m => Resource m -> Webmachine m Response+flow r = evalStateT (b13 r) initFlowState++trace :: Monad m => Text -> FlowStateT m ()+trace t = lift $ tell [t]++-----------------------------------------------------------------------------+-- Header value data newtypes+------------------------------------------------------------------------------++newtype IfMatch = IfMatch ByteString+newtype IfNoneMatch = IfNoneMatch ByteString++------------------------------------------------------------------------------+-- Decision Helpers+------------------------------------------------------------------------------++negotiateContentTypesAccepted :: Monad m => Resource m -> FlowStateT m ()+negotiateContentTypesAccepted Resource{..} = do+ req <- lift request+ accepted <- lift contentTypesAccepted+ let reqHeaders = requestHeaders req+ result = do+ cType <- lookup HTTP.hContentType reqHeaders+ mapContentMedia accepted cType+ case result of+ (Just process) -> lift process+ Nothing -> lift $ halt HTTP.status415++appendRequestPath :: Monad m => [Text] -> Webmachine m ByteString+appendRequestPath ts = do+ currentPath <- pathInfo <$> request+ return $ toByteString (HTTP.encodePathSegments (currentPath ++ ts))++requestHeaderDate :: Monad m => HTTP.HeaderName ->+ Webmachine m (Maybe UTCTime)+requestHeaderDate headerName = do+ req <- request+ let reqHeaders = requestHeaders req+ dateHeader = lookup headerName reqHeaders+ parsedDate = dateHeader >>= parseRfc1123Date+ return parsedDate++writeCacheTags :: Monad m => Resource m -> FlowStateT m ()+writeCacheTags Resource{..} = lift $ do+ etag <- generateETag+ case etag of+ Nothing -> return ()+ Just t -> addResponseHeader ("ETag", etagToByteString t)+ modified <- lastModified+ case modified of+ Nothing -> return ()+ Just d -> addResponseHeader ("Last-Modified", utcTimeToRfc1123 d)++------------------------------------------------------------------------------+-- Type definitions for all decision nodes+------------------------------------------------------------------------------++b13, b12, b11, b10, b09, b08, b07, b06, b05, b04, b03 :: Monad m => Flow m+c04, c03 :: Monad m => Flow m+d05, d04 :: Monad m => Flow m+e06, e05 :: Monad m => Flow m+f07, f06 :: Monad m => Flow m+g11, g09 :: Monad m => IfMatch -> Flow m+g08, g07 :: Monad m => Flow m+h12, h11, h10, h07 :: Monad m => Flow m+i13 :: Monad m => IfNoneMatch -> Flow m+i12, i07, i04 :: Monad m => Flow m+j18 :: Monad m => Flow m+k13 :: Monad m => IfNoneMatch -> Flow m+k07, k05 :: Monad m => Flow m+l17, l15, l14, l13, l07, l05 :: Monad m => Flow m+m20, m16, m07, m05 :: Monad m => Flow m+n16, n11, n05 :: Monad m => Flow m+o20, o18, o16, o14 :: Monad m => Flow m+p11, p03 :: Monad m => Flow m++------------------------------------------------------------------------------+-- B column+------------------------------------------------------------------------------++b13 r@Resource{..} = do+ trace "b13"+ available <- lift serviceAvailable+ if available+ then b12 r+ else lift $ halt HTTP.status503++b12 r@Resource{..} = do+ trace "b12"+ -- known method+ req <- lift request+ let knownMethods = [ HTTP.methodGet+ , HTTP.methodPost+ , HTTP.methodHead+ , HTTP.methodPut+ , HTTP.methodDelete+ , HTTP.methodTrace+ , HTTP.methodConnect+ , HTTP.methodOptions+ , HTTP.methodPatch+ ]+ if requestMethod req `elem` knownMethods+ then b11 r+ else lift $ halt HTTP.status501++b11 r@Resource{..} = do+ trace "b11"+ long <- lift uriTooLong+ if long+ then lift $ halt HTTP.status414+ else b10 r++b10 r@Resource{..} = do+ trace "b10"+ req <- lift request+ allowed <- lift allowedMethods+ if requestMethod req `elem` allowed+ then b09 r+ else do+ lift $ addResponseHeader ("Allow", intercalate "," allowed)+ lift $ halt HTTP.status405++b09 r@Resource{..} = do+ trace "b09"+ malformed <- lift malformedRequest+ if malformed+ then lift $ halt HTTP.status400+ else b08 r++b08 r@Resource{..} = do+ trace "b08"+ authorized <- lift isAuthorized+ if authorized+ then b07 r+ else lift $ halt HTTP.status401++b07 r@Resource{..} = do+ trace "b07"+ forbid <- lift forbidden+ if forbid+ then lift $ halt HTTP.status403+ else b06 r++b06 r@Resource{..} = do+ trace "b06"+ validC <- lift validContentHeaders+ if validC+ then b05 r+ else lift $ halt HTTP.status501++b05 r@Resource{..} = do+ trace "b05"+ known <- lift knownContentType+ if known+ then b04 r+ else lift $ halt HTTP.status415++b04 r@Resource{..} = do+ trace "b04"+ large <- lift entityTooLarge+ if large+ then lift $ halt HTTP.status413+ else b03 r++b03 r@Resource{..} = do+ trace "b03"+ req <- lift request+ allowed <- lift allowedMethods+ if requestMethod req == HTTP.methodOptions+ then do+ lift $ addResponseHeader ("Allow", intercalate "," allowed)+ lift $ halt HTTP.status204+ else c03 r++------------------------------------------------------------------------------+-- C column+------------------------------------------------------------------------------++c04 r@Resource{..} = do+ trace "c04"+ req <- lift request+ provided <- lift contentTypesProvided+ let reqHeaders = requestHeaders req+ result = do+ acceptStr <- lookup HTTP.hAccept reqHeaders+ (acceptTyp, resource) <- mapAcceptMedia provided' acceptStr+ Just (acceptTyp, resource)+ where+ -- this is so that in addition to getting back the resource+ -- that we match, we also return the content-type provided+ -- by that resource.+ provided' = map dupContentType provided+ dupContentType (a, b) = (a, (a, b))++ case result of+ Nothing -> lift $ halt HTTP.status406+ Just res -> do+ modify (\fs -> fs { _contentType = Just res })+ d04 r++c03 r@Resource{..} = do+ trace "c03"+ req <- lift request+ let reqHeaders = requestHeaders req+ case lookup HTTP.hAccept reqHeaders of+ (Just _h) ->+ c04 r+ Nothing ->+ d04 r++------------------------------------------------------------------------------+-- D column+------------------------------------------------------------------------------++d05 r@Resource{..} = do+ trace "d05"+ langAvailable <- lift languageAvailable+ if langAvailable+ then e05 r+ else lift $ halt HTTP.status406++d04 r@Resource{..} = do+ trace "d04"+ req <- lift request+ let reqHeaders = requestHeaders req+ case lookup HTTP.hAcceptLanguage reqHeaders of+ (Just _h) ->+ d05 r+ Nothing ->+ e05 r++------------------------------------------------------------------------------+-- E column+------------------------------------------------------------------------------++e06 r@Resource{..} = do+ trace "e06"+ -- TODO: charset negotiation+ f06 r++e05 r@Resource{..} = do+ trace "e05"+ req <- lift request+ let reqHeaders = requestHeaders req+ case lookup hAcceptCharset reqHeaders of+ (Just _h) ->+ e06 r+ Nothing ->+ f06 r++------------------------------------------------------------------------------+-- F column+------------------------------------------------------------------------------++f07 r@Resource{..} = do+ trace "f07"+ -- TODO: encoding negotiation+ g07 r++f06 r@Resource{..} = do+ trace "f06"+ req <- lift request+ let reqHeaders = requestHeaders req+ case lookup hAcceptEncoding reqHeaders of+ (Just _h) ->+ f07 r+ Nothing ->+ g07 r++------------------------------------------------------------------------------+-- G column+------------------------------------------------------------------------------++g11 (IfMatch ifMatch) r@Resource{..} = do+ trace "g11"+ let etags = parseEtagList ifMatch+ if null etags+ then lift $ halt HTTP.status412+ else h10 r++g09 ifMatch r@Resource{..} = do+ trace "g09"+ case ifMatch of+ -- TODO: should we be stripping whitespace here?+ (IfMatch "*") ->+ h10 r+ _ ->+ g11 ifMatch r++g08 r@Resource{..} = do+ trace "g08"+ req <- lift request+ let reqHeaders = requestHeaders req+ case IfMatch <$> lookup hIfMatch reqHeaders of+ (Just h) ->+ g09 h r+ Nothing ->+ h10 r++g07 r@Resource{..} = do+ trace "g07"+ -- TODO: set Vary headers+ exists <- lift resourceExists+ if exists+ then g08 r+ else h07 r++------------------------------------------------------------------------------+-- H column+------------------------------------------------------------------------------++h12 r@Resource{..} = do+ trace "h12"+ modified <- lift lastModified+ parsedDate <- lift $ requestHeaderDate hIfUnmodifiedSince+ let maybeGreater = do+ lastM <- modified+ headerDate <- parsedDate+ return (lastM > headerDate)+ if maybeGreater == Just True+ then lift $ halt HTTP.status412+ else i12 r++h11 r@Resource{..} = do+ trace "h11"+ parsedDate <- lift $ requestHeaderDate hIfUnmodifiedSince+ if isJust parsedDate+ then h12 r+ else i12 r++h10 r@Resource{..} = do+ trace "h10"+ req <- lift request+ let reqHeaders = requestHeaders req+ case lookup hIfUnmodifiedSince reqHeaders of+ (Just _h) ->+ h11 r+ Nothing ->+ i12 r++h07 r@Resource {..} = do+ trace "h07"+ req <- lift request+ let reqHeaders = requestHeaders req+ case lookup hIfMatch reqHeaders of+ -- TODO: should we be stripping whitespace here?+ (Just "*") ->+ lift $ halt HTTP.status412+ _ ->+ i07 r++------------------------------------------------------------------------------+-- I column+------------------------------------------------------------------------------++i13 ifNoneMatch r@Resource{..} = do+ trace "i13"+ case ifNoneMatch of+ -- TODO: should we be stripping whitespace here?+ (IfNoneMatch "*") ->+ j18 r+ _ ->+ k13 ifNoneMatch r++i12 r@Resource{..} = do+ trace "i12"+ req <- lift request+ let reqHeaders = requestHeaders req+ case IfNoneMatch <$> lookup hIfNoneMatch reqHeaders of+ (Just h) ->+ i13 h r+ Nothing ->+ l13 r++i07 r = do+ trace "i07"+ req <- lift request+ if requestMethod req == HTTP.methodPut+ then i04 r+ else k07 r++i04 r@Resource{..} = do+ trace "i04"+ moved <- lift movedPermanently+ case moved of+ (Just loc) -> do+ lift $ addResponseHeader ("Location", loc)+ lift $ halt HTTP.status301+ Nothing ->+ p03 r++------------------------------------------------------------------------------+-- J column+------------------------------------------------------------------------------++j18 _ = do+ trace "j18"+ req <- lift request+ let getOrHead = [ HTTP.methodGet+ , HTTP.methodHead+ ]+ if requestMethod req `elem` getOrHead+ then lift $ halt HTTP.status304+ else lift $ halt HTTP.status412++------------------------------------------------------------------------------+-- K column+------------------------------------------------------------------------------++k13 (IfNoneMatch ifNoneMatch) r@Resource{..} = do+ trace "k13"+ let etags = parseEtagList ifNoneMatch+ if null etags+ then l13 r+ else j18 r++k07 r@Resource{..} = do+ trace "k07"+ prevExisted <- lift previouslyExisted+ if prevExisted+ then k05 r+ else l07 r++k05 r@Resource{..} = do+ trace "k05"+ moved <- lift movedPermanently+ case moved of+ (Just loc) -> do+ lift $ addResponseHeader ("Location", loc)+ lift $ halt HTTP.status301+ Nothing ->+ l05 r++------------------------------------------------------------------------------+-- L column+------------------------------------------------------------------------------++l17 r@Resource{..} = do+ trace "l17"+ parsedDate <- lift $ requestHeaderDate HTTP.hIfModifiedSince+ modified <- lift lastModified+ let maybeGreater = do+ lastM <- modified+ ifModifiedSince <- parsedDate+ return (lastM > ifModifiedSince)+ if maybeGreater == Just True+ then m16 r+ else lift $ halt HTTP.status304++l15 r@Resource{..} = do+ trace "l15"+ parsedDate <- lift $ requestHeaderDate HTTP.hIfModifiedSince+ now <- lift requestTime+ let maybeGreater = (> now) <$> parsedDate+ if maybeGreater == Just True+ then m16 r+ else l17 r++l14 r@Resource{..} = do+ trace "l14"+ req <- lift request+ let reqHeaders = requestHeaders req+ dateHeader = lookup HTTP.hIfModifiedSince reqHeaders+ validDate = isJust (dateHeader >>= parseRfc1123Date)+ if validDate+ then l15 r+ else m16 r++l13 r@Resource{..} = do+ trace "l13"+ req <- lift request+ let reqHeaders = requestHeaders req+ case lookup HTTP.hIfModifiedSince reqHeaders of+ (Just _h) ->+ l14 r+ Nothing ->+ m16 r++l07 r = do+ trace "l07"+ req <- lift request+ if requestMethod req == HTTP.methodPost+ then m07 r+ else lift $ halt HTTP.status404++l05 r@Resource{..} = do+ trace "l05"+ moved <- lift movedTemporarily+ case moved of+ (Just loc) -> do+ lift $ addResponseHeader ("Location", loc)+ lift $ halt HTTP.status307+ Nothing ->+ m05 r++------------------------------------------------------------------------------+-- M column+------------------------------------------------------------------------------++m20 r@Resource{..} = do+ trace "m20"+ deleteAccepted <- lift deleteResource+ if deleteAccepted+ then do+ completed <- lift deleteCompleted+ if completed+ then o20 r+ else lift $ halt HTTP.status202+ else lift $ halt HTTP.status500++m16 r = do+ trace "m16"+ req <- lift request+ if requestMethod req == HTTP.methodDelete+ then m20 r+ else n16 r++m07 r@Resource{..} = do+ trace "m07"+ allowMissing <- lift allowMissingPost+ if allowMissing+ then n11 r+ else lift $ halt HTTP.status404++m05 r = do+ trace "m05"+ req <- lift request+ if requestMethod req == HTTP.methodPost+ then n05 r+ else lift $ halt HTTP.status410++------------------------------------------------------------------------------+-- N column+------------------------------------------------------------------------------++n16 r = do+ trace "n16"+ req <- lift request+ if requestMethod req == HTTP.methodPost+ then n11 r+ else o16 r++n11 r@Resource{..} = trace "n11" >> lift processPost >>= flip processPostAction r++create :: Monad m => [Text] -> Resource m -> FlowStateT m ()+create ts r = do+ loc <- lift (appendRequestPath ts)+ lift (addResponseHeader ("Location", loc))+ negotiateContentTypesAccepted r++processPostAction :: Monad m => PostResponse m -> Flow m+processPostAction (PostCreate ts) r = do+ create ts r+ p11 r+processPostAction (PostCreateRedirect ts) r = do+ create ts r+ lift $ halt HTTP.status303+processPostAction (PostProcess p) r =+ lift p >> p11 r+processPostAction (PostProcessRedirect ts) _r = do+ locBs <- lift ts+ lift $ addResponseHeader ("Location", locBs)+ lift $ halt HTTP.status303++n05 r@Resource{..} = do+ trace "n05"+ allow <- lift allowMissingPost+ if allow+ then n11 r+ else lift $ halt HTTP.status410++------------------------------------------------------------------------------+-- O column+------------------------------------------------------------------------------++o20 r = do+ trace "o20"+ body <- lift getResponseBody+ -- ResponseBody is a little tough to make an instance of 'Eq',+ -- so we just use a pattern match+ case body of+ Empty -> lift $ halt HTTP.status204+ _ -> o18 r++o18 r@Resource{..} = do+ trace "o18"+ multiple <- lift multipleChoices+ if multiple+ then lift $ halt HTTP.status300+ else do+ -- TODO: set etag, expiration, etc. headers+ req <- lift request+ let getOrHead = [ HTTP.methodGet+ , HTTP.methodHead+ ]+ when (requestMethod req `elem` getOrHead) $ do+ m <- _contentType <$> get+ (cType, body) <- case m of+ Nothing -> do+ provided <- lift contentTypesProvided+ return (head provided)+ Just (cType, body) ->+ return (cType, body)+ b <- lift body+ lift $ putResponseBody b+ lift $ addResponseHeader ("Content-Type", renderHeader cType)+ writeCacheTags r+ lift $ halt HTTP.status200++o16 r = do+ trace "o16"+ req <- lift request+ if requestMethod req == HTTP.methodPut+ then o14 r+ else o18 r++o14 r@Resource{..} = do+ trace "o14"+ conflict <- lift isConflict+ if conflict+ then lift $ halt HTTP.status409+ else negotiateContentTypesAccepted r >> p11 r++------------------------------------------------------------------------------+-- P column+------------------------------------------------------------------------------++p11 r = do+ trace "p11"+ headers <- lift getResponseHeaders+ case lookup HTTP.hLocation headers of+ (Just _) ->+ lift $ halt HTTP.status201+ _ ->+ o20 r++p03 r@Resource{..} = do+ trace "p03"+ conflict <- lift isConflict+ if conflict+ then lift $ halt HTTP.status409+ else negotiateContentTypesAccepted r >> p11 r
+ tests/examples/ghc8/F.hs view
@@ -0,0 +1,20 @@+-- | Thompson's group F.+--+-- See eg. <https://en.wikipedia.org/wiki/Thompson_groups>+--+-- Based mainly on James Michael Belk's PhD thesis \"THOMPSON'S GROUP F\";+-- see <http://www.math.u-psud.fr/~breuilla/Belk.pdf>+--++{-# LANGUAGE TypeSynonymInstances, FlexibleInstances, BangPatterns, PatternSynonyms, DeriveFunctor #-}+module Math.Combinat.Groups.Thompson.F where++-- | Remove the carets with the given indices+-- (throws an error if there is no caret at the given index)+removeCarets :: [Int] -> T -> T+removeCarets idxs tree = if null rem then final else error ("removeCarets: some stuff remained: " ++ show rem) where++ (_,rem,final) = go 0 idxs tree where++ go :: Int -> [Int] -> T -> (Int,[Int],T)+ go !x [] t = (x + treeWidth t , [] , t)
+ tests/examples/ghc8/Families.hs view
@@ -0,0 +1,14 @@+{-# LANGUAGE PolyKinds, TypeFamilies, DataKinds, KindSignatures,+ TypeOperators, UndecidableInstances #-}++{-# LANGUAGE RankNTypes, LiberalTypeSynonyms, EmptyDataDecls #-}++-- | A prelude for type-level programming with type families++module Prelude.Type.Families where++-- >>> T :: T ((I 4) `Minus` (I 7))+-- -3+type family (a :: k) `Minus` (b :: k) :: k+type instance a `Minus` b = a + Negate b+
+ tests/examples/ghc8/ForFree.hs view
@@ -0,0 +1,23 @@++{-# LANGUAGE EmptyDataDecls #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE MultiParamTypeClasses #-}+-- {-# LANGUAGE OverlappingInstances #-}+{-# LANGUAGE Rank2Types #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE UndecidableInstances #-}++module Control.ForFree where {++-- | Free monad from a functor+;+ data Free f x = Pure x | Free (f (Free f x));++ deriving instance (Eq (f (Free f a)), Eq a) => Eq (Free f a);+ deriving instance (Ord (f (Free f a)), Ord a) => Ord (Free f a);+ deriving instance (Read (f (Free f a)), Read a) => Read (Free f a);+ deriving instance (Show (f (Free f a)), Show a) => Show (Free f a);+}
+ tests/examples/ghc8/FromGrin2.hs view
@@ -0,0 +1,6 @@++-- ./hackage-roundtrip-work/ajhc-0.8.0.10/src/C/FromGrin2.hs+-- orig line 588+convertExp :: Exp -> C (Statement,Expression)+convertExp (Prim Func { primArgTypes = as, primRetType = r, primRetArgs = rs@(_:_), ..} vs ty) = do+ return (mempty,e)
+ tests/examples/ghc8/GA1r.hs view
@@ -0,0 +1,5 @@+module GA1r where+import Text.ParserCombinators.Parsec++parseStr :: CharParser () String+parseStr = char '"' *> (many1 (noneOf "\"")) <* char '"'
+ tests/examples/ghc8/Generic.hs view
@@ -0,0 +1,9 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE TypeOperators #-}+module Env.Generic+ ( Record(..)+ , type (?)(..)+ ) where++import Data.Promotion.Prelude (type (:+$), type (:*$), type (:^$), type (:-$))+import Options.Generic (Generic, ParseRecord, type (<?>)(..))
+ tests/examples/ghc8/Manipulate.hs view
@@ -0,0 +1,39 @@+{- |+Module : Control.Comonad.Sheet.Manipulate+Description : Generic functions for manipulating multi-dimensional comonadic spreadsheets.+Copyright : Copyright (c) 2014 Kenneth Foner++Maintainer : kenneth.foner@gmail.com+Stability : experimental+Portability : non-portable++This module defines the 'take', 'view', 'go', and 'insert' functions generically for any dimensionality of sheet. These+constitute the preferred way of manipulating sheets, providing an interface to: take finite slices ('take'), infinite+slices ('view'), move to locations ('go'), and insert finite or infinite structures ('insert').+-}++{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE UndecidableInstances #-}++module Control.Comonad.Sheet.Manipulate where+++-- | In the case of a @Nested@ structure, @asDimensionalAs@ defaults to @asNestedAs@.+instance (NestedAs x (Nested ts y), AsDimensionalAs x (Nested ts y) ~ AsNestedAs x (Nested ts y)) => DimensionalAs x (Nested ts y) where+ type x `AsDimensionalAs` (Nested ts a) = x `AsNestedAs` (Nested ts a)+ asDimensionalAs = asNestedAs++-- | @DimensionalAs@ also knows the dimensionality of an 'Indexed' sheet as well as regular @Nested@ structures.+instance (NestedAs x (Nested ts y)) => DimensionalAs x (Indexed ts y) where+ type x `AsDimensionalAs` (Indexed ts a) = x `AsNestedAs` (Nested ts a)+ x `asDimensionalAs` (Indexed i t) = x `asNestedAs` t+++instance DepIndex (a,b) TH_0 where+ type (a,b) `DepIndexResult` TH_0 = a+ (a,b) # TH_0 = a
+ tests/examples/ghc8/Match.hs view
@@ -0,0 +1,38 @@+{-# LANGUAGE GADTs #-}+{-# LANGUAGE PatternGuards #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE TypeOperators #-}+{-# OPTIONS_HADDOCK hide #-}++-- Discriminate binary functions that commute, and if so return the operands in+-- a stable ordering such that matching recognises expressions modulo+-- commutativity.+--+commutes+ :: forall acc env aenv a r.+ HashAcc acc+ -> PrimFun (a -> r)+ -> PreOpenExp acc env aenv a+ -> Maybe (PreOpenExp acc env aenv a)+commutes h f x = case f of+ PrimAdd _ -> Just (swizzle x)+ PrimMul _ -> Just (swizzle x)+ PrimBAnd _ -> Just (swizzle x)+ PrimBOr _ -> Just (swizzle x)+ PrimBXor _ -> Just (swizzle x)+ PrimEq _ -> Just (swizzle x)+ PrimNEq _ -> Just (swizzle x)+ PrimMax _ -> Just (swizzle x)+ PrimMin _ -> Just (swizzle x)+ PrimLAnd -> Just (swizzle x)+ PrimLOr -> Just (swizzle x)+ _ -> Nothing+ where+ swizzle :: PreOpenExp acc env aenv (a',a') -> PreOpenExp acc env aenv (a',a')+ swizzle exp+ | Tuple (NilTup `SnocTup` a `SnocTup` b) <- exp+ , hashPreOpenExp h a > hashPreOpenExp h b = Tuple (NilTup `SnocTup` b `SnocTup` a)+ --+ | otherwise = exp
+ tests/examples/ghc8/MultiQuote.hs view
@@ -0,0 +1,39 @@+{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE CPP #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE DeriveFunctor #-}+{-# LANGUAGE DeriveGeneric #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE MagicHash #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE RankNTypes#-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE ViewPatterns #-}+{-# LANGUAGE EmptyCase #-}+{-# OPTIONS_GHC -fno-warn-orphans #-}++-- | Internal API for the store package. The functions here which are+-- not re-exported by "Data.Store" are less likely to have stable APIs.+--+-- This module also defines most of the included 'Store' instances, for+-- types from the base package and other commonly used packages+-- (bytestring, containers, text, time, etc).+module Data.Store.Internal where++------------------------------------------------------------------------+-- Instances generated by TH++$($(derive [d|+ -- TODO+ -- instance Deriving (Store ())+ instance Deriving (Store All)+ instance Deriving (Store Any)+ instance Deriving (Store Void)+ instance Deriving (Store Bool)+ |]))+
+ tests/examples/ghc8/PSQ.hs view
@@ -0,0 +1,4 @@++data TourView a = Null+ | Single {-# UNPACK #-} !(Elem a)+ | (PSQ a) `Play` (PSQ a)
+ tests/examples/ghc8/Ppr017.hs view
@@ -0,0 +1,9 @@+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE ExplicitNamespaces #-}+module Imports( f, type (+), pattern Single ) where++import GHC.TypeLits++pattern Single x = [x]++f = undefined
+ tests/examples/ghc8/Query.hs view
@@ -0,0 +1,13 @@+{-# LANGUAGE CPP #-}++module AWS.Lib.Query where++requestQuery = do+ if st < 400+#ifdef DEBUG+ do e+#else+ then return body+ else fail "not reached"+#endif+
+ tests/examples/ghc8/RulePragma.hs view
@@ -0,0 +1,7 @@+module Data.Text.Internal.Fusion.Common where++{-#+ RULES "STREAM map/map fusion" forall f g s.+ map f (map g s) = map (\x -> f (g x)) s+ #-}+
+ tests/examples/ghc8/SpecializePhaseControl.hs view
@@ -0,0 +1,15 @@+{-# SPECIALISE [1] x ::+ Integer -> Integer -> Integer,+ Integer -> Int -> Integer,+ Int -> Int -> Int #-}+{-# INLINABLE [1] x #-}+x :: (Num a, Integral b) => a -> b -> a+x = undefined++{-# SPECIALISE INLINE [999] y ::+ Integer -> Integer -> Integer,+ Integer -> Int -> Integer,+ Int -> Int -> Int #-}+{-# INLINABLE [1] y #-}+y :: (Num a, Integral b) => a -> b -> a+y = undefined
+ tests/examples/ghc8/Structure8.hs view
@@ -0,0 +1,1 @@+foo x | otherwise = y
+ tests/examples/ghc8/Structure8a.hs view
@@ -0,0 +1,1 @@+foo x = y
+ tests/examples/ghc8/T11381.hs view
@@ -0,0 +1,9 @@+{-# LANGUAGE TypeFamilies #-}++module T11381 where++-- ensure that this code does not compile without InjectiveTypeFamilies and that+-- injectivity error is not reported.+type family F a = r | r -> a+type instance F Int = Bool+type instance F Int = Char
+ tests/examples/ghc8/T11959.hs view
@@ -0,0 +1,6 @@+{-# LANGUAGE PatternSynonyms #-}+module Main where++import T11959Lib (Vec2(..), pattern (:>))++main = return ()
+ tests/examples/ghc8/Templates.hs view
@@ -0,0 +1,57 @@+{-# LANGUAGE TemplateHaskell, MultiParamTypeClasses, TypeFamilies, FlexibleInstances, OverlappingInstances, TypeOperators, PatternGuards #-}+module Object.Templates(+ makeName,+ makeObject,+ makeObjectFlexible+ ) where++import Object.Letters+import Object.Types++import Prelude hiding ((.))+import Language.Haskell.TH+import Language.Haskell.TH.Syntax+import Data.Char+import Data.Maybe++-- |+-- implements 'makeObject' or 'makeObjectFlexible' depending on the first argument+makeObject' :: Bool -> Name -> Q [Dec]+makeObject' flexible name = go name where+ go :: Name -> Q [Dec]+ go obj = do+ (name, vars, fields) <- reify name >>= getInfo+ let objType = foldl AppT (ConT name) (VarT<*vars)+ outputDecls <- if flexible+ then return []+ else [d|+ type instance Output $(return objType) (Method m) =+ MethodOutput $(return objType) (Method m)+ type instance Output $(return objType) (Method m := input) =+ MethodOutput $(return objType) (Method m := input)+ |]+ fieldDecls <- (sequence $ makeField name vars <* fields) *> concat+ return $ outputDecls ++ fieldDecls+-- "(Object.Example.Foo,[x_1627454179],[(Object.Example._bar,NotStrict,ConT GHC.Types.Int),(Object.Example._baz,NotStrict,ConT GHC.Types.Char),(Object.Example._blub,NotStrict,VarT x_1627454179)])"+ makeField :: Name -> [Name] -> VarStrictType -> Q [Dec]+ makeField _ _ (name,_,_) | '_' /= head (nameBase name) = fail $ show name ++ " did not start with underscore"+ makeField name vars (fName, _, fType) = do+ (decs1,(typeName,dataName)) <- makeName' (tail $ nameBase fName)+ methodOutput <- lookupTypeName "Object.Types.MethodOutput" *> fromMaybe (error "no MethodOutput in scope")+ let objType = foldl AppT (ConT name) (VarT<*vars)++ let methodOutInst = TySynInstD methodOutput $ TySynEqn [objType, ConT typeName] fType+ actionInst <- [d|+ instance Action $(return objType) $(return $ ConT typeName) where+ object . _ = $(return $ VarE fName) object+ |]++ matchType <- [t| $(return $ ConT typeName) := $(return $ VarT $ mkName "value") |]+ let methodSetOutInst = TySynInstD methodOutput $ TySynEqn [objType, matchType] objType+ actionSetInst <- [d|+ instance (value ~ $(return fType)) => Action $(return objType) $(return matchType) where+ object . ( _ := v) = $(recUpdE [e|object|] [return (fName, VarE $ mkName "v")])+ |]++ return $ [methodOutInst,methodSetOutInst] ++ actionInst ++ actionSetInst ++ decs1+
+ tests/examples/ghc8/TestUtils.hs view
@@ -0,0 +1,5 @@++module Math.NumberTheory.TestUtils where++class (f `Compose` g) x+
tests/examples/ghc8/UnicodeSyntax.hs view
@@ -234,3 +234,10 @@ , reCloseH ∷ !(FinalizerHandle r) } +-- from ghc-prim++-- | A backward-compatible (pre-GHC 8.0) synonym for 'Type'+type * = TYPE 'PtrRepLifted++-- | A unicode backward-compatible (pre-GHC 8.0) synonym for 'Type'+type ★ = TYPE 'PtrRepLifted
+ tests/examples/ghc8/Webhook.hs view
@@ -0,0 +1,176 @@+{-|+Module : Servant.GitHub.Webhook+Description : Easily write safe GitHub webhook handlers with Servant+Copyright : (c) Jacob Thomas Errington, 2016+License : MIT+Maintainer : servant-github-webhook@mail.jerrington.me+Stability : experimental++The GitHub webhook machinery will attach three headers to the HTTP requests+that it fires: @X-Github-Event@, @X-Hub-Signature@, and @X-Github-Delivery@.+The former two headers correspond with the 'GitHubEvent' and+'GitHubSignedReqBody''' routing combinators. This library ignores the+@X-Github-Delivery@ header; if you would like to access its value, then use the+builtin 'Header' combinator from Servant.++Usage of the library is straightforward: protect routes with the 'GitHubEvent'+combinator to ensure that the route is only reached for specific+'RepoWebhookEvent's, and replace any 'ReqBody' combinators you would write+under that route with 'GitHubSignedReqBody'. It is advised to always include a+'GitHubSignedReqBody''', as this is the only way you can be sure that it is+GitHub who is sending the request, and not a malicious user. If you don't care+about the request body, then simply use Aeson\'s 'Object' type as the+deserialization target -- @GitHubSignedReqBody' key '[JSON] Object@ -- and+ignore the @Object@ in the handler.++The 'GitHubSignedReqBody''' combinator makes use of the Servant 'Context' in+order to extract the signing key. This is the same key that must be entered in+the configuration of the webhook on GitHub. See 'GitHubKey'' for more details.++In order to support multiple keys on a per-route basis, the basic combinator+@GitHubSignedReqBody''@ takes as a type parameter as a key index. To use this,+create a datatype, e.g. @KeyIndex@ whose constructors identify the different+keys you will be using. Generally, this means one constructor per repository.+Use the @DataKinds@ extension to promote this datatype to a kind, and write an+instance of 'Reflect' for each promoted constructor of your datatype. Finally,+create a 'Context' containing 'GitHubKey'' whose wrapped function's domain is+the datatype you've built up. Thus, your function can determine which key to+retrieve.+-}++{-# LANGUAGE CPP #-}++{-# LANGUAGE DataKinds #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE InstanceSigs #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeOperators #-}++-- GHC 8 seems to have improved its decidability check for type family+-- instances and class instances. In particular, without UndecidableInstances+-- enabled, the Demote' instance for lists, which we need, will not compile.+-- Similarly, the Reflect instance for Symbol, which just requires KnownSymbol,+-- won't compile on GHC < 8 because the instance head is no smaller than the+-- instance head.+#if __GLASGOW_HASKELL__ < 800+{-# LANGUAGE UndecidableInstances #-}+#endif++module Servant.GitHub.Webhook+( -- * Servant combinators+ GitHubSignedReqBody''+, GitHubSignedReqBody'+, GitHubSignedReqBody+, GitHubEvent++ -- ** Security+, GitHubKey'(..)+, GitHubKey+, gitHubKey++ -- * Reexports+ --+ -- | We reexport a few datatypes that are typically needed to use the+ -- library.+, RepoWebhookEvent(..)+, KProxy(..)++ -- * Implementation details++ -- ** Type-level programming machinery+, Demote+, Demote'+, Reflect(..)++ -- ** Stringy stuff+, parseHeaderMaybe+, matchEvent++ -- * Examples+ --+ -- $example1+ --+ -- $example2+) where++import Control.Monad.IO.Class ( liftIO )+import Data.Aeson ( decode', encode )+import qualified Data.ByteString as BS+import Data.ByteString.Lazy ( fromStrict, toStrict )+import qualified Data.ByteString.Base16 as B16+import Data.HMAC ( hmac_sha1 )+import Data.List ( intercalate )+import Data.Maybe ( catMaybes, fromMaybe )+import Data.Monoid ( (<>) )+import Data.Proxy+import Data.String.Conversions ( cs )+import qualified Data.Text.Encoding as E+import GHC.TypeLits+import GitHub.Data.Webhooks+import Network.HTTP.Types hiding (Header, ResponseHeaders)+import Network.Wai ( requestHeaders, strictRequestBody )+import Servant+import Servant.API.ContentTypes ( AllCTUnrender(..) )+import Servant.Server.Internal+++-- | A clone of Servant's 'ReqBody' combinator, except that it will also+-- verify the signature provided by GitHub in the @X-Hub-Signature@ header by+-- computing the SHA1 HMAC of the request body and comparing.+--+-- The use of this combinator will require that the router context contain an+-- appropriate 'GitHubKey'' entry. Specifically, the type parameter of+-- 'GitHubKey'' must correspond with @Demote k@ where @k@ is the kind of the+-- index @key@ used here. Consequently, it will be necessary to use+-- 'serveWithContext' instead of 'serve'.+--+-- Other routes are not tried upon the failure of this combinator, and a 401+-- response is generated.+--+-- Use of this datatype directly is discouraged, since the choice of the index+-- @key@ determines its kind @k@ and hence @proxy@, which is . Instead, use+-- 'GitHubSignedReqBody'', which computes the @proxy@ argument given just+-- @key@. The proxy argument is necessary to avoid @UndecidableInstances@ for+-- the implementation of the 'HasServer' instance for the datatype.+data GitHubSignedReqBody''+ (proxy :: KProxy k)+ (key :: k)+ (list :: [*])+ (result :: *) where++-- | Convenient synonym for 'GitHubSignedReqBody''' that computes its first+-- type argument given just the second one.+--+-- Use this type synonym if you are creating a webhook server to handle+-- webhooks from multiple repositories, with different secret keys.+type GitHubSignedReqBody' (key :: k)+ = GitHubSignedReqBody'' ('KProxy :: KProxy k) key++-- | A convenient alias for a trivial key index.+--+-- USe this type synonym if you are creating a webhook server to handle only+-- webhooks from a single repository, or for mutliple repositories using the+-- same secret key.+type GitHubSignedReqBody = GitHubSignedReqBody' '()++-- | A routing combinator that succeeds only for a webhook request that matches+-- one of the given 'RepoWebhookEvent' given in the type-level list @events@.+--+-- If the list contains 'WebhookWildcardEvent', then all events will be+-- matched.+--+-- The combinator will require that its associated handler take a+-- 'RepoWebhookEvent' parameter, and the matched event will be passed to the+-- handler. This allows the handler to determine which event triggered it from+-- the list.+--+-- Other routes are tried if there is a mismatch.+data GitHubEvent (events :: [RepoWebhookEvent]) where+