packages feed

ghc-exactprint 0.5.3.1 → 0.5.4.0

raw patch · 22 files changed

+8886/−3728 lines, 22 filesdep ~basePVP: major bump suggested

API removals or changes: PVP suggests a major version bump

Dependency ranges changed: base

API changes (from Hackage documentation)

- Language.Haskell.GHC.ExactPrint.Annotate: instance (Language.Haskell.GHC.ExactPrint.Annotate.Annotate name, PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsPat.HsRecField name (HsExpr.LHsExpr name))
- Language.Haskell.GHC.ExactPrint.Annotate: instance (Language.Haskell.GHC.ExactPrint.Annotate.Annotate name, PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsPat.HsRecField name (HsPat.LPat name))
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate arg) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsTypes.HsImplicitBndrs name (SrcLoc.Located arg))
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (Class.FunDep (SrcLoc.Located name))
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsDecls.InjectivityAnn name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name, Outputable.OutputableBndr name, OccName.HasOccName name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsDecls.ConDecl name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name, Outputable.OutputableBndr name, OccName.HasOccName name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsDecls.FamilyDecl name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name, Outputable.OutputableBndr name, OccName.HasOccName name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsDecls.FamilyResultSig name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name, Outputable.OutputableBndr name, OccName.HasOccName name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsDecls.TyFamDefltEqn name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name, Outputable.OutputableBndr name, OccName.HasOccName name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsDecls.TyFamInstEqn name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name, Outputable.OutputableBndr name, OccName.HasOccName name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsPat.Pat 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.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: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate body) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsExpr.Stmt name (SrcLoc.Located body))
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsBinds.HsBind name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsBinds.HsLocalBinds name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsBinds.IPBind name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsBinds.Sig name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsDecls.AnnDecl name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsDecls.ClsInstDecl name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsDecls.DataFamInstDecl name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsDecls.DefaultDecl name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsDecls.DerivDecl name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsDecls.ForeignDecl name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsDecls.HsDecl name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsDecls.InstDecl name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsDecls.RuleBndr name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsDecls.RuleDecl name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsDecls.RuleDecls name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsDecls.SpliceDecl name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsDecls.TyClDecl name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsDecls.TyFamInstDecl name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsDecls.VectDecl name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsExpr.HsCmd name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsExpr.HsCmdTop name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsExpr.HsExpr name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsExpr.HsSplice name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsExpr.HsTupArg name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsExpr.ParStmtBlock name name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsPat.HsRecUpdField name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsTypes.ConDeclField name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsTypes.HsAppType name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsTypes.HsTyVarBndr name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsTypes.HsType name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (Language.Haskell.GHC.ExactPrint.Annotate.ResTyGADTHook name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate [HsExpr.ExprLStmt name]
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate [HsTypes.LConDeclField name]
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate [HsTypes.LHsSigType name]
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate [HsTypes.LHsType name]
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate [SrcLoc.Located (HsExpr.StmtLR name name (HsExpr.LHsCmd name))]
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate body) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsExpr.GRHS name (SrcLoc.Located body))
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate body) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsExpr.Match name (SrcLoc.Located body))
- Language.Haskell.GHC.ExactPrint.Annotate: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate name, Language.Haskell.GHC.ExactPrint.Annotate.Annotate body) => Language.Haskell.GHC.ExactPrint.Annotate.Annotate [SrcLoc.Located (HsExpr.Match name (SrcLoc.Located body))]
- Language.Haskell.GHC.ExactPrint.Annotate: instance Data.Data.Data Language.Haskell.GHC.ExactPrint.Annotate.WildCardAnon
- Language.Haskell.GHC.ExactPrint.Annotate: instance GHC.Base.Functor Language.Haskell.GHC.ExactPrint.Annotate.AnnotationF
- Language.Haskell.GHC.ExactPrint.Annotate: instance GHC.Show.Show (HsTypes.LHsTyVarBndr name) => GHC.Show.Show (Language.Haskell.GHC.ExactPrint.Annotate.ResTyGADTHook name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance GHC.Show.Show Language.Haskell.GHC.ExactPrint.Annotate.WildCardAnon
- Language.Haskell.GHC.ExactPrint.Annotate: instance Language.Haskell.GHC.ExactPrint.Annotate.Annotate (BasicTypes.SourceText, FastString.FastString)
- Language.Haskell.GHC.ExactPrint.Annotate: instance Language.Haskell.GHC.ExactPrint.Annotate.Annotate (GHC.Base.Maybe CoAxiom.Role)
- Language.Haskell.GHC.ExactPrint.Annotate: instance Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsSyn.HsModule RdrName.RdrName)
- Language.Haskell.GHC.ExactPrint.Annotate: instance Language.Haskell.GHC.ExactPrint.Annotate.Annotate BasicTypes.OverlapMode
- Language.Haskell.GHC.ExactPrint.Annotate: instance Language.Haskell.GHC.ExactPrint.Annotate.Annotate BasicTypes.StringLiteral
- Language.Haskell.GHC.ExactPrint.Annotate: instance Language.Haskell.GHC.ExactPrint.Annotate.Annotate BasicTypes.WarningTxt
- Language.Haskell.GHC.ExactPrint.Annotate: instance Language.Haskell.GHC.ExactPrint.Annotate.Annotate FastString.FastString
- Language.Haskell.GHC.ExactPrint.Annotate: instance Language.Haskell.GHC.ExactPrint.Annotate.Annotate ForeignCall.CCallConv
- Language.Haskell.GHC.ExactPrint.Annotate: instance Language.Haskell.GHC.ExactPrint.Annotate.Annotate ForeignCall.CExportSpec
- Language.Haskell.GHC.ExactPrint.Annotate: instance Language.Haskell.GHC.ExactPrint.Annotate.Annotate ForeignCall.CType
- Language.Haskell.GHC.ExactPrint.Annotate: instance Language.Haskell.GHC.ExactPrint.Annotate.Annotate ForeignCall.Safety
- Language.Haskell.GHC.ExactPrint.Annotate: instance Language.Haskell.GHC.ExactPrint.Annotate.Annotate HsDecls.DocDecl
- Language.Haskell.GHC.ExactPrint.Annotate: instance Language.Haskell.GHC.ExactPrint.Annotate.Annotate HsDoc.HsDocString
- Language.Haskell.GHC.ExactPrint.Annotate: instance Language.Haskell.GHC.ExactPrint.Annotate.Annotate HsLit.HsLit
- Language.Haskell.GHC.ExactPrint.Annotate: instance Language.Haskell.GHC.ExactPrint.Annotate.Annotate HsTypes.HsIPName
- Language.Haskell.GHC.ExactPrint.Annotate: instance Language.Haskell.GHC.ExactPrint.Annotate.Annotate Language.Haskell.GHC.ExactPrint.Annotate.WildCardAnon
- Language.Haskell.GHC.ExactPrint.Annotate: instance Language.Haskell.GHC.ExactPrint.Annotate.Annotate Module.ModuleName
- Language.Haskell.GHC.ExactPrint.Annotate: instance Language.Haskell.GHC.ExactPrint.Annotate.Annotate Name.Name
- Language.Haskell.GHC.ExactPrint.Annotate: instance Language.Haskell.GHC.ExactPrint.Annotate.Annotate RdrName.RdrName
- Language.Haskell.GHC.ExactPrint.Annotate: instance Language.Haskell.GHC.ExactPrint.Annotate.Annotate name => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (BooleanFormula.BooleanFormula (SrcLoc.Located name))
- Language.Haskell.GHC.ExactPrint.Annotate: instance Language.Haskell.GHC.ExactPrint.Annotate.Annotate name => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsDecls.RoleAnnotDecl name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance Language.Haskell.GHC.ExactPrint.Annotate.Annotate name => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsDecls.WarnDecl name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance Language.Haskell.GHC.ExactPrint.Annotate.Annotate name => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsDecls.WarnDecls name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance Outputable.OutputableBndr name => Outputable.Outputable (Language.Haskell.GHC.ExactPrint.Annotate.ResTyGADTHook name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance PlaceHolder.DataId name => Data.Data.Data (Language.Haskell.GHC.ExactPrint.Annotate.ResTyGADTHook name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance PlaceHolder.DataId name => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsLit.HsOverLit name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance PlaceHolder.DataId name => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsTypes.AmbiguousFieldOcc name)
- Language.Haskell.GHC.ExactPrint.Annotate: instance PlaceHolder.DataId name => Language.Haskell.GHC.ExactPrint.Annotate.Annotate (HsTypes.FieldOcc name)
+ Language.Haskell.GHC.ExactPrint.Annotate: [MarkOffsetPrimOptional] :: AnnKeywordId -> Int -> Maybe String -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: [AnnotationsToComments] :: [AnnKeywordId] -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: [CountAnns] :: AnnKeywordId -> (Int -> next) -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: [GetSrcSpanForKw] :: SrcSpan -> AnnKeywordId -> (SrcSpan -> next) -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: [IfInContext] :: Set AstContext -> Annotated () -> Annotated () -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: [MarkAnnBeforeAnn] :: AnnKeywordId -> AnnKeywordId -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: [MarkEOF] :: next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: [MarkExternal] :: SrcSpan -> AnnKeywordId -> String -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: [MarkInside] :: AnnKeywordId -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: [MarkManyOptional] :: AnnKeywordId -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: [MarkMany] :: AnnKeywordId -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: [MarkOffsetPrimOptional] :: AnnKeywordId -> Int -> Maybe String -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: [MarkOffsetPrim] :: AnnKeywordId -> Int -> Maybe String -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: [MarkOutside] :: AnnKeywordId -> KeywordId -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: [MarkPPOptional] :: AnnKeywordId -> Maybe String -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: [MarkPrim] :: AnnKeywordId -> Maybe String -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: [SetContextLevel] :: Set AstContext -> Int -> Annotated () -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: [SetLayoutFlag] :: Rigidity -> Annotated () -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: [StoreOriginalSrcSpan] :: SrcSpan -> AnnKey -> (AnnKey -> next) -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: [TellContext] :: Set AstContext -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: [UnsetContext] :: AstContext -> Annotated () -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: [WithAST] :: Data a => Located a -> Annotated b -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: [WithSortKeyContexts] :: ListContexts -> [(SrcSpan, Annotated ())] -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: [WithSortKey] :: [(SrcSpan, Annotated ())] -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: annotationsToComments :: forall m_a14RT. MonadFree AnnotationF m_a14RT => [AnnKeywordId] -> m_a14RT ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: applyListAnnotations :: [(SrcSpan, Annotated ())] -> Annotated ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: applyListAnnotationsContexts :: ListContexts -> [(SrcSpan, Annotated ())] -> Annotated ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: applyListAnnotationsLayout :: [(SrcSpan, Annotated ())] -> Annotated ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: countAnns :: forall m_a14PX. MonadFree AnnotationF m_a14PX => AnnKeywordId -> m_a14PX Int
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: data AnnotationF next
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: getSrcSpanForKw :: forall m_a14Re. MonadFree AnnotationF m_a14Re => SrcSpan -> AnnKeywordId -> m_a14Re SrcSpan
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: ifInContext :: forall m_a14Uq. MonadFree AnnotationF m_a14Uq => Set AstContext -> Annotated () -> Annotated () -> m_a14Uq ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: inContext :: Set AstContext -> Annotated () -> Annotated ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: instance GHC.Base.Functor Language.Haskell.GHC.ExactPrint.AnnotateTypes.AnnotationF
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: listContexts :: ListContexts
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: listContexts' :: ListContexts
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: mark :: AnnKeywordId -> Annotated ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: markAnnBeforeAnn :: forall m_a14Wm. MonadFree AnnotationF m_a14Wm => AnnKeywordId -> AnnKeywordId -> m_a14Wm ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: markEOF :: forall m_a14dB. MonadFree AnnotationF m_a14dB => m_a14dB ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: markExternal :: forall m_a14MG. MonadFree AnnotationF m_a14MG => SrcSpan -> AnnKeywordId -> String -> m_a14MG ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: markInside :: forall m_a14M5. MonadFree AnnotationF m_a14M5 => AnnKeywordId -> m_a14M5 ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: markListIntercalateWithFun :: (t -> Annotated ()) -> [t] -> Annotated ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: markListIntercalateWithFunLevel :: (t -> Annotated ()) -> Int -> [t] -> Annotated ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: markListIntercalateWithFunLevelCtx :: (t -> Annotated ()) -> Int -> AstContext -> [t] -> Annotated ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: markListWithContextsFunction :: ListContexts -> (t -> Annotated ()) -> [t] -> Annotated ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: markMany :: forall m_a14Nn. MonadFree AnnotationF m_a14Nn => AnnKeywordId -> m_a14Nn ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: markManyOptional :: forall m_a14NY. MonadFree AnnotationF m_a14NY => AnnKeywordId -> m_a14NY ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: markOffset :: AnnKeywordId -> Int -> Annotated ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: markOffsetOptional :: AnnKeywordId -> Int -> Annotated ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: markOffsetPrim :: forall m_a14Oz. MonadFree AnnotationF m_a14Oz => AnnKeywordId -> Int -> Maybe String -> m_a14Oz ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: markOffsetPrimOptional :: forall m_a14Pg. MonadFree AnnotationF m_a14Pg => AnnKeywordId -> Int -> Maybe String -> m_a14Pg ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: markOffsetWithString :: AnnKeywordId -> Int -> String -> Annotated ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: markOptional :: AnnKeywordId -> Annotated ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: markOutside :: forall m_a14Lr. MonadFree AnnotationF m_a14Lr => AnnKeywordId -> KeywordId -> m_a14Lr ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: markPPOptional :: forall m_a14KN. MonadFree AnnotationF m_a14KN => AnnKeywordId -> Maybe String -> m_a14KN ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: markPrim :: forall m_a14K9. MonadFree AnnotationF m_a14K9 => AnnKeywordId -> Maybe String -> m_a14K9 ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: markTrailingSemi :: Annotated ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: markWithString :: AnnKeywordId -> String -> Annotated ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: markWithStringOptional :: AnnKeywordId -> String -> Annotated ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: setContext :: Set AstContext -> Annotated () -> Annotated ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: setContextLevel :: forall m_a14T5. MonadFree AnnotationF m_a14T5 => Set AstContext -> Int -> Annotated () -> m_a14T5 ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: setLayoutFlag :: Annotated () -> Annotated ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: setRigidFlag :: Annotated () -> Annotated ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: storeOriginalSrcSpan :: forall m_a14Qz. MonadFree AnnotationF m_a14Qz => SrcSpan -> AnnKey -> m_a14Qz AnnKey
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: tellContext :: forall m_a14VL. MonadFree AnnotationF m_a14VL => Set AstContext -> m_a14VL ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: type Annotated = FreeT AnnotationF Identity
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: unsetContext :: forall m_a14TM. MonadFree AnnotationF m_a14TM => AstContext -> Annotated () -> m_a14TM ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: withAST :: Data a => Located a -> Annotated () -> Annotated ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: withLocated :: Data a => Located a -> (SrcSpan -> a -> Annotated ()) -> Annotated ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: withSortKey :: forall m_a14Su. MonadFree AnnotationF m_a14Su => [(SrcSpan, Annotated ())] -> m_a14Su ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: withSortKeyContexts :: forall m_a14V7. MonadFree AnnotationF m_a14V7 => ListContexts -> [(SrcSpan, Annotated ())] -> m_a14V7 ()
+ Language.Haskell.GHC.ExactPrint.AnnotateTypes: withSortKeyContextsHelper :: (Monad m) => (Annotated () -> m ()) -> ListContexts -> [(SrcSpan, Annotated ())] -> m ()
+ Language.Haskell.GHC.ExactPrint.Annotater: [AnnotationsToComments] :: [AnnKeywordId] -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotater: [CountAnns] :: AnnKeywordId -> (Int -> next) -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotater: [GetSrcSpanForKw] :: SrcSpan -> AnnKeywordId -> (SrcSpan -> next) -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotater: [IfInContext] :: Set AstContext -> Annotated () -> Annotated () -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotater: [MarkAnnBeforeAnn] :: AnnKeywordId -> AnnKeywordId -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotater: [MarkEOF] :: next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotater: [MarkExternal] :: SrcSpan -> AnnKeywordId -> String -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotater: [MarkInside] :: AnnKeywordId -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotater: [MarkManyOptional] :: AnnKeywordId -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotater: [MarkMany] :: AnnKeywordId -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotater: [MarkOffsetPrimOptional] :: AnnKeywordId -> Int -> Maybe String -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotater: [MarkOffsetPrim] :: AnnKeywordId -> Int -> Maybe String -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotater: [MarkOutside] :: AnnKeywordId -> KeywordId -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotater: [MarkPPOptional] :: AnnKeywordId -> Maybe String -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotater: [MarkPrim] :: AnnKeywordId -> Maybe String -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotater: [SetContextLevel] :: Set AstContext -> Int -> Annotated () -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotater: [SetLayoutFlag] :: Rigidity -> Annotated () -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotater: [StoreOriginalSrcSpan] :: SrcSpan -> AnnKey -> (AnnKey -> next) -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotater: [TellContext] :: Set AstContext -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotater: [UnsetContext] :: AstContext -> Annotated () -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotater: [WithAST] :: Data a => Located a -> Annotated b -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotater: [WithSortKeyContexts] :: ListContexts -> [(SrcSpan, Annotated ())] -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotater: [WithSortKey] :: [(SrcSpan, Annotated ())] -> next -> AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotater: annotate :: (Annotate ast) => Located ast -> Annotated ()
+ Language.Haskell.GHC.ExactPrint.Annotater: class Data ast => Annotate ast
+ Language.Haskell.GHC.ExactPrint.Annotater: data AnnotationF next
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (Language.Haskell.GHC.ExactPrint.Annotater.Annotate name, PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsPat.HsRecField name (HsExpr.LHsExpr name))
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (Language.Haskell.GHC.ExactPrint.Annotater.Annotate name, PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsPat.HsRecField name (HsPat.LPat name))
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate arg) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsTypes.HsImplicitBndrs name (SrcLoc.Located arg))
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (Class.FunDep (SrcLoc.Located name))
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsDecls.InjectivityAnn name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name, Outputable.OutputableBndr name, OccName.HasOccName name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsDecls.ConDecl name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name, Outputable.OutputableBndr name, OccName.HasOccName name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsDecls.FamilyDecl name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name, Outputable.OutputableBndr name, OccName.HasOccName name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsDecls.FamilyResultSig name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name, Outputable.OutputableBndr name, OccName.HasOccName name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsDecls.TyFamDefltEqn name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name, Outputable.OutputableBndr name, OccName.HasOccName name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsDecls.TyFamInstEqn name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name, Outputable.OutputableBndr name, OccName.HasOccName name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsPat.Pat name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsImpExp.IE name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsImpExp.ImportDecl name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate [HsImpExp.LIE name]
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate body) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsExpr.Stmt name (SrcLoc.Located body))
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsBinds.HsBind name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsBinds.HsLocalBinds name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsBinds.IPBind name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsBinds.Sig name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsDecls.AnnDecl name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsDecls.ClsInstDecl name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsDecls.DataFamInstDecl name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsDecls.DefaultDecl name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsDecls.DerivDecl name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsDecls.ForeignDecl name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsDecls.HsDecl name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsDecls.InstDecl name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsDecls.RuleBndr name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsDecls.RuleDecl name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsDecls.RuleDecls name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsDecls.SpliceDecl name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsDecls.TyClDecl name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsDecls.TyFamInstDecl name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsDecls.VectDecl name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsExpr.HsCmd name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsExpr.HsCmdTop name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsExpr.HsExpr name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsExpr.HsSplice name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsExpr.HsTupArg name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsExpr.ParStmtBlock name name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsPat.HsRecUpdField name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsTypes.ConDeclField name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsTypes.HsAppType name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsTypes.HsTyVarBndr name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsTypes.HsType name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (Language.Haskell.GHC.ExactPrint.Annotater.ResTyGADTHook name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate [HsExpr.ExprLStmt name]
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate [HsTypes.LConDeclField name]
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate [HsTypes.LHsSigType name]
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate [HsTypes.LHsType name]
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate [SrcLoc.Located (HsExpr.StmtLR name name (HsExpr.LHsCmd name))]
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate body) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsExpr.GRHS name (SrcLoc.Located body))
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate body) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsExpr.Match name (SrcLoc.Located body))
+ Language.Haskell.GHC.ExactPrint.Annotater: instance (PlaceHolder.DataId name, Outputable.OutputableBndr name, OccName.HasOccName name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate name, Language.Haskell.GHC.ExactPrint.Annotater.Annotate body) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate [SrcLoc.Located (HsExpr.Match name (SrcLoc.Located body))]
+ Language.Haskell.GHC.ExactPrint.Annotater: instance Data.Data.Data Language.Haskell.GHC.ExactPrint.Annotater.WildCardAnon
+ Language.Haskell.GHC.ExactPrint.Annotater: instance GHC.Show.Show (HsTypes.LHsTyVarBndr name) => GHC.Show.Show (Language.Haskell.GHC.ExactPrint.Annotater.ResTyGADTHook name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance GHC.Show.Show Language.Haskell.GHC.ExactPrint.Annotater.WildCardAnon
+ Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (BasicTypes.SourceText, FastString.FastString)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Base.Maybe CoAxiom.Role)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsSyn.HsModule RdrName.RdrName)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate BasicTypes.OverlapMode
+ Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate BasicTypes.StringLiteral
+ Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate BasicTypes.WarningTxt
+ Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate FastString.FastString
+ Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate ForeignCall.CCallConv
+ Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate ForeignCall.CExportSpec
+ Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate ForeignCall.CType
+ Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate ForeignCall.Safety
+ Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate HsDecls.DocDecl
+ Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate HsDoc.HsDocString
+ Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate HsLit.HsLit
+ Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate HsTypes.HsIPName
+ Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate Language.Haskell.GHC.ExactPrint.Annotater.WildCardAnon
+ Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate Module.ModuleName
+ Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate Name.Name
+ Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate RdrName.RdrName
+ Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate name => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (BooleanFormula.BooleanFormula (SrcLoc.Located name))
+ Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate name => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsDecls.RoleAnnotDecl name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate name => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsDecls.WarnDecl name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate name => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsDecls.WarnDecls name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance Outputable.OutputableBndr name => Outputable.Outputable (Language.Haskell.GHC.ExactPrint.Annotater.ResTyGADTHook name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance PlaceHolder.DataId name => Data.Data.Data (Language.Haskell.GHC.ExactPrint.Annotater.ResTyGADTHook name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance PlaceHolder.DataId name => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsLit.HsOverLit name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance PlaceHolder.DataId name => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsTypes.AmbiguousFieldOcc name)
+ Language.Haskell.GHC.ExactPrint.Annotater: instance PlaceHolder.DataId name => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (HsTypes.FieldOcc name)
+ Language.Haskell.GHC.ExactPrint.Annotater: markAST :: Annotate ast => SrcSpan -> ast -> Annotated ()
+ Language.Haskell.GHC.ExactPrint.Annotater: type Annotated = FreeT AnnotationF Identity
+ Language.Haskell.GHC.ExactPrint.Annotater: withSortKeyContextsHelper :: (Monad m) => (Annotated () -> m ()) -> ListContexts -> [(SrcSpan, Annotated ())] -> m ()
+ Language.Haskell.GHC.ExactPrint.Utils: debugP :: String -> c -> c

Files

ChangeLog view
@@ -1,3 +1,5 @@+2017-05-17 v0.5.4.0+	* Support GHC 8.2 (rc2) 2017-05-05 v0.5.3.1 	* Fix bug roundtripping optional semicolons on if statements. 2017-02-07 v0.5.3.0
ghc-exactprint.cabal view
@@ -1,5 +1,5 @@ name:                ghc-exactprint-version:             0.5.3.1+version:             0.5.4.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@@ -17,7 +17,10 @@                         * Print - converts an AST and its annotations to                           properly formatted source text.                      .+                        * Pretty - adds annotations to an AST (fragment) so that+                          the output can be parsed back to the same AST.                      .+                     .                      Note: requires GHC 7.10.2 or later  license:             BSD3@@ -26,8 +29,9 @@ maintainer:          alan.zimm@gmail.com category:            Development build-type:          Simple-tested-with:    GHC == 7.10.3, GHC == 8.0.1, GHC == 8.0.2+tested-with:    GHC == 7.10.3, GHC == 8.0.1, GHC == 8.0.2, GHC == 8.2.1 extra-source-files:  ChangeLog+                     src-ghc710/Language/Haskell/GHC/ExactPrint/*.hs                      tests/examples/failing/*.hs                      tests/examples/ghc710/*.hs                      tests/examples/ghc710-only/*.hs@@ -56,22 +60,25 @@ library   exposed-modules:     Language.Haskell.GHC.ExactPrint                      , Language.Haskell.GHC.ExactPrint.Annotate+                     , Language.Haskell.GHC.ExactPrint.AnnotateTypes+                     , Language.Haskell.GHC.ExactPrint.Annotater                      , Language.Haskell.GHC.ExactPrint.Delta-                     , Language.Haskell.GHC.ExactPrint.GhcInterim                      , Language.Haskell.GHC.ExactPrint.Lookup+                     , Language.Haskell.GHC.ExactPrint.Parsers                      , 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                      , Language.Haskell.GHC.ExactPrint.Utils-                     , Language.Haskell.GHC.ExactPrint.Parsers +  if impl (ghc <= 8.0.2)+      exposed-modules: Language.Haskell.GHC.ExactPrint.GhcInterim    -- other-modules:   -- other-extensions:   GHC-Options:         -Wall-  build-depends:       base >=4.7 && <5.0+  build-depends:       base >=4.7 && <4.11                      , bytestring >= 0.10.6                      , containers >= 0.5                      , directory >= 1.2@@ -84,6 +91,15 @@   if impl (ghc >= 7.11)       build-depends: ghc-boot   hs-source-dirs:      src++  if impl (ghc > 8.0.3)+      hs-source-dirs: src-ghc82+  else+    if impl (ghc > 7.10.3)+        hs-source-dirs: src-ghc80+    else+        hs-source-dirs: src-ghc710+   default-language:    Haskell2010   if impl (ghc < 7.10.2)       buildable: False@@ -96,17 +112,25 @@   else     hs-source-dirs:      tests +  if impl (ghc > 8.0.3)+      hs-source-dirs: src-ghc82+  else+    if impl (ghc > 7.10.3)+        hs-source-dirs: src-ghc80+    else+        hs-source-dirs: src-ghc710+   main-is:             Test.hs   other-modules:       Test.Common                      , Test.Consistency                      , Test.NoAnnotations                      , Test.Transform-  GHC-Options:         -threaded+  GHC-Options:         -threaded -Wall   Default-language:    Haskell2010   if impl (ghc < 7.10.2)       buildable: False   Build-depends:       HUnit >= 1.2-                     , base < 5+                     , base < 4.11                      , bytestring                      , containers >= 0.5                      , Diff@@ -152,7 +176,7 @@   else     buildable: False   ghc-options:-    -threaded+    -threaded -Wall  executable static   main-is: Static.hs@@ -171,7 +195,7 @@   else     buildable: False   ghc-options:-    -threaded+    -threaded -Wall  executable prepare-hackage   main-is: PrepareHackage.hs
+ src-ghc710/Language/Haskell/GHC/ExactPrint/Annotater.hs view
@@ -0,0 +1,2555 @@+{-# LANGUAGE CPP #-}+{-# 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.Annotater+       (+         annotate+       , AnnotationF(..)+       , Annotated+       , Annotate(..)+       , withSortKeyContextsHelper+       ) where++import Language.Haskell.GHC.ExactPrint.AnnotateTypes+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 Name           as GHC+import qualified RdrName        as GHC+import qualified Outputable     as GHC++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" #-}+-- ---------------------------------------------------------------------++class Data ast => Annotate ast where+  markAST :: GHC.SrcSpan -> ast -> Annotated ()+++-- ---------------------------------------------------------------------++-- | Construct a syntax tree which represent which KeywordIds must appear+-- where.+annotate :: (Annotate ast) => GHC.Located ast -> Annotated ()+annotate = markLocated++-- ---------------------------------------------------------------------++-- | 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++-- ---------------------------------------------------------------------++-- |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++-- ---------------------------------------------------------------------++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+++-- ---------------------------------------------------------------------++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++-- ---------------------------------------------------------------------++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 "#-}"++-- ---------------------------------------------------------------------++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 GHC.isTcOcc (GHC.occName n) && GHC.isSymOcc (GHC.occName n)+            then do+              mark GHC.AnnType+              setContext (Set.singleton PrefixOp) $ markLocatedFromKw GHC.AnnVal ln+            else setContext (Set.singleton PrefixOp) $ markLocated ln++        (GHC.IEThingWith ln ns) -> do+          setContext (Set.singleton PrefixOp) $ markLocated ln+          mark GHC.AnnOpenP+          setContext (Set.singleton PrefixOp) $ markListIntercalate ns+          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+          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+      GHC.Orig _ _ -> markExternal l GHC.AnnVal str+      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 -- ')'+         "~" -> do+           mark GHC.AnnOpenP+           mark GHC.AnnTilde+           mark GHC.AnnCloseP+         _ -> 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 ()+    Just pkg -> markWithString GHC.AnnPackageName (show (GHC.unpackFS pkg))++   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)+      GHC.QuasiQuoteD d -> markLocated (GHC.L l d)++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+    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+  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 ()++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+   => Annotate (GHC.RuleBndr name) where+  markAST _ (GHC.RuleBndr ln) = markLocated ln+  markAST _ (GHC.RuleBndrSig ln (GHC.HsWB thing _ _ _)) = do+    mark GHC.AnnOpenP -- "("+    markLocated ln+    mark GHC.AnnDcolon+    markLocated thing+    mark GHC.AnnCloseP -- ")"++-- ---------------------------------------------------------------------++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+  markAST _ (GHC.ForeignImport ln typ _+               (GHC.CImport cconv safety@(GHC.L ll _) _mh _imp (GHC.L ls src))) = do+    mark GHC.AnnForeign+    mark GHC.AnnImport+    markLocated cconv+    unless (ll == GHC.noSrcSpan) $ markLocated safety+    markExternal ls GHC.AnnVal (show src)+    markLocated ln+    mark GHC.AnnDcolon+    markLocated typ+    markTrailingSemi+++  markAST _l (GHC.ForeignExport ln typ _ (GHC.CExport spec (GHC.L ls src))) = do+    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+  markAST l (GHC.CExportStatic _ cconv) = markAST l cconv++-- ---------------------------------------------------------------------++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++  markAST _ (GHC.DerivDecl typ mov) = do+    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++  markAST _ (GHC.ClsInstDecl poly binds sigs tyfams datafams mov) = do+    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++  markAST l (GHC.DataFamInstDecl ln (GHC.HsWB pats _ _ _)+             defn@(GHC.HsDataDefn nd ctx typ _mk cons mderivs) _) = do+    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 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+  markAST _ (GHC.FunBind _ _ (GHC.MG matches _ _ _) _ _ _) = do+    -- 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++  markAST _ (GHC.PatBind lhs (GHC.GRHSs grhs lb) _typ _fvs _ticks) = do+    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+    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"++-- ---------------------------------------------------------------------++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++  markAST _ (GHC.Match mln pats _typ (GHC.GRHSs grhs lb)) = do+    let+      get_infix Nothing = False+      get_infix (Just (_,f)) = f+      isFunBind = isJust+    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+          Nothing -> return ()+          Just (n,_) -> setContext (Set.singleton InfixOp) $ markLocated n+        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+        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++    -- 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++  markAST _ (GHC.TypeSig lns typ _) = do+    setContext (Set.singleton PrefixOp) $ markListNoPrecedingSpace True lns+    mark GHC.AnnDcolon+    markLocated typ+    markTrailingSemi+    tellContext (Set.singleton FollowingLine)++  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++  markAST _ (GHC.GenericSig ns typ) = do+    mark GHC.AnnDefault+    -- 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)+  markAST _ (GHC.FixSig (GHC.FixitySig lns (GHC.Fixity v fdir))) = do+    let fixstr = case fdir of+         GHC.InfixL -> "infixl"+         GHC.InfixR -> "infixr"+         GHC.InfixN -> "infix"+    markWithString GHC.AnnInfix fixstr+    markWithString GHC.AnnVal (show v)+    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++  markAST _ (GHC.SpecSig ln typs inl) = do+    markWithString GHC.AnnOpen (GHC.inl_src inl)+    markActivation (GHC.inl_act inl)+    markLocated ln+    mark GHC.AnnDcolon -- '::'+    markListIntercalate typs+    markWithString GHC.AnnClose "#-}" -- '#-}'+    markTrailingSemi+++  -- '{-# SPECIALISE' 'instance' inst_type '#-}'+  markAST _ (GHC.SpecInstSig src typ) = do+    markWithString GHC.AnnOpen src+    mark GHC.AnnInstance+    markLocated typ+    markWithString GHC.AnnClose "#-}" -- '#-}'+    markTrailingSemi++++  -- MinimalSig (BooleanFormula (Located name))+  markAST _l (GHC.MinimalSig src formula) = do+    markWithString GHC.AnnOpen src+    annotationsToCommentsBF formula [GHC.AnnOpenP,GHC.AnnCloseP,GHC.AnnComma,GHC.AnnVbar]+    markAST _l formula+    finalizeBF _l+    markWithString GHC.AnnClose "#-}"+    markTrailingSemi++-- --------------------------------------------------------------------++-- 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++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+  => Annotate (GHC.HsTyVarBndr name) where+  markAST _l (GHC.UserTyVar n) = do+    markAST _l n++  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 ()+    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 -- ")"++    markType _l (GHC.HsTyVar name) = do+      if GHC.isDataOcc $ GHC.occName name+        then do+            mark GHC.AnnSimpleQuote+            markLocatedFromKw GHC.AnnName (GHC.L _l name)+        else unsetContext Intercalate  $ markAST _l name++    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 "#)" -- '#)'++    markType _ (GHC.HsOpTy t1 (_,lo) t2) = do+      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+      mark GHC.AnnOpenPE+      markAST l s+      mark GHC.AnnCloseP++    markType _ (GHC.HsDocTy t ds) = do+      markLocated t+      markLocated ds++    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++    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)+    markType _ (GHC.HsWrapTy _ _) =+      traceM "warning: HsWrapTyy Introduced after renaming"++    markType l GHC.HsWildcardTy = do+      markExternal l GHC.AnnVal "_"+    markType l (GHC.HsNamedWildcardTy n) = do+      markExternal l GHC.AnnVal  (showGhc n)++    markType l (GHC.HsQuasiQuoteTy n) = do+      markAST l n++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+  => Annotate (GHC.HsSplice name) where+  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++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 ++ "|]")++-- ---------------------------------------------------------------------++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++-- ---------------------------------------------------------------------++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) $+          unsetContext Intercalate $ setContext (Set.singleton PrefixOp) $ markAST l n+      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+        mark GHC.AnnOpenPE+        markAST l s+        mark GHC.AnnCloseP++      -- LitPat HsLit+      markPat l (GHC.LitPat lp) = markExternal l GHC.AnnVal (hsLit2String lp)++      -- NPat (HsOverLit id) (Maybe (SyntaxExpr id)) (SyntaxExpr id)+      markPat _ (GHC.NPat ol mn _) = do+        -- markOptional GHC.AnnMinus+        when (isJust mn) $ mark GHC.AnnMinus+        markLocated ol++      -- NPlusKPat (Located id) (HsOverLit id) (SyntaxExpr id) (SyntaxExpr id)+      markPat _ (GHC.NPlusKPat ln ol _ _) = do+        markLocated ln+        markWithString GHC.AnnVal "+"  -- "+"+        markLocated ol+++      markPat _ (GHC.SigPatIn pat (GHC.HsWB ty _ _ _)) = do+        markLocated pat+        mark GHC.AnnDcolon+        markLocated ty++      markPat _ GHC.SigPatOut {} =+        traceM "warning: SigPatOut introduced after renaming"++      -- CoPat HsAnnotated (Pat id) Type+      markPat _ GHC.CoPat {} =+        traceM "warning: CoPat introduced after renaming"++      markPat l (GHC.QuasiQuotePat p) = markAST l p++-- ---------------------------------------------------------------------+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++-- ---------------------------------------------------------------------++instance (GHC.DataId name,Annotate arg)+    => Annotate (GHC.HsWithBndrs name (GHC.Located arg)) where+  markAST _ (GHC.HsWB thing _ _ _) = do+    markLocated thing++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,Annotate name+         ,GHC.HasOccName name,Annotate body)+  => Annotate (GHC.Stmt name (GHC.Located body)) where++  markAST _ (GHC.LastStmt body _) = setContextLevel (Set.fromList [LeftMost,PrefixOp]) 2 $ markLocated body++  markAST _ (GHC.BindStmt pat body _ _) = do+    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+++  markAST _ (GHC.BodyStmt body _ _ _) = do+    unsetContext Intercalate $ markLocated body+    inContext (Set.singleton AddVbar)     $ mark GHC.AnnVbar+    inContext (Set.singleton Intercalate) $ mark GHC.AnnComma+    markTrailingSemi++  markAST _ (GHC.LetStmt lb) = do+    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++  markAST l (GHC.ParStmt pbs _ _) = do+    -- 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++  markAST _ (GHC.TransStmt form stmts _b using by _ _ _) = do+    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++  markAST _ (GHC.RecStmt stmts _ _ _ _ _ _ _ _) = do+    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 ()+markMatchGroup _ (GHC.MG matches _ _ _)+  = 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+      markExpr l (GHC.HsVar n)           = unsetContext Intercalate $ markAST l n++      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++      markExpr _ (GHC.HsLam (GHC.MG [match] _ _ _)) = do+        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+        markAnnBeforeAnn GHC.AnnSemi GHC.AnnThen+        mark GHC.AnnThen+        setContextLevel (Set.singleton ListStart) 2 $ markLocated e2+        markAnnBeforeAnn GHC.AnnSemi GHC.AnnElse+        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++      markExpr _ (GHC.HsLet binds e) = do+        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)++      -- -------------------------------++      markExpr _ (GHC.HsDo cts es _) = do+        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 "[:"+        markListIntercalate es+        markWithString GHC.AnnClose ":]"++      markExpr _ (GHC.RecordCon n _ (GHC.HsRecFields fs dd)) = do+        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++      markExpr _ (GHC.RecordUpd e (GHC.HsRecFields fs _) _cons _ _) = do+        markLocated e+        mark GHC.AnnOpenC+        markListIntercalate fs+        mark GHC.AnnCloseC++      markExpr _ (GHC.ExprWithTySig e typ _) = do+        setContextLevel (Set.singleton PrefixOp) 2 $ markLocated e+        mark GHC.AnnDcolon+        markLocated typ++      markExpr _ (GHC.ExprWithTySigOut e typ) = do+        markLocated e+        mark GHC.AnnDcolon+        markLocated typ++      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"+        markWithStringOptional GHC.AnnVal (GHC.unpackFS csFStr)+        markWithString GHC.AnnValStr ("\"" ++ GHC.unpackFS csFStr ++ "\"")+        markWithString GHC.AnnClose "#-}"+        markLocated e++      markExpr _ (GHC.HsCoreAnn src csFStr e) = do+        markWithString GHC.AnnOpen src -- "{-# CORE"+        markWithString GHC.AnnVal ("\"" ++ GHC.unpackFS csFStr ++ "\"")+        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+        -- 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|")+        markLocated e+        markWithString GHC.AnnClose "|]"+      markExpr _l (GHC.HsBracket (GHC.TExpBr e)) = do+        -- 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||")+        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"++      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++      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 ()++      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++      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++      markExpr _ (GHC.HsType ty) = markLocated ty++      markExpr _ (GHC.HsWrap _ _) =+        traceM "warning: HsWrap introduced after renaming"+      markExpr _ (GHC.HsUnboundVar _) =+        traceM "warning: HsUnboundVar introduced after renaming"+++-- ---------------------------------------------------------------------++instance Annotate GHC.HsLit where+  markAST l lit = markExternal l GHC.AnnVal (hsLit2String lit)++-- ---------------------------------------------------------------------++-- |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++  markAST _ (GHC.HsCmdLet binds e) = do+    mark GHC.AnnLet+    markOptional GHC.AnnOpenC+    markLocalBindsWithLayout binds+    markOptional GHC.AnnCloseC+    mark GHC.AnnIn+    markLocated e++  markAST _ (GHC.HsCmdDo es _) = do+    mark GHC.AnnDo+    markOptional GHC.AnnOpenC+    markListWithLayout es+    markOptional GHC.AnnCloseC++  markAST _ GHC.HsCmdCast {} =+    traceM "warning: HsCmdCast introduced after renaming"++-- ---------------------------------------------------------------------++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++  markAST _ (GHC.SynDecl ln (GHC.HsQTvs _ tyvars) typ _) = do+    -- 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++  markAST _ (GHC.DataDecl ln (GHC.HsQTvs _ns tyVars)+                (GHC.HsDataDefn nd ctx mctyp mk cons mderivs) _) = do+    if nd == GHC.DataType+      then mark GHC.AnnData+      else mark GHC.AnnNewtype+    markMaybe mctyp+    when (null (GHC.unLoc ctx)) $ markOptional GHC.AnnDarrow+    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++  -- -----------------------------------++  markAST _ (GHC.ClassDecl ctx ln (GHC.HsQTvs _ns tyVars) fds+                          sigs meths ats atdefs docs _) = do+    mark GHC.AnnClass+    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+  markAST _ (GHC.FamilyDecl info ln (GHC.HsQTvs _ tyvars) mkind) = do+    case info of+      GHC.DataFamily -> mark GHC.AnnData+      _              -> mark GHC.AnnType++    mark GHC.AnnFamily++    markTyClass ln tyvars+    case mkind of+      Nothing -> return ()+      Just k -> do+        mark GHC.AnnDcolon+        markLocated k+    case info of+      GHC.ClosedTypeFamily eqns -> do+        mark GHC.AnnWhere+        markOptional GHC.AnnOpenC -- {+        markListWithLayout eqns+        markOptional GHC.AnnCloseC -- }+      _ -> return ()+    markTrailingSemi++-- ---------------------------------------------------------------------++instance (GHC.DataId name,Annotate name,GHC.OutputableBndr name,GHC.HasOccName name)+  => Annotate (GHC.TyFamInstEqn name) where+  markAST _ (GHC.TyFamEqn ln (GHC.HsWB pats _ _ _) typ) = do+    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+  markAST _ (GHC.TyFamEqn ln (GHC.HsQTvs _ns bndrs) typ) = do+    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+  markMaybe _mk+  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+    inContext (Set.singleton Deriving) $ mark GHC.AnnDeriving+    -- 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+  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++-- 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+++-- ---------------------------------------------------------------------++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+      Nothing -> return ()+      Just (GHC.Header h) ->+         markWithString GHC.AnnHeader ("\"" ++ GHC.unpackFS h ++ "\"")+    markWithString GHC.AnnVal ("\"" ++ GHC.unpackFS f ++ "\"")+    markWithString GHC.AnnClose "#-}"++-- ---------------------------------------------------------------------
+ src-ghc80/Language/Haskell/GHC/ExactPrint/Annotater.hs view
@@ -0,0 +1,2750 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# 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.Annotater+       (+         annotate+       , AnnotationF(..)+       , Annotated+       , Annotate(..)+       , withSortKeyContextsHelper+       ) where+++import Language.Haskell.GHC.ExactPrint.AnnotateTypes+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 Name           as GHC+import qualified RdrName        as GHC+import qualified Outputable     as GHC++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" #-}+-- ---------------------------------------------------------------------++class Data ast => Annotate ast where+  markAST :: GHC.SrcSpan -> ast -> Annotated ()++-- ---------------------------------------------------------------------++-- | Construct a syntax tree which represent which KeywordIds must appear+-- where.+annotate :: (Annotate ast) => GHC.Located ast -> Annotated ()+annotate = markLocated++-- ---------------------------------------------------------------------++-- | 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++-- ---------------------------------------------------------------------++-- |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++-- ---------------------------------------------------------------------++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+++-- ---------------------------------------------------------------------++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++-- ---------------------------------------------------------------------++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 "#-}"++-- ---------------------------------------------------------------------++instance Annotate GHC.StringLiteral where+  markAST l (GHC.StringLiteral src _) = do+    markExternal l GHC.AnnVal src+    inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma++-- ---------------------------------------------------------------------++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) -> do+          setContext (Set.fromList [PrefixOp,InIE]) $ markLocated ln++        (GHC.IEThingWith ln wc ns _lfs) -> do+          setContext (Set.fromList [PrefixOp,InIE]) $ markLocated ln+          mark GHC.AnnOpenP+          case wc of+            GHC.NoIEWildcard -> unsetContext Intercalate $ setContext (Set.fromList [PrefixOp,InIE])+                                 $ markListIntercalate ns+            GHC.IEWildcard n -> do+              setContext (Set.fromList [PrefixOp,Intercalate,InIE]) $ mapM_ markLocated (take n ns)+              mark GHC.AnnDotdot+              case drop n ns of+                [] -> return ()+                ns' -> do+                  mark GHC.AnnComma+                  setContext (Set.fromList [PrefixOp,InIE]) $ mapM_ markLocated ns'+          mark GHC.AnnCloseP++        (GHC.IEThingAll ln) -> do+          setContext (Set.fromList [PrefixOp,InIE]) $ 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)++-- ---------------------------------------------------------------------++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+      -- Horrible hack until GHC 8.2 with https://phabricator.haskell.org/D3016+      typeIESym = isSym && (GHC.isTcClsNameSpace $ GHC.rdrNameSpace n)+                        && spanLength l - length str > 6 -- length of "type" + 2 parens+      canParen = isSym && rdrName2String n /= "$"+                       && (not typeIESym)+      doNormalRdrName = do+        let str' = case str of+              -- TODO: unicode support?+                        "forall" -> if spanLength l == 1 then "∀" else str+                        _ -> str+        -- when (isSym && (GHC.isTcClsNameSpace $ GHC.rdrNameSpace n)) $ inContext (Set.singleton InIE) $ mark GHC.AnnType+        when (spanLength l - length str > 4) $ inContext (Set.singleton InIE) $ mark GHC.AnnType+        let str'' = if typeIESym then "(" ++ 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+      GHC.Orig _ _ -> if str == "~"+                        then doNormalRdrName+                        else markExternal l GHC.AnnVal str+      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 -- ')'+         _ -> 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 ()+    Just (GHC.StringLiteral srcPkg _) -> markWithString GHC.AnnPackageName srcPkg++   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)++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@(GHC.L _ (GHC.HsQuasiQuote{})) _flag) = do+    setContext (Set.singleton InSpliceDecl) $ markLocated e+    markTrailingSemi+  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+  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 ()++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+   => Annotate (GHC.RuleBndr name) where+  markAST _ (GHC.RuleBndr ln) = markLocated ln+  markAST _ (GHC.RuleBndrSig ln st) = do+    mark GHC.AnnOpenP -- "("+    markLocated ln+    mark GHC.AnnDcolon+    markLHsSigWcType st+    mark GHC.AnnCloseP -- ")"++-- ---------------------------------------------------------------------++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]+                            )++-- ---------------------------------------------------------------------++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+  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 }++-}+    mark GHC.AnnForeign+    mark GHC.AnnImport+    markLocated cconv+    unless (ll == GHC.noSrcSpan) $ markLocated safety+    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+    markLocated ln+    mark GHC.AnnDcolon+    markLocated typ+    markTrailingSemi+++  markAST _l (GHC.ForeignExport ln (GHC.HsIB _ typ) _ (GHC.CExport spec (GHC.L ls src))) = do+    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+  markAST l (GHC.CExportStatic _src _ cconv) = markAST l cconv++-- ---------------------------------------------------------------------++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++  markAST _ (GHC.DerivDecl (GHC.HsIB _ typ) mov) = do+    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++  markAST _ (GHC.ClsInstDecl (GHC.HsIB _ poly) binds sigs tyfams datafams mov) = do+    mark GHC.AnnInstance+    markMaybe mov+    markLocated poly+    if null (GHC.bagToList binds) && null sigs && null tyfams && null datafams+      then markOptional GHC.AnnWhere+      else do+        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++  markAST l (GHC.DataFamInstDecl ln (GHC.HsIB _ pats)+             defn@(GHC.HsDataDefn nd ctx typ _mk cons mderivs) _) = do+    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++    case (GHC.dd_kindSig defn) of+      Just s -> do+        mark GHC.AnnDcolon+        markLocated s+      Nothing -> return ()+    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+  markAST _ (GHC.FunBind _ (GHC.MG (GHC.L _ matches) _ _ _) _ _ _) = do+    -- 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++  markAST _ (GHC.PatBind lhs (GHC.GRHSs grhs (GHC.L _ lb)) _typ _fvs _ticks) = do+    markLocated lhs+    case grhs of+      (GHC.L _ (GHC.GRHS [] _):_) -> mark GHC.AnnEqual -- empty guards+      _ -> return ()+    markListIntercalateWithFunLevel markLocated 2 grhs++    case lb of+      GHC.EmptyLocalBinds -> return ()+      _ -> do+        mark GHC.AnnWhere+        markOptional GHC.AnnOpenC -- '{'+        markInside GHC.AnnSemi+        markLocalBindsWithLayout lb+        markOptional GHC.AnnCloseC -- '}'+    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+      GHC.RecordPatSyn fs -> do+        markLocated ln+        mark GHC.AnnOpenC  -- '{'+        markListIntercalateWithFun (markLocated . GHC.recordPatSynSelectorId) fs+        mark GHC.AnnCloseC -- '}'+    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"++  -- Introduced after renaming.+  markAST _ GHC.AbsBindsSig{} =+    traceM "warning: AbsBindsSig introduced after renaming"++-- ---------------------------------------------------------------------++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++  markAST _ (GHC.Match mln pats _typ (GHC.GRHSs grhs (GHC.L _ lb))) = do+    let+      get_infix GHC.NonFunBindMatch    = False+      get_infix (GHC.FunBindMatch _ f) = f+      isFunBind GHC.NonFunBindMatch = False+      isFunBind GHC.FunBindMatch{}  = True+    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+          GHC.NonFunBindMatch -> return ()+          GHC.FunBindMatch n _ -> setContext (Set.singleton InfixOp) $ markLocated n+        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+        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++    -- 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++  markAST _ (GHC.TypeSig lns st)  = do+    setContext (Set.singleton PrefixOp) $ markListNoPrecedingSpace True lns+    mark GHC.AnnDcolon+    markLHsSigWcType st+    markTrailingSemi+    tellContext (Set.singleton FollowingLine)++  markAST _ (GHC.PatSynSig ln (GHC.HsIB _ typ)) = do+    mark GHC.AnnPattern+    markLocated ln+    mark GHC.AnnDcolon+    markLocated typ+    markTrailingSemi++  markAST _ (GHC.ClassOpSig isDefault ns (GHC.HsIB _ typ)) = do+    when isDefault $ mark GHC.AnnDefault+    -- 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)+  markAST _ (GHC.FixSig (GHC.FixitySig lns (GHC.Fixity src _v fdir))) = do+    let fixstr = case fdir of+         GHC.InfixL -> "infixl"+         GHC.InfixR -> "infixr"+         GHC.InfixN -> "infix"+    markWithString GHC.AnnInfix fixstr+    markWithString GHC.AnnVal src+    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++  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++-}+    markWithString GHC.AnnOpen (GHC.inl_src inl)+    markActivation (GHC.inl_act inl)+    markLocated ln+    mark GHC.AnnDcolon -- '::'+    markListIntercalateWithFunLevel markLHsSigType 2 typs+    markWithString GHC.AnnClose "#-}" -- '#-}'+    markTrailingSemi+++  -- '{-# SPECIALISE' 'instance' inst_type '#-}'+  markAST _ (GHC.SpecInstSig src typ) = do+    markWithString GHC.AnnOpen src+    mark GHC.AnnInstance+    markLHsSigType typ+    markWithString GHC.AnnClose "#-}" -- '#-}'+    markTrailingSemi++++  -- MinimalSig (BooleanFormula (Located name))+  markAST _l (GHC.MinimalSig src formula) = do+    markWithString GHC.AnnOpen src+    markLocated formula+    markWithString GHC.AnnClose "#-}"+    markTrailingSemi++-- --------------------------------------------------------------------++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++-- --------------------------------------------------------------------++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++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+  => Annotate (GHC.HsTyVarBndr name) where+  markAST _l (GHC.UserTyVar n) = do+    markLocated n++  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 ()+    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+        }++  -}++    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 }+  -}++    markType _l (GHC.HsTyVar name) = do+      -- 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++    markType _ (GHC.HsAppsTy ts) = do+      mapM_ markLocated ts++    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 "#)" -- '#)'++    markType _ (GHC.HsOpTy t1 lo t2) = do+    -- HsOpTy              (LHsType name) (Located name) (LHsType name)+      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+      markAST l s++    markType _ (GHC.HsDocTy t ds) = do+      markLocated t+      markLocated ds++    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++  -}++    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)++    markType l (GHC.HsWildCardTy (GHC.AnonWildCard _)) = do+      markExternal l GHC.AnnVal "_"+++-- ---------------------------------------------------------------------++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++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,GHC.HasOccName name,Annotate name)+  => Annotate (GHC.HsSplice name) where+  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++-- ---------------------------------------------------------------------++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++-- ---------------------------------------------------------------------++instance (GHC.DataId name)+      => Annotate (GHC.FieldOcc name) where+  markAST _ (GHC.FieldOcc rn _) = do+    markLocated rn+    inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma++-- ---------------------------------------------------------------------++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) $+          unsetContext Intercalate $ setContext (Set.singleton PrefixOp) $ markAST l (GHC.unLoc n)+      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+        markAST l s++      -- LitPat HsLit+      markPat l (GHC.LitPat lp) = markExternal l GHC.AnnVal (hsLit2String lp)++      -- NPat (HsOverLit id) (Maybe (SyntaxExpr id)) (SyntaxExpr id)+      markPat _ (GHC.NPat ol mn _ _) = do+        -- markOptional GHC.AnnMinus+        when (isJust mn) $ mark GHC.AnnMinus+        markLocated ol++      -- NPlusKPat (Located id) (HsOverLit id) (SyntaxExpr id) (SyntaxExpr id)+      markPat _ (GHC.NPlusKPat ln ol _ _ _ _) = do+        markLocated ln+        markWithString GHC.AnnVal "+"  -- "+"+        markLocated ol+++      markPat _ (GHC.SigPatIn pat ty) = do+        markLocated pat+        mark GHC.AnnDcolon+        markLHsSigWcType ty++      markPat _ GHC.SigPatOut {} =+        traceM "warning: SigPatOut introduced after renaming"++      -- CoPat HsAnnotated (Pat id) Type+      markPat _ GHC.CoPat {} =+        traceM "warning: CoPat introduced after renaming"++-- ---------------------------------------------------------------------+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++-- ---------------------------------------------------------------------++instance (GHC.DataId name,Annotate arg)+    => Annotate (GHC.HsImplicitBndrs name (GHC.Located arg)) where+  markAST _ (GHC.HsIB _ thing) = do+    markLocated thing++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.OutputableBndr name,Annotate name+         ,GHC.HasOccName name,Annotate body)+  => Annotate (GHC.Stmt name (GHC.Located body)) where++  markAST _ (GHC.LastStmt body _ _) =  setContextLevel (Set.fromList [LeftMost,PrefixOp]) 2 $ markLocated body++  markAST _ (GHC.BindStmt pat body _ _ _) = do+    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++  markAST _ GHC.ApplicativeStmt{}+    = error "ApplicativeStmt should not appear in ParsedSource"++  markAST _ (GHC.BodyStmt body _ _ _) = do+    unsetContext Intercalate $ markLocated body+    inContext (Set.singleton AddVbar)     $ mark GHC.AnnVbar+    inContext (Set.singleton Intercalate) $ mark GHC.AnnComma+    markTrailingSemi++  markAST _ (GHC.LetStmt (GHC.L _ lb)) = do+    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++  markAST l (GHC.ParStmt pbs _ _ _) = do+    -- 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++  markAST _ (GHC.TransStmt form stmts _b using by _ _ _ _) = do+    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++  markAST _ (GHC.RecStmt stmts _ _ _ _ _ _ _ _ _) = do+    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 ()+markMatchGroup _ (GHC.MG (GHC.L _ matches) _ _ _)+  = 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+      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)+            )++      markExpr l (GHC.HsRecFld f) = markAST l f++      markExpr l (GHC.HsOverLabel fs)+        = markExternal l GHC.AnnVal ("#" ++ GHC.unpackFS fs)++      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++      markExpr _ (GHC.HsLam (GHC.MG (GHC.L _ [match]) _ _ _)) = do+        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+        markAnnBeforeAnn GHC.AnnSemi GHC.AnnThen+        mark GHC.AnnThen+        setContextLevel (Set.singleton ListStart) 2 $ markLocated e2+        markAnnBeforeAnn GHC.AnnSemi GHC.AnnElse+        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++      markExpr _ (GHC.HsLet (GHC.L _ binds) e) = do+        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)++      -- -------------------------------++      markExpr _ (GHC.HsDo cts (GHC.L _ es) _) = do+        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 "[:"+        markListIntercalate es+        markWithString GHC.AnnClose ":]"++      markExpr _ (GHC.RecordCon n _ _ (GHC.HsRecFields fs dd)) = do+        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++      markExpr _ (GHC.RecordUpd e fs _cons _ _ _) = do+        markLocated e+        mark GHC.AnnOpenC+        markListIntercalate fs+        mark GHC.AnnCloseC++      markExpr _ (GHC.ExprWithTySig e typ) = do+        setContextLevel (Set.singleton PrefixOp) 2 $ markLocated e+        mark GHC.AnnDcolon+        markLHsSigWcType typ++      markExpr _ (GHC.ExprWithTySigOut e typ) = do+        markLocated e+        mark GHC.AnnDcolon+        markLHsSigWcType typ++      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"+        markWithStringOptional GHC.AnnVal (GHC.sl_st csFStr)+        markWithString GHC.AnnValStr (GHC.sl_st csFStr)+        markWithString GHC.AnnClose "#-}"+        markLocated e++      markExpr _ (GHC.HsCoreAnn src csFStr e) = do+        markWithString GHC.AnnOpen src -- "{-# CORE"+        markWithString GHC.AnnVal (GHC.sl_st csFStr)+        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+        markWithString GHC.AnnOpen "[|"+        markOptional GHC.AnnOpenE  -- "[e|"+        markLocated e+        markWithString GHC.AnnClose "|]"+      markExpr _l (GHC.HsBracket (GHC.TExpBr e)) = do+        markWithString GHC.AnnOpen  "[||"+        markWithStringOptional GHC.AnnOpenE "[e||"+        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"++      -- --------------------------------++      -- markExpr l (GHC.HsSpliceE e@(GHC.HsUntypedSplice _ (GHC.L _ (GHC.HsSpliceE{})))) = do+      --   mark GHC.AnnOpenPE+      --   markAST l e+      --   mark GHC.AnnCloseP+      markExpr l (GHC.HsSpliceE e) = do+        markOptional GHC.AnnOpenPE+        markAST l e+        markOptional GHC.AnnCloseP++      -- --------------------------------++      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 ()++      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++      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++      markExpr _ (GHC.HsAppType e ty) = do+        markLocated e+        mark GHC.AnnAt+        markLHsWcType ty+      markExpr _ (GHC.HsAppTypeOut _ _) =+        traceM "warning: HsAppTypeOut introduced after renaming"++      markExpr _ (GHC.HsWrap _ _) =+        traceM "warning: HsWrap introduced after renaming"+      markExpr _ (GHC.HsUnboundVar _) =+        traceM "warning: HsUnboundVar introduced after renaming"+++-- ---------------------------------------------------------------------++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]+                          )++-- ---------------------------------------------------------------------++instance Annotate GHC.HsLit where+  markAST l lit = markExternal l GHC.AnnVal (hsLit2String lit)++-- ---------------------------------------------------------------------++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++-- ---------------------------------------------------------------------++-- |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++  markAST _ (GHC.HsCmdLet (GHC.L _ binds) e) = do+    mark GHC.AnnLet+    markOptional GHC.AnnOpenC+    markLocalBindsWithLayout binds+    markOptional GHC.AnnCloseC+    mark GHC.AnnIn+    markLocated e++  markAST _ (GHC.HsCmdDo (GHC.L _ es) _) = do+    mark GHC.AnnDo+    markOptional GHC.AnnOpenC+    markListWithLayout es+    markOptional GHC.AnnCloseC+++  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+-}++-- ---------------------------------------------------------------------++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++  markAST _ (GHC.SynDecl ln (GHC.HsQTvs _ tyvars _) typ _) = do+    -- 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++  markAST _ (GHC.DataDecl ln (GHC.HsQTvs _ns tyVars _)+                (GHC.HsDataDefn nd ctx mctyp mk cons mderivs) _ _) = do+    if nd == GHC.DataType+      then mark GHC.AnnData+      else mark GHC.AnnNewtype+    markMaybe mctyp+    when (null (GHC.unLoc ctx)) $ markOptional GHC.AnnDarrow+    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++  -- -----------------------------------++  markAST _ (GHC.ClassDecl ctx ln (GHC.HsQTvs _ns tyVars _) fds+                          sigs meths ats atdefs docs _) = do+    mark GHC.AnnClass+    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+  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+  }+-}+    case info of+      GHC.DataFamily -> mark GHC.AnnData+      _              -> mark GHC.AnnType++    -- ifInContext (Set.singleton InClassDecl) (return ()) (mark GHC.AnnFamily)+    mark GHC.AnnFamily++    markTyClass ln tyvars+    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+    case info of+      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 -- }+      _ -> return ()+    markTrailingSemi++-- ---------------------------------------------------------------------++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++-- ---------------------------------------------------------------------++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++-- ---------------------------------------------------------------------++instance (GHC.DataId name,Annotate name,GHC.OutputableBndr name,GHC.HasOccName name)+  => Annotate (GHC.TyFamInstEqn name) where+  markAST _ (GHC.TyFamEqn ln (GHC.HsIB _ pats) typ) = do+    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+  markAST _ (GHC.TyFamEqn ln (GHC.HsQTvs _ns bndrs _) typ) = do+    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 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+    -- 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+  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++-- 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+++-- 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 "_"++-- ---------------------------------------------------------------------++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+      Nothing -> return ()+      Just (GHC.Header srcH _h) ->+         markWithString GHC.AnnHeader srcH+    markWithString GHC.AnnVal (fst f)+    markWithString GHC.AnnClose "#-}"++-- ---------------------------------------------------------------------
+ src-ghc82/Language/Haskell/GHC/ExactPrint/Annotater.hs view
@@ -0,0 +1,2660 @@+{-# LANGUAGE CPP #-}+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE PatternSynonyms #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# 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.Annotater+       (+         annotate+       , AnnotationF(..)+       , Annotated+       , Annotate(..)+       , withSortKeyContextsHelper+       ) where+++import Language.Haskell.GHC.ExactPrint.AnnotateTypes+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 Name           as GHC+import qualified RdrName        as GHC+import qualified Outputable     as GHC++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" #-}+-- ---------------------------------------------------------------------++class Data ast => Annotate ast where+  markAST :: GHC.SrcSpan -> ast -> Annotated ()++-- ---------------------------------------------------------------------++-- | Construct a syntax tree which represent which KeywordIds must appear+-- where.+annotate :: (Annotate ast) => GHC.Located ast -> Annotated ()+annotate = markLocated++-- ---------------------------------------------------------------------++-- | 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++-- ---------------------------------------------------------------------++-- |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++-- ---------------------------------------------------------------------++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+++-- ---------------------------------------------------------------------++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.HsLocalBinds GHC.RdrName -> 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++-- ---------------------------------------------------------------------++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 _ txt) lss) = do+    markAnnOpen txt "{-# WARNING"+    mark GHC.AnnOpenS+    markListIntercalate lss+    mark GHC.AnnCloseS+    markWithString GHC.AnnClose "#-}"++  markAST _ (GHC.DeprecatedTxt (GHC.L _ txt) lss) = do+    -- markExternal ls GHC.AnnOpen txt+    markAnnOpen txt "{-# DEPRECATED"+    mark GHC.AnnOpenS+    markListIntercalate lss+    mark GHC.AnnCloseS+    markWithString GHC.AnnClose "#-}"++-- ---------------------------------------------------------------------++instance Annotate GHC.StringLiteral where+  markAST l (GHC.StringLiteral src fs) = do+    markExternalSourceText l src (show (GHC.unpackFS fs))+    inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma++-- ---------------------------------------------------------------------++instance Annotate (GHC.SourceText,GHC.FastString) where+  markAST l (src,fs) = do+    markExternalSourceText l src (show (GHC.unpackFS fs))++-- ---------------------------------------------------------------------++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 -> markLocated ln++        GHC.IEThingAbs ln -> do+          setContext (Set.singleton PrefixOp) $ markLocated ln++        GHC.IEThingWith ln wc ns _lfs -> do+          setContext (Set.singleton PrefixOp) $ markLocated ln+          mark GHC.AnnOpenP+          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'+          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)++-- ---------------------------------------------------------------------++instance (GHC.DataId name,GHC.HasOccName name, Annotate name)+  => Annotate (GHC.IEWrappedName name) where+  markAST _ (GHC.IEName ln) = do+    unsetContext Intercalate $ setContext (Set.fromList [PrefixOp])+      $ markLocated ln+    inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma+  markAST _ (GHC.IEPattern ln) = do+    mark GHC.AnnPattern+    setContext (Set.singleton PrefixOp) $ markLocated ln+    inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma+  markAST _ (GHC.IEType ln) = do+    mark GHC.AnnType+    setContext (Set.singleton PrefixOp) $ markLocated ln+    inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma+{-+data IEWrappedName name+  = IEName    (Located name)  -- ^ no extra+  | IEPattern (Located name)  -- ^ pattern X+  | IEType    (Located name)  -- ^ type (:+:)+  deriving (Eq,Data)++-}+-- ---------------------------------------------------------------------+{-+-- 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++        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+      GHC.Orig _ _ -> if str == "~"+                        then doNormalRdrName+                        else markExternal l GHC.AnnVal str+      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 -- ')'+         _ -> 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 "#-}"+   case msrc of+     GHC.SourceText _txt -> do+       markAnnOpen msrc "{-# SOURCE"+       markWithString GHC.AnnClose "#-}"+     GHC.NoSourceText -> return ()+   when safeflag (mark GHC.AnnSafe)+   when qualFlag (unsetContext TopLevel $ mark GHC.AnnQualified)+   case mpkg of+    Just (GHC.StringLiteral (GHC.SourceText srcPkg) _) ->+      markWithString GHC.AnnPackageName srcPkg+    _ -> return ()++   markLocated modname++   case GHC.ideclAs imp of+      Nothing -> return ()+      Just mn -> do+          mark GHC.AnnAs+          markLocated 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.LHsDecl GHC.RdrName -> 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)++instance Annotate (GHC.HsDecl GHC.RdrName) 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 Annotate (GHC.SpliceDecl GHC.RdrName) where+  markAST _ (GHC.SpliceDecl e@(GHC.L _ (GHC.HsQuasiQuote{})) _flag) = do+    markLocated e+    markTrailingSemi+  markAST _ (GHC.SpliceDecl e _flag) = do+    markLocated e+    markTrailingSemi++-- ---------------------------------------------------------------------++instance Annotate (GHC.VectDecl GHC.RdrName) where+  markAST _ (GHC.HsVect src ln e) = do+    markAnnOpen src "{-# VECTORISE"+    markLocated ln+    mark GHC.AnnEqual+    markLocated e+    markWithString GHC.AnnClose "#-}" -- "#-}"++  markAST _ (GHC.HsNoVect src ln) = do+    markAnnOpen src "{-# NOVECTORISE"+    markLocated ln+    markWithString GHC.AnnClose "#-}" -- "#-}"++  markAST _ (GHC.HsVectTypeIn src _b ln mln) = do+    markAnnOpen 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+    markAnnOpen 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 Annotate (GHC.RuleDecls GHC.RdrName) where+   markAST _ (GHC.HsRules src rules) = do+     markAnnOpen src "{-# RULES"+     setLayoutFlag $ markListIntercalateWithFunLevel markLocated 2 rules+     markWithString GHC.AnnClose "#-}"+     markTrailingSemi++-- ---------------------------------------------------------------------++instance Annotate (GHC.RuleDecl GHC.RdrName) where+  markAST l (GHC.HsRule ln act bndrs lhs _ rhs _) = do+    markLocated ln+    setContext (Set.singleton ExplicitNeverActive) $ markActivation l 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.SrcSpan -> GHC.Activation -> Annotated ()+markActivation _ act = do+  case act of+    GHC.ActiveBefore src phase -> do+      mark GHC.AnnOpenS --  '['+      mark GHC.AnnTilde -- ~+      markSourceText src (show phase)+      mark GHC.AnnCloseS -- ']'+    GHC.ActiveAfter src phase -> do+      mark GHC.AnnOpenS --  '['+      markSourceText src (show phase)+      mark GHC.AnnCloseS -- ']'+    GHC.NeverActive -> do+      inContext (Set.singleton ExplicitNeverActive) $ do+        mark GHC.AnnOpenS --  '['+        mark GHC.AnnTilde -- ~+        mark GHC.AnnCloseS -- ']'+    _ -> return ()++-- ---------------------------------------------------------------------++instance Annotate (GHC.RuleBndr GHC.RdrName) where+  markAST _ (GHC.RuleBndr ln) = markLocated ln+  markAST _ (GHC.RuleBndrSig ln st) = do+    mark GHC.AnnOpenP -- "("+    markLocated ln+    mark GHC.AnnDcolon+    markLHsSigWcType st+    mark GHC.AnnCloseP -- ")"++-- ---------------------------------------------------------------------++markLHsSigWcType :: GHC.LHsSigWcType GHC.RdrName -> Annotated ()+markLHsSigWcType (GHC.HsWC _ (GHC.HsIB _ ty _)) = do+  markLocated ty++-- ---------------------------------------------------------------------++instance Annotate (GHC.AnnDecl GHC.RdrName) where+   markAST _ (GHC.HsAnnotation src prov e) = do+     markAnnOpen src "{-# ANN"+     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+     markAnnOpen src "{-# WARNING" -- Note: might be {-# DEPRECATED+     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 Annotate (GHC.ForeignDecl GHC.RdrName) where+  markAST _ (GHC.ForeignImport ln (GHC.HsIB _ typ _) _+               (GHC.CImport cconv safety@(GHC.L ll _) _mh _imp (GHC.L ls src))) = do+    mark GHC.AnnForeign+    mark GHC.AnnImport+    markLocated cconv+    unless (ll == GHC.noSrcSpan) $ markLocated safety+    markExternalSourceText ls src ""+    markLocated ln+    mark GHC.AnnDcolon+    markLocated typ+    markTrailingSemi+++  markAST _l (GHC.ForeignExport ln (GHC.HsIB _ typ _) _ (GHC.CExport spec (GHC.L ls src))) = do+    mark GHC.AnnForeign+    mark GHC.AnnExport+    markLocated spec+    markExternal ls GHC.AnnVal (sourceTextToString src "")+    setContext (Set.singleton PrefixOp) $ markLocated ln+    mark GHC.AnnDcolon+    markLocated typ+++-- ---------------------------------------------------------------------++instance (Annotate GHC.CExportSpec) where+  markAST l (GHC.CExportStatic _src _ cconv) = markAST l cconv++-- ---------------------------------------------------------------------++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 Annotate (GHC.DerivDecl GHC.RdrName) where++  markAST _ (GHC.DerivDecl typ ms mov) = do+    mark GHC.AnnDeriving+    markMaybe ms+    mark GHC.AnnInstance+    markMaybe mov+    markLHsSigType typ+    markTrailingSemi+{-+stand_alone_deriving :: { LDerivDecl RdrName }+  : 'deriving' deriv_strategy 'instance' overlap_pragma inst_type+                {% do { let { err = text "in the stand-alone deriving instance"+                                    <> colon <+> quotes (ppr $5) }+                      ; ams (sLL $1 (hsSigType $>) (DerivDecl $5 $2 $4))+                            [mj AnnDeriving $1, mj AnnInstance $3] } }++data DerivDecl name = DerivDecl+        { deriv_type         :: LHsSigType name+        , deriv_strategy     :: Maybe (Located DerivStrategy)+        , deriv_overlap_mode :: Maybe (Located OverlapMode)+         -- ^ - 'ApiAnnotation.AnnKeywordId' : 'ApiAnnotation.AnnDeriving',+         --        'ApiAnnotation.AnnInstance', 'ApiAnnotation.AnnStock',+         --        'ApiAnnotation.AnnAnyClass', 'Api.AnnNewtype',+         --        'ApiAnnotation.AnnOpen','ApiAnnotation.AnnClose'++  -- For details on above see note [Api annotations] in ApiAnnotation+        }+-}++-- ---------------------------------------------------------------------++instance Annotate GHC.DerivStrategy where++  markAST _ GHC.StockStrategy    = mark GHC.AnnStock+  markAST _ GHC.AnyclassStrategy = mark GHC.AnnAnyclass+  markAST _ GHC.NewtypeStrategy  = mark GHC.AnnNewtype++-- ---------------------------------------------------------------------++instance Annotate (GHC.DefaultDecl GHC.RdrName) where++  markAST _ (GHC.DefaultDecl typs) = do+    mark GHC.AnnDefault+    mark GHC.AnnOpenP -- '('+    markListIntercalate typs+    mark GHC.AnnCloseP -- ')'+    markTrailingSemi++-- ---------------------------------------------------------------------++instance Annotate (GHC.InstDecl GHC.RdrName) 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++  -- NOTE: NoOverlap is only used in the typechecker+  markAST _ (GHC.NoOverlap src) = do+    markAnnOpen src "{-# NO_OVERLAP"+    markWithString GHC.AnnClose "#-}"++  markAST _ (GHC.Overlappable src) = do+    markAnnOpen src "{-# OVERLAPPABLE"+    markWithString GHC.AnnClose "#-}"++  markAST _ (GHC.Overlapping src) = do+    markAnnOpen src "{-# OVERLAPPING"+    markWithString GHC.AnnClose "#-}"++  markAST _ (GHC.Overlaps src) = do+    markAnnOpen src "{-# OVERLAPS"+    markWithString GHC.AnnClose "#-}"++  markAST _ (GHC.Incoherent src) = do+    markAnnOpen src "{-# INCOHERENT"+    markWithString GHC.AnnClose "#-}"++-- ---------------------------------------------------------------------++instance Annotate (GHC.ClsInstDecl GHC.RdrName) where++  markAST _ (GHC.ClsInstDecl (GHC.HsIB _ poly _) binds sigs tyfams datafams mov) = do+    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 Annotate (GHC.TyFamInstDecl GHC.RdrName) 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 Annotate (GHC.DataFamInstDecl GHC.RdrName) where++  markAST l (GHC.DataFamInstDecl ln (GHC.HsIB _ pats _) fixity+             defn@(GHC.HsDataDefn nd ctx typ _mk cons mderivs) _) = do+    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 fixity ln pats++    case (GHC.dd_kindSig defn) of+      Just s -> do+        mark GHC.AnnDcolon+        markLocated s+      Nothing -> return ()+    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 Annotate (GHC.HsBind GHC.RdrName) where+  markAST _ (GHC.FunBind _ (GHC.MG (GHC.L _ matches) _ _ _) _ _ _) = do+    -- 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++  markAST _ (GHC.PatBind lhs (GHC.GRHSs grhs (GHC.L _ lb)) _typ _fvs _ticks) = do+    markLocated lhs+    case grhs of+      (GHC.L _ (GHC.GRHS [] _):_) -> mark GHC.AnnEqual -- empty guards+      _ -> return ()+    markListIntercalateWithFunLevel markLocated 2 grhs++    -- TODO: extract this common code+    case lb of+      GHC.EmptyLocalBinds -> return ()+      _ -> do+        mark GHC.AnnWhere+        markOptional GHC.AnnOpenC -- '{'+        markInside GHC.AnnSemi+        markLocalBindsWithLayout lb+        markOptional GHC.AnnCloseC -- '}'+    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+      GHC.RecordPatSyn fs -> do+        markLocated ln+        mark GHC.AnnOpenC  -- '{'+        markListIntercalateWithFun (markLocated . GHC.recordPatSynSelectorId) fs+        mark GHC.AnnCloseC -- '}'+    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"++  -- Introduced after renaming.+  markAST _ GHC.AbsBindsSig{} =+    traceM "warning: AbsBindsSig introduced after renaming"++-- ---------------------------------------------------------------------++instance Annotate (GHC.IPBind GHC.RdrName) 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 (Annotate body)+  => Annotate (GHC.Match GHC.RdrName (GHC.Located body)) where++  markAST _ (GHC.Match mln pats _typ (GHC.GRHSs grhs (GHC.L _ lb))) = do+    let+      get_infix (GHC.FunRhs _ f) = f+      get_infix _                = GHC.Prefix++      isFunBind GHC.FunRhs{} = True+      isFunBind _            = False+    case (get_infix mln,pats) of+      (GHC.Infix, a:b:xs) -> do+        if null xs+          then markOptional GHC.AnnOpenP+          else mark         GHC.AnnOpenP+        markLocated a+        case mln of+          GHC.FunRhs n _ -> setContext (Set.singleton InfixOp) $ markLocated n+          _              -> return ()+        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+        case mln of+          GHC.FunRhs n _ -> do+            setContext (Set.fromList [NoPrecedingSpace,PrefixOp]) $ markLocated n+            mapM_ markLocated pats+          _  -> markListNoPrecedingSpace False pats++    -- 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 (Annotate body)+  => Annotate (GHC.GRHS GHC.RdrName (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 Annotate (GHC.Sig GHC.RdrName) where++  markAST _ (GHC.TypeSig lns st)  = do+    setContext (Set.singleton PrefixOp) $ markListNoPrecedingSpace True lns+    mark GHC.AnnDcolon+    markLHsSigWcType st+    markTrailingSemi+    tellContext (Set.singleton FollowingLine)++  markAST _ (GHC.PatSynSig lns (GHC.HsIB _ typ _)) = do+    mark GHC.AnnPattern+    markListIntercalate lns+    mark GHC.AnnDcolon+    markLocated typ+    markTrailingSemi++  markAST _ (GHC.ClassOpSig isDefault ns (GHC.HsIB _ typ _)) = do+    when isDefault $ mark GHC.AnnDefault+    setContext (Set.singleton PrefixOp) $ markListIntercalate ns+    mark GHC.AnnDcolon+    markLocated typ+    markTrailingSemi++  markAST _ (GHC.IdSig _) =+    traceM "warning: Introduced after renaming"++  markAST _ (GHC.FixSig (GHC.FixitySig lns (GHC.Fixity src v fdir))) = do+    let fixstr = case fdir of+         GHC.InfixL -> "infixl"+         GHC.InfixR -> "infixr"+         GHC.InfixN -> "infix"+    markWithString GHC.AnnInfix fixstr+    markSourceText src (show v)+    setContext (Set.singleton InfixOp) $ markListIntercalate lns+    markTrailingSemi++  markAST l (GHC.InlineSig ln inl) = do+    markAnnOpen (GHC.inl_src inl) "{-# INLINE"+    markActivation l (GHC.inl_act inl)+    setContext (Set.singleton PrefixOp) $ markLocated ln+    markWithString GHC.AnnClose "#-}" -- '#-}'+    markTrailingSemi++  markAST l (GHC.SpecSig ln typs inl) = do+    markAnnOpen (GHC.inl_src inl) "{-# SPECIALISE" -- Note: may be {-# SPECIALISE_INLINE+    markActivation l (GHC.inl_act inl)+    markLocated ln+    mark GHC.AnnDcolon -- '::'+    markListIntercalateWithFunLevel markLHsSigType 2 typs+    markWithString GHC.AnnClose "#-}" -- '#-}'+    markTrailingSemi+++  markAST _ (GHC.SpecInstSig src typ) = do+    markAnnOpen src "{-# SPECIALISE"+    mark GHC.AnnInstance+    markLHsSigType typ+    markWithString GHC.AnnClose "#-}" -- '#-}'+    markTrailingSemi+++  markAST _ (GHC.MinimalSig src formula) = do+    markAnnOpen src "{-# MINIMAL"+    markLocated formula+    markWithString GHC.AnnClose "#-}"+    markTrailingSemi++  markAST _ (GHC.SCCFunSig src ln ml) = do+    markAnnOpen src "{-# SCC"+    markLocated ln+    markMaybe ml+    markWithString GHC.AnnClose "#-}"+    markTrailingSemi++  markAST _ (GHC.CompleteMatchSig src (GHC.L _ ns) mlns) = do+    markAnnOpen src "{-# COMPLETE"+    markListIntercalate ns+    case mlns of+      Nothing -> return ()+      Just _ -> do+        mark GHC.AnnDcolon+        markMaybe mlns+    markWithString GHC.AnnClose "#-}" -- '#-}'+    markTrailingSemi++-- --------------------------------------------------------------------++markLHsSigType :: GHC.LHsSigType GHC.RdrName -> Annotated ()+markLHsSigType (GHC.HsIB _ typ _) = markLocated typ++instance Annotate [GHC.LHsSigType GHC.RdrName] 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++-- --------------------------------------------------------------------++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 _ (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++-- ---------------------------------------------------------------------++instance Annotate (GHC.HsTyVarBndr GHC.RdrName) where+  markAST _l (GHC.UserTyVar n) = do+    markLocated n++  markAST _ (GHC.KindedTyVar n ty) = do+    mark GHC.AnnOpenP  -- '('+    markLocated n+    mark GHC.AnnDcolon -- '::'+    markLocated ty+    mark GHC.AnnCloseP -- '('++-- ---------------------------------------------------------------------++instance Annotate (GHC.HsType GHC.RdrName) where+  markAST loc ty = do+    markType loc ty+    inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma+   where++    -- markType :: GHC.SrcSpan -> ast -> Annotated ()+    markType _ (GHC.HsForAllTy tvs typ) = do+      mark GHC.AnnForall+      mapM_ markLocated tvs+      mark GHC.AnnDot+      markLocated typ++    markType _ (GHC.HsQualTy cxt typ) = do+      markLocated cxt+      markLocated typ++    markType _ (GHC.HsTyVar promoted name) = do+      when (promoted == GHC.Promoted) $ mark GHC.AnnSimpleQuote+      markLocated name++    markType _ (GHC.HsAppsTy ts) = do+      mapM_ markLocated ts+      inContext (Set.fromList [AddVbar]) $ mark GHC.AnnVbar++    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 "#)" -- '#)'++    markType _ (GHC.HsSumTy tys) = do+      markWithString GHC.AnnOpen "(#"+      markListIntercalateWithFunLevelCtx markLocated 2 AddVbar tys+      markWithString GHC.AnnClose "#)"++    markType _ (GHC.HsOpTy t1 lo t2) = do+      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 n t) = do+      markLocated 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+      markAST l s++    markType _ (GHC.HsDocTy t ds) = do+      markLocated t+      markLocated ds++    markType _ (GHC.HsBangTy (GHC.HsSrcBang mt _up str) t) = do+      case mt of+        GHC.NoSourceText -> return ()+        GHC.SourceText 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++    markType _ (GHC.HsRecTy cons) = do+      mark GHC.AnnOpenC  -- '{'+      markListIntercalate cons+      mark GHC.AnnCloseC -- '}'++    markType _ (GHC.HsCoreTy _t) =+      traceM "warning: HsCoreTy Introduced after renaming"++    markType _ (GHC.HsExplicitListTy promoted _ ts) = do+      when (promoted == GHC.Promoted) $ 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++    markType l (GHC.HsTyLit lit) = do+      case lit of+        (GHC.HsNumTy s v) ->+          markExternalSourceText l s (show v)+        (GHC.HsStrTy s v) ->+          markExternalSourceText l s (show v)++    markType l (GHC.HsWildCardTy (GHC.AnonWildCard _)) = do+      markExternal l GHC.AnnVal "_"+++-- ---------------------------------------------------------------------++instance Annotate (GHC.HsAppType GHC.RdrName) 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++-- ---------------------------------------------------------------------++instance Annotate (GHC.HsSplice GHC.RdrName) where+  markAST l c =+    case c of+      GHC.HsQuasiQuote _ n _pos fs -> do+        markExternal l GHC.AnnVal+              -- Note: Lexer.x does not provide unicode alternative. 2017-02-26+              ("[" ++ (showGhc n) ++ "|" ++ (GHC.unpackFS fs) ++ "|]")++      GHC.HsTypedSplice hasParens _n b@(GHC.L _ (GHC.HsVar (GHC.L _ n)))  -> do+        when (hasParens == GHC.HasParens) $ mark GHC.AnnOpenPTE+        if (hasParens == GHC.HasDollar)+          then markWithString GHC.AnnThIdTySplice ("$$" ++ (GHC.occNameString (GHC.occName n)))+          else markLocated b+        when (hasParens == GHC.HasParens) $ mark GHC.AnnCloseP++      GHC.HsTypedSplice hasParens _n b -> do+        when (hasParens == GHC.HasParens) $ mark GHC.AnnOpenPTE+        markLocated b+        when (hasParens == GHC.HasParens) $ mark GHC.AnnCloseP++      -- -------------------------------++      GHC.HsUntypedSplice hasParens _n b@(GHC.L _ (GHC.HsVar (GHC.L _ n)))  -> do+        when (hasParens == GHC.HasParens) $  mark GHC.AnnOpenPE+        if (hasParens == GHC.HasDollar)+          then markWithString GHC.AnnThIdSplice ("$" ++ (GHC.occNameString (GHC.occName n)))+          else markLocated b+        when (hasParens == GHC.HasParens) $ mark GHC.AnnCloseP++      GHC.HsUntypedSplice hasParens _n b  -> do+        case hasParens of+          GHC.HasParens -> mark GHC.AnnOpenPE+          GHC.HasDollar -> mark GHC.AnnThIdSplice+          GHC.NoParens  -> return ()+        markLocated b+        when (hasParens == GHC.HasParens) $ mark GHC.AnnCloseP++      GHC.HsSpliced{} -> error "HsSpliced only exists between renamer and typechecker in GHC"++-- ---------------------------------------------------------------------++instance Annotate (GHC.ConDeclField GHC.RdrName) where+  markAST _ (GHC.ConDeclField ns ty mdoc) = do+    unsetContext Intercalate $ do+      markListIntercalate ns+      mark GHC.AnnDcolon+      markLocated ty+      markMaybe mdoc+    inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma++-- ---------------------------------------------------------------------++instance (GHC.DataId name)+      => Annotate (GHC.FieldOcc name) where+  markAST _ (GHC.FieldOcc rn _) = do+    markLocated rn+    inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma++-- ---------------------------------------------------------------------++instance Annotate GHC.HsDocString where+  markAST l (GHC.HsDocString s) = do+    markExternal l GHC.AnnVal (GHC.unpackFS s)++-- ---------------------------------------------------------------------++instance Annotate (GHC.Pat GHC.RdrName) 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) $+          unsetContext Intercalate $ setContext (Set.singleton PrefixOp) $ markAST l (GHC.unLoc n)+      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.SumPat pat alt arity _) = do+        markWithString GHC.AnnOpen "(#"+        replicateM_ (alt - 1) $ mark GHC.AnnVbar+        markLocated pat+        replicateM_ (arity - alt) $ mark GHC.AnnVbar+        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"++      markPat _ (GHC.ViewPat e pat _) = do+        markLocated e+        mark GHC.AnnRarrow+        markLocated pat++      markPat l (GHC.SplicePat s) = do+        markAST l s++      markPat l (GHC.LitPat lp) = markAST l lp++      markPat _ (GHC.NPat ol mn _ _) = do+        when (isJust mn) $ mark GHC.AnnMinus+        markLocated ol++      markPat _ (GHC.NPlusKPat ln ol _ _ _ _) = do+        markLocated ln+        markWithString GHC.AnnVal "+"  -- "+"+        markLocated ol+++      markPat _ (GHC.SigPatIn pat ty) = do+        markLocated pat+        mark GHC.AnnDcolon+        markLHsSigWcType ty++      markPat _ GHC.SigPatOut {} =+        traceM "warning: SigPatOut introduced after renaming"++      markPat _ GHC.CoPat {} =+        traceM "warning: CoPat introduced after renaming"++-- ---------------------------------------------------------------------++hsLit2String :: GHC.HsLit -> String+hsLit2String lit =+  case lit of+    GHC.HsChar       src v   -> toSourceTextWithSuffix src v ""+    -- It should be included here+    -- https://github.com/ghc/ghc/blob/master/compiler/parser/Lexer.x#L1471+    GHC.HsCharPrim   src p   -> toSourceTextWithSuffix src p "#"+    GHC.HsString     src v   -> toSourceTextWithSuffix src v ""+    GHC.HsStringPrim src v   -> toSourceTextWithSuffix src v ""+    GHC.HsInt        src v   -> toSourceTextWithSuffix src v ""+    GHC.HsIntPrim    src v   -> toSourceTextWithSuffix src v ""+    GHC.HsWordPrim   src v   -> toSourceTextWithSuffix src v ""+    GHC.HsInt64Prim  src v   -> toSourceTextWithSuffix src v ""+    GHC.HsWord64Prim src v   -> toSourceTextWithSuffix src v ""+    GHC.HsInteger    src v _ -> toSourceTextWithSuffix src v ""+    GHC.HsRat        (GHC.FL src _) _ -> src+    GHC.HsFloatPrim  (GHC.FL src _)   -> src ++ "#"+    GHC.HsDoublePrim (GHC.FL src _)   -> src ++ "##"++toSourceTextWithSuffix :: (Show a) => GHC.SourceText -> a -> String -> String+toSourceTextWithSuffix (GHC.NoSourceText)    alt suffix = show alt ++ suffix+toSourceTextWithSuffix (GHC.SourceText txt) _alt suffix = txt ++ suffix++-- --------------------------------------------------------------------++markHsConPatDetails :: GHC.Located GHC.RdrName -> GHC.HsConPatDetails GHC.RdrName -> 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+      unsetContext PrefixOp $ setContext (Set.singleton InfixOp) $ markLocated ln+      markLocated a2++markHsConDeclDetails ::+  Bool -> Bool -> [GHC.Located GHC.RdrName] -> GHC.HsConDeclDetails GHC.RdrName -> 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 Annotate [GHC.LConDeclField GHC.RdrName] 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.SourceText $ GHC.fl_text l2+                GHC.HsIsString src _ -> src+    in+    markExternalSourceText l str ""++-- ---------------------------------------------------------------------++instance (GHC.DataId name,Annotate arg)+    => Annotate (GHC.HsImplicitBndrs name (GHC.Located arg)) where+  markAST _ (GHC.HsIB _ thing _) = do+    markLocated thing++-- ---------------------------------------------------------------------++instance (Annotate body) => Annotate (GHC.Stmt GHC.RdrName (GHC.Located body)) where++  markAST _ (GHC.LastStmt body _ _)+    = setContextLevel (Set.fromList [LeftMost,PrefixOp]) 2 $ markLocated body++  markAST _ (GHC.BindStmt pat body _ _ _) = do+    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++  markAST _ GHC.ApplicativeStmt{}+    = error "ApplicativeStmt should not appear in ParsedSource"++  markAST _ (GHC.BodyStmt body _ _ _) = do+    unsetContext Intercalate $ markLocated body+    inContext (Set.singleton AddVbar)     $ mark GHC.AnnVbar+    inContext (Set.singleton Intercalate) $ mark GHC.AnnComma+    markTrailingSemi++  markAST _ (GHC.LetStmt (GHC.L _ lb)) = do+    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++  markAST l (GHC.ParStmt pbs _ _ _) = do+    -- 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++  markAST _ (GHC.TransStmt form stmts _b using by _ _ _ _) = do+    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++  markAST _ (GHC.RecStmt stmts _ _ _ _ _ _ _ _ _) = do+    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 Annotate (GHC.ParStmtBlock GHC.RdrName GHC.RdrName) where+  markAST _ (GHC.ParStmtBlock stmts _ns _) = do+    markListIntercalate stmts++-- ---------------------------------------------------------------------++instance Annotate (GHC.HsLocalBinds GHC.RdrName) where+  markAST _ lb = markHsLocalBinds lb++-- ---------------------------------------------------------------------++markHsLocalBinds :: GHC.HsLocalBinds GHC.RdrName -> 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 binds+markHsLocalBinds GHC.EmptyLocalBinds                   = return ()++-- ---------------------------------------------------------------------++markMatchGroup :: (Annotate body)+                   => GHC.SrcSpan -> GHC.MatchGroup GHC.RdrName (GHC.Located body)+                   -> Annotated ()+markMatchGroup _ (GHC.MG (GHC.L _ matches) _ _ _)+  = setContextLevel (Set.singleton AdvanceLine) 2 $ markListWithLayout matches++-- ---------------------------------------------------------------------++instance (Annotate body)+  => Annotate [GHC.Located (GHC.Match GHC.RdrName (GHC.Located body))] where+  markAST _ ls = mapM_ markLocated ls++-- ---------------------------------------------------------------------++instance Annotate (GHC.HsExpr GHC.RdrName) 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+      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)+            )++      markExpr l (GHC.HsRecFld f) = markAST l f++      markExpr l (GHC.HsOverLabel _ fs)+        = markExternal l GHC.AnnVal ("#" ++ GHC.unpackFS fs)+++      markExpr l (GHC.HsIPVar n@(GHC.HsIPName _v))         =+        markAST l n+      markExpr l (GHC.HsOverLit ov)     = markAST l ov+      markExpr l (GHC.HsLit lit)        = markAST l lit++      markExpr _ (GHC.HsLam (GHC.MG (GHC.L _ [match]) _ _ _)) = do+        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+        setContext (Set.singleton PrefixOp) $ markLocated e1+        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 _ (GHC.ExplicitSum alt arity e _) = do+        markWithString GHC.AnnOpen "(#"+        replicateM_ (alt - 1) $ mark GHC.AnnVbar+        markLocated e+        replicateM_ (arity - alt) $ mark GHC.AnnVbar+        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+        markAnnBeforeAnn GHC.AnnSemi GHC.AnnThen+        mark GHC.AnnThen+        setContextLevel (Set.singleton ListStart) 2 $ markLocated e2+        markAnnBeforeAnn GHC.AnnSemi GHC.AnnElse+        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++      markExpr _ (GHC.HsLet (GHC.L _ binds) e) = do+        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)++      -- -------------------------------++      markExpr _ (GHC.HsDo cts (GHC.L _ es) _) = do+        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 "[:"+        markListIntercalateWithFunLevel markLocated 2 es+        markWithString GHC.AnnClose ":]"++      markExpr _ (GHC.RecordCon n _ _ (GHC.HsRecFields fs dd)) = do+        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++      markExpr _ (GHC.RecordUpd e fs _cons _ _ _) = do+        markLocated e+        mark GHC.AnnOpenC+        markListIntercalate fs+        mark GHC.AnnCloseC++      markExpr _ (GHC.ExprWithTySig e typ) = do+        setContextLevel (Set.singleton PrefixOp) 2 $ markLocated e+        mark GHC.AnnDcolon+        markLHsSigWcType typ++      markExpr _ (GHC.ExprWithTySigOut _e _typ)+        = error "ExprWithTySigOut only occurs after renamer"++      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+        markAnnOpen src "{-# SCC"+        let txt = sourceTextToString (GHC.sl_st csFStr) (GHC.unpackFS $ GHC.sl_fs csFStr)+        markWithStringOptional GHC.AnnVal    txt+        markWithString         GHC.AnnValStr txt+        markWithString GHC.AnnClose "#-}"+        markLocated e++      markExpr _ (GHC.HsCoreAnn src csFStr e) = do+        -- markWithString GHC.AnnOpen src -- "{-# CORE"+        markAnnOpen src "{-# CORE"+        -- markWithString GHC.AnnVal (GHC.sl_st csFStr)+        markSourceText (GHC.sl_st csFStr) (GHC.unpackFS $ GHC.sl_fs csFStr)+        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+        mark GHC.AnnCloseQ -- "|]"+      -- Introduced after the renamer+      markExpr _ (GHC.HsBracket (GHC.DecBrG _)) =+        traceM "warning: DecBrG introduced after renamer"+      markExpr _l (GHC.HsBracket (GHC.ExpBr e)) = do+        mark GHC.AnnOpenEQ -- "[|"+        markOptional GHC.AnnOpenE  -- "[e|"+        markLocated e+        mark GHC.AnnCloseQ -- "|]"+      markExpr _l (GHC.HsBracket (GHC.TExpBr e)) = do+        markWithString GHC.AnnOpen  "[||"+        markWithStringOptional GHC.AnnOpenE "[e||"+        markLocated e+        markWithString GHC.AnnClose "||]"+      markExpr _ (GHC.HsBracket (GHC.TypBr e)) = do+        markWithString GHC.AnnOpen "[t|"+        markLocated e+        mark GHC.AnnCloseQ -- "|]"+      markExpr _ (GHC.HsBracket (GHC.PatBr e)) = do+        markWithString GHC.AnnOpen  "[p|"+        markLocated e+        mark GHC.AnnCloseQ -- "|]"++      markExpr _ (GHC.HsRnBracketOut _ _) =+        traceM "warning: HsRnBracketOut introduced after renamer"+      markExpr _ (GHC.HsTcBracketOut _ _) =+        traceM "warning: HsTcBracketOut introduced after renamer"++      markExpr l (GHC.HsSpliceE e) = markAST l e++      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 ()++      markExpr _ (GHC.HsTickPragma src (str,(v1,v2),(v3,v4)) ((s1,s2),(s3,s4)) e) = do+        -- '{-# GENERATED' STRING INTEGER ':' INTEGER '-' INTEGER ':' INTEGER '#-}'+        markAnnOpen src  "{-# GENERATED"+        markOffsetWithString GHC.AnnVal 0 (stringLiteralToString str) -- STRING++        let+          markOne n  v GHC.NoSourceText   = markOffsetWithString GHC.AnnVal n (show v)+          markOne n _v (GHC.SourceText s) = markOffsetWithString GHC.AnnVal n s++        markOne  1 v1 s1 -- INTEGER+        markOffset GHC.AnnColon 0 -- ':'+        markOne  2 v2 s2 -- INTEGER+        mark   GHC.AnnMinus   -- '-'+        markOne  3 v3 s3 -- INTEGER+        markOffset GHC.AnnColon 1 -- ':'+        markOne  4 v4 s4 -- INTEGER+        markWithString   GHC.AnnClose  "#-}"+        markLocated e++      markExpr l GHC.EWildPat = do+        ifInContext (Set.fromList [InfixOp])+          (do  mark GHC.AnnBackquote+               markWithString GHC.AnnVal "_"+               mark GHC.AnnBackquote)+          (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++      markExpr _ (GHC.HsAppType e ty) = do+        markLocated e+        mark GHC.AnnAt+        markLHsWcType ty+      markExpr _ (GHC.HsAppTypeOut _ _) =+        traceM "warning: HsAppTypeOut introduced after renaming"++      markExpr _ (GHC.HsWrap _ _) =+        traceM "warning: HsWrap introduced after renaming"+      markExpr _ (GHC.HsUnboundVar _) =+        traceM "warning: HsUnboundVar introduced after renaming"++      markExpr _ (GHC.HsConLikeOut{}) =+        traceM "warning: HsConLikeOut introduced after type checking"+++-- ---------------------------------------------------------------------++markLHsWcType :: GHC.LHsWcType GHC.RdrName -> Annotated ()+markLHsWcType (GHC.HsWC _ ty) = do+  markLocated ty++-- ---------------------------------------------------------------------++instance Annotate GHC.HsLit where+  markAST l lit = markExternal l GHC.AnnVal (hsLit2String lit)++-- ---------------------------------------------------------------------++instance Annotate (GHC.HsRecUpdField GHC.RdrName) 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++instance (GHC.DataId name)+  => Annotate (GHC.AmbiguousFieldOcc name) where+  markAST _ (GHC.Unambiguous n _) = markLocated n+  markAST _ (GHC.Ambiguous   n _) = markLocated n++-- ---------------------------------------------------------------------++-- |Used for declarations that need to be aligned together, e.g. in a+-- do or let .. in statement/expr+instance Annotate [GHC.ExprLStmt GHC.RdrName] where+  markAST _ ls = mapM_ markLocated ls++-- ---------------------------------------------------------------------++instance Annotate (GHC.HsTupArg GHC.RdrName) 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 Annotate (GHC.HsCmdTop GHC.RdrName) where+  markAST _ (GHC.HsCmdTop cmd _ _ _) = markLocated cmd++instance Annotate (GHC.HsCmd GHC.RdrName) 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 fixity _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++    let isPrefixOp = case fixity of+          GHC.Infix  -> False+          GHC.Prefix -> True+    when isPrefixOp $ mark GHC.AnnOpenB -- "(|"++    -- 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 $ mark GHC.AnnCloseB -- "|)"++  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++  markAST _ (GHC.HsCmdLet (GHC.L _ binds) e) = do+    mark GHC.AnnLet+    markOptional GHC.AnnOpenC+    markLocalBindsWithLayout binds+    markOptional GHC.AnnCloseC+    mark GHC.AnnIn+    markLocated e++  markAST _ (GHC.HsCmdDo (GHC.L _ es) _) = do+    mark GHC.AnnDo+    markOptional GHC.AnnOpenC+    markListWithLayout es+    markOptional GHC.AnnCloseC+++  markAST _ (GHC.HsCmdWrap {}) =+    traceM "warning: HsCmdWrap introduced after renaming"++-- ---------------------------------------------------------------------++instance Annotate [GHC.Located (GHC.StmtLR GHC.RdrName GHC.RdrName (GHC.LHsCmd GHC.RdrName))] where+  markAST _ ls = mapM_ markLocated ls++-- ---------------------------------------------------------------------++instance Annotate (GHC.TyClDecl GHC.RdrName) where++  markAST l (GHC.FamDecl famdecl) = markAST l famdecl >> markTrailingSemi++  markAST _ (GHC.SynDecl ln (GHC.HsQTvs _ tyvars _) fixity typ _) = do+    -- 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 fixity ln tyvars+    mark GHC.AnnEqual+    markLocated typ+    markTrailingSemi++  markAST _ (GHC.DataDecl ln (GHC.HsQTvs _ns tyVars _) fixity+                (GHC.HsDataDefn nd ctx mctyp mk cons derivs) _ _) = do+    if nd == GHC.DataType+      then mark GHC.AnnData+      else mark GHC.AnnNewtype+    markMaybe mctyp+    markLocated ctx+    markTyClass fixity 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]) $ markLocated derivs+    markTrailingSemi++  -- -----------------------------------++  markAST _ (GHC.ClassDecl ctx ln (GHC.HsQTvs _ns tyVars _) fixity fds+                          sigs meths ats atdefs docs _) = do+    mark GHC.AnnClass+    markLocated ctx++    markTyClass fixity 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.LexicalFixity -> GHC.Located a -> [GHC.Located ast] -> Annotated ()+markTyClass fixity ln tyVars = do+    let markParens = if fixity == GHC.Infix && length tyVars > 2+          then markMany+          else markManyOptional+    if fixity == GHC.Prefix+      then do+        markManyOptional GHC.AnnOpenP+        setContext (Set.singleton PrefixOp) $ markLocated ln+        setContext (Set.singleton PrefixOp) $ mapM_ markLocated $ take 2 tyVars+        when (length tyVars >= 2) $ do+          markParens GHC.AnnCloseP+          setContext (Set.singleton PrefixOp) $ mapM_ markLocated $ drop 2 tyVars+        markManyOptional GHC.AnnCloseP+      else do+        case tyVars of+          (x:y:xs) -> do+            markParens GHC.AnnOpenP+            markLocated x+            setContext (Set.singleton InfixOp) $ markLocated ln+            markLocated y+            markParens GHC.AnnCloseP+            mapM_ markLocated xs+            markManyOptional GHC.AnnCloseP+          _ -> error $ "markTyClass: Infix op without operands"++-- ---------------------------------------------------------------------++instance Annotate [GHC.LHsDerivingClause GHC.RdrName] where+  markAST _ ds = mapM_ markLocated ds++-- ---------------------------------------------------------------------++instance Annotate (GHC.HsDerivingClause GHC.RdrName) where+  markAST _ (GHC.HsDerivingClause mstrategy (GHC.L _ typs)) = do+    let needsParens = case typs of+          [(GHC.HsIB _ (GHC.L _ (GHC.HsTyVar _ _)) _)] -> False+          _                           -> True+    mark GHC.AnnDeriving+    markMaybe mstrategy+    if needsParens then mark         GHC.AnnOpenP+                   else markOptional GHC.AnnOpenP+    markListIntercalateWithFunLevel markLHsSigType 2 typs+    if needsParens then mark         GHC.AnnCloseP+                   else markOptional GHC.AnnCloseP++-- ---------------------------------------------------------------------++instance Annotate (GHC.FamilyDecl GHC.RdrName) where+  markAST _ (GHC.FamilyDecl info ln (GHC.HsQTvs _ tyvars _) fixity rsig minj) = do+    case info of+      GHC.DataFamily -> mark GHC.AnnData+      _              -> mark GHC.AnnType++    mark GHC.AnnFamily++    markTyClass fixity ln tyvars+    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+    case info of+      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 -- }+      _ -> return ()+    markTrailingSemi++-- ---------------------------------------------------------------------++instance Annotate (GHC.FamilyResultSig GHC.RdrName) where+  markAST _ (GHC.NoSig)        = return ()+  markAST _ (GHC.KindSig k)    = markLocated k+  markAST _ (GHC.TyVarSig ltv) = markLocated ltv++-- ---------------------------------------------------------------------++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++-- ---------------------------------------------------------------------++instance Annotate (GHC.TyFamInstEqn GHC.RdrName) where+  markAST _ (GHC.TyFamEqn ln (GHC.HsIB _ pats _) fixity typ) = do+    markTyClass fixity ln pats+    mark GHC.AnnEqual+    markLocated typ++-- ---------------------------------------------------------------------++instance Annotate (GHC.TyFamDefltEqn GHC.RdrName) where+  markAST _ (GHC.TyFamEqn ln (GHC.HsQTvs _ns bndrs _) fixity typ) = do+    mark GHC.AnnType+    mark GHC.AnnInstance+    markTyClass fixity ln 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.SrcSpan -> GHC.HsDataDefn GHC.RdrName -> Annotated ()+markDataDefn _ (GHC.HsDataDefn _ ctx typ _mk cons derivs) = do+  markLocated ctx+  markMaybe typ+  if isGadt cons+    then markListWithLayout cons+    else markListIntercalateWithFunLevel markLocated 2 cons+  setContext (Set.singleton Deriving) $ markLocated derivs++-- ---------------------------------------------------------------------++-- Note: GHC.HsContext name aliases to here too+instance Annotate [GHC.LHsType GHC.RdrName] where+  markAST l ts = do+    -- 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 Annotate (GHC.ConDecl GHC.RdrName) where+  markAST _ (GHC.ConDeclH98 ln mqtvs mctx+                         dets _ ) = do+    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++-- 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.OutputableBndrId name) => GHC.Outputable (ResTyGADTHook name) where+  ppr (ResTyGADTHook bs) = GHC.text "ResTyGADTHook" GHC.<+> GHC.ppr bs+++-- 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 "_"++-- ---------------------------------------------------------------------++instance Annotate (ResTyGADTHook GHC.RdrName) where+  markAST _ (ResTyGADTHook bndrs) = do+    unless (null bndrs) $ do+      mark GHC.AnnForall+      mapM_ markLocated bndrs+      mark GHC.AnnDot++-- ---------------------------------------------------------------------++instance Annotate (GHC.HsRecField GHC.RdrName (GHC.LPat GHC.RdrName)) 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 (GHC.HsRecField GHC.RdrName (GHC.LHsExpr GHC.RdrName)) 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+    markAnnOpen src ""+    case mh of+      Nothing -> return ()+      Just (GHC.Header srcH _h) ->+         -- markWithString GHC.AnnHeader srcH+         markWithString GHC.AnnHeader (toSourceTextWithSuffix srcH "" "")+    -- markWithString GHC.AnnVal (fst f)+    markSourceText  (fst f) (GHC.unpackFS $ snd f)+    markWithString GHC.AnnClose "#-}"++-- ---------------------------------------------------------------------++stringLiteralToString :: GHC.StringLiteral -> String+stringLiteralToString (GHC.StringLiteral st fs) =+  case st of+    GHC.NoSourceText   -> GHC.unpackFS fs+    GHC.SourceText src -> src
src/Language/Haskell/GHC/ExactPrint/Annotate.hs view
@@ -29,3661 +29,8 @@        , 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-  MarkAnnBeforeAnn :: GHC.AnnKeywordId -> GHC.AnnKeywordId                 -> 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-makeFreeCon  'MarkAnnBeforeAnn---- -----------------------------------------------------------------------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-        markAnnBeforeAnn GHC.AnnSemi GHC.AnnThen-        mark GHC.AnnThen-        setContextLevel (Set.singleton ListStart) 2 $ markLocated e2-        -- markOffsetOptional GHC.AnnSemi 1-        markAnnBeforeAnn GHC.AnnSemi GHC.AnnElse-        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-      Nothing -> return ()-#if __GLASGOW_HASKELL__ <= 710-      Just (GHC.Header h) ->-         markWithString GHC.AnnHeader ("\"" ++ GHC.unpackFS h ++ "\"")-    markWithString GHC.AnnVal ("\"" ++ GHC.unpackFS f ++ "\"")-#else-      Just (GHC.Header srcH _h) ->-         markWithString GHC.AnnHeader srcH-    markWithString GHC.AnnVal (fst f)-#endif-    markWithString GHC.AnnClose "#-}"---- ---------------------------------------------------------------------++       ) where+++import Language.Haskell.GHC.ExactPrint.Annotater
+ src/Language/Haskell/GHC/ExactPrint/AnnotateTypes.hs view
@@ -0,0 +1,370 @@+{-# LANGUAGE CPP #-}+{-# 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.AnnotateTypes+       -- (+       --   AnnotationF(..)+       -- , Annotated+       -- , Annotate(..)++       -- )+      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+#if __GLASGOW_HASKELL__ > 800+import qualified BasicTypes     as GHC+#endif+-- 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+#if __GLASGOW_HASKELL__ <= 710+import qualified BooleanFormula as GHC+import qualified Outputable     as GHC+#endif++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+  MarkAnnBeforeAnn :: GHC.AnnKeywordId -> GHC.AnnKeywordId                 -> 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+makeFreeCon  'MarkAnnBeforeAnn++-- ---------------------------------------------------------------------++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 ())++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++-- ---------------------------------------------------------------------++withLocated :: Data a+            => GHC.Located a+            -> (GHC.SrcSpan -> a -> Annotated ())+            -> Annotated ()+withLocated a@(GHC.L l ast) action =+  withAST a (action l ast)++-- ---------------------------------------------------------------------+++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++-- ---------------------------------------------------------------------++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++-- ---------------------------------------------------------------------+-- Managing lists which have been separated, e.g. Sigs and Binds+++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])++-- ---------------------------------------------------------------------+++#if __GLASGOW_HASKELL__ > 800+markAnnOpen :: GHC.SourceText -> String -> Annotated ()+markAnnOpen GHC.NoSourceText txt   =  markWithString GHC.AnnOpen txt+markAnnOpen (GHC.SourceText txt) _ =  markWithString GHC.AnnOpen txt++markSourceText :: GHC.SourceText -> String -> Annotated ()+markSourceText GHC.NoSourceText txt   =  markWithString GHC.AnnVal txt+markSourceText (GHC.SourceText txt) _ =  markWithString GHC.AnnVal txt++markExternalSourceText :: GHC.SrcSpan -> GHC.SourceText -> String -> Annotated ()+markExternalSourceText l GHC.NoSourceText txt   =  markExternal l GHC.AnnVal txt+markExternalSourceText l (GHC.SourceText txt) _ =  markExternal l GHC.AnnVal txt++sourceTextToString :: GHC.SourceText -> String -> String+sourceTextToString GHC.NoSourceText alt   = alt+sourceTextToString (GHC.SourceText txt) _ = txt+#endif++-- ---------------------------------------------------------------------
src/Language/Haskell/GHC/ExactPrint/Delta.hs view
@@ -1,7 +1,7 @@ {-# LANGUAGE CPP #-} {-# LANGUAGE NamedFieldPuns #-} -- |  This module converts 'GHC.ApiAnns' into 'Anns' by traversing a--- structure created by the "Annotate" modue.+-- structure created by the "Annotate" module. -- -- == Structure of an Annotation --@@ -11,18 +11,80 @@ -- -- == Layout Calculation ----- Certain expressions such as do blocks and let bindings obey--- <https://en.wikibooks.org/wiki/Haskell/Indentation layout rules>. We--- calculate the 'annEntryDelta' slightly differently when such rules--- apply.+-- In order to properly place syntax nodes and comments properly after+-- refactoring them (in such a way that the indentation level changes), their+-- position (encoded in the 'addEntryDelta' field) is not expressed as absolute+-- but relative to their context. As further motivation, consider the simple+-- let-into-where-block refactoring, from: ----- 1. The first element which the layout rule applies to is given--- a 'annEntryDelta' as normal.--- 2. Further elements which must obey the rules are then given--- 'annEntryDelta's relative to the LHS of the first element.+-- @+-- foo = do+--   let bar = do+--         x+--         -- comment+--         y+--   bar+-- @ --+-- to+--+-- @+-- foo = do+--   bar+--  where+--   bar = do+--     x+--     -- comment+--     y+-- @+--+-- Notice how the column of @x@, @y@ and the comment change due to this+-- refactoring but certain relative positions (e.g. the comment starting at the+-- same column as @x@) remain unchanged.+--+-- Now, what does "context" mean exactly? Here we reference the+-- "indentation level" as used in the haskell report (see chapter 2.7:+-- <https://www.haskell.org/onlinereport/haskell2010/haskellch2.html#x7-210002.7>):+-- 'addEntryDelta' is mostly relative to the current (inner-most) indentation+-- level. But in order to get better results, for the purpose of defining+-- relative positions a the offside-rule is modified slightly: Normally it+-- fires (only) at the first elements after where/let/do/of, introducing a new+-- indentation level. In addition, the rule here fires also at the "@let@"+-- keyword (when it is part of a "@let-in@" construct) and at the "@if@" keyword.+--+-- The effect of this additional applications of the offside-rule is that any+-- elements (more or less directly) following the "@let@" ("@if@"")+-- keyword have a position relative to the "@let@" ("@if@")+-- keyword position, even when the regular offside-rule does apply not yet/not+-- anymore. This affects two concrete things: Comments directly following+-- "@let@"/"@if@", and the respective follow-up keywords: "@in@" or+-- "@then@"/"@else@".+--+-- Due to this additional indentation level, it is possible to observe/obtain+-- negative delta-positions; consider:+--+-- @+-- foo = let x = 1+--   in x+-- @+--+-- Here, the @in@ keyword has an 'annEntryDelta' of @DP (1, -4)@ as it appears+-- one line below the previous elements and 4 columns /left/ relative to the+-- start of the @let@ keyword.+--+-- In general, the element that defines such an indentation level (i.e. the+-- first element after a where/let/do/of) will have an 'annEntryDelta' relative+-- to the previous inner-most indentation level; in other words: a new+-- indentation level becomes relevant only after the construct introducing the+-- element received its 'annEntryDelta' position. (Otherwise these elements+-- always would have a zero horizontal position - relative to itself.)+--+-- (This affects comments, too: A comment preceding the first element of a+-- layout block will have a position relative to the outer block, not of the+-- newly introduced layout block.)+-- -- For example, in the following expression the statement corresponding to--- `baz` will be given a 'annEntryDelta' of @DP (1, 2)@ as it appears+-- @baz@ will be given a 'annEntryDelta' of @DP (1, 2)@ as it appears -- 1 line and 2 columns after the @do@ keyword. On the other hand, @bar@ -- will be given a 'annEntryDelta' of @DP (1,0)@ as it appears 1 line -- further than @baz@ but in the same column as the start of the layout@@ -43,7 +105,7 @@ -- -- === annTrueEntryDelta -- A very useful function is 'annTrueEntryDelta' which calculates the--- offset from the last synctactic element (ignoring comments). This is+-- offset from the last syntactic element (ignoring comments). This is -- different to 'annEntryDelta' which does not ignore comments. -- --@@ -245,7 +307,7 @@     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 (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@@ -625,7 +687,14 @@       , (GHC.Annlarrowtail, GHC.AnnlarrowtailU)       , (GHC.Annrarrowtail, GHC.AnnrarrowtailU)       , (GHC.AnnLarrowtail, GHC.AnnLarrowtailU)-      , (GHC.AnnRarrowtail, GHC.AnnRarrowtailU)]+      , (GHC.AnnRarrowtail, GHC.AnnRarrowtailU)+#if __GLASGOW_HASKELL__ > 801+      , (GHC.AnnCloseB,     GHC.AnnCloseBU)+      , (GHC.AnnCloseQ,     GHC.AnnCloseQU)+      , (GHC.AnnOpenB,      GHC.AnnOpenBU)+      , (GHC.AnnOpenEQ,     GHC.AnnOpenEQU)+#endif+      ] #endif  
src/Language/Haskell/GHC/ExactPrint/GhcInterim.hs view
@@ -1,4 +1,6 @@+{-# LANGUAGE CPP #-} -- functions from GHC copied here until they can be exported in the next version.+ module Language.Haskell.GHC.ExactPrint.GhcInterim where  import ApiAnnotation@@ -6,6 +8,8 @@ import SrcLoc  -- ---------------------------------------------------------------------+#if __GLASGOW_HASKELL__ > 800+#else -- From Lexer.x commentToAnnotation :: Located Token -> Located AnnotationComment commentToAnnotation (L l (ITdocCommentNext s))  = L l (AnnDocCommentNext s)@@ -13,7 +17,10 @@ commentToAnnotation (L l (ITdocCommentNamed s)) = L l (AnnDocCommentNamed s) commentToAnnotation (L l (ITdocSection n s))    = L l (AnnDocSection n s) commentToAnnotation (L l (ITdocOptions s))      = L l (AnnDocOptions s)+#if __GLASGOW_HASKELL__ < 801 commentToAnnotation (L l (ITdocOptionsOld s))   = L l (AnnDocOptionsOld s)+#endif commentToAnnotation (L l (ITlineComment s))     = L l (AnnLineComment s) commentToAnnotation (L l (ITblockComment s))    = L l (AnnBlockComment s) commentToAnnotation _ = error $ "commentToAnnotation called for non-comment:" -- ++ show x+#endif
src/Language/Haskell/GHC/ExactPrint/Lookup.hs view
@@ -30,6 +30,9 @@       AnnUnicode kw'    -> keywordToString (G kw') #endif       AnnSemiSep        -> ";"+#if __GLASGOW_HASKELL__ >= 801+      (G GHC.AnnAnyclass) -> "anyclass"+#endif       (G GHC.AnnOpen  ) -> mkErr kw       (G GHC.AnnClose ) -> mkErr kw       (G GHC.AnnVal   ) -> mkErr kw@@ -46,8 +49,16 @@       (G GHC.AnnBy     ) -> "by"       (G GHC.AnnCase   ) -> "case"       (G GHC.AnnClass   ) -> "class"+#if __GLASGOW_HASKELL__ >= 801+      (G GHC.AnnCloseB  ) -> "|)"+      (G GHC.AnnCloseBU ) -> "⦈"+#endif       (G GHC.AnnCloseC  ) -> "}"       (G GHC.AnnCloseP  ) -> ")"+#if __GLASGOW_HASKELL__ >= 801+      (G GHC.AnnCloseQ  ) -> "|]"+      (G GHC.AnnCloseQU ) -> "⟧"+#endif       (G GHC.AnnCloseS  ) -> "]"       (G GHC.AnnColon   ) -> ":"       (G GHC.AnnComma   ) -> ","@@ -80,10 +91,18 @@       (G GHC.AnnModule   ) -> "module"       (G GHC.AnnNewtype  ) -> "newtype"       (G GHC.AnnOf       ) -> "of"+#if __GLASGOW_HASKELL__ >= 801+      (G GHC.AnnOpenB    ) -> "(|"+      (G GHC.AnnOpenBU   ) ->  "⦇"+#endif       (G GHC.AnnOpenC    ) -> "{" #if __GLASGOW_HASKELL__ > 710       (G GHC.AnnOpenE    ) -> "[e|" #endif+#if __GLASGOW_HASKELL__ >= 801+      (G GHC.AnnOpenEQ   ) -> "[|"+      (G GHC.AnnOpenEQU  ) ->  "⟦"+#endif       (G GHC.AnnOpenP    ) -> "("       (G GHC.AnnOpenPE   ) -> "$("       (G GHC.AnnOpenPTE  ) -> "$$("@@ -96,6 +115,10 @@       (G GHC.AnnRole     ) -> "role"       (G GHC.AnnSafe     ) -> "safe"       (G GHC.AnnSemi     ) -> ";"+#if __GLASGOW_HASKELL__ >= 801+      (G GHC.AnnSignature) -> "signature"+      (G GHC.AnnStock    ) -> "stock"+#endif       (G GHC.AnnStatic   ) -> "static"       (G GHC.AnnThen     ) -> "then"       (G GHC.AnnTilde    ) -> "~"@@ -144,7 +167,8 @@       , (G GHC.AnnRarrow, "→")       , (G GHC.AnnRarrowtail, "⤜")       , (G GHC.Annlarrowtail, "⤙")-      , (G GHC.Annrarrowtail, "⤚")]+      , (G GHC.Annrarrowtail, "⤚")+      ]  {- From Lexer.x
src/Language/Haskell/GHC/ExactPrint/Preprocess.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE CPP #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE OverloadedStrings #-} -- | This module provides support for CPP, interpreter directives and line@@ -32,7 +33,9 @@ import Control.Exception import Data.List hiding (find) import Data.Maybe+#if __GLASGOW_HASKELL__ <= 800 import Language.Haskell.GHC.ExactPrint.GhcInterim (commentToAnnotation)+#endif import Language.Haskell.GHC.ExactPrint.Types import Language.Haskell.GHC.ExactPrint.Utils import qualified Data.Set as Set@@ -113,7 +116,11 @@                   let toks = GHC.addSourceToTokens startLoc source ts                       cppCommentToks = getCppTokens directiveToks nonDirectiveToks toks                   return $ filter goodComment+#if __GLASGOW_HASKELL__ > 800+                         $  map (tokComment . GHC.commentToAnnotation . fst) cppCommentToks+#else                          $  map (tokComment . commentToAnnotation . fst) cppCommentToks+#endif         GHC.PFailed sspan err -> parseError flags2 sspan err  goodComment :: Comment -> Bool
src/Language/Haskell/GHC/ExactPrint/Pretty.hs view
@@ -38,8 +38,6 @@ 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" #-}@@ -161,7 +159,7 @@     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 (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@@ -199,12 +197,13 @@ addPrettyAnnotation ann = do   noPrec <- gets apNoPrecedingSpace   ctx <- asks prContext-  _ <- trace ("Pretty.addPrettyAnnotation:=" ++ showGhc (ann,noPrec,ctx)) $ asks prContext+  _ <- debugP ("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.AnnBackquote) -> 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))@@ -221,6 +220,7 @@            (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.AnnIf)        -> 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))@@ -250,7 +250,8 @@ -- ---------------------------------------------------------------------  addPrettyAnnotationsOutside :: GHC.AnnKeywordId -> KeywordId -> Pretty ()-addPrettyAnnotationsOutside _akwid _kwid = return ()+addPrettyAnnotationsOutside _akwid AnnSemiSep = return ()+addPrettyAnnotationsOutside _akwid kwid = addPrettyAnnotation kwid  -- --------------------------------------------------------------------- @@ -280,7 +281,7 @@   -- flags passed up from subelements of the AST.   (_,w) <- listen (return () :: Pretty ()) -  _ <- trace ("withSrcSpanPretty: prLayoutContext w=" ++ show (prLayoutContext w) ) (return ())+  _ <- debugP ("withSrcSpanPretty: prLayoutContext w=" ++ show (prLayoutContext w) ) (return ())    local (\s -> s { curSrcSpan = l                  , annConName = annGetConstr a@@ -321,20 +322,20 @@ #endif      -- uncs <- getUnallocatedComments-    -- ctx <- trace ("Pretty.withAST:cs:(ss,cs,uncs)=" ++ showGhc (ss,cs,uncs)) $ asks prContext+    -- ctx <- debugP ("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 <- debugP ("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+    let ctx1 = debugP ("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") $+           -- debugP ("Pretty.withAST:setNoPrecedingSpace") $              censor maskWriter (listen (setNoPrecedingSpace action))       else-           -- trace ("Pretty.withAST:setNoPrecedingSpace") $+           -- debugP ("Pretty.withAST:setNoPrecedingSpace") $             censor maskWriter (listen action)      let kds = annKds w@@ -363,7 +364,7 @@      def :: a -> Pretty DeltaPos     def _ =-      trace ("entryDpFor:(topLevel,listStart,inList,noAdvanceLine,ctx)=" ++ show (topLevel,listStart,inList,noAdvanceLine,ctx)) $+      debugP ("entryDpFor:(topLevel,listStart,inList,noAdvanceLine,ctx)=" ++ show (topLevel,listStart,inList,noAdvanceLine,ctx)) $         if noAdvanceLine           then return (DP (0,1))           else@@ -396,11 +397,11 @@     then do       modify (\s -> s { apNoPrecedingSpace = False                       })-      trace ("fromNoPrecedingSpace:def") def+      debugP ("fromNoPrecedingSpace:def") def       -- def     else       -- lay-      trace ("fromNoPrecedingSpace:lay") lay+      debugP ("fromNoPrecedingSpace:lay") lay   -- ---------------------------------------------------------------------@@ -505,8 +506,8 @@ 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)) ()+  cs <- debugP ("annotationsToCommentsBFPretty:" ++ showGhc (bf,makeBooleanFormulaAnns bf)) $ gets apComments+  -- return$ debugP ("annotationsToCommentsBFPretty:" ++ showGhc (bf,makeBooleanFormulaAnns bf)) ()   -- error ("annotationsToCommentsBFPretty:" ++ showGhc (bf,makeBooleanFormulaAnns bf))   let     kws = makeBooleanFormulaAnns bf
src/Language/Haskell/GHC/ExactPrint/Print.hs view
@@ -166,8 +166,8 @@       allAnns akwid >> next     go (MarkOffsetPrim kwid _ mstr next) =       printStringAtMaybeAnn (G kwid) mstr >> next-    -- go (MarkOffsetPrimOptional 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) =
src/Language/Haskell/GHC/ExactPrint/Utils.hs view
@@ -60,6 +60,7 @@    -- * For tests   , debug+  , debugP   , debugM   , warn   , showGhc@@ -109,18 +110,30 @@ {-# ANN module "HLint: ignore Reduce duplication" #-} -- --------------------------------------------------------------------- --- |Global switch to enable debug tracing in ghc-exactprint+-- |Global switch to enable debug tracing in ghc-exactprint Delta / Print debugEnabledFlag :: Bool -- debugEnabledFlag = True debugEnabledFlag = False --- |Provide a version of trace the comes at the end of the line, so it can+-- |Global switch to enable debug tracing in ghc-exactprint Pretty+debugPEnabledFlag :: Bool+-- debugPEnabledFlag = True+debugPEnabledFlag = False++-- |Provide a version of trace that comes at the end of the line, so it can -- easily be commented out when debugging different things. debug :: c -> String -> c debug c s = if debugEnabledFlag               then trace s c               else c +-- |Provide a version of trace for the Pretty module, which can be enabled+-- separately from 'debug' and 'debugM'+debugP :: String -> c -> c+debugP s c = if debugPEnabledFlag+               then trace s c+               else c+ debugM :: Monad m => String -> m () debugM s = when debugEnabledFlag $ traceM s @@ -286,7 +299,9 @@ ghcCommentText (GHC.L _ (GHC.AnnDocCommentNamed s)) = s ghcCommentText (GHC.L _ (GHC.AnnDocSection _ s))    = s ghcCommentText (GHC.L _ (GHC.AnnDocOptions s))      = s+#if __GLASGOW_HASKELL__ < 801 ghcCommentText (GHC.L _ (GHC.AnnDocOptionsOld s))   = s+#endif ghcCommentText (GHC.L _ (GHC.AnnLineComment s))     = s ghcCommentText (GHC.L _ (GHC.AnnBlockComment s))    = s @@ -488,7 +503,7 @@           `extQ` string `extQ` fastString `extQ` srcSpan           `extQ` bytestring           `extQ` name `extQ` occName `extQ` moduleName `extQ` var `extQ` dataCon-          `extQ` overLit+          -- `extQ` overLit           `extQ` bagName `extQ` bagRdrName `extQ` bagVar `extQ` nameSet           `extQ` fixity           `ext2Q` located@@ -520,8 +535,8 @@         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+        -- 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@@ -530,7 +545,11 @@         bagVar    :: GHC.Bag (GHC.Located (GHC.HsBind GHC.Var)) -> String         bagVar     = ("{Bag(Located (HsBind Var)): "++) . (++"}") . list . GHC.bagToList +#if __GLASGOW_HASKELL__ > 800+        nameSet = ("{NameSet: "++) . (++"}") . list . GHC.nameSetElemsStable+#else         nameSet = ("{NameSet: "++) . (++"}") . list . GHC.nameSetElems+#endif          fixity = ("{Fixity: "++) . (++"}") . showSDoc_ . GHC.ppr :: GHC.Fixity -> String 
tests/Test.hs view
@@ -14,7 +14,7 @@ import System.Exit  import Data.List-+import qualified Data.Set as Set import System.IO.Silently  import Test.Common@@ -28,11 +28,13 @@  -- --------------------------------------------------------------------- -data GHCVersion = GHC710 | GHC80 deriving (Eq, Ord, Show)+data GHCVersion = GHC710 | GHC80 | GHC82 deriving (Eq, Ord, Show)  ghcVersion :: GHCVersion ghcVersion =-#if __GLASGOW_HASKELL__ >= 711+#if __GLASGOW_HASKELL__ > 800+  GHC82+#elif __GLASGOW_HASKELL__ >= 711   GHC80 #else   GHC710@@ -44,6 +46,10 @@   case ghcVersion of     GHC710 -> ["ghc710-only","ghc710"]     GHC80  -> ["ghc710", "ghc80"]+    GHC82  -> ["ghc710", "ghc80", "ghc82"]+    -- GHC82  -> ["ghc82-ghc-test"]+    -- GHC82  -> ["ghc82-ghc-backups-rename"]+    -- GHC82  -> ["ghc82"]  -- --------------------------------------------------------------------- @@ -68,18 +74,43 @@ -- ---------------------------------------------------------------------  findTests :: IO Test-findTests = testList "Round-trip tests" <$> mapM (findTestsDir mkParserTest) testDirs+findTests = testList "Round-trip tests" <$> mapM (findTestsDir id mkParserTest) testDirs  findPrettyTests :: IO Test-findPrettyTests = testList "Default Annotations round-trip tests" <$> mapM (findTestsDir mkPrettyRoundtrip) testDirs+findPrettyTests =+  testList "Default Annotations round-trip tests"+           <$> mapM (findTestsDir filterPrettyRoundTrip mkPrettyRoundtrip) testDirs -findTestsDir :: (FilePath -> FilePath -> Test) -> FilePath -> IO Test-findTestsDir mkTestFn dir = do+-- | Filter out tests that are known to fail, for particular compilers+filterPrettyRoundTrip :: [FilePath] -> [FilePath]+filterPrettyRoundTrip fps = sort $ Set.toList $ Set.difference (Set.fromList fps) skipped+-- filterPrettyRoundTrip fps = error $ "filterPrettyRoundTrip:fps=" ++ show fps+  where+#if __GLASGOW_HASKELL__ > 800+  -- GHC 8.2+  skipped = Set.empty+#elif __GLASGOW_HASKELL__ >= 711+  -- GHC 8.0+  skipped = Set.fromList+    [+      -- testPrefix </> "ghc80" </> "MultiQuote.hs"+      "MultiQuote.hs"+    , "TestUtils.hs"+    , "T10689a.hs"+    , "Zwaluw.hs"+    , "determ004.hs"+    ]+#else+  -- GHC 7.10+  skipped = Set.empty+#endif++findTestsDir :: ([FilePath] -> [FilePath]) -> (FilePath -> FilePath -> Test) -> FilePath -> IO Test+findTestsDir filterFn 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)+  return $ testList dir (map (\fn -> TestLabel fn (mkTestFn dir fn)) $ filterFn testFiles)  listTests :: IO () listTests = do@@ -99,7 +130,8 @@   prettyRoundTripTests <- findPrettyTests   return $ TestList [                       internalTests, roundTripTests, transformTests, failingTests, noAnnotationTests-                    -- , prettyRoundTripTests+                    ,+                      prettyRoundTripTests                     ]  -- Tests that will fail until https://phabricator.haskell.org/D907 lands in a@@ -109,10 +141,12 @@   [   -- Tests requiring future GHC modifications     mkTestModBad "InfixOperator.hs"-  , mkTestModBad "CtorOp.hs" -- Should be fixed in GHC 8.2+  , mkTestModBad "CtorOp.hs" -- Should be fixed in GHC 8.4 -#if __GLASGOW_HASKELL__ > 710+#if __GLASGOW_HASKELL__ > 800   , mkTestModBad "overloadedlabelsrun04.hs"+#elif __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@@ -148,24 +182,24 @@  tt' :: IO (Counts,Int) tt' = runTestText (putTextToHandle stdout True) $ TestList [-      mkParserTest "ghc80" "SemicolonIf.hs" -      -- mkPrettyRoundtrip "ghc80" "StringSource.hs"-      -- mkPrettyRoundtrip "ghc80" "records-prov-req.hs"-      -- mkPrettyRoundtrip "ghc80" "records-poly-update.hs"-      -- mkPrettyRoundtrip "ghc80" "poly-export-fail2.hs"+      mkPrettyRoundtrip "ghc80" "Zwaluw.hs"       -- mkPrettyRoundtrip "ghc80" "pmc007.hs"+      -- mkPrettyRoundtrip "ghc80" "MultiQuote.hs"+      -- mkPrettyRoundtrip "ghc80" "T10689a.hs"+      -- mkPrettyRoundtrip "ghc710" "Ann01.hs" -      -- mkParserTest "ghc80" "DatatypeContexts.hs"-      -- mkParserTest "ghc80" "Families.hs"+      , mkParserTest "ghc80" "Zwaluw.hs"+      -- mkParserTest "ghc80" "SemicolonIf.hs"+      -- mkParserTest "ghc80" "T10689a.hs"+      -- mkParserTest "ghc80" "MonadT.hs"+      -- mkParserTest "ghc710" "Ann01.hs"     -- Needs GHC changes-      -- , mkParserTest "failing" "CtorOp.hs"-      -- mkParserTest "failing" "TensorTests.hs"-      -- mkParserTest "failing" "List2.hs"+        -- mkParserTest "failing" "CtorOp.hs"+        -- mkParserTest "failing" "InfixOperator.hs"  -      -- mkParserTest "ghc710" "DroppedComma.hs"      ] 
tests/Test/NoAnnotations.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE BangPatterns #-}+{-# LANGUAGE CPP #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-}@@ -17,7 +18,7 @@ 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.Pretty import Language.Haskell.GHC.ExactPrint.Types import Language.Haskell.GHC.ExactPrint.Utils @@ -201,7 +202,11 @@         bagVar    :: GHC.Bag (GHC.Located (GHC.HsBind GHC.Var)) -> String         bagVar     = ("{Bag(Located (HsBind Var)): "++) . (++"}") . list . GHC.bagToList +#if __GLASGOW_HASKELL__ > 800+        nameSet = ("{NameSet: "++) . (++"}") . list . GHC.nameSetElemsStable+#else         nameSet = ("{NameSet: "++) . (++"}") . list . GHC.nameSetElems+#endif          fixity = ("{Fixity: "++) . (++"}") . showSDoc_ . GHC.ppr :: GHC.Fixity -> String 
tests/Test/Transform.hs view
@@ -696,8 +696,13 @@           [GHC.L li imp1,imp2] = GHC.hsmodImports p           n1 = GHC.L l1 (GHC.mkVarUnqual (GHC.mkFastString "n1"))           n2 = GHC.L l2 (GHC.mkVarUnqual (GHC.mkFastString "n2"))+#if __GLASGOW_HASKELL__ > 800+          v1 = GHC.L l1 (GHC.IEVar (GHC.L l1 (GHC.IEName n1)))+          v2 = GHC.L l2 (GHC.IEVar (GHC.L l2 (GHC.IEName n2)))+#else           v1 = GHC.L l1 (GHC.IEVar n1)           v2 = GHC.L l2 (GHC.IEVar n2)+#endif           impHiding = GHC.L l0 [v1,v2]           imp1' = imp1 { GHC.ideclHiding = Just (True,impHiding)}           p' = p { GHC.hsmodImports = [GHC.L li imp1',imp2]}@@ -722,8 +727,13 @@           Just (_,GHC.L lh ns) = GHC.ideclHiding imp1           n1 = GHC.L l1 (GHC.mkVarUnqual (GHC.mkFastString "n1"))           n2 = GHC.L l2 (GHC.mkVarUnqual (GHC.mkFastString "n2"))+#if __GLASGOW_HASKELL__ > 800+          v1 = GHC.L l1 (GHC.IEVar (GHC.L l1 (GHC.IEName n1)))+          v2 = GHC.L l2 (GHC.IEVar (GHC.L l2 (GHC.IEName n2)))+#else           v1 = GHC.L l1 (GHC.IEVar n1)           v2 = GHC.L l2 (GHC.IEVar n2)+#endif           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))]
+ tests/examples/ghc710/DiophantineVect.hs view
@@ -0,0 +1,40 @@+{-# LANGUAGE ParallelArrays #-}+{-# OPTIONS -fvectorise -XParallelListComp #-}+module DiophantineVect (solution3) where++import Data.Array.Parallel+import Data.Array.Parallel.Prelude.Int as I++import qualified Prelude as P++solution3'+ = let+     pow x i     = productP (replicateP i x)+     primes      = [: 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73 :]+     a `cutTo` b = sliceP 0 (lengthP b) a+     sumpri xx   = productP [: pow p x | p <- primes `cutTo` xx | x <- xx :]+     distinct xx = productP [: x I.+ 1   | x <- xx :]++     series :: [:Int:] -> Int -> [:[:Int:]:]+     series xs n+       | n == 1      = [: [: 0 :] :]+       | otherwise   = [: [: x :] +:+ ps+                             | x <- xs+                             , ps <- series (I.enumFromToP 0 x) (n I.- 1) :]++     prob x y+      = let  xx      = [: (sumpri m ,m)+                             | m <- series (I.enumFromToP 1 3) x+                             , distinct [: x I.* 2 | x <- m :] > y :]+             i       = minIndexP [: a | (a, b) <- xx :]+        in   xx !: i+   in+   prob 5 200++solution3 :: (Int, PArray Int)+{-# NOINLINE solution3 #-}+solution3+  = let (i, is) = solution3'+    in+    (i, toPArrayP is)+
tests/examples/ghc710/ExplicitNamespaces.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE DataKinds #-}+{-# LANGUAGE ExplicitNamespaces #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE MagicHash #-} {-# LANGUAGE TypeOperators #-}
+ tests/examples/ghc710/read018.hs view
@@ -0,0 +1,17 @@+{-# LANGUAGE DatatypeContexts #-}+-- !!! Checking that empty contexts are permitted.+module ShouldCompile where++data () => Foo a = Foo a++newtype () => Bar = Bar Int++f :: () => Int -> Int+f = (+1)+++class () => Fob a where++instance () => Fob Int where+instance () => Fob Float+
+ tests/examples/ghc80/MonadT.hs view
@@ -0,0 +1,48 @@+{-# OPTIONS -XRank2Types #-}++module Control.Monatron.MonadT (+  MonadT(..), FMonadT(..), MMonadT(..), FComp(..), FunctorD(..), tmap, mtmap,+  module Control.Monad+) where++import Control.Monad+++----------------------------------------------------------+-- Class of monad transformers with+-- a lifting of first-order operations+----------------------------------------------------------++class MonadT t where+    lift    :: Monad m  => m a -> t m a+    treturn :: Monad m => a -> t m a+    treturn =  lift. return+    tbind   :: Monad m => t m a -> (a -> t m b) -> t m b++newtype FunctorD f = FunctorD {fmapD :: forall a b . (a -> b) -> f a -> f b}++functor :: Functor f => FunctorD f+functor = FunctorD fmap++class MonadT t => FMonadT t where+    tmap' :: FunctorD m -> FunctorD n -> (a -> b) -> (forall x. m x -> n x) -> t m a -> t n b++tmap :: (FMonadT t, Functor m, Functor n) => (forall b. m b -> n b) -> t m a -> t n a+tmap = tmap' functor functor id++mtmap :: FMonadT t => FunctorD f -> (a -> b) -> t f a -> t f b+mtmap fd f = tmap' fd fd f id++class FMonadT t => MMonadT t where+    flift      :: Functor f => f a -> t f a --should coincide with lift!+    monoidalT  :: (Functor f, Functor g) => t f (t g a) -> t (FComp f g) a++----------------------------------------+-- Functor Composition+----------------------------------------++newtype (FComp f g) a = Comp {deComp :: (f (g a)) }++instance (Functor f, Functor g) => Functor (FComp f g) where+    fmap f (Comp fga) = Comp (fmap (fmap f) fga)+
+ tests/examples/ghc80/Zwaluw.hs view
@@ -0,0 +1,168 @@+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE TypeOperators #-}++module Web.Zwaluw (+    -- * Types+    Router, (:-)(..), (<>),++    -- * Running routers+    parse, unparse,+    parse1, unparse1,++    -- * Constructing routers+    -- | The @constrN@ functions are helper functions to lift constructors of+    -- datatypes to routers. Their first argument is the constructor; their+    -- second argument is a (partial) destructor.+    constr0, constr1, constr2,+    int, slash, lit+  ) where++import Prelude hiding ((.), id)+import Control.Monad+import Control.Category+import Control.Arrow (first)+import Data.Monoid++infixr 8 <>+infixr 8 :-++-- | Infix operator for 'mappend'.+(<>) :: Monoid m => m -> m -> m+(<>) = mappend++data Router a b = Router+  { ser :: b -> [(a, String)]+  , prs :: String -> [(a -> b, String)] }++data a :- b = a :- b deriving (Eq, Show)++xmap :: (b -> a) -> (a -> b) -> Router r a -> Router r b+xmap f g (Router s p) = Router (s . f) ((fmap . liftM . first . fmap) g p)++instance Category (Router) where+  id = lit ""+  Router sf pf . Router sg pg = Router+    (\a -> do+        (b, s) <- sf a+        (c, s') <- sg b+        return (c, s ++ s'))+    (\s -> do+        (f, s') <- pf s+        (g, s'') <- pg s'+        return (f . g, s''))++instance Monoid (Router a b) where+  mempty = Router (const mzero) (const mzero)+  Router sf pf `mappend` Router sg pg = Router+    (\s -> sf s `mplus` sg s)+    (\s -> pf s `mplus` pg s)++parse :: Router () a -> String -> [a]+parse p = concatMap (\(a, s) -> if (s == "") then [a ()] else []) . prs p++parse1 :: Router () (a :- ()) -> String -> [a]+parse1 p s = map (\(r :- ()) -> r) (parse p s)++unparse :: Router () a -> a -> [String]+unparse p = map snd . ser p++unparse1 :: Router () (a :- ()) -> a -> [String]+unparse1 p x = unparse p (x :- ())++maph :: (b -> a) -> (a -> b) -> Router i (a :- o) -> Router i (b :- o)+maph f g = xmap (\(h :- t) -> f h :- t) (\(h :- t) -> g h :- t)++opt :: Eq a => a -> Router r (a :- r) -> Router r (a :- r)+opt a p = p <> push a++nil :: Router r ([a] :- r)+nil = constr0 [] $ \x -> do [] <- x; Just ()++cons :: Router (a :- [a] :- r) ([a] :- r)+cons = constr2 (:) $ \x -> do a:as <- x; return (a, as)++-- many :: Eq a => (forall r. Router r (a :- r)) -> Router r ([a] :- r)+-- many p = nil <> many1 p++-- many1 :: Eq a => (forall r. Router r (a :- r)) -> Router r ([a] :- r)+-- many1 p = cons . p . many p++satisfy :: (Char -> Bool) -> Router r (Char :- r)+satisfy p = Router+  (\(c :- a) -> if (p c) then return (a, [c]) else mzero)+  (\s -> case s of+    []     -> mzero+    (c:cs) -> if (p c) then return ((c :-), cs) else mzero)++char :: Router r (Char :- r)+char = satisfy (const True)++digitChar :: Router r (Char :- r)+digitChar = satisfy (\c -> c >= '0' && c <= '9')++digit :: Router r (Int :- r)+digit = maph (head . show) (read . (:[])) digitChar+++-- | Routes a constant string.+lit :: String -> Router r r+lit l = Router+  (\b -> return (b, l))+  (\s -> let (s1, s2) = splitAt (length l) s in if s1 == l then return (id, s2) else mzero)++-- | Routes a slash.+slash :: Router r r+slash = lit "/"++-- | Routes any integer.+int :: Router r (Int :- r)+-- int = maph show read $ many1 digitChar+int = Router+  (\(i :- a) -> return (a, show i))+  (\s -> let l = reads s in map (first (:-)) l)++++push :: Eq h => h -> Router r (h :- r)+push h = Router+  (\(h' :- t) -> do guard (h == h'); return (t, ""))+  (\s -> return ((h :-), s))++left :: Router (a :- r) (Either a b :- r)+left = constr1 Left $ \x -> do Left a <- x; return a++right :: Router (b :- r) (Either a b :- r)+right = constr1 Right $ \x -> do Right b <- x; return b++eitherP :: Router r (a :- r) -> Router r (b :- r) -> Router r (Either a b :- r)+eitherP l r = left . l <> right . r++-- | For example:+--+-- > nil :: Router r ([a] :- r)+-- > nil = constr0 [] $ \x -> do [] <- x; Just ()+constr0 :: o -> (Maybe o -> Maybe ()) -> Router r (o :- r)+constr0 c d = Router+  (\(a :- t) -> maybe mzero (\_ -> return (t, "")) (d (return a)))+  (\s -> return ((c :-), s))++-- | For example:+--+-- > left :: Router (a :- r) (Either a b :- r)+-- > left = constr1 Left $ \x -> do Left a <- x; return a+constr1 :: (a -> o) -> (Maybe o -> Maybe a) -> Router (a :- r) (o :- r)+constr1 c d = Router+  (\(a :- t) -> maybe mzero (\a -> return (a :- t, "")) (d (return a)))+  (\s -> return (\(a :- t) -> c a :- t, s))++-- | For example:+--+-- > cons :: Router (a :- [a] :- r) ([a] :- r)+-- > cons = constr2 (:) $ \x -> do a:as <- x; return (a, as)+constr2 :: (a -> b -> o) -> (Maybe o -> Maybe (a, b)) ->+  Router (a :- b :- r) (o :- r)+constr2 c d = Router+  (\(a :- t) ->+    maybe mzero (\(a, b) -> return (a :- b :- t, "")) (d (return a)))+  (\s -> return (\(a :- b :- t) -> c a b :- t, s))+