ghc-exactprint 0.6.4 → 1.1.0
raw patch · 89 files changed
+9815/−29762 lines, 89 filesdep +ordered-containersdep ~basedep ~ghcPVP ok
version bump matches the API change (PVP)
Dependencies added: ordered-containers
Dependency ranges changed: base, ghc
API changes (from Hackage documentation)
- Language.Haskell.GHC.ExactPrint: addAnnotationsForPretty :: Annotate a => [Comment] -> Located a -> Anns -> Anns
- Language.Haskell.GHC.ExactPrint: relativiseApiAnns :: (Data (SrcSpanLess ast), Annotate ast, HasSrcSpan ast) => ast -> ApiAnns -> Anns
- Language.Haskell.GHC.ExactPrint: relativiseApiAnnsWithComments :: (Data (SrcSpanLess ast), Annotate ast, HasSrcSpan ast) => [Comment] -> ast -> ApiAnns -> Anns
- Language.Haskell.GHC.ExactPrint.Annotate: [AnnotationsToComments] :: [AnnKeywordId] -> next -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotate: [CountAnns] :: AnnKeywordId -> (Int -> next) -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotate: [GetSrcSpanForKw] :: SrcSpan -> AnnKeywordId -> (SrcSpan -> next) -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotate: [IfInContext] :: Set AstContext -> Annotated () -> Annotated () -> next -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotate: [MarkAnnBeforeAnn] :: AnnKeywordId -> AnnKeywordId -> next -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotate: [MarkEOF] :: next -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotate: [MarkExternal] :: SrcSpan -> AnnKeywordId -> String -> next -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotate: [MarkInside] :: AnnKeywordId -> next -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotate: [MarkInstead] :: AnnKeywordId -> KeywordId -> next -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotate: [MarkManyOptional] :: AnnKeywordId -> next -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotate: [MarkMany] :: AnnKeywordId -> next -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotate: [MarkOffsetPrimOptional] :: AnnKeywordId -> Int -> Maybe String -> next -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotate: [MarkOffsetPrim] :: AnnKeywordId -> Int -> Maybe String -> next -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotate: [MarkOutside] :: AnnKeywordId -> KeywordId -> next -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotate: [MarkPPOptional] :: AnnKeywordId -> Maybe String -> next -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotate: [MarkPrim] :: AnnKeywordId -> Maybe String -> next -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotate: [SetContextLevel] :: Set AstContext -> Int -> Annotated () -> next -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotate: [SetLayoutFlag] :: Rigidity -> Annotated () -> next -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotate: [StoreOriginalSrcSpan] :: SrcSpan -> AnnKey -> (AnnKey -> next) -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotate: [TellContext] :: Set AstContext -> next -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotate: [UnsetContext] :: AstContext -> Annotated () -> next -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotate: [WithAST] :: (Data a, Data (SrcSpanLess a), HasSrcSpan a) => a -> Annotated b -> next -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotate: [WithSortKeyContexts] :: ListContexts -> [(AnnSpan, Annotated ())] -> next -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotate: [WithSortKey] :: [(AnnSpan, Annotated ())] -> next -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotate: annotate :: (Annotate ast, Data (SrcSpanLess ast), HasSrcSpan ast) => ast -> Annotated ()
- Language.Haskell.GHC.ExactPrint.Annotate: class Data ast => Annotate ast
- Language.Haskell.GHC.ExactPrint.Annotate: data AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotate: markAST :: Annotate ast => SrcSpan -> ast -> Annotated ()
- Language.Haskell.GHC.ExactPrint.Annotate: type Annotated = FreeT AnnotationF Identity
- Language.Haskell.GHC.ExactPrint.Annotate: withSortKeyContextsHelper :: Monad m => (Annotated () -> m ()) -> ListContexts -> [(AnnSpan, Annotated ())] -> m ()
- 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: [MarkInstead] :: AnnKeywordId -> KeywordId -> 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, Data (SrcSpanLess a), HasSrcSpan a) => a -> Annotated b -> next -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: [WithSortKeyContexts] :: ListContexts -> [(AnnSpan, Annotated ())] -> next -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: [WithSortKey] :: [(AnnSpan, Annotated ())] -> next -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: annotationsToComments :: forall m_axI4. MonadFree AnnotationF m_axI4 => [AnnKeywordId] -> m_axI4 ()
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: applyListAnnotations :: [(AnnSpan, Annotated ())] -> Annotated ()
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: applyListAnnotationsContexts :: ListContexts -> [(AnnSpan, Annotated ())] -> Annotated ()
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: applyListAnnotationsLayout :: [(AnnSpan, Annotated ())] -> Annotated ()
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: countAnns :: forall m_axEM. MonadFree AnnotationF m_axEM => AnnKeywordId -> m_axEM Int
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: data AnnotationF next
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: getSrcSpanForKw :: forall m_axGX. MonadFree AnnotationF m_axGX => SrcSpan -> AnnKeywordId -> m_axGX SrcSpan
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: ifInContext :: forall m_axMp. MonadFree AnnotationF m_axMp => Set AstContext -> Annotated () -> Annotated () -> m_axMp ()
- 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_axPH. MonadFree AnnotationF m_axPH => AnnKeywordId -> AnnKeywordId -> m_axPH ()
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: markAnnOpen :: SourceText -> String -> Annotated ()
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: markEOF :: forall m_axaB. MonadFree AnnotationF m_axaB => m_axaB ()
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: markExternal :: forall m_axzf. MonadFree AnnotationF m_axzf => SrcSpan -> AnnKeywordId -> String -> m_axzf ()
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: markExternalSourceText :: SrcSpan -> SourceText -> String -> Annotated ()
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: markInside :: forall m_axyc. MonadFree AnnotationF m_axyc => AnnKeywordId -> m_axyc ()
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: markInstead :: forall m_axw0. MonadFree AnnotationF m_axw0 => AnnKeywordId -> KeywordId -> m_axw0 ()
- 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_axAo. MonadFree AnnotationF m_axAo => AnnKeywordId -> m_axAo ()
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: markManyOptional :: forall m_axBr. MonadFree AnnotationF m_axBr => AnnKeywordId -> m_axBr ()
- 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_axCu. MonadFree AnnotationF m_axCu => AnnKeywordId -> Int -> Maybe String -> m_axCu ()
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: markOffsetPrimOptional :: forall m_axDD. MonadFree AnnotationF m_axDD => AnnKeywordId -> Int -> Maybe String -> m_axDD ()
- 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_axx6. MonadFree AnnotationF m_axx6 => AnnKeywordId -> KeywordId -> m_axx6 ()
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: markPPOptional :: forall m_axuU. MonadFree AnnotationF m_axuU => AnnKeywordId -> Maybe String -> m_axuU ()
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: markPrim :: forall m_axtO. MonadFree AnnotationF m_axtO => AnnKeywordId -> Maybe String -> m_axtO ()
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: markSourceText :: SourceText -> String -> Annotated ()
- 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_axKa. MonadFree AnnotationF m_axKa => Set AstContext -> Int -> Annotated () -> m_axKa ()
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: setLayoutFlag :: Annotated () -> Annotated ()
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: setRigidFlag :: Annotated () -> Annotated ()
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: sourceTextToString :: SourceText -> String -> String
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: storeOriginalSrcSpan :: forall m_axFQ. MonadFree AnnotationF m_axFQ => SrcSpan -> AnnKey -> m_axFQ AnnKey
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: tellContext :: forall m_axOE. MonadFree AnnotationF m_axOE => Set AstContext -> m_axOE ()
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: type Annotated = FreeT AnnotationF Identity
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: unsetContext :: forall m_axLj. MonadFree AnnotationF m_axLj => AstContext -> Annotated () -> m_axLj ()
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: withAST :: (Data a, Data (SrcSpanLess a), HasSrcSpan a) => a -> Annotated () -> Annotated ()
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: withLocated :: (Data a, Data (SrcSpanLess a), HasSrcSpan a) => a -> (SrcSpan -> a -> Annotated ()) -> Annotated ()
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: withSortKey :: forall m_axJ7. MonadFree AnnotationF m_axJ7 => [(AnnSpan, Annotated ())] -> m_axJ7 ()
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: withSortKeyContexts :: forall m_axNy. MonadFree AnnotationF m_axNy => ListContexts -> [(AnnSpan, Annotated ())] -> m_axNy ()
- Language.Haskell.GHC.ExactPrint.AnnotateTypes: withSortKeyContextsHelper :: Monad m => (Annotated () -> m ()) -> ListContexts -> [(AnnSpan, 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: [MarkInstead] :: AnnKeywordId -> KeywordId -> 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, Data (SrcSpanLess a), HasSrcSpan a) => a -> Annotated b -> next -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotater: [WithSortKeyContexts] :: ListContexts -> [(AnnSpan, Annotated ())] -> next -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotater: [WithSortKey] :: [(AnnSpan, Annotated ())] -> next -> AnnotationF next
- Language.Haskell.GHC.ExactPrint.Annotater: annotate :: (Annotate ast, Data (SrcSpanLess ast), HasSrcSpan ast) => 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 (Data.Data.Data ast, Language.Haskell.GHC.ExactPrint.Annotater.Annotate ast) => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (SrcLoc.Located ast)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Data.Data.Data Language.Haskell.GHC.ExactPrint.Annotater.ResTyGADTHook
- Language.Haskell.GHC.ExactPrint.Annotater: instance Data.Data.Data Language.Haskell.GHC.ExactPrint.Annotater.WildCardAnon
- 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 (Class.FunDep (SrcLoc.Located RdrName.RdrName))
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Binds.HsBind GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Binds.HsLocalBinds GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Binds.IPBind GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Binds.Sig GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Decls.AnnDecl GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Decls.ClsInstDecl GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Decls.ConDecl GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Decls.DataFamInstDecl GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Decls.DefaultDecl GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Decls.DerivDecl GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Decls.DerivStrategy GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Decls.FamilyDecl GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Decls.FamilyResultSig GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Decls.ForeignDecl GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Decls.HsDecl GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Decls.HsDerivingClause GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Decls.InjectivityAnn GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Decls.InstDecl GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Decls.RoleAnnotDecl GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Decls.RuleBndr GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Decls.RuleDecl GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Decls.RuleDecls GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Decls.SpliceDecl GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Decls.StandaloneKindSig GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Decls.TyClDecl GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Decls.TyFamInstDecl GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Decls.TyFamInstEqn GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Decls.WarnDecl GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Decls.WarnDecls GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Expr.HsCmd GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Expr.HsCmdTop GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Expr.HsExpr GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Expr.HsSplice GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Expr.HsTupArg GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Expr.ParStmtBlock GHC.Hs.Extension.GhcPs GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.HsModule GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.ImpExp.IE GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.ImpExp.IEWrappedName RdrName.RdrName)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.ImpExp.ImportDecl GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Lit.HsLit GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Lit.HsOverLit GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Pat.HsRecField GHC.Hs.Extension.GhcPs (GHC.Hs.Expr.LHsExpr GHC.Hs.Extension.GhcPs))
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Pat.HsRecField GHC.Hs.Extension.GhcPs (SrcLoc.Located (GHC.Hs.Pat.Pat GHC.Hs.Extension.GhcPs)))
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Pat.HsRecUpdField GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Pat.Pat GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Types.AmbiguousFieldOcc GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Types.ConDeclField GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Types.FieldOcc GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Types.HsTyVarBndr GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Types.HsType GHC.Hs.Extension.GhcPs)
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Maybe.Maybe CoAxiom.Role)
- 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 GHC.Hs.Decls.DocDecl
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate GHC.Hs.Doc.HsDocString
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate GHC.Hs.Types.HsIPName
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate Language.Haskell.GHC.ExactPrint.Annotater.ResTyGADTHook
- 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 RdrName.RdrName
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate [GHC.Hs.Decls.LHsDerivingClause GHC.Hs.Extension.GhcPs]
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate [GHC.Hs.Expr.ExprLStmt GHC.Hs.Extension.GhcPs]
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate [GHC.Hs.ImpExp.LIE GHC.Hs.Extension.GhcPs]
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate [GHC.Hs.Types.LConDeclField GHC.Hs.Extension.GhcPs]
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate [GHC.Hs.Types.LHsSigType GHC.Hs.Extension.GhcPs]
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate [GHC.Hs.Types.LHsType GHC.Hs.Extension.GhcPs]
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate [SrcLoc.Located (GHC.Hs.Expr.StmtLR GHC.Hs.Extension.GhcPs GHC.Hs.Extension.GhcPs (GHC.Hs.Expr.LHsCmd GHC.Hs.Extension.GhcPs))]
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate arg => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Types.HsImplicitBndrs GHC.Hs.Extension.GhcPs (SrcLoc.Located arg))
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate body => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Expr.GRHS GHC.Hs.Extension.GhcPs (SrcLoc.Located body))
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate body => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Expr.Match GHC.Hs.Extension.GhcPs (SrcLoc.Located body))
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate body => Language.Haskell.GHC.ExactPrint.Annotater.Annotate (GHC.Hs.Expr.Stmt GHC.Hs.Extension.GhcPs (SrcLoc.Located body))
- Language.Haskell.GHC.ExactPrint.Annotater: instance Language.Haskell.GHC.ExactPrint.Annotater.Annotate body => Language.Haskell.GHC.ExactPrint.Annotater.Annotate [SrcLoc.Located (GHC.Hs.Expr.Match GHC.Hs.Extension.GhcPs (SrcLoc.Located body))]
- 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 Outputable.Outputable Language.Haskell.GHC.ExactPrint.Annotater.ResTyGADTHook
- 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 -> [(AnnSpan, Annotated ())] -> m ()
- Language.Haskell.GHC.ExactPrint.Delta: data DeltaOptions
- Language.Haskell.GHC.ExactPrint.Delta: deltaOptions :: Rigidity -> DeltaOptions
- Language.Haskell.GHC.ExactPrint.Delta: instance GHC.Base.Monoid Language.Haskell.GHC.ExactPrint.Delta.DeltaWriter
- Language.Haskell.GHC.ExactPrint.Delta: instance GHC.Base.Semigroup Language.Haskell.GHC.ExactPrint.Delta.DeltaWriter
- Language.Haskell.GHC.ExactPrint.Delta: normalLayout :: DeltaOptions
- Language.Haskell.GHC.ExactPrint.Delta: relativiseApiAnns :: (Data (SrcSpanLess ast), Annotate ast, HasSrcSpan ast) => ast -> ApiAnns -> Anns
- Language.Haskell.GHC.ExactPrint.Delta: relativiseApiAnnsWithComments :: (Data (SrcSpanLess ast), Annotate ast, HasSrcSpan ast) => [Comment] -> ast -> ApiAnns -> Anns
- Language.Haskell.GHC.ExactPrint.Delta: relativiseApiAnnsWithOptions :: (Data (SrcSpanLess ast), Annotate ast, HasSrcSpan ast) => DeltaOptions -> [Comment] -> ast -> ApiAnns -> Anns
- Language.Haskell.GHC.ExactPrint.Parsers: parseModuleApiAnnsWithCpp :: CppOptions -> FilePath -> IO (Either ErrorMessages (ApiAnns, [Comment], DynFlags, ParsedSource))
- Language.Haskell.GHC.ExactPrint.Parsers: parseModuleApiAnnsWithCppInternal :: GhcMonad m => CppOptions -> DynFlags -> FilePath -> m (Either ErrorMessages (ApiAnns, [Comment], DynFlags, ParsedSource))
- Language.Haskell.GHC.ExactPrint.Pretty: addAnnotationsForPretty :: Annotate a => [Comment] -> Located a -> Anns -> Anns
- Language.Haskell.GHC.ExactPrint.Pretty: instance GHC.Base.Monoid Language.Haskell.GHC.ExactPrint.Pretty.PrettyWriter
- Language.Haskell.GHC.ExactPrint.Pretty: instance GHC.Base.Semigroup Language.Haskell.GHC.ExactPrint.Pretty.PrettyWriter
- Language.Haskell.GHC.ExactPrint.Pretty: instance GHC.Show.Show Language.Haskell.GHC.ExactPrint.Pretty.PrettyOptions
- Language.Haskell.GHC.ExactPrint.Print: data PrintOptions m a
- Language.Haskell.GHC.ExactPrint.Print: exactPrint :: Annotate ast => Located ast -> Anns -> String
- Language.Haskell.GHC.ExactPrint.Print: exactPrintWithOptions :: (Annotate ast, Monoid b, Monad m) => PrintOptions m b -> Located ast -> Anns -> m b
- Language.Haskell.GHC.ExactPrint.Print: instance GHC.Base.Monoid w => GHC.Base.Monoid (Language.Haskell.GHC.ExactPrint.Print.EPWriter w)
- Language.Haskell.GHC.ExactPrint.Print: instance GHC.Base.Monoid w => GHC.Base.Semigroup (Language.Haskell.GHC.ExactPrint.Print.EPWriter w)
- Language.Haskell.GHC.ExactPrint.Print: printOptions :: (forall ast. (Data ast, HasSrcSpan ast) => ast -> a -> m a) -> (String -> m a) -> (String -> m a) -> Rigidity -> PrintOptions m a
- Language.Haskell.GHC.ExactPrint.Print: stringOptions :: PrintOptions Identity String
- Language.Haskell.GHC.ExactPrint.Transform: captureOrderAnnKey :: AnnKey -> [Located b] -> Anns -> Anns
- Language.Haskell.GHC.ExactPrint.Transform: instance Language.Haskell.GHC.ExactPrint.Transform.HasDecls (GHC.Hs.Expr.LHsExpr Language.Haskell.GHC.ExactPrint.Types.GhcPs)
- Language.Haskell.GHC.ExactPrint.Transform: instance Language.Haskell.GHC.ExactPrint.Transform.HasDecls (GHC.Hs.Expr.LMatch Language.Haskell.GHC.ExactPrint.Types.GhcPs (GHC.Hs.Expr.LHsExpr Language.Haskell.GHC.ExactPrint.Types.GhcPs))
- Language.Haskell.GHC.ExactPrint.Transform: instance Language.Haskell.GHC.ExactPrint.Transform.HasDecls (GHC.Hs.Expr.LStmt Language.Haskell.GHC.ExactPrint.Types.GhcPs (GHC.Hs.Expr.LHsExpr Language.Haskell.GHC.ExactPrint.Types.GhcPs))
- Language.Haskell.GHC.ExactPrint.Types: ACS :: !Map a Int -> ACS' a
- Language.Haskell.GHC.ExactPrint.Types: AddVbar :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: AdvanceLine :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: CaseAlt :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: CtxFirst :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: CtxLast :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: CtxMiddle :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: CtxOnly :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: CtxPos :: Int -> AstContext
- Language.Haskell.GHC.ExactPrint.Types: DP :: (Int, Int) -> DeltaPos
- Language.Haskell.GHC.ExactPrint.Types: Deriving :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: ExplicitNeverActive :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: FollowingLine :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: HasHiding :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: InClassDecl :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: InGadt :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: InIE :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: InRecCon :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: InSpliceDecl :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: InTypeApp :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: InfixOp :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: Intercalate :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: LC :: !Set AstContext -> ListContexts
- Language.Haskell.GHC.ExactPrint.Types: LambdaExpr :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: LeftMost :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: ListItem :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: ListStart :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: NoAdvanceLine :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: NoDarrow :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: NoPrecedingSpace :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: Parens :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: PrefixOp :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: PrefixOpDollar :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: TopLevel :: AstContext
- Language.Haskell.GHC.ExactPrint.Types: [acs] :: ACS' a -> !Map a Int
- Language.Haskell.GHC.ExactPrint.Types: [commentIdentifier] :: Comment -> !AnnSpan
- Language.Haskell.GHC.ExactPrint.Types: [lcOnly, lcInitial, lcMiddle, lcLast] :: ListContexts -> !Set AstContext
- Language.Haskell.GHC.ExactPrint.Types: data ACS' a
- Language.Haskell.GHC.ExactPrint.Types: data AstContext
- Language.Haskell.GHC.ExactPrint.Types: data ListContexts
- Language.Haskell.GHC.ExactPrint.Types: defaultACS :: AstContextSet
- Language.Haskell.GHC.ExactPrint.Types: deltaColumn :: DeltaPos -> Int
- Language.Haskell.GHC.ExactPrint.Types: deltaRow :: DeltaPos -> Int
- Language.Haskell.GHC.ExactPrint.Types: instance Data.Data.Data Language.Haskell.GHC.ExactPrint.Types.Comment
- Language.Haskell.GHC.ExactPrint.Types: instance Data.Data.Data Language.Haskell.GHC.ExactPrint.Types.DeltaPos
- Language.Haskell.GHC.ExactPrint.Types: instance Data.Data.Data Language.Haskell.GHC.ExactPrint.Types.KeywordId
- Language.Haskell.GHC.ExactPrint.Types: instance GHC.Base.Monoid (Language.Haskell.GHC.ExactPrint.Types.ACS' Language.Haskell.GHC.ExactPrint.Types.AstContext)
- Language.Haskell.GHC.ExactPrint.Types: instance GHC.Base.Semigroup (Language.Haskell.GHC.ExactPrint.Types.ACS' Language.Haskell.GHC.ExactPrint.Types.AstContext)
- Language.Haskell.GHC.ExactPrint.Types: instance GHC.Classes.Eq Language.Haskell.GHC.ExactPrint.Types.AstContext
- Language.Haskell.GHC.ExactPrint.Types: instance GHC.Classes.Eq Language.Haskell.GHC.ExactPrint.Types.DeltaPos
- Language.Haskell.GHC.ExactPrint.Types: instance GHC.Classes.Eq Language.Haskell.GHC.ExactPrint.Types.ListContexts
- Language.Haskell.GHC.ExactPrint.Types: instance GHC.Classes.Ord Language.Haskell.GHC.ExactPrint.Types.AstContext
- Language.Haskell.GHC.ExactPrint.Types: instance GHC.Classes.Ord Language.Haskell.GHC.ExactPrint.Types.DeltaPos
- Language.Haskell.GHC.ExactPrint.Types: instance GHC.Classes.Ord Language.Haskell.GHC.ExactPrint.Types.KeywordId
- Language.Haskell.GHC.ExactPrint.Types: instance GHC.Show.Show Language.Haskell.GHC.ExactPrint.Types.Annotation
- Language.Haskell.GHC.ExactPrint.Types: instance GHC.Show.Show Language.Haskell.GHC.ExactPrint.Types.AstContext
- Language.Haskell.GHC.ExactPrint.Types: instance GHC.Show.Show Language.Haskell.GHC.ExactPrint.Types.DeltaPos
- Language.Haskell.GHC.ExactPrint.Types: instance GHC.Show.Show Language.Haskell.GHC.ExactPrint.Types.ListContexts
- Language.Haskell.GHC.ExactPrint.Types: instance GHC.Show.Show a => GHC.Show.Show (Language.Haskell.GHC.ExactPrint.Types.ACS' a)
- Language.Haskell.GHC.ExactPrint.Types: instance GHC.Show.Show a => Outputable.Outputable (Language.Haskell.GHC.ExactPrint.Types.ACS' a)
- Language.Haskell.GHC.ExactPrint.Types: instance Outputable.Outputable Language.Haskell.GHC.ExactPrint.Types.AnnConName
- Language.Haskell.GHC.ExactPrint.Types: instance Outputable.Outputable Language.Haskell.GHC.ExactPrint.Types.AnnKey
- Language.Haskell.GHC.ExactPrint.Types: instance Outputable.Outputable Language.Haskell.GHC.ExactPrint.Types.Annotation
- Language.Haskell.GHC.ExactPrint.Types: instance Outputable.Outputable Language.Haskell.GHC.ExactPrint.Types.Comment
- Language.Haskell.GHC.ExactPrint.Types: instance Outputable.Outputable Language.Haskell.GHC.ExactPrint.Types.DeltaPos
- Language.Haskell.GHC.ExactPrint.Types: instance Outputable.Outputable Language.Haskell.GHC.ExactPrint.Types.KeywordId
- Language.Haskell.GHC.ExactPrint.Types: newtype DeltaPos
- Language.Haskell.GHC.ExactPrint.Types: noExt :: NoExtField
- Language.Haskell.GHC.ExactPrint.Types: type AnnSpan = SrcSpan
- Language.Haskell.GHC.ExactPrint.Types: type AstContextSet = ACS' AstContext
- Language.Haskell.GHC.ExactPrint.Types: type Constraints a = (Data a, Data (SrcSpanLess a), HasSrcSpan a)
- Language.Haskell.GHC.ExactPrint.Types: type GhcPs = GhcPs
- Language.Haskell.GHC.ExactPrint.Types: type GhcRn = GhcRn
- Language.Haskell.GHC.ExactPrint.Types: type GhcTc = GhcTc
- Language.Haskell.GHC.ExactPrint.Utils: annCommentEntryDelta :: Annotation -> DeltaPos -> DeltaPos
- Language.Haskell.GHC.ExactPrint.Utils: bumpAcs :: ACS' a -> ACS' a
- Language.Haskell.GHC.ExactPrint.Utils: extractComments :: ApiAnns -> [Comment]
- Language.Haskell.GHC.ExactPrint.Utils: inAcs :: Ord a => Set a -> ACS' a -> Bool
- Language.Haskell.GHC.ExactPrint.Utils: pushAcs :: ACS' a -> ACS' a
- Language.Haskell.GHC.ExactPrint.Utils: setAcs :: Set AstContext -> AstContextSet -> AstContextSet
- Language.Haskell.GHC.ExactPrint.Utils: setAcsWithLevel :: Ord a => Set a -> Int -> ACS' a -> ACS' a
- Language.Haskell.GHC.ExactPrint.Utils: showAnnData :: Data a => Anns -> Int -> a -> String
- Language.Haskell.GHC.ExactPrint.Utils: showGhc :: Outputable a => a -> String
- Language.Haskell.GHC.ExactPrint.Utils: showSDocDebug_ :: SDoc -> String
- Language.Haskell.GHC.ExactPrint.Utils: showSDoc_ :: SDoc -> String
- Language.Haskell.GHC.ExactPrint.Utils: sr :: SrcSpan -> SrcSpan
- Language.Haskell.GHC.ExactPrint.Utils: srcSpanEndColumn :: SrcSpan -> Int
- Language.Haskell.GHC.ExactPrint.Utils: srcSpanEndLine :: SrcSpan -> Int
- Language.Haskell.GHC.ExactPrint.Utils: srcSpanStartColumn :: SrcSpan -> Int
- Language.Haskell.GHC.ExactPrint.Utils: srcSpanStartLine :: SrcSpan -> Int
- Language.Haskell.GHC.ExactPrint.Utils: unsetAcs :: Ord a => a -> ACS' a -> ACS' a
+ Language.Haskell.GHC.ExactPrint.ExactPrint: class (Typeable a) => ExactPrint a
+ Language.Haskell.GHC.ExactPrint.ExactPrint: exact :: ExactPrint a => a -> Annotated ()
+ Language.Haskell.GHC.ExactPrint.ExactPrint: exactPrint :: ExactPrint ast => Located ast -> String
+ Language.Haskell.GHC.ExactPrint.ExactPrint: getAnnotationEntry :: ExactPrint a => a -> Entry
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance (Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (GHC.Parser.Annotation.LocatedA (body GHC.Hs.Extension.GhcPs)), Language.Haskell.Syntax.Extension.Anno (Language.Haskell.Syntax.Expr.StmtLR GHC.Hs.Extension.GhcPs GHC.Hs.Extension.GhcPs (GHC.Parser.Annotation.LocatedA (body GHC.Hs.Extension.GhcPs))) GHC.Types.~ GHC.Parser.Annotation.SrcSpanAnnA, Language.Haskell.Syntax.Extension.Anno [GHC.Types.SrcLoc.GenLocated GHC.Parser.Annotation.SrcSpanAnnA (Language.Haskell.Syntax.Expr.StmtLR GHC.Hs.Extension.GhcPs GHC.Hs.Extension.GhcPs (GHC.Parser.Annotation.LocatedA (body GHC.Hs.Extension.GhcPs)))] GHC.Types.~ GHC.Parser.Annotation.SrcSpanAnnL, Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (GHC.Parser.Annotation.LocatedL [GHC.Parser.Annotation.LocatedA (Language.Haskell.Syntax.Expr.StmtLR GHC.Hs.Extension.GhcPs GHC.Hs.Extension.GhcPs (GHC.Parser.Annotation.LocatedA (body GHC.Hs.Extension.GhcPs)))])) => Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Expr.StmtLR GHC.Hs.Extension.GhcPs GHC.Hs.Extension.GhcPs (GHC.Parser.Annotation.LocatedA (body GHC.Hs.Extension.GhcPs)))
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance (Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Pat.HsRecField' (a GHC.Hs.Extension.GhcPs) body), Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Pat.HsRecField' (b GHC.Hs.Extension.GhcPs) body)) => Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Data.Either.Either [GHC.Parser.Annotation.LocatedA (Language.Haskell.Syntax.Pat.HsRecField' (a GHC.Hs.Extension.GhcPs) body)] [GHC.Parser.Annotation.LocatedA (Language.Haskell.Syntax.Pat.HsRecField' (b GHC.Hs.Extension.GhcPs) body)])
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance (Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint tm, Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint ty, GHC.Utils.Outputable.Outputable tm, GHC.Utils.Outputable.Outputable ty) => Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Type.HsArg tm ty)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance GHC.Base.Monoid w => GHC.Base.Monoid (Language.Haskell.GHC.ExactPrint.ExactPrint.EPWriter w)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance GHC.Base.Monoid w => GHC.Base.Semigroup (Language.Haskell.GHC.ExactPrint.ExactPrint.EPWriter w)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance GHC.Classes.Eq Language.Haskell.GHC.ExactPrint.ExactPrint.FlushComments
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance GHC.Classes.Eq a => GHC.Classes.Eq (Language.Haskell.GHC.ExactPrint.ExactPrint.AnnotatedList a)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance GHC.Show.Show Language.Haskell.GHC.ExactPrint.ExactPrint.FlushComments
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance GHC.Show.Show a => GHC.Show.Show (Language.Haskell.GHC.ExactPrint.ExactPrint.AnnotatedList a)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (GHC.Data.BooleanFormula.BooleanFormula (GHC.Parser.Annotation.LocatedN GHC.Types.Name.Reader.RdrName))
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (GHC.Hs.ImpExp.IE GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (GHC.Hs.ImpExp.IEWrappedName GHC.Types.Name.Reader.RdrName)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (GHC.Hs.ImpExp.ImportDecl GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (GHC.Parser.Annotation.LocatedA body) => Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Pat.HsRecField' (Language.Haskell.Syntax.Type.AmbiguousFieldOcc GHC.Hs.Extension.GhcPs) (GHC.Parser.Annotation.LocatedA body))
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (GHC.Parser.Annotation.LocatedL (GHC.Data.BooleanFormula.BooleanFormula (GHC.Parser.Annotation.LocatedN GHC.Types.Name.Reader.RdrName)))
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (GHC.Parser.Annotation.LocatedL [GHC.Parser.Annotation.LocatedA (GHC.Hs.ImpExp.IE GHC.Hs.Extension.GhcPs)])
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (GHC.Parser.Annotation.LocatedL [GHC.Parser.Annotation.LocatedA (Language.Haskell.Syntax.Expr.StmtLR GHC.Hs.Extension.GhcPs GHC.Hs.Extension.GhcPs (GHC.Parser.Annotation.LocatedA (Language.Haskell.Syntax.Expr.HsCmd GHC.Hs.Extension.GhcPs)))])
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (GHC.Parser.Annotation.LocatedL [GHC.Parser.Annotation.LocatedA (Language.Haskell.Syntax.Expr.StmtLR GHC.Hs.Extension.GhcPs GHC.Hs.Extension.GhcPs (GHC.Parser.Annotation.LocatedA (Language.Haskell.Syntax.Expr.HsExpr GHC.Hs.Extension.GhcPs)))])
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (GHC.Parser.Annotation.LocatedL [GHC.Parser.Annotation.LocatedA (Language.Haskell.Syntax.Type.ConDeclField GHC.Hs.Extension.GhcPs)])
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (GHC.Parser.Annotation.LocatedN GHC.Types.Name.Reader.RdrName)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (GHC.Parser.Annotation.LocatedP GHC.Types.Basic.OverlapMode)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (GHC.Parser.Annotation.LocatedP GHC.Types.ForeignCall.CType)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (GHC.Parser.Annotation.LocatedP GHC.Unit.Module.Warnings.WarningTxt)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (GHC.Types.SourceText.SourceText, GHC.Types.Basic.RuleName)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Binds.HsBind GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Binds.HsIPBinds GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Binds.HsLocalBinds GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Binds.HsValBindsLR GHC.Hs.Extension.GhcPs GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Binds.IPBind GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Binds.PatSynBind GHC.Hs.Extension.GhcPs GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Binds.RecordPatSynField GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Binds.Sig GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Decls.AnnDecl GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Decls.ClsInstDecl GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Decls.ConDecl GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Decls.DefaultDecl GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Decls.DerivClauseTys GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Decls.DerivDecl GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Decls.DerivStrategy GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Decls.FamilyDecl GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Decls.ForeignDecl GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Decls.FunDep GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Decls.HsDecl GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Decls.HsDerivingClause GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Decls.InjectivityAnn GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Decls.InstDecl GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Decls.RoleAnnotDecl GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Decls.RuleBndr GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Decls.RuleDecl GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Decls.RuleDecls GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Decls.SpliceDecl GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Decls.StandaloneKindSig GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Decls.TyClDecl GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Decls.TyFamInstDecl GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Decls.WarnDecl GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Decls.WarnDecls GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Expr.FieldLabelStrings GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Expr.GRHS GHC.Hs.Extension.GhcPs (GHC.Parser.Annotation.LocatedA (Language.Haskell.Syntax.Expr.HsCmd GHC.Hs.Extension.GhcPs)))
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Expr.GRHS GHC.Hs.Extension.GhcPs (GHC.Parser.Annotation.LocatedA (Language.Haskell.Syntax.Expr.HsExpr GHC.Hs.Extension.GhcPs)))
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Expr.GRHSs GHC.Hs.Extension.GhcPs (GHC.Parser.Annotation.LocatedA (Language.Haskell.Syntax.Expr.HsCmd GHC.Hs.Extension.GhcPs)))
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Expr.GRHSs GHC.Hs.Extension.GhcPs (GHC.Parser.Annotation.LocatedA (Language.Haskell.Syntax.Expr.HsExpr GHC.Hs.Extension.GhcPs)))
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Expr.HsCmd GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Expr.HsCmdTop GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Expr.HsExpr GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Expr.HsFieldLabel GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Expr.HsPragE GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Expr.HsSplice GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Expr.HsTupArg GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Expr.Match GHC.Hs.Extension.GhcPs (GHC.Parser.Annotation.LocatedA (Language.Haskell.Syntax.Expr.HsCmd GHC.Hs.Extension.GhcPs)))
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Expr.Match GHC.Hs.Extension.GhcPs (GHC.Parser.Annotation.LocatedA (Language.Haskell.Syntax.Expr.HsExpr GHC.Hs.Extension.GhcPs)))
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Expr.Match GHC.Hs.Extension.GhcPs (GHC.Parser.Annotation.LocatedA body)) => Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (GHC.Parser.Annotation.LocatedL [GHC.Parser.Annotation.LocatedA (Language.Haskell.Syntax.Expr.Match GHC.Hs.Extension.GhcPs (GHC.Parser.Annotation.LocatedA body))])
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Expr.MatchGroup GHC.Hs.Extension.GhcPs (GHC.Parser.Annotation.LocatedA (Language.Haskell.Syntax.Expr.HsCmd GHC.Hs.Extension.GhcPs)))
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Expr.MatchGroup GHC.Hs.Extension.GhcPs (GHC.Parser.Annotation.LocatedA (Language.Haskell.Syntax.Expr.HsExpr GHC.Hs.Extension.GhcPs)))
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Expr.ParStmtBlock GHC.Hs.Extension.GhcPs GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Lit.HsOverLit GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Pat.Pat GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Type.AmbiguousFieldOcc GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Type.ConDeclField GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Type.FieldOcc GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Type.HsForAllTelescope GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Type.HsPatSigType GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Type.HsSigType GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Type.HsType GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint Data.Void.Void
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint GHC.Core.Coercion.Axiom.Role
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint GHC.Data.FastString.FastString
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint GHC.Hs.Doc.HsDocString
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint GHC.Hs.HsModule
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint GHC.Types.ForeignCall.CCallConv
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint GHC.Types.ForeignCall.CExportSpec
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint GHC.Types.ForeignCall.Safety
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint GHC.Types.SourceText.StringLiteral
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint GHC.Unit.Module.Name.ModuleName
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint Language.Haskell.GHC.ExactPrint.ExactPrint.DataDefnWithContext
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint Language.Haskell.Syntax.Decls.DocDecl
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint Language.Haskell.Syntax.Decls.ForeignExport
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint Language.Haskell.Syntax.Decls.ForeignImport
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint Language.Haskell.Syntax.Type.HsIPName
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint a => Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (GHC.Maybe.Maybe a)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint a => Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (GHC.Parser.Annotation.LocatedA a)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint a => Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (GHC.Parser.Annotation.LocatedC a)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint a => Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (GHC.Types.SrcLoc.Located a)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint a => Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.GHC.ExactPrint.ExactPrint.AnnotatedList a)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint a => Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Type.HsScaled GHC.Hs.Extension.GhcPs a)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint a => Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint [a]
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint body => Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Decls.FamEqn GHC.Hs.Extension.GhcPs body)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint body => Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Pat.HsRecField' (Language.Haskell.Syntax.Expr.FieldLabelStrings GHC.Hs.Extension.GhcPs) body)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint body => Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Pat.HsRecField' (Language.Haskell.Syntax.Type.FieldOcc GHC.Hs.Extension.GhcPs) body)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint body => Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Pat.HsRecFields GHC.Hs.Extension.GhcPs body)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint body => Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Type.HsWildCardBndrs GHC.Hs.Extension.GhcPs body)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrintTVFlag ()
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrintTVFlag GHC.Types.Var.Specificity
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrintTVFlag flag => Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Type.HsOuterTyVarBndrs flag GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrintTVFlag flag => Language.Haskell.GHC.ExactPrint.ExactPrint.ExactPrint (Language.Haskell.Syntax.Type.HsTyVarBndr flag GHC.Hs.Extension.GhcPs)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.HasEntry (GHC.Parser.Annotation.EpAnn a)
+ Language.Haskell.GHC.ExactPrint.ExactPrint: instance Language.Haskell.GHC.ExactPrint.ExactPrint.HasEntry (GHC.Parser.Annotation.SrcSpanAnn' (GHC.Parser.Annotation.EpAnn an))
+ Language.Haskell.GHC.ExactPrint.Lookup: AnnComment :: Comment -> KeywordId
+ Language.Haskell.GHC.ExactPrint.Lookup: AnnSemiSep :: KeywordId
+ Language.Haskell.GHC.ExactPrint.Lookup: AnnString :: String -> KeywordId
+ Language.Haskell.GHC.ExactPrint.Lookup: AnnTypeApp :: KeywordId
+ Language.Haskell.GHC.ExactPrint.Lookup: Comment :: !String -> !Anchor -> !Maybe AnnKeywordId -> Comment
+ Language.Haskell.GHC.ExactPrint.Lookup: G :: AnnKeywordId -> KeywordId
+ Language.Haskell.GHC.ExactPrint.Lookup: [commentAnchor] :: Comment -> !Anchor
+ Language.Haskell.GHC.ExactPrint.Lookup: [commentContents] :: Comment -> !String
+ Language.Haskell.GHC.ExactPrint.Lookup: [commentOrigin] :: Comment -> !Maybe AnnKeywordId
+ Language.Haskell.GHC.ExactPrint.Lookup: data Comment
+ Language.Haskell.GHC.ExactPrint.Lookup: data KeywordId
+ Language.Haskell.GHC.ExactPrint.Parsers: parseModuleEpAnnsWithCpp :: FilePath -> CppOptions -> FilePath -> IO (Either ErrorMessages ([LEpaComment], DynFlags, ParsedSource))
+ Language.Haskell.GHC.ExactPrint.Parsers: parseModuleEpAnnsWithCppInternal :: GhcMonad m => CppOptions -> DynFlags -> FilePath -> m (Either ErrorMessages ([LEpaComment], DynFlags, ParsedSource))
+ Language.Haskell.GHC.ExactPrint.Parsers: type LibDir = FilePath
+ Language.Haskell.GHC.ExactPrint.Transform: WithWhere :: WithWhere
+ Language.Haskell.GHC.ExactPrint.Transform: WithoutWhere :: WithWhere
+ Language.Haskell.GHC.ExactPrint.Transform: addComma :: SrcSpanAnnA -> SrcSpanAnnA
+ Language.Haskell.GHC.ExactPrint.Transform: anchorEof :: ParsedSource -> ParsedSource
+ Language.Haskell.GHC.ExactPrint.Transform: balanceCommentsList :: Monad m => [LHsDecl GhcPs] -> TransformT m [LHsDecl GhcPs]
+ Language.Haskell.GHC.ExactPrint.Transform: balanceCommentsList' :: Monad m => [LocatedA a] -> TransformT m [LocatedA a]
+ Language.Haskell.GHC.ExactPrint.Transform: captureLineSpacing :: Monoid t => [LocatedAn t e] -> [GenLocated (SrcSpanAnn' (EpAnn t)) e]
+ Language.Haskell.GHC.ExactPrint.Transform: captureMatchLineSpacing :: LHsDecl GhcPs -> LHsDecl GhcPs
+ Language.Haskell.GHC.ExactPrint.Transform: captureTypeSigSpacing :: LHsDecl GhcPs -> LHsDecl GhcPs
+ Language.Haskell.GHC.ExactPrint.Transform: d0 :: EpaLocation
+ Language.Haskell.GHC.ExactPrint.Transform: d1 :: EpaLocation
+ Language.Haskell.GHC.ExactPrint.Transform: data WithWhere
+ Language.Haskell.GHC.ExactPrint.Transform: deltaAnchor :: Anchor -> RealSrcSpan -> Anchor
+ Language.Haskell.GHC.ExactPrint.Transform: dn :: Int -> EpaLocation
+ Language.Haskell.GHC.ExactPrint.Transform: insertAt :: HasDecls ast => (LHsDecl GhcPs -> [LHsDecl GhcPs] -> [LHsDecl GhcPs]) -> ast -> LHsDecl GhcPs -> Transform ast
+ Language.Haskell.GHC.ExactPrint.Transform: instance GHC.Classes.Eq Language.Haskell.GHC.ExactPrint.Transform.WithWhere
+ Language.Haskell.GHC.ExactPrint.Transform: instance GHC.Show.Show Language.Haskell.GHC.ExactPrint.Transform.WithWhere
+ Language.Haskell.GHC.ExactPrint.Transform: instance Language.Haskell.GHC.ExactPrint.Transform.HasDecls (GHC.Parser.Annotation.LocatedA (Language.Haskell.Syntax.Expr.HsExpr GHC.Hs.Extension.GhcPs))
+ Language.Haskell.GHC.ExactPrint.Transform: instance Language.Haskell.GHC.ExactPrint.Transform.HasDecls (GHC.Parser.Annotation.LocatedA (Language.Haskell.Syntax.Expr.Match GHC.Hs.Extension.GhcPs (GHC.Parser.Annotation.LocatedA (Language.Haskell.Syntax.Expr.HsExpr GHC.Hs.Extension.GhcPs))))
+ Language.Haskell.GHC.ExactPrint.Transform: instance Language.Haskell.GHC.ExactPrint.Transform.HasDecls (GHC.Parser.Annotation.LocatedA (Language.Haskell.Syntax.Expr.Stmt GHC.Hs.Extension.GhcPs (GHC.Parser.Annotation.LocatedA (Language.Haskell.Syntax.Expr.HsExpr GHC.Hs.Extension.GhcPs))))
+ Language.Haskell.GHC.ExactPrint.Transform: m0 :: AnchorOperation
+ Language.Haskell.GHC.ExactPrint.Transform: m1 :: AnchorOperation
+ Language.Haskell.GHC.ExactPrint.Transform: mn :: Int -> AnchorOperation
+ Language.Haskell.GHC.ExactPrint.Transform: noAnnSrcSpanDP :: Monoid ann => SrcSpan -> DeltaPos -> SrcSpanAnn' (EpAnn ann)
+ Language.Haskell.GHC.ExactPrint.Transform: noAnnSrcSpanDP0 :: Monoid ann => SrcSpan -> SrcSpanAnn' (EpAnn ann)
+ Language.Haskell.GHC.ExactPrint.Transform: noAnnSrcSpanDP1 :: Monoid ann => SrcSpan -> SrcSpanAnn' (EpAnn ann)
+ Language.Haskell.GHC.ExactPrint.Transform: noAnnSrcSpanDPn :: Monoid ann => SrcSpan -> Int -> SrcSpanAnn' (EpAnn ann)
+ Language.Haskell.GHC.ExactPrint.Transform: setEntryDP' :: Monoid t => LocatedAn t a -> DeltaPos -> LocatedAn t a
+ Language.Haskell.GHC.ExactPrint.Transform: transferEntryDP' :: Monad m => LHsDecl GhcPs -> LHsDecl GhcPs -> TransformT m (LHsDecl GhcPs)
+ Language.Haskell.GHC.ExactPrint.Types: [commentAnchor] :: Comment -> !Anchor
+ Language.Haskell.GHC.ExactPrint.Types: instance GHC.Utils.Outputable.Outputable Language.Haskell.GHC.ExactPrint.Types.Comment
+ Language.Haskell.GHC.ExactPrint.Types: mkAnnKeyPrim :: Data a => Located a -> AnnKey
+ Language.Haskell.GHC.ExactPrint.Types: mkAnnKeyPrimA :: Data a => LocatedA a -> AnnKey
+ Language.Haskell.GHC.ExactPrint.Types: showGhc :: Outputable a => a -> String
+ Language.Haskell.GHC.ExactPrint.Utils: adjustDeltaForOffset :: Int -> LayoutStartCol -> DeltaPos -> DeltaPos
+ Language.Haskell.GHC.ExactPrint.Utils: badRealSrcSpan :: RealSrcSpan
+ Language.Haskell.GHC.ExactPrint.Utils: debugEnabledFlag :: Bool
+ Language.Haskell.GHC.ExactPrint.Utils: debugPEnabledFlag :: Bool
+ Language.Haskell.GHC.ExactPrint.Utils: ghcCommentText :: LEpaComment -> String
+ Language.Haskell.GHC.ExactPrint.Utils: insertCppComments :: ParsedSource -> [LEpaComment] -> ParsedSource
+ Language.Haskell.GHC.ExactPrint.Utils: locatedAnAnchor :: LocatedAn a t -> RealSrcSpan
+ Language.Haskell.GHC.ExactPrint.Utils: mkLEpaComment :: String -> Anchor -> LEpaComment
+ Language.Haskell.GHC.ExactPrint.Utils: name2String :: Name -> String
+ Language.Haskell.GHC.ExactPrint.Utils: normaliseCommentText :: String -> String
+ Language.Haskell.GHC.ExactPrint.Utils: range2rs :: (Pos, Pos) -> RealSrcSpan
+ Language.Haskell.GHC.ExactPrint.Utils: rs2range :: RealSrcSpan -> (Pos, Pos)
+ Language.Haskell.GHC.ExactPrint.Utils: showAst :: Data a => a -> String
+ Language.Haskell.GHC.ExactPrint.Utils: sortAnchorLocated :: [GenLocated Anchor a] -> [GenLocated Anchor a]
+ Language.Haskell.GHC.ExactPrint.Utils: ss2deltaEnd :: RealSrcSpan -> RealSrcSpan -> DeltaPos
+ Language.Haskell.GHC.ExactPrint.Utils: ss2deltaStart :: RealSrcSpan -> RealSrcSpan -> DeltaPos
+ Language.Haskell.GHC.ExactPrint.Utils: undeltaSpan :: RealSrcSpan -> AnnKeywordId -> DeltaPos -> AddEpAnn
- Language.Haskell.GHC.ExactPrint: Ann :: !DeltaPos -> ![(Comment, DeltaPos)] -> ![(Comment, DeltaPos)] -> ![(KeywordId, DeltaPos)] -> !Maybe [SrcSpan] -> !Maybe AnnKey -> Annotation
+ Language.Haskell.GHC.ExactPrint: Ann :: !DeltaPos -> ![(Comment, DeltaPos)] -> ![(Comment, DeltaPos)] -> ![(KeywordId, DeltaPos)] -> !Maybe [RealSrcSpan] -> !Maybe AnnKey -> Annotation
- Language.Haskell.GHC.ExactPrint: AnnKey :: AnnSpan -> AnnConName -> AnnKey
+ Language.Haskell.GHC.ExactPrint: AnnKey :: RealSrcSpan -> AnnConName -> AnnKey
- Language.Haskell.GHC.ExactPrint: [annSortKey] :: Annotation -> !Maybe [SrcSpan]
+ Language.Haskell.GHC.ExactPrint: [annSortKey] :: Annotation -> !Maybe [RealSrcSpan]
- Language.Haskell.GHC.ExactPrint: exactPrint :: Annotate ast => Located ast -> Anns -> String
+ Language.Haskell.GHC.ExactPrint: exactPrint :: ExactPrint ast => Located ast -> String
- Language.Haskell.GHC.ExactPrint: parseModule :: FilePath -> IO (ParseResult ParsedSource)
+ Language.Haskell.GHC.ExactPrint: parseModule :: LibDir -> FilePath -> IO (ParseResult ParsedSource)
- Language.Haskell.GHC.ExactPrint.Parsers: ghcWrapper :: Ghc a -> IO a
+ Language.Haskell.GHC.ExactPrint.Parsers: ghcWrapper :: FilePath -> Ghc a -> IO a
- Language.Haskell.GHC.ExactPrint.Parsers: parseModule :: FilePath -> IO (ParseResult ParsedSource)
+ Language.Haskell.GHC.ExactPrint.Parsers: parseModule :: LibDir -> FilePath -> IO (ParseResult ParsedSource)
- Language.Haskell.GHC.ExactPrint.Parsers: parseModuleFromString :: FilePath -> String -> IO (ParseResult ParsedSource)
+ Language.Haskell.GHC.ExactPrint.Parsers: parseModuleFromString :: FilePath -> FilePath -> String -> IO (ParseResult ParsedSource)
- Language.Haskell.GHC.ExactPrint.Parsers: parseModuleWithCpp :: CppOptions -> DeltaOptions -> FilePath -> IO (ParseResult ParsedSource)
+ Language.Haskell.GHC.ExactPrint.Parsers: parseModuleWithCpp :: FilePath -> CppOptions -> FilePath -> IO (ParseResult ParsedSource)
- Language.Haskell.GHC.ExactPrint.Parsers: parseModuleWithOptions :: DeltaOptions -> FilePath -> IO (ParseResult ParsedSource)
+ Language.Haskell.GHC.ExactPrint.Parsers: parseModuleWithOptions :: FilePath -> FilePath -> IO (ParseResult ParsedSource)
- Language.Haskell.GHC.ExactPrint.Parsers: parseWith :: (Data (SrcSpanLess w), Annotate w, HasSrcSpan w) => DynFlags -> FilePath -> P w -> String -> ParseResult w
+ Language.Haskell.GHC.ExactPrint.Parsers: parseWith :: DynFlags -> FilePath -> P w -> String -> ParseResult w
- Language.Haskell.GHC.ExactPrint.Parsers: postParseTransform :: Either a (ApiAnns, [Comment], DynFlags, ParsedSource) -> DeltaOptions -> Either a (Anns, ParsedSource)
+ Language.Haskell.GHC.ExactPrint.Parsers: postParseTransform :: Either a ([LEpaComment], DynFlags, ParsedSource) -> Either a ParsedSource
- Language.Haskell.GHC.ExactPrint.Parsers: type ParseResult a = Either ErrorMessages (Anns, a)
+ Language.Haskell.GHC.ExactPrint.Parsers: type ParseResult a = Either ErrorMessages a
- Language.Haskell.GHC.ExactPrint.Parsers: withDynFlags :: (DynFlags -> a) -> IO a
+ Language.Haskell.GHC.ExactPrint.Parsers: withDynFlags :: FilePath -> (DynFlags -> a) -> IO a
- Language.Haskell.GHC.ExactPrint.Preprocess: getCppTokensAsComments :: GhcMonad m => CppOptions -> FilePath -> m [Comment]
+ Language.Haskell.GHC.ExactPrint.Preprocess: getCppTokensAsComments :: GhcMonad m => CppOptions -> FilePath -> m [LEpaComment]
- Language.Haskell.GHC.ExactPrint.Preprocess: stripLinePragmas :: String -> (String, [Comment])
+ Language.Haskell.GHC.ExactPrint.Preprocess: stripLinePragmas :: String -> (String, [LEpaComment])
- Language.Haskell.GHC.ExactPrint.Transform: addSimpleAnnT :: (Constraints a, Monad m) => a -> DeltaPos -> [(KeywordId, DeltaPos)] -> TransformT m ()
+ Language.Haskell.GHC.ExactPrint.Transform: addSimpleAnnT :: (Data a, Monad m) => Located a -> DeltaPos -> [(KeywordId, DeltaPos)] -> TransformT m ()
- Language.Haskell.GHC.ExactPrint.Transform: balanceComments :: (Data a, Data b, Monad m) => Located a -> Located b -> TransformT m ()
+ Language.Haskell.GHC.ExactPrint.Transform: balanceComments :: Monad m => LHsDecl GhcPs -> LHsDecl GhcPs -> TransformT m (LHsDecl GhcPs, LHsDecl GhcPs)
- Language.Haskell.GHC.ExactPrint.Transform: captureOrder :: Data a => Located a -> [Located b] -> Anns -> Anns
+ Language.Haskell.GHC.ExactPrint.Transform: captureOrder :: [LocatedA b] -> AnnSortKey
- Language.Haskell.GHC.ExactPrint.Transform: decl2Bind :: LHsDecl name -> [LHsBind name]
+ Language.Haskell.GHC.ExactPrint.Transform: decl2Bind :: LHsDecl GhcPs -> [LHsBind GhcPs]
- Language.Haskell.GHC.ExactPrint.Transform: decl2Sig :: LHsDecl name -> [LSig name]
+ Language.Haskell.GHC.ExactPrint.Transform: decl2Sig :: LHsDecl GhcPs -> [LSig GhcPs]
- Language.Haskell.GHC.ExactPrint.Transform: getEntryDP :: Constraints a => Anns -> a -> DeltaPos
+ Language.Haskell.GHC.ExactPrint.Transform: getEntryDP :: Data a => Anns -> Located a -> DeltaPos
- Language.Haskell.GHC.ExactPrint.Transform: getEntryDPT :: (Constraints a, Monad m) => a -> TransformT m DeltaPos
+ Language.Haskell.GHC.ExactPrint.Transform: getEntryDPT :: (Data a, Monad m) => Located a -> TransformT m DeltaPos
- Language.Haskell.GHC.ExactPrint.Transform: insertAfter :: HasDecls (Located ast) => Located old -> Located ast -> LHsDecl GhcPs -> Transform (Located ast)
+ Language.Haskell.GHC.ExactPrint.Transform: insertAfter :: HasDecls (LocatedA ast) => LocatedA old -> LocatedA ast -> LHsDecl GhcPs -> Transform (LocatedA ast)
- Language.Haskell.GHC.ExactPrint.Transform: insertAtEnd :: HasDecls (Located ast) => Located ast -> LHsDecl GhcPs -> Transform (Located ast)
+ Language.Haskell.GHC.ExactPrint.Transform: insertAtEnd :: HasDecls ast => ast -> LHsDecl GhcPs -> Transform ast
- Language.Haskell.GHC.ExactPrint.Transform: insertAtStart :: HasDecls (Located ast) => Located ast -> LHsDecl GhcPs -> Transform (Located ast)
+ Language.Haskell.GHC.ExactPrint.Transform: insertAtStart :: HasDecls ast => ast -> LHsDecl GhcPs -> Transform ast
- Language.Haskell.GHC.ExactPrint.Transform: insertBefore :: HasDecls (Located ast) => Located old -> Located ast -> LHsDecl GhcPs -> Transform (Located ast)
+ Language.Haskell.GHC.ExactPrint.Transform: insertBefore :: HasDecls (LocatedA ast) => LocatedA old -> LocatedA ast -> LHsDecl GhcPs -> Transform (LocatedA ast)
- Language.Haskell.GHC.ExactPrint.Transform: modifyValD :: forall m t. HasTransform m => SrcSpan -> Decl -> (Match -> [Decl] -> m ([Decl], Maybe t)) -> m (Decl, Maybe t)
+ Language.Haskell.GHC.ExactPrint.Transform: modifyValD :: forall m t. HasTransform m => SrcSpan -> Decl -> (PMatch -> [Decl] -> m ([Decl], Maybe t)) -> m (Decl, Maybe t)
- Language.Haskell.GHC.ExactPrint.Transform: replaceDeclsValbinds :: Monad m => HsLocalBinds GhcPs -> [LHsDecl GhcPs] -> TransformT m (HsLocalBinds GhcPs)
+ Language.Haskell.GHC.ExactPrint.Transform: replaceDeclsValbinds :: Monad m => WithWhere -> HsLocalBinds GhcPs -> [LHsDecl GhcPs] -> TransformT m (HsLocalBinds GhcPs)
- Language.Haskell.GHC.ExactPrint.Transform: setEntryDP :: Constraints a => a -> DeltaPos -> Anns -> Anns
+ Language.Haskell.GHC.ExactPrint.Transform: setEntryDP :: LocatedA a -> DeltaPos -> Anns -> Anns
- Language.Haskell.GHC.ExactPrint.Transform: setEntryDPT :: (Constraints a, Monad m) => a -> DeltaPos -> TransformT m ()
+ Language.Haskell.GHC.ExactPrint.Transform: setEntryDPT :: Monad m => LocatedA a -> DeltaPos -> TransformT m ()
- Language.Haskell.GHC.ExactPrint.Transform: setPrecedingLines :: Data a => Located a -> Int -> Int -> Anns -> Anns
+ Language.Haskell.GHC.ExactPrint.Transform: setPrecedingLines :: LocatedA a -> Int -> Int -> Anns -> Anns
- Language.Haskell.GHC.ExactPrint.Transform: setPrecedingLinesT :: (Data a, Monad m) => Located a -> Int -> Int -> TransformT m ()
+ Language.Haskell.GHC.ExactPrint.Transform: setPrecedingLinesT :: Monad m => LocatedA a -> Int -> Int -> TransformT m ()
- Language.Haskell.GHC.ExactPrint.Transform: transferEntryDP :: (Data a, Data b) => Located a -> Located b -> Anns -> Anns
+ Language.Haskell.GHC.ExactPrint.Transform: transferEntryDP :: (Monad m, Monoid t) => LocatedAn t a -> LocatedAn t b -> TransformT m (LocatedAn t b)
- Language.Haskell.GHC.ExactPrint.Transform: transferEntryDPT :: (Data a, Data b, Monad m) => Located a -> Located b -> TransformT m ()
+ Language.Haskell.GHC.ExactPrint.Transform: transferEntryDPT :: Monad m => LocatedA a -> LocatedA b -> TransformT m (LocatedA b)
- Language.Haskell.GHC.ExactPrint.Types: Ann :: !DeltaPos -> ![(Comment, DeltaPos)] -> ![(Comment, DeltaPos)] -> ![(KeywordId, DeltaPos)] -> !Maybe [SrcSpan] -> !Maybe AnnKey -> Annotation
+ Language.Haskell.GHC.ExactPrint.Types: Ann :: !DeltaPos -> ![(Comment, DeltaPos)] -> ![(Comment, DeltaPos)] -> ![(KeywordId, DeltaPos)] -> !Maybe [RealSrcSpan] -> !Maybe AnnKey -> Annotation
- Language.Haskell.GHC.ExactPrint.Types: AnnKey :: AnnSpan -> AnnConName -> AnnKey
+ Language.Haskell.GHC.ExactPrint.Types: AnnKey :: RealSrcSpan -> AnnConName -> AnnKey
- Language.Haskell.GHC.ExactPrint.Types: Comment :: !String -> !AnnSpan -> !Maybe AnnKeywordId -> Comment
+ Language.Haskell.GHC.ExactPrint.Types: Comment :: !String -> !Anchor -> !Maybe AnnKeywordId -> Comment
- Language.Haskell.GHC.ExactPrint.Types: [annSortKey] :: Annotation -> !Maybe [SrcSpan]
+ Language.Haskell.GHC.ExactPrint.Types: [annSortKey] :: Annotation -> !Maybe [RealSrcSpan]
- Language.Haskell.GHC.ExactPrint.Types: declFun :: (forall a. Data a => Located a -> b) -> LHsDecl GhcPs -> b
+ Language.Haskell.GHC.ExactPrint.Types: declFun :: (forall a. Data a => LocatedA a -> b) -> LHsDecl GhcPs -> b
- Language.Haskell.GHC.ExactPrint.Types: mkAnnKey :: Constraints a => a -> AnnKey
+ Language.Haskell.GHC.ExactPrint.Types: mkAnnKey :: Data a => Located a -> AnnKey
- Language.Haskell.GHC.ExactPrint.Utils: getAnnotationEP :: (Data a, Data (SrcSpanLess a), HasSrcSpan a) => a -> Anns -> Maybe Annotation
+ Language.Haskell.GHC.ExactPrint.Utils: getAnnotationEP :: Data a => Located a -> Anns -> Maybe Annotation
- Language.Haskell.GHC.ExactPrint.Utils: isGadt :: [LConDecl name] -> Bool
+ Language.Haskell.GHC.ExactPrint.Utils: isGadt :: [LConDecl (GhcPass p)] -> Bool
- Language.Haskell.GHC.ExactPrint.Utils: isPointSrcSpan :: AnnSpan -> Bool
+ Language.Haskell.GHC.ExactPrint.Utils: isPointSrcSpan :: RealSrcSpan -> Bool
- Language.Haskell.GHC.ExactPrint.Utils: mkComment :: String -> SrcSpan -> Comment
+ Language.Haskell.GHC.ExactPrint.Utils: mkComment :: String -> Anchor -> Comment
- Language.Haskell.GHC.ExactPrint.Utils: mkKWComment :: AnnKeywordId -> SrcSpan -> Comment
+ Language.Haskell.GHC.ExactPrint.Utils: mkKWComment :: AnnKeywordId -> EpaLocation -> Comment
- Language.Haskell.GHC.ExactPrint.Utils: orderByKey :: Eq o => [(o, a)] -> [o] -> [(o, a)]
+ Language.Haskell.GHC.ExactPrint.Utils: orderByKey :: [(RealSrcSpan, a)] -> [RealSrcSpan] -> [(RealSrcSpan, a)]
- Language.Haskell.GHC.ExactPrint.Utils: rs :: SrcSpan -> AnnSpan
+ Language.Haskell.GHC.ExactPrint.Utils: rs :: SrcSpan -> RealSrcSpan
- Language.Haskell.GHC.ExactPrint.Utils: spanLength :: SrcSpan -> Int
+ Language.Haskell.GHC.ExactPrint.Utils: spanLength :: RealSrcSpan -> Int
- Language.Haskell.GHC.ExactPrint.Utils: ss2delta :: Pos -> SrcSpan -> DeltaPos
+ Language.Haskell.GHC.ExactPrint.Utils: ss2delta :: Pos -> RealSrcSpan -> DeltaPos
- Language.Haskell.GHC.ExactPrint.Utils: ss2pos :: SrcSpan -> Pos
+ Language.Haskell.GHC.ExactPrint.Utils: ss2pos :: RealSrcSpan -> Pos
- Language.Haskell.GHC.ExactPrint.Utils: ss2posEnd :: SrcSpan -> Pos
+ Language.Haskell.GHC.ExactPrint.Utils: ss2posEnd :: RealSrcSpan -> Pos
- Language.Haskell.GHC.ExactPrint.Utils: tokComment :: Located AnnotationComment -> Comment
+ Language.Haskell.GHC.ExactPrint.Utils: tokComment :: LEpaComment -> Comment
Files
- ChangeLog +3/−0
- ghc-exactprint.cabal +30/−137
- src-ghc710/Language/Haskell/GHC/ExactPrint/Annotater.hs +0/−2556
- src-ghc80/Language/Haskell/GHC/ExactPrint/Annotater.hs +0/−2750
- src-ghc810/Language/Haskell/GHC/ExactPrint/Annotater.hs +0/−2949
- src-ghc82/Language/Haskell/GHC/ExactPrint/Annotater.hs +0/−2662
- src-ghc84/Language/Haskell/GHC/ExactPrint/Annotater.hs +0/−2606
- src-ghc86/Language/Haskell/GHC/ExactPrint/Annotater.hs +0/−2796
- src-ghc88/Language/Haskell/GHC/ExactPrint/Annotater.hs +0/−2935
- src-ghc90/Language/Haskell/GHC/ExactPrint/Annotater.hs +0/−2813
- src/Language/Haskell/GHC/ExactPrint.hs +2/−10
- src/Language/Haskell/GHC/ExactPrint/Annotate.hs +0/−36
- src/Language/Haskell/GHC/ExactPrint/AnnotateTypes.hs +0/−387
- src/Language/Haskell/GHC/ExactPrint/Delta.hs +0/−921
- src/Language/Haskell/GHC/ExactPrint/ExactPrint.hs +3884/−0
- src/Language/Haskell/GHC/ExactPrint/GhcInterim.hs +0/−26
- src/Language/Haskell/GHC/ExactPrint/Lookup.hs +107/−197
- src/Language/Haskell/GHC/ExactPrint/Parsers.hs +86/−181
- src/Language/Haskell/GHC/ExactPrint/Preprocess.hs +42/−103
- src/Language/Haskell/GHC/ExactPrint/Pretty.hs +0/−652
- src/Language/Haskell/GHC/ExactPrint/Print.hs +0/−572
- src/Language/Haskell/GHC/ExactPrint/Transform.hs +1491/−1398
- src/Language/Haskell/GHC/ExactPrint/Types.hs +99/−399
- src/Language/Haskell/GHC/ExactPrint/Utils.hs +278/−539
- tests/Roundtrip.hs +16/−15
- tests/Test.hs +157/−120
- tests/Test/Common.hs +43/−80
- tests/Test/CommonUtils.hs +0/−5
- tests/Test/Consistency.hs +0/−33
- tests/Test/NoAnnotations.hs +37/−159
- tests/Test/Transform.hs +1116/−871
- tests/examples/failing/InfixOperator.hs +0/−26
- tests/examples/failing/InfixOperator.hs.bad +0/−25
- tests/examples/failing/List2.hs +0/−40
- tests/examples/failing/List2.hs.bad +0/−40
- tests/examples/failing/MultiLineWarningPragma.hs +0/−18
- tests/examples/failing/MultiLineWarningPragma.hs.bad +0/−17
- tests/examples/failing/OverloadedLabelsRun04_A.hs +0/−8
- tests/examples/failing/T10970a.hs +8/−0
- tests/examples/failing/T10970a.hs.bad +7/−0
- tests/examples/failing/T17544_kw.hs +0/−25
- tests/examples/failing/TensorTests.hs +0/−41
- tests/examples/failing/TensorTests.hs.bad +0/−41
- tests/examples/failing/TopLevelSemis.hs +80/−0
- tests/examples/failing/TopLevelSemis.hs.bad +94/−0
- tests/examples/failing/UnicodeRules.hs +0/−16
- tests/examples/failing/UnicodeRules.hs.bad +0/−16
- tests/examples/failing/UnicodeSyntax.hs +0/−236
- tests/examples/failing/UnicodeSyntax.hs.bad +0/−236
- tests/examples/failing/dsrun010.hs +0/−25
- tests/examples/failing/n-plus-k-patterns.hs +11/−0
- tests/examples/failing/n-plus-k-patterns.hs.bad +11/−0
- tests/examples/failing/overloadedlabelsrun04.hs +0/−13
- tests/examples/failing/overloadedlabelsrun04.hs.bad +0/−12
- tests/examples/ghc710/EmptyMostly.hs +1/−0
- tests/examples/ghc710/TypeBrackets2.hs +3/−3
- tests/examples/ghc710/TypeSynParens.hs +1/−1
- tests/examples/ghc80/MonadFailErrors.hs +1/−1
- tests/examples/ghc80/T10970a.hs +0/−8
- tests/examples/ghc92/Binary.hs +259/−0
- tests/examples/ghc92/BlockComment.hs +7/−0
- tests/examples/ghc92/Character.hs +79/−0
- tests/examples/ghc92/Checkpoint.hs +45/−0
- tests/examples/ghc92/CommentPlacement.hs +17/−0
- tests/examples/ghc92/CommentPlacement2.hs +8/−0
- tests/examples/ghc92/CommonUI.hs +11/−0
- tests/examples/ghc92/ExperimIOP.hs +24/−0
- tests/examples/ghc92/FOL.hs +13/−0
- tests/examples/ghc92/Field.hs +48/−0
- tests/examples/ghc92/Group.hs +247/−0
- tests/examples/ghc92/LinearArrow.hs +26/−0
- tests/examples/ghc92/MatchSemis.hs +5/−0
- tests/examples/ghc92/Observer.hs +325/−0
- tests/examples/ghc92/Parse.hs +5/−0
- tests/examples/ghc92/PostgreSQL.hs +194/−0
- tests/examples/ghc92/RList.hs +233/−0
- tests/examples/ghc92/ScopesBug.hs +15/−0
- tests/examples/ghc92/StringRef.hs +129/−0
- tests/examples/ghc92/T17544_kw.hs +24/−0
- tests/examples/ghc92/TH.hs +279/−0
- tests/examples/ghc92/proc-do-complex-four-out.hs +63/−0
- tests/examples/ghc92/proc-do-complex-out.hs +63/−0
- tests/examples/ghc92/proc-do-complex.hs +50/−0
- tests/examples/ghc92/proc-lets-out.hs +13/−0
- tests/examples/ghc92/proc-lets.hs +15/−0
- tests/examples/transform/AddLocalDecl1.hs +4/−0
- tests/examples/transform/AddLocalDecl1.hs.expected +4/−0
- tests/examples/transform/LocalDecls2.hs.expected +2/−0
- tests/examples/transform/WhereIn3a.hs.expected +0/−6
ChangeLog view
@@ -1,3 +1,6 @@+2021-08-23 v1.1+ * Add support for GHC 9.2 rc1, and this version drops support for+ prior GHC versions. 2021-02-24 v0.6.4 * Add support for GHC 9.0.1 2021-02-01 v0.6.3.4
ghc-exactprint.cabal view
@@ -1,27 +1,13 @@ name: ghc-exactprint-version: 0.6.4+version: 1.1.0 synopsis: ExactPrint for GHC-description: Using the API Annotations available from GHC 7.10.2, this+description: Using the API Annotations available from GHC 9.2.1, this library provides a means to round trip any code that can be compiled by GHC, currently excluding lhs files. .- It does this with a phased approach- .- * Delta - converts GHC API Annotations into relative- offsets, indexed by SrcSpan- .- * Transform - functions to facilitate changes to- the AST, adjusting the annotations generated in the- Delta phase to suit the changes.- .- * 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 9.2 or later. For GHC versions from+ 7.10.2 to 9.0.* see this library with versions < 1.1 .- Note: requires GHC 7.10.2 or later license: BSD3 license-file: LICENSE@@ -29,25 +15,9 @@ maintainer: alan.zimm@gmail.com category: Development build-type: Simple-tested-with: GHC == 7.10.3- , GHC == 8.0.2- , GHC == 8.2.2- , GHC == 8.4.2- , GHC == 8.4.3- , GHC == 8.4.4- , GHC == 8.6.1- , GHC == 8.6.2- , GHC == 8.6.4- , GHC == 8.6.5- , GHC == 8.8.1- , GHC == 8.8.2- , GHC == 8.8.3- , GHC == 8.8.4- , GHC == 8.10.1- , GHC == 8.10.2- , GHC == 9.0.1+-- tested-with: GHC == 9.2.1+tested-with: GHC == 9.2.0.20210821 extra-source-files: ChangeLog- src-ghc710/Language/Haskell/GHC/ExactPrint/*.hs tests/examples/failing/*.hs tests/examples/ghc710-only/*.hs tests/examples/ghc710/*.hs@@ -58,6 +28,7 @@ tests/examples/ghc86/*.hs tests/examples/ghc88/*.hs tests/examples/ghc90/*.hs+ tests/examples/ghc92/*.hs tests/examples/pre-ghc810/*.hs tests/examples/pre-ghc86/*.hs tests/examples/pre-ghc90/*.hs@@ -85,32 +56,24 @@ 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.ExactPrint , 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 - if impl (ghc <= 8.0.2)- exposed-modules: Language.Haskell.GHC.ExactPrint.GhcInterim + hs-source-dirs: src -- other-modules: -- other-extensions:- if impl (ghc >= 8.0.1)- GHC-Options: -Wall -Wredundant-constraints- else- GHC-Options: -Wall+ GHC-Options: -Wall -Wredundant-constraints -- GHC-Options: -Weverything- build-depends: base >=4.8 && <4.16+ build-depends: base >=4.16 && <4.18 , bytestring >= 0.10.6 , containers >= 0.5+ , ordered-containers , directory >= 1.2 , filepath >= 1.4 , ghc >= 7.10.2@@ -118,40 +81,12 @@ , mtl >= 2.2.1 , syb >= 0.5 , free >= 4.12+ , fail >= 4.9 && <4.10+ , ghc-boot - if !impl (ghc >= 8.0)- build-depends:- fail >= 4.9 && <4.10 - if impl (ghc >= 7.11)- build-depends: ghc-boot- hs-source-dirs: src-- if impl (ghc > 8.10.9)- hs-source-dirs: src-ghc90- else- if impl (ghc > 8.8.4)- hs-source-dirs: src-ghc810- else- if impl (ghc > 8.6.5)- hs-source-dirs: src-ghc88- else- if impl (ghc > 8.4.4)- hs-source-dirs: src-ghc86- else- if impl (ghc > 8.2.2)- hs-source-dirs: src-ghc84- else- 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)+ if impl (ghc < 9.2) buildable: False Test-Suite test@@ -162,46 +97,20 @@ else hs-source-dirs: tests - if impl (ghc > 8.10.9)- hs-source-dirs: src-ghc90- else- if impl (ghc > 8.8.4)- hs-source-dirs: src-ghc810- else- if impl (ghc > 8.6.5)- hs-source-dirs: src-ghc88- else- if impl (ghc > 8.4.4)- hs-source-dirs: src-ghc86- else- if impl (ghc > 8.2.2)- hs-source-dirs: src-ghc84- else- 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.CommonUtils- , Test.Consistency , Test.NoAnnotations , Test.Transform- if impl (ghc >= 8.0.1)- GHC-Options: -threaded -Wall -Wredundant-constraints- else- GHC-Options: -threaded -Wall+ GHC-Options: -threaded -Wall -Wredundant-constraints Default-language: Haskell2010- if impl (ghc < 7.10.2)+ if impl (ghc < 9.2) buildable: False Build-depends: HUnit >= 1.2- , base < 4.16+ , base < 4.18 , bytestring , containers >= 0.5+ , ordered-containers , Diff , directory >= 1.2 , filepath >= 1.4@@ -212,25 +121,21 @@ , silently >= 1.2 , filemanip >= 0.3 -- for the lib only- if !impl (ghc >= 8.0)- build-depends:- fail >= 4.9 && <4.10+ , fail >= 4.9 && <4.10+ , ghc-boot if flag (dev) build-depends: free else build-depends: ghc-exactprint - if impl (ghc >= 7.11)- build-depends: ghc-boot- executable roundtrip main-is: Roundtrip.hs hs-source-dirs: tests other-modules: Test.Common Test.CommonUtils- Test.Consistency+ -- Test.Consistency default-language: Haskell2010- if impl (ghc >= 7.10.2) && flag (roundtrip)+ if impl (ghc >= 9.2) && flag (roundtrip) build-depends: HUnit , base@@ -244,15 +149,11 @@ , syb , temporary , time- if impl (ghc >= 7.11)- build-depends: ghc-boot+ , ghc-boot buildable: True else buildable: False- if impl (ghc >= 8.0.1)- GHC-Options: -threaded -Wall -Wredundant-constraints- else- GHC-Options: -threaded -Wall+ GHC-Options: -threaded -Wall -Wredundant-constraints executable static main-is: Static.hs@@ -265,15 +166,11 @@ , filepath , ghc , Diff+ , ghc-boot buildable: True- if impl (ghc >= 7.11)- build-depends: ghc-boot else buildable: False- if impl (ghc >= 8.0.1)- GHC-Options: -threaded -Wall -Wredundant-constraints- else- GHC-Options: -threaded -Wall+ GHC-Options: -threaded -Wall -Wredundant-constraints executable prepare-hackage main-is: PrepareHackage.hs@@ -285,17 +182,13 @@ , directory , filemanip , filepath- , ghc >= 7.10.2+ , ghc >= 9.2 , ghc-paths >= 0.1 , HUnit , text >= 1.2.2 , turtle >= 1.3.0+ , ghc-boot buildable: True- if impl (ghc >= 7.11)- build-depends: ghc-boot else buildable: False- if impl (ghc >= 8.0.1)- GHC-Options: -threaded -Wall -Wredundant-constraints- else- GHC-Options: -threaded -Wall+ GHC-Options: -threaded -Wall -Wredundant-constraints
− src-ghc710/Language/Haskell/GHC/ExactPrint/Annotater.hs
@@ -1,2556 +0,0 @@-{-# 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- markManyOptional GHC.AnnOpenP- 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
@@ -1,2750 +0,0 @@-{-# 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- markInstead GHC.AnnAt AnnTypeApp- 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-ghc810/Language/Haskell/GHC/ExactPrint/Annotater.hs
@@ -1,2949 +0,0 @@-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE GADTs #-}-{-# LANGUAGE PatternSynonyms #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE StandaloneDeriving #-}-{-# LANGUAGE ViewPatterns #-}----- | '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 HsDoc as GHC-import qualified Name as GHC-import qualified RdrName as GHC-import qualified Outputable as GHC-import qualified SrcLoc 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, Data (GHC.SrcSpanLess ast), GHC.HasSrcSpan ast) => ast -> Annotated ()-annotate = markLocated---- instance Annotate (GHC.SrcSpanLess ast) where--- markAST s ast = undefined-instance (Data ast, Annotate ast) => Annotate (GHC.Located ast) where- markAST l (GHC.L _ ast) = markAST l ast---- ------------------------------------------------------------------------- | Constructs a syntax tree which contains information about which--- annotations are required by each element.-markLocated :: (Data (GHC.SrcSpanLess ast), Annotate ast, GHC.HasSrcSpan ast)- => ast -> Annotated ()-markLocated ast =- case cast ast :: Maybe (GHC.LHsDecl GHC.GhcPs) 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 :: (Data (GHC.SrcSpanLess ast), Annotate ast, GHC.HasSrcSpan ast)- => Bool -> [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 :: (Data (GHC.SrcSpanLess ast), Annotate ast, GHC.HasSrcSpan ast)- => [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.GhcPs -> 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.GhcPs) 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- 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 Annotate [GHC.LIE GHC.GhcPs] 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 Annotate (GHC.IE GHC.GhcPs) 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- unsetContext Intercalate $ setContext (Set.fromList [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 ()- GHC.XIE x -> error $ "got XIE for :" ++ showGhc x- ifInContext (Set.fromList [Intercalate])- (mark GHC.AnnComma)- (markOptional GHC.AnnComma)---- -----------------------------------------------------------------------instance Annotate (GHC.IEWrappedName GHC.RdrName) 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---- -----------------------------------------------------------------------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- 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 isSym- then ifInContext (Set.fromList [PrefixOp,PrefixOpDollar])- (mark pa) -- '('- (markOptional pa)- else markOptional pa-- markOptional GHC.AnnSimpleQuote- 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- -- then error $ "GHC.orig:(isSym,canParen)=" ++ show (isSym,canParen)- else markExternal l GHC.AnnVal str- -- GHC.Orig _ _ -> markExternal l GHC.AnnVal str- -- GHC.Orig _ _ -> error $ "GHC.orig:str=[" ++ 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- doNormalRdrName- "*" -> 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")---- -----------------------------------------------------------------------instance Annotate (GHC.ImportDecl GHC.GhcPs) 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)- case qualFlag of- GHC.QualifiedPre -- 'qualified' appears in prepositive position.- -> (unsetContext TopLevel $ mark GHC.AnnQualified)- _ -> return ()- case mpkg of- Just (GHC.StringLiteral (GHC.SourceText srcPkg) _) ->- markWithString GHC.AnnPackageName srcPkg- _ -> return ()-- markLocated modname-- case qualFlag of- GHC.QualifiedPost -- 'qualified' appears in postpositive position.- -> (unsetContext TopLevel $ mark GHC.AnnQualified)- _ -> return ()-- 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--- markAST _ (GHC.XImportDecl x) = error $ "got XImportDecl for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate GHC.ModuleName where- markAST l mname =- markExternal l GHC.AnnVal (GHC.moduleNameString mname)---- -----------------------------------------------------------------------markLHsDecl :: GHC.LHsDecl GHC.GhcPs -> 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.KindSigD _ 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.SpliceD _ d -> markLocated (GHC.L l d)- GHC.DocD _ d -> markLocated (GHC.L l d)- GHC.RoleAnnotD _ d -> markLocated (GHC.L l d)- GHC.XHsDecl x -> error $ "got XHsDecl for:" ++ showGhc x--instance Annotate (GHC.HsDecl GHC.GhcPs) where- markAST l d = markLHsDecl (GHC.L l d)---- -----------------------------------------------------------------------instance Annotate (GHC.RoleAnnotDecl GHC.GhcPs) where- markAST _ (GHC.RoleAnnotDecl _ ln mr) = do- mark GHC.AnnType- mark GHC.AnnRole- setContext (Set.singleton PrefixOp) $ markLocated ln- mapM_ markLocated mr- markAST _ (GHC.XRoleAnnotDecl x) = error $ "got XRoleAnnotDecl for:" ++ showGhc x--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.GhcPs) where- markAST _ (GHC.SpliceDecl _ e@(GHC.L _ (GHC.HsQuasiQuote{})) _flag) = do- markLocated e- markTrailingSemi- markAST _ (GHC.SpliceDecl _ e _flag) = do- markLocated e- markTrailingSemi-- markAST _ (GHC.XSpliceDecl x) = error $ "got XSpliceDecl for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.RuleDecls GHC.GhcPs) where- markAST _ (GHC.HsRules _ src rules) = do- markAnnOpen src "{-# RULES"- setLayoutFlag $ markListIntercalateWithFunLevel markLocated 2 rules- markWithString GHC.AnnClose "#-}"- markTrailingSemi- markAST _ (GHC.XRuleDecls x) = error $ "got XRuleDecls for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.RuleDecl GHC.GhcPs) where- markAST l (GHC.HsRule _ ln act mtybndrs termbndrs lhs rhs) = do- markLocated ln- setContext (Set.singleton ExplicitNeverActive) $ markActivation l act-- case mtybndrs of- Nothing -> return ()- Just bndrs -> do- mark GHC.AnnForall- mapM_ markLocated bndrs- mark GHC.AnnDot-- mark GHC.AnnForall- mapM_ markLocated termbndrs- mark GHC.AnnDot-- markLocated lhs- mark GHC.AnnEqual- markLocated rhs- inContext (Set.singleton Intercalate) $ mark GHC.AnnSemi- markTrailingSemi-{-- = HsRule -- Source rule- { rd_ext :: XHsRule pass- -- ^ After renamer, free-vars from the LHS and RHS- , rd_name :: Located (SourceText,RuleName)- -- ^ Note [Pragma source text] in BasicTypes- , rd_act :: Activation- , rd_tyvs :: Maybe [LHsTyVarBndr (NoGhcTc pass)]- -- ^ Forall'd type vars- , rd_tmvs :: [LRuleBndr pass]- -- ^ Forall'd term vars, before typechecking; after typechecking- -- this includes all forall'd vars- , rd_lhs :: Located (HsExpr pass)- , rd_rhs :: Located (HsExpr pass)- }---}-- markAST _ (GHC.XRuleDecl x) = error $ "got XRuleDecl for:" ++ showGhc x---- -----------------------------------------------------------------------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.GhcPs) 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 -- ")"- markAST _ (GHC.XRuleBndr x) = error $ "got XRuleBndr for:" ++ showGhc x---- -----------------------------------------------------------------------markLHsSigWcType :: GHC.LHsSigWcType GHC.GhcPs -> Annotated ()-markLHsSigWcType (GHC.HsWC _ (GHC.HsIB _ ty)) = do- markLocated ty-markLHsSigWcType (GHC.HsWC _ (GHC.XHsImplicitBndrs _)) = error "markLHsSigWcType extension hit"-markLHsSigWcType (GHC.XHsWildCardBndrs _) = error "markLHsSigWcType extension hit"---- -----------------------------------------------------------------------instance Annotate (GHC.AnnDecl GHC.GhcPs) 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-- markAST _ (GHC.XAnnDecl x) = error $ "got XAnnDecl for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.WarnDecls GHC.GhcPs) where- markAST _ (GHC.Warnings _ src warns) = do- markAnnOpen src "{-# WARNING" -- Note: might be {-# DEPRECATED- mapM_ markLocated warns- markWithString GHC.AnnClose "#-}"-- markAST _ (GHC.XWarnDecls x) = error $ "got XWarnDecls for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.WarnDecl GHC.GhcPs) 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 -- "]"-- markAST _ (GHC.XWarnDecl x) = error $ "got XWarnDecl for:" ++ showGhc x--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.GhcPs) 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--- markAST _ (GHC.ForeignImport _ _ (GHC.XHsImplicitBndrs _) _) = error "markAST ForeignDecl hit extenstion"- markAST _ (GHC.ForeignExport _ _ (GHC.XHsImplicitBndrs _) _) = error "markAST ForeignDecl hit extenstion"- markAST _ (GHC.XForeignDecl _) = error "markAST ForeignDecl hit extenstion"---- -----------------------------------------------------------------------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.GhcPs) where-- markAST _ (GHC.DerivDecl _ (GHC.HsWC _ (GHC.HsIB _ typ)) ms mov) = do- mark GHC.AnnDeriving- markMaybe ms- mark GHC.AnnInstance- markMaybe mov- markLocated typ- markTrailingSemi--{--data DerivDecl pass = DerivDecl- { deriv_ext :: XCDerivDecl pass- , deriv_type :: LHsSigWcType pass- -- ^ The instance type to derive.- --- -- It uses an 'LHsSigWcType' because the context is allowed to be a- -- single wildcard:- --- -- > deriving instance _ => Eq (Foo a)- --- -- Which signifies that the context should be inferred.-- -- See Note [Inferring the instance context] in TcDerivInfer.-- , deriv_strategy :: Maybe (LDerivStrategy pass)- , deriv_overlap_mode :: Maybe (Located OverlapMode)--type LHsSigWcType pass = HsWildCardBndrs pass (LHsSigType pass) -- Both--data HsWildCardBndrs pass thing- -- See Note [HsType binders]- -- See Note [The wildcard story for types]- = HsWC { hswc_ext :: XHsWC pass thing- -- after the renamer- -- Wild cards, both named and anonymous-- , hswc_body :: thing- -- Main payload (type or list of types)- -- If there is an extra-constraints wildcard,- -- it's still there in the hsc_body.- }----}--- markAST _ (GHC.DerivDecl _ (GHC.HsWC _ (GHC.XHsImplicitBndrs _)) _ _) = error "markAST DerivDecl hit extension"- markAST _ (GHC.DerivDecl _ (GHC.XHsWildCardBndrs _) _ _) = error "markAST DerivDecl hit extension"- markAST _ (GHC.XDerivDecl _) = error "markAST DerivDecl hit extension"---- -----------------------------------------------------------------------instance Annotate (GHC.DerivStrategy GHC.GhcPs) where-- markAST _ GHC.StockStrategy = mark GHC.AnnStock- markAST _ GHC.AnyclassStrategy = mark GHC.AnnAnyclass- markAST _ GHC.NewtypeStrategy = mark GHC.AnnNewtype- markAST _ (GHC.ViaStrategy (GHC.HsIB _ ty)) = do- mark GHC.AnnVia- markLocated ty- markAST _ (GHC.ViaStrategy (GHC.XHsImplicitBndrs _))- = error $ "got XHsImplicitBndrs in AnnDerivStrategy"---- -----------------------------------------------------------------------instance Annotate (GHC.DefaultDecl GHC.GhcPs) where-- markAST _ (GHC.DefaultDecl _ typs) = do- mark GHC.AnnDefault- mark GHC.AnnOpenP -- '('- markListIntercalate typs- mark GHC.AnnCloseP -- ')'- markTrailingSemi-- markAST _ (GHC.XDefaultDecl x) = error $ "got XDefaultDecl for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.InstDecl GHC.GhcPs) 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- markAST _ (GHC.XInstDecl x) = error $ "got XInstDecl for:" ++ showGhc x---- -----------------------------------------------------------------------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.GhcPs) 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-- markAST _ (GHC.ClsInstDecl _ (GHC.XHsImplicitBndrs _) _ _ _ _ _) = error "extension hit for ClsInstDecl"- markAST _ (GHC.XClsInstDecl _) = error "extension hit for ClsInstDecl"---- -----------------------------------------------------------------------instance Annotate (GHC.TyFamInstDecl GHC.GhcPs) where-{--newtype TyFamInstDecl pass = TyFamInstDecl { tfid_eqn :: TyFamInstEqn pass }--type TyFamInstEqn pass = FamInstEqn pass (LHsType pass)--type FamInstEqn pass rhs- = HsImplicitBndrs pass (FamEqn pass (HsTyPats pass) rhs)----}- markAST _ (GHC.TyFamInstDecl (GHC.HsIB _ eqn)) = do- mark GHC.AnnType- mark GHC.AnnInstance -- Note: this keyword is optional- markFamEqn eqn- markTrailingSemi-- markAST _ (GHC.TyFamInstDecl (GHC.XHsImplicitBndrs _)) = error "extension hit for TyFamInstDecl"---- ------------------------------------------------------------------------- markFamEqn :: (GHC.HasOccName (GHC.IdP pass),--- Annotate (GHC.IdP pass), Annotate ast1, Annotate ast2)--- => GHC.FamEqn pass [GHC.Located ast1] (GHC.Located ast2)--- -> Annotated ()--- markFamEqn :: GHC.FamEqn GhcPs [GHC.LHsTypeArg GhcPs] (GHC.LHsType GHC.GhcPs)-markFamEqn :: GHC.FamEqn GhcPs (GHC.LHsType GHC.GhcPs)- -> Annotated ()-markFamEqn (GHC.FamEqn _ ln bndrs pats fixity rhs) = do- markTyClassArgs bndrs fixity ln pats- mark GHC.AnnEqual- markLocated rhs-{--data FamEqn pass pats rhs- = FamEqn- { feqn_ext :: XCFamEqn pass pats rhs- , feqn_tycon :: Located (IdP pass)- , feqn_bndrs :: Maybe [LHsTyVarBndr pass] -- ^ Optional quantified type vars- , feqn_pats :: pats- , feqn_fixity :: LexicalFixity -- ^ Fixity used in the declaration- , feqn_rhs :: rhs- }--}--markFamEqn (GHC.XFamEqn _) = error "got XFamEqn"---- -----------------------------------------------------------------------instance Annotate (GHC.DataFamInstDecl GHC.GhcPs) where-- markAST l (GHC.DataFamInstDecl (GHC.HsIB _ (GHC.FamEqn _ ln bndrs 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- mark GHC.AnnInstance-- markLocated ctx-- markTyClassArgs bndrs 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 unless (null cons) $ mark GHC.AnnEqual- markDataDefn l (GHC.HsDataDefn GHC.NoExtField nd (GHC.noLoc []) typ _mk cons mderivs)- markOptional GHC.AnnWhere- markTrailingSemi-- markAST _- (GHC.DataFamInstDecl- (GHC.HsIB _ (GHC.FamEqn _ _ _ _ _ (GHC.XHsDataDefn _))))- = error "extension hit for DataFamInstDecl"- markAST _ (GHC.DataFamInstDecl (GHC.HsIB _ (GHC.XFamEqn _)))- = error "extension hit for DataFamInstDecl"- markAST _ (GHC.DataFamInstDecl (GHC.XHsImplicitBndrs _))- = error "extension hit for DataFamInstDecl"---- -----------------------------------------------------------------------instance Annotate (GHC.HsBind GHC.GhcPs) 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)) _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-- -- ------------------------------------- -- Introduced after renaming.- markAST _ (GHC.AbsBinds {}) =- traceM "warning: AbsBinds introduced after renaming"-- -- ------------------------------------- markAST l (GHC.PatSynBind _ (GHC.PSB _ ln args def dir)) = do- mark GHC.AnnPattern- case args of- GHC.InfixCon la lb -> do- markLocated la- setContext (Set.singleton InfixOp) $ markLocated ln- markLocated lb- GHC.PrefixCon ns -> do- setContext (Set.singleton PrefixOp) $ markLocated ln- mapM_ markLocated ns- GHC.RecCon 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-- -- ------------------------------------- markAST _ (GHC.FunBind _ _ (GHC.XMatchGroup _) _ _)- = error "extension hit for HsBind"- markAST _ (GHC.PatBind _ _ (GHC.XGRHSs _) _)- = error "extension hit for HsBind"- markAST _ (GHC.PatSynBind _ (GHC.XPatSynBind _))- = error "extension hit for HsBind"- markAST _ (GHC.XHsBindsLR _)- = error "extension hit for HsBind"---- -----------------------------------------------------------------------instance Annotate (GHC.IPBind GHC.GhcPs) where- markAST _ (GHC.IPBind _ en e) = do- case en of- Left n -> markLocated n- Right _i -> return ()- mark GHC.AnnEqual- markLocated e- markTrailingSemi-- -- markAST _ (GHC.XCIPBind x) = error $ "got XIPBind for:" ++ showGhc x- markAST _ (GHC.XIPBind x) = error $ "got XIPBind for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate GHC.HsIPName where- markAST l (GHC.HsIPName n) = markExternal l GHC.AnnVal ("?" ++ GHC.unpackFS n)---- -----------------------------------------------------------------------instance (Annotate body)- => Annotate (GHC.Match GHC.GhcPs (GHC.Located body)) where-- markAST _ (GHC.Match _ mln pats (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 _ s -> do- setContext (Set.fromList [NoPrecedingSpace,PrefixOp]) $ do- when (s == GHC.SrcStrict) $ mark GHC.AnnBang- 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-- -- ------------------------------------- markAST _ (GHC.Match _ _ _ (GHC.XGRHSs _))- = error "hit extension for Match"- markAST _ (GHC.XMatch _)- = error "hit extension for Match"---- -----------------------------------------------------------------------instance (Annotate body)- => Annotate (GHC.GRHS GHC.GhcPs (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-- markAST _ (GHC.XGRHS x) = error $ "got XGRHS for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.Sig GHC.GhcPs) 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- setContext (Set.singleton PrefixOp) $ 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-- -- ------------------------------------ markAST _ (GHC.PatSynSig _ _ (GHC.XHsImplicitBndrs _))- = error "hit extension for Sig"- markAST _ (GHC.ClassOpSig _ _ _ (GHC.XHsImplicitBndrs _))- = error "hit extension for Sig"- markAST _ (GHC.FixSig _ (GHC.XFixitySig _))- = error "hit extension for Sig"- markAST _ (GHC.XSig _)- = error "hit extension for Sig"---- -----------------------------------------------------------------------instance Annotate (GHC.StandaloneKindSig GHC.GhcPs) where-- markAST _ (GHC.StandaloneKindSig _ ln st) = do- mark GHC.AnnType- setContext (Set.singleton PrefixOp) $ markLocated ln- mark GHC.AnnDcolon- markLHsSigType st- markTrailingSemi- tellContext (Set.singleton FollowingLine)-- markAST _ (GHC.XStandaloneKindSig _)- = error "hit extension for StandaloneKindSig"---- ----------------------------------------------------------------------markLHsSigType :: GHC.LHsSigType GHC.GhcPs -> Annotated ()-markLHsSigType (GHC.HsIB _ typ) = markLocated typ-markLHsSigType (GHC.XHsImplicitBndrs x) = error $ "got XHsImplicitBndrs for:" ++ showGhc x--instance Annotate [GHC.LHsSigType GHC.GhcPs] 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.- let marker = case ls of- [] -> markManyOptional- [GHC.HsIB _ t] -> if GHC.hsTypeNeedsParens GHC.appPrec (GHC.unLoc t)- then markMany- else markManyOptional- _ -> markMany -- Need parens if more than one entry- marker GHC.AnnOpenP- markListIntercalateWithFun markLHsSigType ls- marker 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.GhcPs) 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 -- '('-- markAST _l (GHC.XTyVarBndr x) = error $ "got XTyVarBndr for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.HsType GHC.GhcPs) where- markAST loc ty = do- inContext (Set.fromList [InTypeApp]) $ mark GHC.AnnAt- markType loc ty- inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma- (inContext (Set.singleton AddVbar) $ mark GHC.AnnVbar)- where-- -- markType :: GHC.SrcSpan -> ast -> Annotated ()- markType :: GHC.SrcSpan -> (GHC.HsType GHC.GhcPs) -> Annotated ()- markType _ (GHC.HsForAllTy _ fvf tvs typ) = do- mark GHC.AnnForall- mapM_ markLocated tvs- case fvf of- GHC.ForallInvis -> mark GHC.AnnDot- GHC.ForallVis -> mark GHC.AnnRarrow- markLocated typ-- markType _ (GHC.HsQualTy _ cxt typ) = do- markLocated cxt- markLocated typ-- markType _ (GHC.HsTyVar _ promoted name) = do- when (promoted == GHC.IsPromoted) $ mark GHC.AnnSimpleQuote- unsetContext InfixOp $ setContext (Set.singleton PrefixOp) $ markLocated name-- markType _ (GHC.HsAppTy _ t1 t2) = do- setContext (Set.singleton PrefixOp) $ markLocated t1- markLocated t2-- markType _ (GHC.HsAppKindTy l t k) = do- setContext (Set.singleton PrefixOp) $ markLocated t- markTypeApp l- markLocated k-- markType _ (GHC.HsFunTy _ t1 t2) = do- markLocated t1- mark GHC.AnnRarrow- markLocated t2- -- markManyOptional GHC.AnnCloseP -- For trailing parens after res_ty in ConDeclGADT-- markType _ (GHC.HsListTy _ t) = do- mark GHC.AnnOpenS -- '['- markLocated t- mark GHC.AnnCloseS -- ']'-- 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 l (GHC.HsStarTy _ isUnicode) = do- if isUnicode- then markExternal l GHC.AnnVal "\x2605" -- Unicode star- else markExternal l GHC.AnnVal "*"-- markType _ (GHC.HsKindSig _ t k) = do- markOptional GHC.AnnOpenP -- '('- markLocated t- mark GHC.AnnDcolon -- '::'- markLocated k- markOptional 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.HsExplicitListTy _ promoted ts) = do- when (promoted == GHC.IsPromoted) $ 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 _) = do- markExternal l GHC.AnnVal "_"-- markType _ (GHC.XHsType x) = error $ "got XHsType for:" ++ showGhc x----- ------------------------------------------------------------------------- instance Annotate (GHC.HsAppType GHC.GhcPs) 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.GhcPs) 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"- GHC.HsSplicedT{} -> error "HsSplicedT only exists between renamer and typechecker in GHC"-- -- --------------------------------- (GHC.XSplice x) -> error $ "got XSplice for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.ConDeclField GHC.GhcPs) 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-- markAST _ (GHC.XConDeclField x) = error $ "got XConDeclField for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.FieldOcc GHC.GhcPs) where- markAST _ (GHC.FieldOcc _ rn) = do- markLocated rn- inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma-- markAST _ (GHC.XFieldOcc x) = error $ "got XFieldOcc for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate GHC.HsDocString where- markAST l s = do- markExternal l GHC.AnnVal (GHC.unpackHDS s)---- -----------------------------------------------------------------------instance Annotate (GHC.Pat GHC.GhcPs) 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)- -- unsetContext Intercalate $ setContext (Set.singleton PrefixOp) $ markLocated 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.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.SigPat _ pat ty) = do- markLocated pat- mark GHC.AnnDcolon- markLHsSigWcType ty-- markPat _ GHC.CoPat {} =- traceM "warning: CoPat introduced after renaming"-- -- markPat _ (GHC.XPat (GHC.L l p)) = markPat l p- markPat _ (GHC.XPat x) = error $ "got XPat for:" ++ showGhc x---- -----------------------------------------------------------------------hsLit2String :: GHC.HsLit GHC.GhcPs -> 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 _ (GHC.IL 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 _ v) _ -> toSourceTextWithSuffix src v ""- GHC.HsFloatPrim _ (GHC.FL src _ v) -> toSourceTextWithSuffix src v "#"- GHC.HsDoublePrim _ (GHC.FL src _ v) -> toSourceTextWithSuffix src v "##"- (GHC.XLit x) -> error $ "got XLit for:" ++ showGhc x--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.GhcPs -> 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.GhcPs -> Annotated ()--markHsConDeclDetails isDeprecated inGadt lns dets = do- case dets of- GHC.PrefixCon args ->- setContext (Set.singleton PrefixOp) $ mapM_ markLocated args- -- GHC.RecCon fs -> markLocated fs- 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.GhcPs] 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 Annotate (GHC.HsOverLit GHC.GhcPs) where- markAST l ol =- let str = case GHC.ol_val ol of- GHC.HsIntegral (GHC.IL src _ _) -> src- GHC.HsFractional (GHC.FL src _ _) -> src- GHC.HsIsString src _ -> src- in- markExternalSourceText l str ""---- -----------------------------------------------------------------------instance (Annotate arg)- => Annotate (GHC.HsImplicitBndrs GHC.GhcPs (GHC.Located arg)) where- markAST _ (GHC.HsIB _ thing) = do- markLocated thing- markAST _ (GHC.XHsImplicitBndrs x) = error $ "got XHsImplicitBndrs for:" ++ showGhc x---- -----------------------------------------------------------------------instance (Annotate body) => Annotate (GHC.Stmt GHC.GhcPs (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- markListWithLayout stmts- markOptional GHC.AnnCloseC- inContext (Set.singleton AddVbar) $ mark GHC.AnnVbar- inContext (Set.singleton Intercalate) $ mark GHC.AnnComma- markTrailingSemi-- markAST _ (GHC.XStmtLR x) = error $ "got XStmtLR for:" ++ showGhc x---- ------------------------------------------------------------------------- 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.GhcPs GHC.GhcPs) where- markAST _ (GHC.ParStmtBlock _ stmts _ns _) = do- markListIntercalate stmts- markAST _ (GHC.XParStmtBlock x) = error $ "got XParStmtBlock for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.HsLocalBinds GHC.GhcPs) where- markAST _ lb = markHsLocalBinds lb---- -----------------------------------------------------------------------markHsLocalBinds :: GHC.HsLocalBinds GHC.GhcPs -> Annotated ()-markHsLocalBinds (GHC.HsValBinds _ (GHC.ValBinds _ binds sigs)) =- applyListAnnotationsLayout- (prepareListAnnotation (GHC.bagToList binds)- ++ prepareListAnnotation sigs- )-markHsLocalBinds (GHC.HsIPBinds _ (GHC.IPBinds _ binds)) = markListWithLayout binds-markHsLocalBinds GHC.EmptyLocalBinds{} = return ()--markHsLocalBinds (GHC.HsValBinds _ (GHC.XValBindsLR _)) = error "markHsLocalBinds:got extension"-markHsLocalBinds (GHC.HsIPBinds _ (GHC.XHsIPBinds _)) = error "markHsLocalBinds:got extension"-markHsLocalBinds (GHC.XHsLocalBindsLR _) = error "markHsLocalBinds:got extension"---- -----------------------------------------------------------------------markMatchGroup :: (Annotate body)- => GHC.SrcSpan -> GHC.MatchGroup GHC.GhcPs (GHC.Located body)- -> Annotated ()-markMatchGroup _ (GHC.MG _ (GHC.L _ matches) _)- = setContextLevel (Set.singleton AdvanceLine) 2 $ markListWithLayout matches-markMatchGroup _ (GHC.XMatchGroup x) = error $ "got XMatchGroup for:" ++ showGhc x---- -----------------------------------------------------------------------instance (Annotate body)- => Annotate [GHC.Located (GHC.Match GHC.GhcPs (GHC.Located body))] where- markAST _ ls = mapM_ markLocated ls---- -----------------------------------------------------------------------instance Annotate (GHC.HsExpr GHC.GhcPs) 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.HsUnboundVar {}) = do- ifInContext (Set.fromList [InfixOp])- (do mark GHC.AnnBackquote- markWithString GHC.AnnVal "_"- mark GHC.AnnBackquote)- (markExternal l GHC.AnnVal "_")-- 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.AnnSemi- 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 ("[", "]")- 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.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) = 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.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.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.AnnOpenB "(|"- -- markLocated e- -- mapM_ markLocated cs- -- markWithString GHC.AnnCloseB "|)"-- 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 _ (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- markInstead GHC.AnnAt AnnTypeApp- markLHsWcType ty-- markExpr _ (GHC.HsWrap {}) =- traceM "warning: HsWrap introduced after renaming"-- markExpr _ (GHC.HsConLikeOut{}) =- traceM "warning: HsConLikeOut introduced after type checking"-- markExpr _ (GHC.HsBracket _ (GHC.XBracket _)) = error "markExpr got extension"- markExpr _ (GHC.XExpr _) = error "markExpr got extension"---- -----------------------------------------------------------------------markLHsWcType :: GHC.LHsWcType GHC.GhcPs -> Annotated ()-markLHsWcType (GHC.HsWC _ ty) = do- markLocated ty-markLHsWcType (GHC.XHsWildCardBndrs x) = error $ "markLHsWcType got :" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.HsLit GHC.GhcPs) where- markAST l lit = markExternal l GHC.AnnVal (hsLit2String lit)---- -----------------------------------------------------------------------instance Annotate (GHC.HsRecUpdField GHC.GhcPs) 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 Annotate (GHC.AmbiguousFieldOcc GHC.GhcPs) where- markAST _ (GHC.Unambiguous _ n) = markLocated n- markAST _ (GHC.Ambiguous _ n) = markLocated n- markAST _ (GHC.XAmbiguousFieldOcc x) = error $ "got XAmbiguousFieldOcc for:" ++ showGhc x---- ------------------------------------------------------------------------- |Used for declarations that need to be aligned together, e.g. in a--- do or let .. in statement/expr-instance Annotate [GHC.ExprLStmt GHC.GhcPs] where- markAST _ ls = mapM_ markLocated ls---- -----------------------------------------------------------------------instance Annotate (GHC.HsTupArg GHC.GhcPs) 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-- markAST _ (GHC.XTupArg x) = error $ "got XTupArg got:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.HsCmdTop GHC.GhcPs) where- markAST _ (GHC.HsCmdTop _ cmd) = markLocated cmd- markAST _ (GHC.XCmdTop x) = error $ "got XCmdTop for:" ++ showGhc x--instance Annotate (GHC.HsCmd GHC.GhcPs) 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"-- markAST _ (GHC.XCmd x) = error $ "got XCmd for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate [GHC.Located (GHC.StmtLR GHC.GhcPs GHC.GhcPs (GHC.LHsCmd GHC.GhcPs))] where- markAST _ ls = mapM_ markLocated ls---- -----------------------------------------------------------------------instance Annotate (GHC.TyClDecl GHC.GhcPs) where-- markAST l (GHC.FamDecl _ famdecl) = markAST l famdecl >> markTrailingSemi-{-- SynDecl { tcdSExt :: XSynDecl pass -- ^ Post renameer, FVs- , tcdLName :: Located (IdP pass) -- ^ Type constructor- , tcdTyVars :: LHsQTyVars pass -- ^ Type variables; for an- -- associated type these- -- include outer binders- , tcdFixity :: LexicalFixity -- ^ Fixity used in the declaration- , tcdRhs :: LHsType pass } -- ^ RHS of type declaration---}- 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 Nothing fixity ln tyvars- mark GHC.AnnEqual- markLocated typ- markTrailingSemi-- markAST _ (GHC.DataDecl _ ln (GHC.HsQTvs _ 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 Nothing 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 _ tyVars) fixity fds- sigs meths ats atdefs docs) = do- mark GHC.AnnClass- markLocated ctx-- markTyClass Nothing 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-{-- | ClassDecl { tcdCExt :: XClassDecl pass, -- ^ Post renamer, FVs- tcdCtxt :: LHsContext pass, -- ^ Context...- tcdLName :: Located (IdP pass), -- ^ Name of the class- tcdTyVars :: LHsQTyVars pass, -- ^ Class type variables- tcdFixity :: LexicalFixity, -- ^ Fixity used in the declaration- tcdFDs :: [Located (FunDep (Located (IdP pass)))],- -- ^ Functional deps- tcdSigs :: [LSig pass], -- ^ Methods' signatures- tcdMeths :: LHsBinds pass, -- ^ Default methods- tcdATs :: [LFamilyDecl pass], -- ^ Associated types;- tcdATDefs :: [LTyFamDefltEqn pass],- -- ^ Associated type defaults- tcdDocs :: [LDocDecl] -- ^ Haddock docs- }---}-- markAST _ (GHC.SynDecl _ _ (GHC.XLHsQTyVars _) _ _)- = error "extension hit for TyClDecl"- markAST _ (GHC.DataDecl _ _ (GHC.HsQTvs _ _) _ (GHC.XHsDataDefn _))- = error "extension hit for TyClDecl"- markAST _ (GHC.DataDecl _ _ (GHC.XLHsQTyVars _) _ _)- = error "extension hit for TyClDecl"- markAST _ (GHC.ClassDecl _ _ _ (GHC.XLHsQTyVars _) _ _ _ _ _ _ _)- = error "extension hit for TyClDecl"- markAST _ (GHC.XTyClDecl _)- = error "extension hit for TyClDecl"---- -----------------------------------------------------------------------markTypeApp :: GHC.SrcSpan -> Annotated ()-markTypeApp loc = do- let l = GHC.srcSpanFirstCharacter loc- markExternal l GHC.AnnVal "@"---- -----------------------------------------------------------------------markTyClassArgs :: (Annotate a)- => Maybe [GHC.LHsTyVarBndr GhcPs] -> GHC.LexicalFixity- -- -> GHC.Located a -> [ast] -> Annotated ()- -> GHC.Located a -> [GHC.LHsTypeArg GhcPs] -> Annotated ()-markTyClassArgs mbndrs fixity ln tyVars = do- let- cvt (GHC.HsValArg val) = markLocated val- cvt (GHC.HsTypeArg loc typ) = do- markTypeApp loc- -- let l = GHC.srcSpanFirstCharacter loc- -- markExternal l GHC.AnnVal "@"- markLocated typ- cvt (GHC.HsArgPar _ss) = undefined- markTyClassWorker cvt mbndrs fixity ln tyVars- {--type LHsTypeArg p = HsArg (LHsType p) (LHsKind p)--data HsArg tm ty- = HsValArg tm -- Argument is an ordinary expression (f arg)- | HsTypeArg ty -- Argument is a visible type application (f @ty)- | HsArgPar SrcSpan -- See Note [HsArgPar]--}---- TODO:AZ: simplify-markTyClass :: (Data (GHC.SrcSpanLess ast), Annotate a, Annotate ast,GHC.HasSrcSpan ast)- => Maybe [GHC.LHsTyVarBndr GhcPs] -> GHC.LexicalFixity- -> GHC.Located a -> [ast] -> Annotated ()-markTyClass = markTyClassWorker markLocated--markTyClassWorker :: (Annotate a)- => (b -> Annotated ()) -> Maybe [GHC.LHsTyVarBndr GhcPs] -> GHC.LexicalFixity- -- -> GHC.Located a -> [ast] -> Annotated ()- -> GHC.Located a -> [b] -> Annotated ()-markTyClassWorker markFn mbndrs fixity ln tyVars = do- let processBinders =- case mbndrs of- Nothing -> return ()- Just bndrs -> do- mark GHC.AnnForall- mapM_ markLocated bndrs- mark GHC.AnnDot-- -- There may be arbitrary parens around parts of the constructor- -- Turn these into comments so that they feed into the right place automatically- annotationsToComments [GHC.AnnOpenP,GHC.AnnCloseP]- let markParens = if fixity == GHC.Infix && length tyVars > 2- then markMany- else markManyOptional- if fixity == GHC.Prefix- then do- markManyOptional GHC.AnnOpenP- processBinders- setContext (Set.singleton PrefixOp) $ markLocated ln- -- setContext (Set.singleton PrefixOp) $ mapM_ markLocated tyVars- setContext (Set.singleton PrefixOp) $ mapM_ markFn $ take 2 tyVars- when (length tyVars >= 2) $ do- markParens GHC.AnnCloseP- setContext (Set.singleton PrefixOp) $ mapM_ markFn $ drop 2 tyVars- markManyOptional GHC.AnnCloseP- else do- case tyVars of- (x:y:xs) -> do- markParens GHC.AnnOpenP- processBinders- markFn x- setContext (Set.singleton InfixOp) $ markLocated ln- markFn y- markParens GHC.AnnCloseP- mapM_ markFn xs- markManyOptional GHC.AnnCloseP- _ -> error $ "markTyClass: Infix op without operands"---- -----------------------------------------------------------------------instance Annotate [GHC.LHsDerivingClause GHC.GhcPs] where- markAST _ ds = mapM_ markLocated ds---- -----------------------------------------------------------------------instance Annotate (GHC.HsDerivingClause GHC.GhcPs) where- markAST _ (GHC.HsDerivingClause _ mstrategy typs) = do- mark GHC.AnnDeriving- case mstrategy of- Nothing -> return ()- Just (GHC.L _ (GHC.ViaStrategy{})) -> return ()- Just s -> markLocated s- markLocated typs- case mstrategy of- Just s@(GHC.L _ (GHC.ViaStrategy{})) -> markLocated s- _ -> return ()-- markAST _ (GHC.XHsDerivingClause x) = error $ "got XHsDerivingClause for:" ++ showGhc x--{-- = HsDerivingClause- { deriv_clause_ext :: XCHsDerivingClause pass- , deriv_clause_strategy :: Maybe (LDerivStrategy pass)- -- ^ The user-specified strategy (if any) to use when deriving- -- 'deriv_clause_tys'.- , deriv_clause_tys :: Located [LHsSigType pass]- -- ^ The types to derive.- --- -- It uses 'LHsSigType's because, with @-XGeneralizedNewtypeDeriving@,- -- we can mention type variables that aren't bound by the datatype, e.g.- --- -- > data T b = ... deriving (C [a])- --- -- should produce a derived instance for @C [a] (T b)@.- }---}---- -----------------------------------------------------------------------instance Annotate (GHC.FamilyDecl GHC.GhcPs) 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 Nothing 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- (GHC.XFamilyResultSig x) -> error $ "FamilyDecl:got XFamilyResultSig for:" ++ showGhc x- 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-- markAST _ (GHC.FamilyDecl _ _ _ (GHC.XLHsQTyVars _) _ _ _)- = error "got extension for FamilyDecl"- markAST _ (GHC.XFamilyDecl _)- = error "got extension for FamilyDecl"---- -----------------------------------------------------------------------instance Annotate (GHC.FamilyResultSig GHC.GhcPs) where- markAST _ (GHC.NoSig _) = return ()- markAST _ (GHC.KindSig _ k) = markLocated k- markAST _ (GHC.TyVarSig _ ltv) = markLocated ltv- markAST _ (GHC.XFamilyResultSig x) = error $ "got XFamilyResultSig for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.InjectivityAnn GHC.GhcPs) where- markAST _ (GHC.InjectivityAnn ln lns) = do- markLocated ln- mark GHC.AnnRarrow- mapM_ markLocated lns---- -----------------------------------------------------------------------instance Annotate (GHC.TyFamInstEqn GHC.GhcPs) where-{--type TyFamInstEqn pass = FamInstEqn pass (LHsType pass)--type FamInstEqn pass rhs- = HsImplicitBndrs pass (FamEqn pass (HsTyPats pass) rhs)--type HsTyPats pass = [LHsTypeArg pass]---}- markAST _ (GHC.HsIB _ eqn) = do- markFamEqn eqn- markTrailingSemi- markAST _ (GHC.XHsImplicitBndrs x) = error $ "got XHsImplicitBndrs for:" ++ showGhc x---- ------------------------------------------------------------------------- instance Annotate (GHC.TyFamDefltEqn GHC.GhcPs) where---- markAST _ (GHC.FamEqn _ ln mbndrs (GHC.HsQTvs _ bndrs) fixity typ) = do--- mark GHC.AnnType--- mark GHC.AnnInstance--- markTyClass mbndrs fixity ln bndrs--- mark GHC.AnnEqual--- markLocated typ-- -- markAST _ (GHC.FamEqn _ _ _ (GHC.XLHsQTyVars _) _ _)- -- = error "TyFamDefltEqn hit extension point"- -- markAST _ (GHC.XFamEqn _)- -- = error "TyFamDefltEqn hit extension point"---- ------------------------------------------------------------------------- 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 ds) -> GHC.unpackHDS ds- (GHC.DocCommentPrev ds) -> GHC.unpackHDS ds- (GHC.DocCommentNamed _s ds) -> GHC.unpackHDS ds- (GHC.DocGroup _i ds) -> GHC.unpackHDS ds- in- markExternal l GHC.AnnVal str >> markTrailingSemi-{--data DocDecl- = DocCommentNext HsDocString- | DocCommentPrev HsDocString- | DocCommentNamed String HsDocString- | DocGroup Int HsDocString---}---- -----------------------------------------------------------------------markDataDefn :: GHC.SrcSpan -> GHC.HsDataDefn GHC.GhcPs -> 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-markDataDefn _ (GHC.XHsDataDefn x) = error $ "got XHsDataDefn for:" ++ showGhc x---- ------------------------------------------------------------------------- Note: GHC.HsContext name aliases to here too-instance Annotate [GHC.LHsType GHC.GhcPs] where- markAST l ts = do- -- Note: A single item in parens in a standalone deriving clause- -- is parsed as a HsSigType, which is always a HsForAllTy or- -- HsQualTy. 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- [GHC.L _ GHC.HsQualTy{}] -> markMany pa- [_] -> markManyOptional pa- _ -> markMany pa-- parenIfNeeded'' pa =- ifInContext (Set.singleton Parens) -- AZ:TODO: this is never set?- (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.GhcPs) where- markAST _ (GHC.ConDeclH98 _ ln (GHC.L _ fa) mqtvs mctx- dets _) = do- when fa $ do- mark GHC.AnnForall- mapM_ markLocated mqtvs- mark GHC.AnnDot-- case mctx of- Just ctx -> do- setContext (Set.fromList [NoDarrow]) $ markLocated 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-{-- | ConDeclH98- { con_ext :: XConDeclH98 pass- , con_name :: Located (IdP pass)-- , con_forall :: Bool -- ^ True <=> explicit user-written forall- -- e.g. data T a = forall b. MkT b (b->a)- -- con_ex_tvs = {b}- -- False => con_ex_tvs is empty- , con_ex_tvs :: [LHsTyVarBndr pass] -- ^ Existentials only- , con_mb_cxt :: Maybe (LHsContext pass) -- ^ User-written context (if any)- , con_args :: HsConDeclDetails pass -- ^ Arguments; can be InfixCon-- , con_doc :: Maybe LHsDocString- -- ^ A possible Haddock comment.- }---}- markAST _ (GHC.ConDeclGADT _ lns (GHC.L l forall) (GHC.HsQTvs _ qvars) mbCxt args typ _) = do- setContext (Set.singleton PrefixOp) $ markListIntercalate lns- mark GHC.AnnDcolon- annotationsToComments [GHC.AnnOpenP]- markLocated (GHC.L l (ResTyGADTHook forall qvars))- markMaybe mbCxt- markHsConDeclDetails False True lns args- markLocated typ- markManyOptional GHC.AnnCloseP- markTrailingSemi-{-- = ConDeclGADT- { con_g_ext :: XConDeclGADT pass- , con_names :: [Located (IdP pass)]-- -- The next four fields describe the type after the '::'- -- See Note [GADT abstract syntax]- , con_forall :: Located Bool -- ^ True <=> explicit forall- -- False => hsq_explicit is empty- , con_qvars :: LHsQTyVars pass- -- Whether or not there is an /explicit/ forall, we still- -- need to capture the implicitly-bound type/kind variables-- , con_mb_cxt :: Maybe (LHsContext pass) -- ^ User-written context (if any)- , con_args :: HsConDeclDetails pass -- ^ Arguments; never InfixCon- , con_res_ty :: LHsType pass -- ^ Result type-- , con_doc :: Maybe LHsDocString- -- ^ A possible Haddock comment.- }---}-- markAST _ (GHC.ConDeclGADT _ _ (GHC.L _ _) (GHC.XLHsQTyVars _) _ _ _ _)- = error "hit extension point in ConDecl"- markAST _ (GHC.XConDecl _)- = error "hit extension point in ConDecl"---- ResTyGADT has a SrcSpan for the original sigtype, we need to create--- a type for exactPC and annotatePC-data ResTyGADTHook = ResTyGADTHook Bool [GHC.LHsTyVarBndr GHC.GhcPs]- deriving (Typeable)-deriving instance Data (ResTyGADTHook)--instance GHC.Outputable ResTyGADTHook where- ppr (ResTyGADTHook b bs) = GHC.text "ResTyGADTHook" GHC.<+> GHC.ppr b 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 where- markAST _ (ResTyGADTHook forall bndrs) = do- when forall $ mark GHC.AnnForall- mapM_ markLocated bndrs- when forall $ mark GHC.AnnDot---- -----------------------------------------------------------------------instance Annotate (GHC.HsRecField GHC.GhcPs (GHC.Located (GHC.Pat GHC.GhcPs))) 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.GhcPs (GHC.LPat GHC.GhcPs)) 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.GhcPs (GHC.LHsExpr GHC.GhcPs)) 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.FunDep (GHC.Located GHC.RdrName)) 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-ghc82/Language/Haskell/GHC/ExactPrint/Annotater.hs
@@ -1,2662 +0,0 @@-{-# 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 _ s -> do- setContext (Set.fromList [NoPrecedingSpace,PrefixOp]) $ do- when (s == GHC.SrcStrict) $ mark GHC.AnnBang- 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- markInstead GHC.AnnAt AnnTypeApp- 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-ghc84/Language/Haskell/GHC/ExactPrint/Annotater.hs
@@ -1,2606 +0,0 @@-{-# 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.GhcPs) 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.GhcPs -> 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.GhcPs) 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- 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 Annotate [GHC.LIE GHC.GhcPs] 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 Annotate (GHC.IE GHC.GhcPs) 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- unsetContext Intercalate $ setContext (Set.fromList [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)---- -----------------------------------------------------------------------instance Annotate (GHC.IEWrappedName GHC.RdrName) 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---- -----------------------------------------------------------------------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- 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")---- -----------------------------------------------------------------------instance Annotate (GHC.ImportDecl GHC.GhcPs) 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.GhcPs -> 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.GhcPs) where- markAST l d = markLHsDecl (GHC.L l d)---- -----------------------------------------------------------------------instance Annotate (GHC.RoleAnnotDecl GHC.GhcPs) 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.GhcPs) 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.GhcPs) 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.GhcPs) where- markAST _ (GHC.HsRules src rules) = do- markAnnOpen src "{-# RULES"- setLayoutFlag $ markListIntercalateWithFunLevel markLocated 2 rules- markWithString GHC.AnnClose "#-}"- markTrailingSemi---- -----------------------------------------------------------------------instance Annotate (GHC.RuleDecl GHC.GhcPs) 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.GhcPs) 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.GhcPs -> Annotated ()-markLHsSigWcType (GHC.HsWC _ (GHC.HsIB _ ty _)) = do- markLocated ty---- -----------------------------------------------------------------------instance Annotate (GHC.AnnDecl GHC.GhcPs) 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 (GHC.WarnDecls GHC.GhcPs) where- markAST _ (GHC.Warnings src warns) = do- markAnnOpen src "{-# WARNING" -- Note: might be {-# DEPRECATED- mapM_ markLocated warns- markWithString GHC.AnnClose "#-}"---- -----------------------------------------------------------------------instance Annotate (GHC.WarnDecl GHC.GhcPs) 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.GhcPs) 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.GhcPs) where-- markAST _ (GHC.DerivDecl typ ms mov) = do- mark GHC.AnnDeriving- markMaybe ms- mark GHC.AnnInstance- markMaybe mov- markLHsSigType typ- markTrailingSemi---- -----------------------------------------------------------------------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.GhcPs) where-- markAST _ (GHC.DefaultDecl typs) = do- mark GHC.AnnDefault- mark GHC.AnnOpenP -- '('- markListIntercalate typs- mark GHC.AnnCloseP -- ')'- markTrailingSemi---- -----------------------------------------------------------------------instance Annotate (GHC.InstDecl GHC.GhcPs) 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.GhcPs) 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.GhcPs) where-- markAST _ (GHC.TyFamInstDecl (GHC.HsIB _ eqn _)) = do- mark GHC.AnnType- mark GHC.AnnInstance -- Note: this keyword is optional- markFamEqn eqn- markTrailingSemi---- -----------------------------------------------------------------------markFamEqn :: (Annotate (GHC.IdP pass), Annotate ast1, Annotate ast2)- => GHC.FamEqn pass [GHC.Located ast1] (GHC.Located ast2)- -> Annotated ()-markFamEqn (GHC.FamEqn ln pats fixity rhs) = do- markTyClass fixity ln pats- mark GHC.AnnEqual- markLocated rhs---- -----------------------------------------------------------------------instance Annotate (GHC.DataFamInstDecl GHC.GhcPs) where-- markAST l (GHC.DataFamInstDecl (GHC.HsIB _ (GHC.FamEqn ln 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- 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.GhcPs) 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-- -- ------------------------------------- -- Introduced after renaming.- markAST _ (GHC.AbsBinds {}) =- traceM "warning: AbsBinds introduced after renaming"-- -- ------------------------------------- markAST l (GHC.PatSynBind (GHC.PSB ln _fvs args def dir)) = do- mark GHC.AnnPattern- case args of- GHC.InfixCon la lb -> do- markLocated la- setContext (Set.singleton InfixOp) $ markLocated ln- markLocated lb- GHC.PrefixCon ns -> do- markLocated ln- mapM_ markLocated ns- GHC.RecCon 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---- -----------------------------------------------------------------------instance Annotate (GHC.IPBind GHC.GhcPs) 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.GhcPs (GHC.Located body)) where-- markAST _ (GHC.Match mln pats (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 _ s -> do- setContext (Set.fromList [NoPrecedingSpace,PrefixOp]) $ do- when (s == GHC.SrcStrict) $ mark GHC.AnnBang- 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.GhcPs (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.GhcPs) 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.GhcPs -> Annotated ()-markLHsSigType (GHC.HsIB _ typ _) = markLocated typ--instance Annotate [GHC.LHsSigType GHC.GhcPs] 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.GhcPs) 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.GhcPs) 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.GhcPs) 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.GhcPs) 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.GhcPs) 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.GhcPs) 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 GHC.GhcPs -> 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 _ (GHC.IL 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 _ v) _ -> toSourceTextWithSuffix src v ""- GHC.HsFloatPrim _ (GHC.FL src _ v) -> toSourceTextWithSuffix src v "#"- GHC.HsDoublePrim _ (GHC.FL src _ v) -> toSourceTextWithSuffix src v "##"--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.GhcPs -> 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.GhcPs -> 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.GhcPs] 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 Annotate (GHC.HsOverLit GHC.GhcPs) where- markAST l ol =- let str = case GHC.ol_val ol of- GHC.HsIntegral (GHC.IL src _ _) -> src- GHC.HsFractional (GHC.FL src _ _) -> src- 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.GhcPs (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.GhcPs GHC.GhcPs) where- markAST _ (GHC.ParStmtBlock stmts _ns _) = do- markListIntercalate stmts---- -----------------------------------------------------------------------instance Annotate (GHC.HsLocalBinds GHC.GhcPs) where- markAST _ lb = markHsLocalBinds lb---- -----------------------------------------------------------------------markHsLocalBinds :: GHC.HsLocalBinds GHC.GhcPs -> 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.GhcPs (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.GhcPs (GHC.Located body))] where- markAST _ ls = mapM_ markLocated ls---- -----------------------------------------------------------------------instance Annotate (GHC.HsExpr GHC.GhcPs) 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.AnnOpenB "(|"- markLocated e- mapM_ markLocated cs- markWithString GHC.AnnCloseB "|)"-- 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- markInstead GHC.AnnAt AnnTypeApp- 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.GhcPs -> Annotated ()-markLHsWcType (GHC.HsWC _ ty) = do- markLocated ty---- -----------------------------------------------------------------------instance Annotate (GHC.HsLit GHC.GhcPs) where- markAST l lit = markExternal l GHC.AnnVal (hsLit2String lit)---- -----------------------------------------------------------------------instance Annotate (GHC.HsRecUpdField GHC.GhcPs) 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.GhcPs] where- markAST _ ls = mapM_ markLocated ls---- -----------------------------------------------------------------------instance Annotate (GHC.HsTupArg GHC.GhcPs) 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.GhcPs) where- markAST _ (GHC.HsCmdTop cmd _ _ _) = markLocated cmd--instance Annotate (GHC.HsCmd GHC.GhcPs) 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.GhcPs GHC.GhcPs (GHC.LHsCmd GHC.GhcPs))] where- markAST _ ls = mapM_ markLocated ls---- -----------------------------------------------------------------------instance Annotate (GHC.TyClDecl GHC.GhcPs) 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.LexicalFixity -> GHC.Located a -> [GHC.Located ast] -> Annotated ()-markTyClass fixity ln tyVars = do- -- There may be arbitrary parens around parts of the constructor- -- Turn these into comments so that they feed into the right place automatically- annotationsToComments [GHC.AnnOpenP,GHC.AnnCloseP]- 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 tyVars- 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.GhcPs] where- markAST _ ds = mapM_ markLocated ds---- -----------------------------------------------------------------------instance Annotate (GHC.HsDerivingClause GHC.GhcPs) 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.GhcPs) 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.GhcPs) where- markAST _ (GHC.NoSig) = return ()- markAST _ (GHC.KindSig k) = markLocated k- markAST _ (GHC.TyVarSig ltv) = markLocated ltv---- -----------------------------------------------------------------------instance Annotate (GHC.InjectivityAnn GHC.GhcPs) where- markAST _ (GHC.InjectivityAnn ln lns) = do- markLocated ln- mark GHC.AnnRarrow- mapM_ markLocated lns---- -----------------------------------------------------------------------instance Annotate (GHC.TyFamInstEqn GHC.GhcPs) where-- markAST _ (GHC.HsIB _ eqn _) = do- markFamEqn eqn- markTrailingSemi---- -----------------------------------------------------------------------instance Annotate (GHC.TyFamDefltEqn GHC.GhcPs) where-- markAST _ (GHC.FamEqn 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.GhcPs -> 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.GhcPs] 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.GhcPs) 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.Outputable (ResTyGADTHook GHC.GhcPs) 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.GhcPs) where- markAST _ (ResTyGADTHook bndrs) = do- unless (null bndrs) $ do- mark GHC.AnnForall- mapM_ markLocated bndrs- mark GHC.AnnDot---- -----------------------------------------------------------------------instance Annotate (GHC.HsRecField GHC.GhcPs (GHC.LPat GHC.GhcPs)) 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.GhcPs (GHC.LHsExpr GHC.GhcPs)) 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.FunDep (GHC.Located GHC.RdrName)) 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-ghc86/Language/Haskell/GHC/ExactPrint/Annotater.hs
@@ -1,2796 +0,0 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE GADTs #-}-{-# LANGUAGE PatternSynonyms #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE StandaloneDeriving #-}---- | '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 HsDoc 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.GhcPs) 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.GhcPs -> 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.GhcPs) 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- 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 Annotate [GHC.LIE GHC.GhcPs] 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 Annotate (GHC.IE GHC.GhcPs) 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- unsetContext Intercalate $ setContext (Set.fromList [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 ()- GHC.XIE x -> error $ "got XIE for :" ++ showGhc x- ifInContext (Set.fromList [Intercalate])- (mark GHC.AnnComma)- (markOptional GHC.AnnComma)---- -----------------------------------------------------------------------instance Annotate (GHC.IEWrappedName GHC.RdrName) 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---- -----------------------------------------------------------------------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- 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-- markOptional GHC.AnnSimpleQuote- 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- -- then error $ "GHC.orig:(isSym,canParen)=" ++ show (isSym,canParen)- else markExternal l GHC.AnnVal str- -- GHC.Orig _ _ -> markExternal l GHC.AnnVal str- -- GHC.Orig _ _ -> error $ "GHC.orig:str=[" ++ 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")---- -----------------------------------------------------------------------instance Annotate (GHC.ImportDecl GHC.GhcPs) 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-- markAST _ (GHC.XImportDecl x) = error $ "got XImportDecl for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate GHC.ModuleName where- markAST l mname =- markExternal l GHC.AnnVal (GHC.moduleNameString mname)---- -----------------------------------------------------------------------markLHsDecl :: GHC.LHsDecl GHC.GhcPs -> 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.SpliceD _ d -> markLocated (GHC.L l d)- GHC.DocD _ d -> markLocated (GHC.L l d)- GHC.RoleAnnotD _ d -> markLocated (GHC.L l d)- GHC.XHsDecl x -> error $ "got XHsDecl for:" ++ showGhc x--instance Annotate (GHC.HsDecl GHC.GhcPs) where- markAST l d = markLHsDecl (GHC.L l d)---- -----------------------------------------------------------------------instance Annotate (GHC.RoleAnnotDecl GHC.GhcPs) where- markAST _ (GHC.RoleAnnotDecl _ ln mr) = do- mark GHC.AnnType- mark GHC.AnnRole- markLocated ln- mapM_ markLocated mr- markAST _ (GHC.XRoleAnnotDecl x) = error $ "got XRoleAnnotDecl for:" ++ showGhc x--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.GhcPs) where- markAST _ (GHC.SpliceDecl _ e@(GHC.L _ (GHC.HsQuasiQuote{})) _flag) = do- markLocated e- markTrailingSemi- markAST _ (GHC.SpliceDecl _ e _flag) = do- markLocated e- markTrailingSemi-- markAST _ (GHC.XSpliceDecl x) = error $ "got XSpliceDecl for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.RuleDecls GHC.GhcPs) where- markAST _ (GHC.HsRules _ src rules) = do- markAnnOpen src "{-# RULES"- setLayoutFlag $ markListIntercalateWithFunLevel markLocated 2 rules- markWithString GHC.AnnClose "#-}"- markTrailingSemi- markAST _ (GHC.XRuleDecls x) = error $ "got XRuleDecls for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.RuleDecl GHC.GhcPs) 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-- markAST _ (GHC.XRuleDecl x) = error $ "got XRuleDecl for:" ++ showGhc x---- -----------------------------------------------------------------------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.GhcPs) 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 -- ")"- markAST _ (GHC.XRuleBndr x) = error $ "got XRuleBndr for:" ++ showGhc x---- -----------------------------------------------------------------------markLHsSigWcType :: GHC.LHsSigWcType GHC.GhcPs -> Annotated ()-markLHsSigWcType (GHC.HsWC _ (GHC.HsIB _ ty)) = do- markLocated ty-markLHsSigWcType (GHC.HsWC _ (GHC.XHsImplicitBndrs _)) = error "markLHsSigWcType extension hit"-markLHsSigWcType (GHC.XHsWildCardBndrs _) = error "markLHsSigWcType extension hit"---- -----------------------------------------------------------------------instance Annotate (GHC.AnnDecl GHC.GhcPs) 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-- markAST _ (GHC.XAnnDecl x) = error $ "got XAnnDecl for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.WarnDecls GHC.GhcPs) where- markAST _ (GHC.Warnings _ src warns) = do- markAnnOpen src "{-# WARNING" -- Note: might be {-# DEPRECATED- mapM_ markLocated warns- markWithString GHC.AnnClose "#-}"-- markAST _ (GHC.XWarnDecls x) = error $ "got XWarnDecls for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.WarnDecl GHC.GhcPs) 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 -- "]"-- markAST _ (GHC.XWarnDecl x) = error $ "got XWarnDecl for:" ++ showGhc x--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.GhcPs) 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--- markAST _ (GHC.ForeignImport _ _ (GHC.XHsImplicitBndrs _) _) = error "markAST ForeignDecl hit extenstion"- markAST _ (GHC.ForeignExport _ _ (GHC.XHsImplicitBndrs _) _) = error "markAST ForeignDecl hit extenstion"- markAST _ (GHC.XForeignDecl _) = error "markAST ForeignDecl hit extenstion"---- -----------------------------------------------------------------------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.GhcPs) where-- markAST _ (GHC.DerivDecl _ (GHC.HsWC _ (GHC.HsIB _ typ)) ms mov) = do- mark GHC.AnnDeriving- markMaybe ms- mark GHC.AnnInstance- markMaybe mov- markLocated typ- markTrailingSemi--{--data DerivDecl pass = DerivDecl- { deriv_ext :: XCDerivDecl pass- , deriv_type :: LHsSigWcType pass- -- ^ The instance type to derive.- --- -- It uses an 'LHsSigWcType' because the context is allowed to be a- -- single wildcard:- --- -- > deriving instance _ => Eq (Foo a)- --- -- Which signifies that the context should be inferred.-- -- See Note [Inferring the instance context] in TcDerivInfer.-- , deriv_strategy :: Maybe (LDerivStrategy pass)- , deriv_overlap_mode :: Maybe (Located OverlapMode)--type LHsSigWcType pass = HsWildCardBndrs pass (LHsSigType pass) -- Both--data HsWildCardBndrs pass thing- -- See Note [HsType binders]- -- See Note [The wildcard story for types]- = HsWC { hswc_ext :: XHsWC pass thing- -- after the renamer- -- Wild cards, both named and anonymous-- , hswc_body :: thing- -- Main payload (type or list of types)- -- If there is an extra-constraints wildcard,- -- it's still there in the hsc_body.- }----}--- markAST _ (GHC.DerivDecl _ (GHC.HsWC _ (GHC.XHsImplicitBndrs _)) _ _) = error "markAST DerivDecl hit extension"- markAST _ (GHC.DerivDecl _ (GHC.XHsWildCardBndrs _) _ _) = error "markAST DerivDecl hit extension"- markAST _ (GHC.XDerivDecl _) = error "markAST DerivDecl hit extension"---- -----------------------------------------------------------------------instance Annotate (GHC.DerivStrategy GHC.GhcPs) where-- markAST _ GHC.StockStrategy = mark GHC.AnnStock- markAST _ GHC.AnyclassStrategy = mark GHC.AnnAnyclass- markAST _ GHC.NewtypeStrategy = mark GHC.AnnNewtype- markAST _ (GHC.ViaStrategy (GHC.HsIB _ ty)) = do- mark GHC.AnnVia- markLocated ty- markAST _ (GHC.ViaStrategy (GHC.XHsImplicitBndrs _))- = error $ "got XHsImplicitBndrs in AnnDerivStrategy"---- -----------------------------------------------------------------------instance Annotate (GHC.DefaultDecl GHC.GhcPs) where-- markAST _ (GHC.DefaultDecl _ typs) = do- mark GHC.AnnDefault- mark GHC.AnnOpenP -- '('- markListIntercalate typs- mark GHC.AnnCloseP -- ')'- markTrailingSemi-- markAST _ (GHC.XDefaultDecl x) = error $ "got XDefaultDecl for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.InstDecl GHC.GhcPs) 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- markAST _ (GHC.XInstDecl x) = error $ "got XInstDecl for:" ++ showGhc x---- -----------------------------------------------------------------------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.GhcPs) 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-- markAST _ (GHC.ClsInstDecl _ (GHC.XHsImplicitBndrs _) _ _ _ _ _) = error "extension hit for ClsInstDecl"- markAST _ (GHC.XClsInstDecl _) = error "extension hit for ClsInstDecl"---- -----------------------------------------------------------------------instance Annotate (GHC.TyFamInstDecl GHC.GhcPs) where-- markAST _ (GHC.TyFamInstDecl (GHC.HsIB _ eqn)) = do- mark GHC.AnnType- mark GHC.AnnInstance -- Note: this keyword is optional- markFamEqn eqn- markTrailingSemi-- markAST _ (GHC.TyFamInstDecl (GHC.XHsImplicitBndrs _)) = error "extension hit for TyFamInstDecl"---- -----------------------------------------------------------------------markFamEqn :: (Annotate (GHC.IdP pass), Annotate ast1, Annotate ast2)- => GHC.FamEqn pass [GHC.Located ast1] (GHC.Located ast2)- -> Annotated ()-markFamEqn (GHC.FamEqn _ ln pats fixity rhs) = do- markTyClass fixity ln pats- mark GHC.AnnEqual- markLocated rhs-markFamEqn (GHC.XFamEqn _) = error "got XFamEqn"---- -----------------------------------------------------------------------instance Annotate (GHC.DataFamInstDecl GHC.GhcPs) where-- markAST l (GHC.DataFamInstDecl (GHC.HsIB _ (GHC.FamEqn _ ln 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- 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 GHC.noExt nd (GHC.noLoc []) typ _mk cons mderivs)- markTrailingSemi--{--newtype DataFamInstDecl pass- = DataFamInstDecl { dfid_eqn :: FamInstEqn pass (HsDataDefn pass) }--type FamInstEqn pass rhs- = HsImplicitBndrs pass (FamEqn pass (HsTyPats pass) rhs)--data FamEqn pass pats rhs- = FamEqn- { feqn_ext :: XCFamEqn pass pats rhs- , feqn_tycon :: Located (IdP pass)- , feqn_pats :: pats- , feqn_fixity :: LexicalFixity -- ^ Fixity used in the declaration- , feqn_rhs :: rhs- }--}-- markAST _- (GHC.DataFamInstDecl- (GHC.HsIB _ (GHC.FamEqn _ _ _ _ (GHC.XHsDataDefn _))))- = error "extension hit for DataFamInstDecl"- markAST _ (GHC.DataFamInstDecl (GHC.HsIB _ (GHC.XFamEqn _)))- = error "extension hit for DataFamInstDecl"- markAST _ (GHC.DataFamInstDecl (GHC.XHsImplicitBndrs _))- = error "extension hit for DataFamInstDecl"---- -----------------------------------------------------------------------instance Annotate (GHC.HsBind GHC.GhcPs) 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)) _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-- -- ------------------------------------- -- Introduced after renaming.- markAST _ (GHC.AbsBinds {}) =- traceM "warning: AbsBinds introduced after renaming"-- -- ------------------------------------- markAST l (GHC.PatSynBind _ (GHC.PSB _ ln args def dir)) = do- mark GHC.AnnPattern- case args of- GHC.InfixCon la lb -> do- markLocated la- setContext (Set.singleton InfixOp) $ markLocated ln- markLocated lb- GHC.PrefixCon ns -> do- markLocated ln- mapM_ markLocated ns- GHC.RecCon 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-- -- ------------------------------------- markAST _ (GHC.FunBind _ _ (GHC.XMatchGroup _) _ _)- = error "extension hit for HsBind"- markAST _ (GHC.PatBind _ _ (GHC.XGRHSs _) _)- = error "extension hit for HsBind"- markAST _ (GHC.PatSynBind _ (GHC.XPatSynBind _))- = error "extension hit for HsBind"- markAST _ (GHC.XHsBindsLR _)- = error "extension hit for HsBind"---- -----------------------------------------------------------------------instance Annotate (GHC.IPBind GHC.GhcPs) where- markAST _ (GHC.IPBind _ en e) = do- case en of- Left n -> markLocated n- Right _i -> return ()- mark GHC.AnnEqual- markLocated e- markTrailingSemi-- -- markAST _ (GHC.XCIPBind x) = error $ "got XIPBind for:" ++ showGhc x- markAST _ (GHC.XIPBind x) = error $ "got XIPBind for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate GHC.HsIPName where- markAST l (GHC.HsIPName n) = markExternal l GHC.AnnVal ("?" ++ GHC.unpackFS n)---- -----------------------------------------------------------------------instance (Annotate body)- => Annotate (GHC.Match GHC.GhcPs (GHC.Located body)) where-- markAST _ (GHC.Match _ mln pats (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 _ s -> do- setContext (Set.fromList [NoPrecedingSpace,PrefixOp]) $ do- when (s == GHC.SrcStrict) $ mark GHC.AnnBang- 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-- -- ------------------------------------- markAST _ (GHC.Match _ _ _ (GHC.XGRHSs _))- = error "hit extension for Match"- markAST _ (GHC.XMatch _)- = error "hit extension for Match"---- -----------------------------------------------------------------------instance (Annotate body)- => Annotate (GHC.GRHS GHC.GhcPs (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-- markAST _ (GHC.XGRHS x) = error $ "got XGRHS for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.Sig GHC.GhcPs) 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-- -- ------------------------------------ markAST _ (GHC.PatSynSig _ _ (GHC.XHsImplicitBndrs _))- = error "hit extension for Sig"- markAST _ (GHC.ClassOpSig _ _ _ (GHC.XHsImplicitBndrs _))- = error "hit extension for Sig"- markAST _ (GHC.FixSig _ (GHC.XFixitySig _))- = error "hit extension for Sig"- markAST _ (GHC.XSig _)- = error "hit extension for Sig"---- ----------------------------------------------------------------------markLHsSigType :: GHC.LHsSigType GHC.GhcPs -> Annotated ()-markLHsSigType (GHC.HsIB _ typ) = markLocated typ-markLHsSigType (GHC.XHsImplicitBndrs x) = error $ "got XHsImplicitBndrs for:" ++ showGhc x--instance Annotate [GHC.LHsSigType GHC.GhcPs] 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.- let marker = case ls of- [] -> markManyOptional- [GHC.HsIB _ t] -> if GHC.hsTypeNeedsParens GHC.appPrec (GHC.unLoc t)- then markMany- else markManyOptional- _ -> markMany -- Need parens if more than one entry- marker GHC.AnnOpenP- markListIntercalateWithFun markLHsSigType ls- marker 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.GhcPs) 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 -- '('-- markAST _l (GHC.XTyVarBndr x) = error $ "got XTyVarBndr for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.HsType GHC.GhcPs) where- markAST loc ty = do- markType loc ty- inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma- (inContext (Set.singleton AddVbar) $ mark GHC.AnnVbar)- where-- -- markType :: GHC.SrcSpan -> ast -> Annotated ()- markType :: GHC.SrcSpan -> (GHC.HsType GHC.GhcPs) -> 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- unsetContext InfixOp $ setContext (Set.singleton PrefixOp) $ markLocated 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- -- markManyOptional GHC.AnnCloseP -- For trailing parens after res_ty in ConDeclGADT-- markType _ (GHC.HsListTy _ t) = do- mark GHC.AnnOpenS -- '['- markLocated t- mark GHC.AnnCloseS -- ']'-- 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 l (GHC.HsStarTy _ isUnicode) = do- if isUnicode- then markExternal l GHC.AnnVal "\x2605" -- Unicode star- else markExternal l GHC.AnnVal "*"-- 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.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 _) = do- markExternal l GHC.AnnVal "_"-- markType _ (GHC.XHsType x) = error $ "got XHsType for:" ++ showGhc x----- ------------------------------------------------------------------------- instance Annotate (GHC.HsAppType GHC.GhcPs) 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.GhcPs) 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"-- -- --------------------------------- (GHC.XSplice x) -> error $ "got XSplice for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.ConDeclField GHC.GhcPs) 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-- markAST _ (GHC.XConDeclField x) = error $ "got XConDeclField for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.FieldOcc GHC.GhcPs) where- markAST _ (GHC.FieldOcc _ rn) = do- markLocated rn- inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma-- markAST _ (GHC.XFieldOcc x) = error $ "got XFieldOcc for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate GHC.HsDocString where- markAST l s = do- markExternal l GHC.AnnVal (GHC.unpackHDS s)---- -----------------------------------------------------------------------instance Annotate (GHC.Pat GHC.GhcPs) 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.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.SigPat ty pat) = do- markLocated pat- mark GHC.AnnDcolon- markLHsSigWcType ty-- markPat _ GHC.CoPat {} =- traceM "warning: CoPat introduced after renaming"-- markPat _ (GHC.XPat x) = error $ "got XPat for:" ++ showGhc x---- -----------------------------------------------------------------------hsLit2String :: GHC.HsLit GHC.GhcPs -> 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 _ (GHC.IL 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 _ v) _ -> toSourceTextWithSuffix src v ""- GHC.HsFloatPrim _ (GHC.FL src _ v) -> toSourceTextWithSuffix src v "#"- GHC.HsDoublePrim _ (GHC.FL src _ v) -> toSourceTextWithSuffix src v "##"- (GHC.XLit x) -> error $ "got XLit for:" ++ showGhc x--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.GhcPs -> 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.GhcPs -> Annotated ()--markHsConDeclDetails isDeprecated inGadt lns dets = do- case dets of- GHC.PrefixCon args ->- setContext (Set.singleton PrefixOp) $ mapM_ markLocated args- -- GHC.RecCon fs -> markLocated fs- 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.GhcPs] 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 Annotate (GHC.HsOverLit GHC.GhcPs) where- markAST l ol =- let str = case GHC.ol_val ol of- GHC.HsIntegral (GHC.IL src _ _) -> src- GHC.HsFractional (GHC.FL src _ _) -> src- GHC.HsIsString src _ -> src- in- markExternalSourceText l str ""---- -----------------------------------------------------------------------instance (Annotate arg)- => Annotate (GHC.HsImplicitBndrs GHC.GhcPs (GHC.Located arg)) where- markAST _ (GHC.HsIB _ thing) = do- markLocated thing- markAST _ (GHC.XHsImplicitBndrs x) = error $ "got XHsImplicitBndrs for:" ++ showGhc x---- -----------------------------------------------------------------------instance (Annotate body) => Annotate (GHC.Stmt GHC.GhcPs (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-- markAST _ (GHC.XStmtLR x) = error $ "got XStmtLR for:" ++ showGhc x---- ------------------------------------------------------------------------- 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.GhcPs GHC.GhcPs) where- markAST _ (GHC.ParStmtBlock _ stmts _ns _) = do- markListIntercalate stmts- markAST _ (GHC.XParStmtBlock x) = error $ "got XParStmtBlock for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.HsLocalBinds GHC.GhcPs) where- markAST _ lb = markHsLocalBinds lb---- -----------------------------------------------------------------------markHsLocalBinds :: GHC.HsLocalBinds GHC.GhcPs -> Annotated ()-markHsLocalBinds (GHC.HsValBinds _ (GHC.ValBinds _ binds sigs)) =- applyListAnnotationsLayout- (prepareListAnnotation (GHC.bagToList binds)- ++ prepareListAnnotation sigs- )-markHsLocalBinds (GHC.HsIPBinds _ (GHC.IPBinds _ binds)) = markListWithLayout binds-markHsLocalBinds GHC.EmptyLocalBinds{} = return ()--markHsLocalBinds (GHC.HsValBinds _ (GHC.XValBindsLR _)) = error "markHsLocalBinds:got extension"-markHsLocalBinds (GHC.HsIPBinds _ (GHC.XHsIPBinds _)) = error "markHsLocalBinds:got extension"-markHsLocalBinds (GHC.XHsLocalBindsLR _) = error "markHsLocalBinds:got extension"---- -----------------------------------------------------------------------markMatchGroup :: (Annotate body)- => GHC.SrcSpan -> GHC.MatchGroup GHC.GhcPs (GHC.Located body)- -> Annotated ()-markMatchGroup _ (GHC.MG _ (GHC.L _ matches) _)- = setContextLevel (Set.singleton AdvanceLine) 2 $ markListWithLayout matches-markMatchGroup _ (GHC.XMatchGroup x) = error $ "got XMatchGroup for:" ++ showGhc x---- -----------------------------------------------------------------------instance (Annotate body)- => Annotate [GHC.Located (GHC.Match GHC.GhcPs (GHC.Located body))] where- markAST _ ls = mapM_ markLocated ls---- -----------------------------------------------------------------------instance Annotate (GHC.HsExpr GHC.GhcPs) 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 ("[", "]")- 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.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) = do- markLocated e- mark GHC.AnnOpenC- markListIntercalate fs- mark GHC.AnnCloseC-- markExpr _ (GHC.ExprWithTySig typ e) = do- setContextLevel (Set.singleton PrefixOp) 2 $ 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.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.AnnOpenB "(|"- markLocated e- mapM_ markLocated cs- markWithString GHC.AnnCloseB "|)"-- 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 ty e) = do- markLocated e- markInstead GHC.AnnAt AnnTypeApp- markLHsWcType ty-- 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"-- markExpr _ (GHC.HsBracket _ (GHC.XBracket _)) = error "markExpr got extension"- markExpr _ (GHC.XExpr _) = error "markExpr got extension"---- -----------------------------------------------------------------------markLHsWcType :: GHC.LHsWcType GHC.GhcPs -> Annotated ()-markLHsWcType (GHC.HsWC _ ty) = do- markLocated ty-markLHsWcType (GHC.XHsWildCardBndrs x) = error $ "markLHsWcType got :" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.HsLit GHC.GhcPs) where- markAST l lit = markExternal l GHC.AnnVal (hsLit2String lit)---- -----------------------------------------------------------------------instance Annotate (GHC.HsRecUpdField GHC.GhcPs) 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 Annotate (GHC.AmbiguousFieldOcc GHC.GhcPs) where- markAST _ (GHC.Unambiguous _ n) = markLocated n- markAST _ (GHC.Ambiguous _ n) = markLocated n- markAST _ (GHC.XAmbiguousFieldOcc x) = error $ "got XAmbiguousFieldOcc for:" ++ showGhc x---- ------------------------------------------------------------------------- |Used for declarations that need to be aligned together, e.g. in a--- do or let .. in statement/expr-instance Annotate [GHC.ExprLStmt GHC.GhcPs] where- markAST _ ls = mapM_ markLocated ls---- -----------------------------------------------------------------------instance Annotate (GHC.HsTupArg GHC.GhcPs) 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-- markAST _ (GHC.XTupArg x) = error $ "got XTupArg got:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.HsCmdTop GHC.GhcPs) where- markAST _ (GHC.HsCmdTop _ cmd) = markLocated cmd- markAST _ (GHC.XCmdTop x) = error $ "got XCmdTop for:" ++ showGhc x--instance Annotate (GHC.HsCmd GHC.GhcPs) 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"-- markAST _ (GHC.XCmd x) = error $ "got XCmd for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate [GHC.Located (GHC.StmtLR GHC.GhcPs GHC.GhcPs (GHC.LHsCmd GHC.GhcPs))] where- markAST _ ls = mapM_ markLocated ls---- -----------------------------------------------------------------------instance Annotate (GHC.TyClDecl GHC.GhcPs) 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 _ 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 _ 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-{-- | ClassDecl { tcdCExt :: XClassDecl pass, -- ^ Post renamer, FVs- tcdCtxt :: LHsContext pass, -- ^ Context...- tcdLName :: Located (IdP pass), -- ^ Name of the class- tcdTyVars :: LHsQTyVars pass, -- ^ Class type variables- tcdFixity :: LexicalFixity, -- ^ Fixity used in the declaration- tcdFDs :: [Located (FunDep (Located (IdP pass)))],- -- ^ Functional deps- tcdSigs :: [LSig pass], -- ^ Methods' signatures- tcdMeths :: LHsBinds pass, -- ^ Default methods- tcdATs :: [LFamilyDecl pass], -- ^ Associated types;- tcdATDefs :: [LTyFamDefltEqn pass],- -- ^ Associated type defaults- tcdDocs :: [LDocDecl] -- ^ Haddock docs- }---}-- markAST _ (GHC.SynDecl _ _ (GHC.XLHsQTyVars _) _ _)- = error "extension hit for TyClDecl"- markAST _ (GHC.DataDecl _ _ (GHC.HsQTvs _ _) _ (GHC.XHsDataDefn _))- = error "extension hit for TyClDecl"- markAST _ (GHC.DataDecl _ _ (GHC.XLHsQTyVars _) _ _)- = error "extension hit for TyClDecl"- markAST _ (GHC.ClassDecl _ _ _ (GHC.XLHsQTyVars _) _ _ _ _ _ _ _)- = error "extension hit for TyClDecl"- markAST _ (GHC.XTyClDecl _)- = error "extension hit for TyClDecl"---- -----------------------------------------------------------------------markTyClass :: (Annotate a, Annotate ast)- => GHC.LexicalFixity -> GHC.Located a -> [GHC.Located ast] -> Annotated ()-markTyClass fixity ln tyVars = do- -- There may be arbitrary parens around parts of the constructor- -- Turn these into comments so that they feed into the right place automatically- annotationsToComments [GHC.AnnOpenP,GHC.AnnCloseP]- 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 tyVars- 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.GhcPs] where- markAST _ ds = mapM_ markLocated ds---- -----------------------------------------------------------------------instance Annotate (GHC.HsDerivingClause GHC.GhcPs) where- markAST _ (GHC.HsDerivingClause _ mstrategy typs) = do- mark GHC.AnnDeriving- case mstrategy of- Nothing -> return ()- Just (GHC.L _ (GHC.ViaStrategy{})) -> return ()- Just s -> markLocated s- markLocated typs- case mstrategy of- Just s@(GHC.L _ (GHC.ViaStrategy{})) -> markLocated s- _ -> return ()-- markAST _ (GHC.XHsDerivingClause x) = error $ "got XHsDerivingClause for:" ++ showGhc x--{-- = HsDerivingClause- { deriv_clause_ext :: XCHsDerivingClause pass- , deriv_clause_strategy :: Maybe (LDerivStrategy pass)- -- ^ The user-specified strategy (if any) to use when deriving- -- 'deriv_clause_tys'.- , deriv_clause_tys :: Located [LHsSigType pass]- -- ^ The types to derive.- --- -- It uses 'LHsSigType's because, with @-XGeneralizedNewtypeDeriving@,- -- we can mention type variables that aren't bound by the datatype, e.g.- --- -- > data T b = ... deriving (C [a])- --- -- should produce a derived instance for @C [a] (T b)@.- }---}---- -----------------------------------------------------------------------instance Annotate (GHC.FamilyDecl GHC.GhcPs) 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- (GHC.XFamilyResultSig x) -> error $ "FamilyDecl:got XFamilyResultSig for:" ++ showGhc x- 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-- markAST _ (GHC.FamilyDecl _ _ _ (GHC.XLHsQTyVars _) _ _ _)- = error "got extension for FamilyDecl"- markAST _ (GHC.XFamilyDecl _)- = error "got extension for FamilyDecl"---- -----------------------------------------------------------------------instance Annotate (GHC.FamilyResultSig GHC.GhcPs) where- markAST _ (GHC.NoSig _) = return ()- markAST _ (GHC.KindSig _ k) = markLocated k- markAST _ (GHC.TyVarSig _ ltv) = markLocated ltv- markAST _ (GHC.XFamilyResultSig x) = error $ "got XFamilyResultSig for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.InjectivityAnn GHC.GhcPs) where- markAST _ (GHC.InjectivityAnn ln lns) = do- markLocated ln- mark GHC.AnnRarrow- mapM_ markLocated lns---- -----------------------------------------------------------------------instance Annotate (GHC.TyFamInstEqn GHC.GhcPs) where-- markAST _ (GHC.HsIB _ eqn) = do- markFamEqn eqn- markTrailingSemi- markAST _ (GHC.XHsImplicitBndrs x) = error $ "got XHsImplicitBndrs for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.TyFamDefltEqn GHC.GhcPs) where-- markAST _ (GHC.FamEqn _ ln (GHC.HsQTvs _ bndrs) fixity typ) = do- mark GHC.AnnType- mark GHC.AnnInstance- markTyClass fixity ln bndrs- mark GHC.AnnEqual- markLocated typ-- markAST _ (GHC.FamEqn _ _ (GHC.XLHsQTyVars _) _ _)- = error "TyFamDefltEqn hit extension point"- markAST _ (GHC.XFamEqn _)- = error "TyFamDefltEqn hit extension point"---- ------------------------------------------------------------------------- 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 ds) -> GHC.unpackHDS ds- (GHC.DocCommentPrev ds) -> GHC.unpackHDS ds- (GHC.DocCommentNamed _s ds) -> GHC.unpackHDS ds- (GHC.DocGroup _i ds) -> GHC.unpackHDS ds- in- markExternal l GHC.AnnVal str >> markTrailingSemi-{--data DocDecl- = DocCommentNext HsDocString- | DocCommentPrev HsDocString- | DocCommentNamed String HsDocString- | DocGroup Int HsDocString---}---- -----------------------------------------------------------------------markDataDefn :: GHC.SrcSpan -> GHC.HsDataDefn GHC.GhcPs -> 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-markDataDefn _ (GHC.XHsDataDefn x) = error $ "got XHsDataDefn for:" ++ showGhc x---- ------------------------------------------------------------------------- Note: GHC.HsContext name aliases to here too-instance Annotate [GHC.LHsType GHC.GhcPs] where- markAST l ts = do- -- Note: A single item in parens in a standalone deriving clause- -- is parsed as a HsSigType, which is always a HsForAllTy or- -- HsQualTy. 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- [GHC.L _ GHC.HsQualTy{}] -> markMany pa- [_] -> markManyOptional pa- _ -> markMany pa-- parenIfNeeded'' pa =- ifInContext (Set.singleton Parens) -- AZ:TODO: this is never set?- (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.GhcPs) where- markAST _ (GHC.ConDeclH98 _ ln (GHC.L _ fa) mqtvs mctx- dets _) = do- when fa $ do- mark GHC.AnnForall- mapM_ markLocated mqtvs- mark GHC.AnnDot-- case mctx of- Just ctx -> do- setContext (Set.fromList [NoDarrow]) $ markLocated 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-{-- | ConDeclH98- { con_ext :: XConDeclH98 pass- , con_name :: Located (IdP pass)-- , con_forall :: Bool -- ^ True <=> explicit user-written forall- -- e.g. data T a = forall b. MkT b (b->a)- -- con_ex_tvs = {b}- -- False => con_ex_tvs is empty- , con_ex_tvs :: [LHsTyVarBndr pass] -- ^ Existentials only- , con_mb_cxt :: Maybe (LHsContext pass) -- ^ User-written context (if any)- , con_args :: HsConDeclDetails pass -- ^ Arguments; can be InfixCon-- , con_doc :: Maybe LHsDocString- -- ^ A possible Haddock comment.- }---}- markAST _ (GHC.ConDeclGADT _ lns (GHC.L l forall) (GHC.HsQTvs _ qvars) mbCxt args typ _) = do- setContext (Set.singleton PrefixOp) $ markListIntercalate lns- mark GHC.AnnDcolon- annotationsToComments [GHC.AnnOpenP]- markLocated (GHC.L l (ResTyGADTHook forall qvars))- markMaybe mbCxt- markHsConDeclDetails False True lns args- markLocated typ- markManyOptional GHC.AnnCloseP- markTrailingSemi-{-- = ConDeclGADT- { con_g_ext :: XConDeclGADT pass- , con_names :: [Located (IdP pass)]-- -- The next four fields describe the type after the '::'- -- See Note [GADT abstract syntax]- , con_forall :: Located Bool -- ^ True <=> explicit forall- -- False => hsq_explicit is empty- , con_qvars :: LHsQTyVars pass- -- Whether or not there is an /explicit/ forall, we still- -- need to capture the implicitly-bound type/kind variables-- , con_mb_cxt :: Maybe (LHsContext pass) -- ^ User-written context (if any)- , con_args :: HsConDeclDetails pass -- ^ Arguments; never InfixCon- , con_res_ty :: LHsType pass -- ^ Result type-- , con_doc :: Maybe LHsDocString- -- ^ A possible Haddock comment.- }---}-- markAST _ (GHC.ConDeclGADT _ _ (GHC.L _ _) (GHC.XLHsQTyVars _) _ _ _ _)- = error "hit extension point in ConDecl"- markAST _ (GHC.XConDecl _)- = error "hit extension point in ConDecl"---- ResTyGADT has a SrcSpan for the original sigtype, we need to create--- a type for exactPC and annotatePC-data ResTyGADTHook = ResTyGADTHook Bool [GHC.LHsTyVarBndr GHC.GhcPs]- deriving (Typeable)-deriving instance Data (ResTyGADTHook)--instance GHC.Outputable ResTyGADTHook where- ppr (ResTyGADTHook b bs) = GHC.text "ResTyGADTHook" GHC.<+> GHC.ppr b 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 where- markAST _ (ResTyGADTHook forall bndrs) = do- when forall $ mark GHC.AnnForall- mapM_ markLocated bndrs- when forall $ mark GHC.AnnDot---- -----------------------------------------------------------------------instance Annotate (GHC.HsRecField GHC.GhcPs (GHC.LPat GHC.GhcPs)) 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.GhcPs (GHC.LHsExpr GHC.GhcPs)) 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.FunDep (GHC.Located GHC.RdrName)) 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-ghc88/Language/Haskell/GHC/ExactPrint/Annotater.hs
@@ -1,2935 +0,0 @@-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE GADTs #-}-{-# LANGUAGE PatternSynonyms #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE StandaloneDeriving #-}-{-# LANGUAGE ViewPatterns #-}----- | '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 HsDoc as GHC-import qualified Name as GHC-import qualified RdrName as GHC-import qualified Outputable as GHC-import qualified SrcLoc 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, Data (GHC.SrcSpanLess ast), GHC.HasSrcSpan ast) => ast -> Annotated ()-annotate = markLocated---- instance Annotate (GHC.SrcSpanLess ast) where--- markAST s ast = undefined-instance (Data ast, Annotate ast) => Annotate (GHC.Located ast) where- markAST l (GHC.L _ ast) = markAST l ast---- ------------------------------------------------------------------------- | Constructs a syntax tree which contains information about which--- annotations are required by each element.-markLocated :: (Data (GHC.SrcSpanLess ast), Annotate ast, GHC.HasSrcSpan ast)- => ast -> Annotated ()-markLocated ast =- case cast ast :: Maybe (GHC.LHsDecl GHC.GhcPs) 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 :: (Data (GHC.SrcSpanLess ast), Annotate ast, GHC.HasSrcSpan ast)- => Bool -> [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 :: (Data (GHC.SrcSpanLess ast), Annotate ast, GHC.HasSrcSpan ast)- => [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.GhcPs -> 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.GhcPs) 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- 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 Annotate [GHC.LIE GHC.GhcPs] 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 Annotate (GHC.IE GHC.GhcPs) 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- unsetContext Intercalate $ setContext (Set.fromList [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 ()- GHC.XIE x -> error $ "got XIE for :" ++ showGhc x- ifInContext (Set.fromList [Intercalate])- (mark GHC.AnnComma)- (markOptional GHC.AnnComma)---- -----------------------------------------------------------------------instance Annotate (GHC.IEWrappedName GHC.RdrName) 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---- -----------------------------------------------------------------------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- 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 isSym- then ifInContext (Set.fromList [PrefixOp,PrefixOpDollar])- (mark pa) -- '('- (markOptional pa)- else markOptional pa-- markOptional GHC.AnnSimpleQuote- 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- -- then error $ "GHC.orig:(isSym,canParen)=" ++ show (isSym,canParen)- else markExternal l GHC.AnnVal str- -- GHC.Orig _ _ -> markExternal l GHC.AnnVal str- -- GHC.Orig _ _ -> error $ "GHC.orig:str=[" ++ 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- doNormalRdrName- "*" -> 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")---- -----------------------------------------------------------------------instance Annotate (GHC.ImportDecl GHC.GhcPs) 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-- markAST _ (GHC.XImportDecl x) = error $ "got XImportDecl for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate GHC.ModuleName where- markAST l mname =- markExternal l GHC.AnnVal (GHC.moduleNameString mname)---- -----------------------------------------------------------------------markLHsDecl :: GHC.LHsDecl GHC.GhcPs -> 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.SpliceD _ d -> markLocated (GHC.L l d)- GHC.DocD _ d -> markLocated (GHC.L l d)- GHC.RoleAnnotD _ d -> markLocated (GHC.L l d)- GHC.XHsDecl x -> error $ "got XHsDecl for:" ++ showGhc x--instance Annotate (GHC.HsDecl GHC.GhcPs) where- markAST l d = markLHsDecl (GHC.L l d)---- -----------------------------------------------------------------------instance Annotate (GHC.RoleAnnotDecl GHC.GhcPs) where- markAST _ (GHC.RoleAnnotDecl _ ln mr) = do- mark GHC.AnnType- mark GHC.AnnRole- setContext (Set.singleton PrefixOp) $ markLocated ln- mapM_ markLocated mr- markAST _ (GHC.XRoleAnnotDecl x) = error $ "got XRoleAnnotDecl for:" ++ showGhc x--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.GhcPs) where- markAST _ (GHC.SpliceDecl _ e@(GHC.L _ (GHC.HsQuasiQuote{})) _flag) = do- markLocated e- markTrailingSemi- markAST _ (GHC.SpliceDecl _ e _flag) = do- markLocated e- markTrailingSemi-- markAST _ (GHC.XSpliceDecl x) = error $ "got XSpliceDecl for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.RuleDecls GHC.GhcPs) where- markAST _ (GHC.HsRules _ src rules) = do- markAnnOpen src "{-# RULES"- setLayoutFlag $ markListIntercalateWithFunLevel markLocated 2 rules- markWithString GHC.AnnClose "#-}"- markTrailingSemi- markAST _ (GHC.XRuleDecls x) = error $ "got XRuleDecls for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.RuleDecl GHC.GhcPs) where- markAST l (GHC.HsRule _ ln act mtybndrs termbndrs lhs rhs) = do- markLocated ln- setContext (Set.singleton ExplicitNeverActive) $ markActivation l act-- case mtybndrs of- Nothing -> return ()- Just bndrs -> do- mark GHC.AnnForall- mapM_ markLocated bndrs- mark GHC.AnnDot-- mark GHC.AnnForall- mapM_ markLocated termbndrs- mark GHC.AnnDot-- markLocated lhs- mark GHC.AnnEqual- markLocated rhs- inContext (Set.singleton Intercalate) $ mark GHC.AnnSemi- markTrailingSemi-{-- = HsRule -- Source rule- { rd_ext :: XHsRule pass- -- ^ After renamer, free-vars from the LHS and RHS- , rd_name :: Located (SourceText,RuleName)- -- ^ Note [Pragma source text] in BasicTypes- , rd_act :: Activation- , rd_tyvs :: Maybe [LHsTyVarBndr (NoGhcTc pass)]- -- ^ Forall'd type vars- , rd_tmvs :: [LRuleBndr pass]- -- ^ Forall'd term vars, before typechecking; after typechecking- -- this includes all forall'd vars- , rd_lhs :: Located (HsExpr pass)- , rd_rhs :: Located (HsExpr pass)- }---}-- markAST _ (GHC.XRuleDecl x) = error $ "got XRuleDecl for:" ++ showGhc x---- -----------------------------------------------------------------------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.GhcPs) 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 -- ")"- markAST _ (GHC.XRuleBndr x) = error $ "got XRuleBndr for:" ++ showGhc x---- -----------------------------------------------------------------------markLHsSigWcType :: GHC.LHsSigWcType GHC.GhcPs -> Annotated ()-markLHsSigWcType (GHC.HsWC _ (GHC.HsIB _ ty)) = do- markLocated ty-markLHsSigWcType (GHC.HsWC _ (GHC.XHsImplicitBndrs _)) = error "markLHsSigWcType extension hit"-markLHsSigWcType (GHC.XHsWildCardBndrs _) = error "markLHsSigWcType extension hit"---- -----------------------------------------------------------------------instance Annotate (GHC.AnnDecl GHC.GhcPs) 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-- markAST _ (GHC.XAnnDecl x) = error $ "got XAnnDecl for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.WarnDecls GHC.GhcPs) where- markAST _ (GHC.Warnings _ src warns) = do- markAnnOpen src "{-# WARNING" -- Note: might be {-# DEPRECATED- mapM_ markLocated warns- markWithString GHC.AnnClose "#-}"-- markAST _ (GHC.XWarnDecls x) = error $ "got XWarnDecls for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.WarnDecl GHC.GhcPs) 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 -- "]"-- markAST _ (GHC.XWarnDecl x) = error $ "got XWarnDecl for:" ++ showGhc x--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.GhcPs) 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--- markAST _ (GHC.ForeignImport _ _ (GHC.XHsImplicitBndrs _) _) = error "markAST ForeignDecl hit extenstion"- markAST _ (GHC.ForeignExport _ _ (GHC.XHsImplicitBndrs _) _) = error "markAST ForeignDecl hit extenstion"- markAST _ (GHC.XForeignDecl _) = error "markAST ForeignDecl hit extenstion"---- -----------------------------------------------------------------------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.GhcPs) where-- markAST _ (GHC.DerivDecl _ (GHC.HsWC _ (GHC.HsIB _ typ)) ms mov) = do- mark GHC.AnnDeriving- markMaybe ms- mark GHC.AnnInstance- markMaybe mov- markLocated typ- markTrailingSemi--{--data DerivDecl pass = DerivDecl- { deriv_ext :: XCDerivDecl pass- , deriv_type :: LHsSigWcType pass- -- ^ The instance type to derive.- --- -- It uses an 'LHsSigWcType' because the context is allowed to be a- -- single wildcard:- --- -- > deriving instance _ => Eq (Foo a)- --- -- Which signifies that the context should be inferred.-- -- See Note [Inferring the instance context] in TcDerivInfer.-- , deriv_strategy :: Maybe (LDerivStrategy pass)- , deriv_overlap_mode :: Maybe (Located OverlapMode)--type LHsSigWcType pass = HsWildCardBndrs pass (LHsSigType pass) -- Both--data HsWildCardBndrs pass thing- -- See Note [HsType binders]- -- See Note [The wildcard story for types]- = HsWC { hswc_ext :: XHsWC pass thing- -- after the renamer- -- Wild cards, both named and anonymous-- , hswc_body :: thing- -- Main payload (type or list of types)- -- If there is an extra-constraints wildcard,- -- it's still there in the hsc_body.- }----}--- markAST _ (GHC.DerivDecl _ (GHC.HsWC _ (GHC.XHsImplicitBndrs _)) _ _) = error "markAST DerivDecl hit extension"- markAST _ (GHC.DerivDecl _ (GHC.XHsWildCardBndrs _) _ _) = error "markAST DerivDecl hit extension"- markAST _ (GHC.XDerivDecl _) = error "markAST DerivDecl hit extension"---- -----------------------------------------------------------------------instance Annotate (GHC.DerivStrategy GHC.GhcPs) where-- markAST _ GHC.StockStrategy = mark GHC.AnnStock- markAST _ GHC.AnyclassStrategy = mark GHC.AnnAnyclass- markAST _ GHC.NewtypeStrategy = mark GHC.AnnNewtype- markAST _ (GHC.ViaStrategy (GHC.HsIB _ ty)) = do- mark GHC.AnnVia- markLocated ty- markAST _ (GHC.ViaStrategy (GHC.XHsImplicitBndrs _))- = error $ "got XHsImplicitBndrs in AnnDerivStrategy"---- -----------------------------------------------------------------------instance Annotate (GHC.DefaultDecl GHC.GhcPs) where-- markAST _ (GHC.DefaultDecl _ typs) = do- mark GHC.AnnDefault- mark GHC.AnnOpenP -- '('- markListIntercalate typs- mark GHC.AnnCloseP -- ')'- markTrailingSemi-- markAST _ (GHC.XDefaultDecl x) = error $ "got XDefaultDecl for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.InstDecl GHC.GhcPs) 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- markAST _ (GHC.XInstDecl x) = error $ "got XInstDecl for:" ++ showGhc x---- -----------------------------------------------------------------------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.GhcPs) 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-- markAST _ (GHC.ClsInstDecl _ (GHC.XHsImplicitBndrs _) _ _ _ _ _) = error "extension hit for ClsInstDecl"- markAST _ (GHC.XClsInstDecl _) = error "extension hit for ClsInstDecl"---- -----------------------------------------------------------------------instance Annotate (GHC.TyFamInstDecl GHC.GhcPs) where-{--newtype TyFamInstDecl pass = TyFamInstDecl { tfid_eqn :: TyFamInstEqn pass }--type TyFamInstEqn pass = FamInstEqn pass (LHsType pass)--type FamInstEqn pass rhs- = HsImplicitBndrs pass (FamEqn pass (HsTyPats pass) rhs)----}- markAST _ (GHC.TyFamInstDecl (GHC.HsIB _ eqn)) = do- mark GHC.AnnType- mark GHC.AnnInstance -- Note: this keyword is optional- markFamEqn eqn- markTrailingSemi-- markAST _ (GHC.TyFamInstDecl (GHC.XHsImplicitBndrs _)) = error "extension hit for TyFamInstDecl"---- ------------------------------------------------------------------------- markFamEqn :: (GHC.HasOccName (GHC.IdP pass),--- Annotate (GHC.IdP pass), Annotate ast1, Annotate ast2)--- => GHC.FamEqn pass [GHC.Located ast1] (GHC.Located ast2)--- -> Annotated ()-markFamEqn :: GHC.FamEqn GhcPs [GHC.LHsTypeArg GhcPs] (GHC.LHsType GHC.GhcPs)- -> Annotated ()-markFamEqn (GHC.FamEqn _ ln bndrs pats fixity rhs) = do- markTyClassArgs bndrs fixity ln pats- mark GHC.AnnEqual- markLocated rhs-{--data FamEqn pass pats rhs- = FamEqn- { feqn_ext :: XCFamEqn pass pats rhs- , feqn_tycon :: Located (IdP pass)- , feqn_bndrs :: Maybe [LHsTyVarBndr pass] -- ^ Optional quantified type vars- , feqn_pats :: pats- , feqn_fixity :: LexicalFixity -- ^ Fixity used in the declaration- , feqn_rhs :: rhs- }--}--markFamEqn (GHC.XFamEqn _) = error "got XFamEqn"---- -----------------------------------------------------------------------instance Annotate (GHC.DataFamInstDecl GHC.GhcPs) where-- markAST l (GHC.DataFamInstDecl (GHC.HsIB _ (GHC.FamEqn _ ln bndrs 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- mark GHC.AnnInstance-- markLocated ctx-- markTyClassArgs bndrs 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 unless (null cons) $ mark GHC.AnnEqual- markDataDefn l (GHC.HsDataDefn GHC.noExt nd (GHC.noLoc []) typ _mk cons mderivs)- markTrailingSemi-- markAST _- (GHC.DataFamInstDecl- (GHC.HsIB _ (GHC.FamEqn _ _ _ _ _ (GHC.XHsDataDefn _))))- = error "extension hit for DataFamInstDecl"- markAST _ (GHC.DataFamInstDecl (GHC.HsIB _ (GHC.XFamEqn _)))- = error "extension hit for DataFamInstDecl"- markAST _ (GHC.DataFamInstDecl (GHC.XHsImplicitBndrs _))- = error "extension hit for DataFamInstDecl"---- -----------------------------------------------------------------------instance Annotate (GHC.HsBind GHC.GhcPs) 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)) _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-- -- ------------------------------------- -- Introduced after renaming.- markAST _ (GHC.AbsBinds {}) =- traceM "warning: AbsBinds introduced after renaming"-- -- ------------------------------------- markAST l (GHC.PatSynBind _ (GHC.PSB _ ln args def dir)) = do- mark GHC.AnnPattern- case args of- GHC.InfixCon la lb -> do- markLocated la- setContext (Set.singleton InfixOp) $ markLocated ln- markLocated lb- GHC.PrefixCon ns -> do- setContext (Set.singleton PrefixOp) $ markLocated ln- mapM_ markLocated ns- GHC.RecCon 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-- -- ------------------------------------- markAST _ (GHC.FunBind _ _ (GHC.XMatchGroup _) _ _)- = error "extension hit for HsBind"- markAST _ (GHC.PatBind _ _ (GHC.XGRHSs _) _)- = error "extension hit for HsBind"- markAST _ (GHC.PatSynBind _ (GHC.XPatSynBind _))- = error "extension hit for HsBind"- markAST _ (GHC.XHsBindsLR _)- = error "extension hit for HsBind"---- -----------------------------------------------------------------------instance Annotate (GHC.IPBind GHC.GhcPs) where- markAST _ (GHC.IPBind _ en e) = do- case en of- Left n -> markLocated n- Right _i -> return ()- mark GHC.AnnEqual- markLocated e- markTrailingSemi-- -- markAST _ (GHC.XCIPBind x) = error $ "got XIPBind for:" ++ showGhc x- markAST _ (GHC.XIPBind x) = error $ "got XIPBind for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate GHC.HsIPName where- markAST l (GHC.HsIPName n) = markExternal l GHC.AnnVal ("?" ++ GHC.unpackFS n)---- -----------------------------------------------------------------------instance (Annotate body)- => Annotate (GHC.Match GHC.GhcPs (GHC.Located body)) where-- markAST _ (GHC.Match _ mln pats (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 _ s -> do- setContext (Set.fromList [NoPrecedingSpace,PrefixOp]) $ do- when (s == GHC.SrcStrict) $ mark GHC.AnnBang- 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-- -- ------------------------------------- markAST _ (GHC.Match _ _ _ (GHC.XGRHSs _))- = error "hit extension for Match"- markAST _ (GHC.XMatch _)- = error "hit extension for Match"---- -----------------------------------------------------------------------instance (Annotate body)- => Annotate (GHC.GRHS GHC.GhcPs (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-- markAST _ (GHC.XGRHS x) = error $ "got XGRHS for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.Sig GHC.GhcPs) 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- setContext (Set.singleton PrefixOp) $ 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-- -- ------------------------------------ markAST _ (GHC.PatSynSig _ _ (GHC.XHsImplicitBndrs _))- = error "hit extension for Sig"- markAST _ (GHC.ClassOpSig _ _ _ (GHC.XHsImplicitBndrs _))- = error "hit extension for Sig"- markAST _ (GHC.FixSig _ (GHC.XFixitySig _))- = error "hit extension for Sig"- markAST _ (GHC.XSig _)- = error "hit extension for Sig"---- ----------------------------------------------------------------------markLHsSigType :: GHC.LHsSigType GHC.GhcPs -> Annotated ()-markLHsSigType (GHC.HsIB _ typ) = markLocated typ-markLHsSigType (GHC.XHsImplicitBndrs x) = error $ "got XHsImplicitBndrs for:" ++ showGhc x--instance Annotate [GHC.LHsSigType GHC.GhcPs] 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.- let marker = case ls of- [] -> markManyOptional- [GHC.HsIB _ t] -> if GHC.hsTypeNeedsParens GHC.appPrec (GHC.unLoc t)- then markMany- else markManyOptional- _ -> markMany -- Need parens if more than one entry- marker GHC.AnnOpenP- markListIntercalateWithFun markLHsSigType ls- marker 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.GhcPs) 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 -- '('-- markAST _l (GHC.XTyVarBndr x) = error $ "got XTyVarBndr for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.HsType GHC.GhcPs) where- markAST loc ty = do- inContext (Set.fromList [InTypeApp]) $ mark GHC.AnnAt- markType loc ty- inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma- (inContext (Set.singleton AddVbar) $ mark GHC.AnnVbar)- where-- -- markType :: GHC.SrcSpan -> ast -> Annotated ()- markType :: GHC.SrcSpan -> (GHC.HsType GHC.GhcPs) -> 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.IsPromoted) $ mark GHC.AnnSimpleQuote- unsetContext InfixOp $ setContext (Set.singleton PrefixOp) $ markLocated name-- markType _ (GHC.HsAppTy _ t1 t2) = do- setContext (Set.singleton PrefixOp) $ markLocated t1- markLocated t2-- markType _ (GHC.HsAppKindTy l t k) = do- setContext (Set.singleton PrefixOp) $ markLocated t- markTypeApp l- markLocated k-- markType _ (GHC.HsFunTy _ t1 t2) = do- markLocated t1- mark GHC.AnnRarrow- markLocated t2- -- markManyOptional GHC.AnnCloseP -- For trailing parens after res_ty in ConDeclGADT-- markType _ (GHC.HsListTy _ t) = do- mark GHC.AnnOpenS -- '['- markLocated t- mark GHC.AnnCloseS -- ']'-- 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 l (GHC.HsStarTy _ isUnicode) = do- if isUnicode- then markExternal l GHC.AnnVal "\x2605" -- Unicode star- else markExternal l GHC.AnnVal "*"-- markType _ (GHC.HsKindSig _ t k) = do- markOptional GHC.AnnOpenP -- '('- markLocated t- mark GHC.AnnDcolon -- '::'- markLocated k- markOptional 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.HsExplicitListTy _ promoted ts) = do- when (promoted == GHC.IsPromoted) $ 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 _) = do- markExternal l GHC.AnnVal "_"-- markType _ (GHC.XHsType x) = error $ "got XHsType for:" ++ showGhc x----- ------------------------------------------------------------------------- instance Annotate (GHC.HsAppType GHC.GhcPs) 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.GhcPs) 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"- GHC.HsSplicedT{} -> error "HsSplicedT only exists between renamer and typechecker in GHC"-- -- --------------------------------- (GHC.XSplice x) -> error $ "got XSplice for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.ConDeclField GHC.GhcPs) 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-- markAST _ (GHC.XConDeclField x) = error $ "got XConDeclField for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.FieldOcc GHC.GhcPs) where- markAST _ (GHC.FieldOcc _ rn) = do- markLocated rn- inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma-- markAST _ (GHC.XFieldOcc x) = error $ "got XFieldOcc for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate GHC.HsDocString where- markAST l s = do- markExternal l GHC.AnnVal (GHC.unpackHDS s)---- -----------------------------------------------------------------------instance Annotate (GHC.Pat GHC.GhcPs) 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)- -- unsetContext Intercalate $ setContext (Set.singleton PrefixOp) $ markLocated 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.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.SigPat _ pat ty) = do- markLocated pat- mark GHC.AnnDcolon- markLHsSigWcType ty-- markPat _ GHC.CoPat {} =- traceM "warning: CoPat introduced after renaming"-- markPat _ (GHC.XPat (GHC.L l p)) = markPat l p- -- markPat _ (GHC.XPat x) = error $ "got XPat for:" ++ showGhc x---- -----------------------------------------------------------------------hsLit2String :: GHC.HsLit GHC.GhcPs -> 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 _ (GHC.IL 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 _ v) _ -> toSourceTextWithSuffix src v ""- GHC.HsFloatPrim _ (GHC.FL src _ v) -> toSourceTextWithSuffix src v "#"- GHC.HsDoublePrim _ (GHC.FL src _ v) -> toSourceTextWithSuffix src v "##"- (GHC.XLit x) -> error $ "got XLit for:" ++ showGhc x--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.GhcPs -> 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.GhcPs -> Annotated ()--markHsConDeclDetails isDeprecated inGadt lns dets = do- case dets of- GHC.PrefixCon args ->- setContext (Set.singleton PrefixOp) $ mapM_ markLocated args- -- GHC.RecCon fs -> markLocated fs- 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.GhcPs] 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 Annotate (GHC.HsOverLit GHC.GhcPs) where- markAST l ol =- let str = case GHC.ol_val ol of- GHC.HsIntegral (GHC.IL src _ _) -> src- GHC.HsFractional (GHC.FL src _ _) -> src- GHC.HsIsString src _ -> src- in- markExternalSourceText l str ""---- -----------------------------------------------------------------------instance (Annotate arg)- => Annotate (GHC.HsImplicitBndrs GHC.GhcPs (GHC.Located arg)) where- markAST _ (GHC.HsIB _ thing) = do- markLocated thing- markAST _ (GHC.XHsImplicitBndrs x) = error $ "got XHsImplicitBndrs for:" ++ showGhc x---- -----------------------------------------------------------------------instance (Annotate body) => Annotate (GHC.Stmt GHC.GhcPs (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- markListWithLayout stmts- markOptional GHC.AnnCloseC- inContext (Set.singleton AddVbar) $ mark GHC.AnnVbar- inContext (Set.singleton Intercalate) $ mark GHC.AnnComma- markTrailingSemi-- markAST _ (GHC.XStmtLR x) = error $ "got XStmtLR for:" ++ showGhc x---- ------------------------------------------------------------------------- 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.GhcPs GHC.GhcPs) where- markAST _ (GHC.ParStmtBlock _ stmts _ns _) = do- markListIntercalate stmts- markAST _ (GHC.XParStmtBlock x) = error $ "got XParStmtBlock for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.HsLocalBinds GHC.GhcPs) where- markAST _ lb = markHsLocalBinds lb---- -----------------------------------------------------------------------markHsLocalBinds :: GHC.HsLocalBinds GHC.GhcPs -> Annotated ()-markHsLocalBinds (GHC.HsValBinds _ (GHC.ValBinds _ binds sigs)) =- applyListAnnotationsLayout- (prepareListAnnotation (GHC.bagToList binds)- ++ prepareListAnnotation sigs- )-markHsLocalBinds (GHC.HsIPBinds _ (GHC.IPBinds _ binds)) = markListWithLayout binds-markHsLocalBinds GHC.EmptyLocalBinds{} = return ()--markHsLocalBinds (GHC.HsValBinds _ (GHC.XValBindsLR _)) = error "markHsLocalBinds:got extension"-markHsLocalBinds (GHC.HsIPBinds _ (GHC.XHsIPBinds _)) = error "markHsLocalBinds:got extension"-markHsLocalBinds (GHC.XHsLocalBindsLR _) = error "markHsLocalBinds:got extension"---- -----------------------------------------------------------------------markMatchGroup :: (Annotate body)- => GHC.SrcSpan -> GHC.MatchGroup GHC.GhcPs (GHC.Located body)- -> Annotated ()-markMatchGroup _ (GHC.MG _ (GHC.L _ matches) _)- = setContextLevel (Set.singleton AdvanceLine) 2 $ markListWithLayout matches-markMatchGroup _ (GHC.XMatchGroup x) = error $ "got XMatchGroup for:" ++ showGhc x---- -----------------------------------------------------------------------instance (Annotate body)- => Annotate [GHC.Located (GHC.Match GHC.GhcPs (GHC.Located body))] where- markAST _ ls = mapM_ markLocated ls---- -----------------------------------------------------------------------instance Annotate (GHC.HsExpr GHC.GhcPs) 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.AnnSemi- 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 ("[", "]")- 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.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) = 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.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.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.AnnOpenB "(|"- markLocated e- mapM_ markLocated cs- markWithString GHC.AnnCloseB "|)"-- 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- markInstead GHC.AnnAt AnnTypeApp- markLHsWcType ty-- 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"-- markExpr _ (GHC.HsBracket _ (GHC.XBracket _)) = error "markExpr got extension"- markExpr _ (GHC.XExpr _) = error "markExpr got extension"---- -----------------------------------------------------------------------markLHsWcType :: GHC.LHsWcType GHC.GhcPs -> Annotated ()-markLHsWcType (GHC.HsWC _ ty) = do- markLocated ty-markLHsWcType (GHC.XHsWildCardBndrs x) = error $ "markLHsWcType got :" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.HsLit GHC.GhcPs) where- markAST l lit = markExternal l GHC.AnnVal (hsLit2String lit)---- -----------------------------------------------------------------------instance Annotate (GHC.HsRecUpdField GHC.GhcPs) 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 Annotate (GHC.AmbiguousFieldOcc GHC.GhcPs) where- markAST _ (GHC.Unambiguous _ n) = markLocated n- markAST _ (GHC.Ambiguous _ n) = markLocated n- markAST _ (GHC.XAmbiguousFieldOcc x) = error $ "got XAmbiguousFieldOcc for:" ++ showGhc x---- ------------------------------------------------------------------------- |Used for declarations that need to be aligned together, e.g. in a--- do or let .. in statement/expr-instance Annotate [GHC.ExprLStmt GHC.GhcPs] where- markAST _ ls = mapM_ markLocated ls---- -----------------------------------------------------------------------instance Annotate (GHC.HsTupArg GHC.GhcPs) 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-- markAST _ (GHC.XTupArg x) = error $ "got XTupArg got:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.HsCmdTop GHC.GhcPs) where- markAST _ (GHC.HsCmdTop _ cmd) = markLocated cmd- markAST _ (GHC.XCmdTop x) = error $ "got XCmdTop for:" ++ showGhc x--instance Annotate (GHC.HsCmd GHC.GhcPs) 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"-- markAST _ (GHC.XCmd x) = error $ "got XCmd for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate [GHC.Located (GHC.StmtLR GHC.GhcPs GHC.GhcPs (GHC.LHsCmd GHC.GhcPs))] where- markAST _ ls = mapM_ markLocated ls---- -----------------------------------------------------------------------instance Annotate (GHC.TyClDecl GHC.GhcPs) where-- markAST l (GHC.FamDecl _ famdecl) = markAST l famdecl >> markTrailingSemi-{-- SynDecl { tcdSExt :: XSynDecl pass -- ^ Post renameer, FVs- , tcdLName :: Located (IdP pass) -- ^ Type constructor- , tcdTyVars :: LHsQTyVars pass -- ^ Type variables; for an- -- associated type these- -- include outer binders- , tcdFixity :: LexicalFixity -- ^ Fixity used in the declaration- , tcdRhs :: LHsType pass } -- ^ RHS of type declaration---}- 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 Nothing fixity ln tyvars- mark GHC.AnnEqual- markLocated typ- markTrailingSemi-- markAST _ (GHC.DataDecl _ ln (GHC.HsQTvs _ 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 Nothing 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 _ tyVars) fixity fds- sigs meths ats atdefs docs) = do- mark GHC.AnnClass- markLocated ctx-- markTyClass Nothing 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-{-- | ClassDecl { tcdCExt :: XClassDecl pass, -- ^ Post renamer, FVs- tcdCtxt :: LHsContext pass, -- ^ Context...- tcdLName :: Located (IdP pass), -- ^ Name of the class- tcdTyVars :: LHsQTyVars pass, -- ^ Class type variables- tcdFixity :: LexicalFixity, -- ^ Fixity used in the declaration- tcdFDs :: [Located (FunDep (Located (IdP pass)))],- -- ^ Functional deps- tcdSigs :: [LSig pass], -- ^ Methods' signatures- tcdMeths :: LHsBinds pass, -- ^ Default methods- tcdATs :: [LFamilyDecl pass], -- ^ Associated types;- tcdATDefs :: [LTyFamDefltEqn pass],- -- ^ Associated type defaults- tcdDocs :: [LDocDecl] -- ^ Haddock docs- }---}-- markAST _ (GHC.SynDecl _ _ (GHC.XLHsQTyVars _) _ _)- = error "extension hit for TyClDecl"- markAST _ (GHC.DataDecl _ _ (GHC.HsQTvs _ _) _ (GHC.XHsDataDefn _))- = error "extension hit for TyClDecl"- markAST _ (GHC.DataDecl _ _ (GHC.XLHsQTyVars _) _ _)- = error "extension hit for TyClDecl"- markAST _ (GHC.ClassDecl _ _ _ (GHC.XLHsQTyVars _) _ _ _ _ _ _ _)- = error "extension hit for TyClDecl"- markAST _ (GHC.XTyClDecl _)- = error "extension hit for TyClDecl"---- -----------------------------------------------------------------------markTypeApp :: GHC.SrcSpan -> Annotated ()-markTypeApp loc = do- let l = GHC.srcSpanFirstCharacter loc- markExternal l GHC.AnnVal "@"---- -----------------------------------------------------------------------markTyClassArgs :: (Annotate a)- => Maybe [GHC.LHsTyVarBndr GhcPs] -> GHC.LexicalFixity- -- -> GHC.Located a -> [ast] -> Annotated ()- -> GHC.Located a -> [GHC.LHsTypeArg GhcPs] -> Annotated ()-markTyClassArgs mbndrs fixity ln tyVars = do- let- cvt (GHC.HsValArg val) = markLocated val- cvt (GHC.HsTypeArg loc typ) = do- markTypeApp loc- -- let l = GHC.srcSpanFirstCharacter loc- -- markExternal l GHC.AnnVal "@"- markLocated typ- cvt (GHC.HsArgPar _ss) = undefined- markTyClassWorker cvt mbndrs fixity ln tyVars- {--type LHsTypeArg p = HsArg (LHsType p) (LHsKind p)--data HsArg tm ty- = HsValArg tm -- Argument is an ordinary expression (f arg)- | HsTypeArg ty -- Argument is a visible type application (f @ty)- | HsArgPar SrcSpan -- See Note [HsArgPar]--}---- TODO:AZ: simplify-markTyClass :: (Data (GHC.SrcSpanLess ast), Annotate a, Annotate ast,GHC.HasSrcSpan ast)- => Maybe [GHC.LHsTyVarBndr GhcPs] -> GHC.LexicalFixity- -> GHC.Located a -> [ast] -> Annotated ()-markTyClass = markTyClassWorker markLocated--markTyClassWorker :: (Annotate a)- => (b -> Annotated ()) -> Maybe [GHC.LHsTyVarBndr GhcPs] -> GHC.LexicalFixity- -- -> GHC.Located a -> [ast] -> Annotated ()- -> GHC.Located a -> [b] -> Annotated ()-markTyClassWorker markFn mbndrs fixity ln tyVars = do- let processBinders =- case mbndrs of- Nothing -> return ()- Just bndrs -> do- mark GHC.AnnForall- mapM_ markLocated bndrs- mark GHC.AnnDot-- -- There may be arbitrary parens around parts of the constructor- -- Turn these into comments so that they feed into the right place automatically- annotationsToComments [GHC.AnnOpenP,GHC.AnnCloseP]- let markParens = if fixity == GHC.Infix && length tyVars > 2- then markMany- else markManyOptional- if fixity == GHC.Prefix- then do- markManyOptional GHC.AnnOpenP- processBinders- setContext (Set.singleton PrefixOp) $ markLocated ln- -- setContext (Set.singleton PrefixOp) $ mapM_ markLocated tyVars- setContext (Set.singleton PrefixOp) $ mapM_ markFn $ take 2 tyVars- when (length tyVars >= 2) $ do- markParens GHC.AnnCloseP- setContext (Set.singleton PrefixOp) $ mapM_ markFn $ drop 2 tyVars- markManyOptional GHC.AnnCloseP- else do- case tyVars of- (x:y:xs) -> do- markParens GHC.AnnOpenP- processBinders- markFn x- setContext (Set.singleton InfixOp) $ markLocated ln- markFn y- markParens GHC.AnnCloseP- mapM_ markFn xs- markManyOptional GHC.AnnCloseP- _ -> error $ "markTyClass: Infix op without operands"---- -----------------------------------------------------------------------instance Annotate [GHC.LHsDerivingClause GHC.GhcPs] where- markAST _ ds = mapM_ markLocated ds---- -----------------------------------------------------------------------instance Annotate (GHC.HsDerivingClause GHC.GhcPs) where- markAST _ (GHC.HsDerivingClause _ mstrategy typs) = do- mark GHC.AnnDeriving- case mstrategy of- Nothing -> return ()- Just (GHC.L _ (GHC.ViaStrategy{})) -> return ()- Just s -> markLocated s- markLocated typs- case mstrategy of- Just s@(GHC.L _ (GHC.ViaStrategy{})) -> markLocated s- _ -> return ()-- markAST _ (GHC.XHsDerivingClause x) = error $ "got XHsDerivingClause for:" ++ showGhc x--{-- = HsDerivingClause- { deriv_clause_ext :: XCHsDerivingClause pass- , deriv_clause_strategy :: Maybe (LDerivStrategy pass)- -- ^ The user-specified strategy (if any) to use when deriving- -- 'deriv_clause_tys'.- , deriv_clause_tys :: Located [LHsSigType pass]- -- ^ The types to derive.- --- -- It uses 'LHsSigType's because, with @-XGeneralizedNewtypeDeriving@,- -- we can mention type variables that aren't bound by the datatype, e.g.- --- -- > data T b = ... deriving (C [a])- --- -- should produce a derived instance for @C [a] (T b)@.- }---}---- -----------------------------------------------------------------------instance Annotate (GHC.FamilyDecl GHC.GhcPs) 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 Nothing 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- (GHC.XFamilyResultSig x) -> error $ "FamilyDecl:got XFamilyResultSig for:" ++ showGhc x- 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-- markAST _ (GHC.FamilyDecl _ _ _ (GHC.XLHsQTyVars _) _ _ _)- = error "got extension for FamilyDecl"- markAST _ (GHC.XFamilyDecl _)- = error "got extension for FamilyDecl"---- -----------------------------------------------------------------------instance Annotate (GHC.FamilyResultSig GHC.GhcPs) where- markAST _ (GHC.NoSig _) = return ()- markAST _ (GHC.KindSig _ k) = markLocated k- markAST _ (GHC.TyVarSig _ ltv) = markLocated ltv- markAST _ (GHC.XFamilyResultSig x) = error $ "got XFamilyResultSig for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.InjectivityAnn GHC.GhcPs) where- markAST _ (GHC.InjectivityAnn ln lns) = do- markLocated ln- mark GHC.AnnRarrow- mapM_ markLocated lns---- -----------------------------------------------------------------------instance Annotate (GHC.TyFamInstEqn GHC.GhcPs) where-{--type TyFamInstEqn pass = FamInstEqn pass (LHsType pass)--type FamInstEqn pass rhs- = HsImplicitBndrs pass (FamEqn pass (HsTyPats pass) rhs)--type HsTyPats pass = [LHsTypeArg pass]---}- markAST _ (GHC.HsIB _ eqn) = do- markFamEqn eqn- markTrailingSemi- markAST _ (GHC.XHsImplicitBndrs x) = error $ "got XHsImplicitBndrs for:" ++ showGhc x---- -----------------------------------------------------------------------instance Annotate (GHC.TyFamDefltEqn GHC.GhcPs) where-- markAST _ (GHC.FamEqn _ ln mbndrs (GHC.HsQTvs _ bndrs) fixity typ) = do- mark GHC.AnnType- mark GHC.AnnInstance- markTyClass mbndrs fixity ln bndrs- mark GHC.AnnEqual- markLocated typ-{--type TyFamDefltEqn pass = FamEqn pass (LHsQTyVars pass) (LHsType pass)--data LHsQTyVars pass -- See Note [HsType binders]- = HsQTvs { hsq_ext :: XHsQTvs pass-- , hsq_explicit :: [LHsTyVarBndr pass]- -- Explicit variables, written by the user- -- See Note [HsForAllTy tyvar binders]- }---data FamEqn pass pats rhs- = FamEqn- { feqn_ext :: XCFamEqn pass pats rhs- , feqn_tycon :: Located (IdP pass)- , feqn_bndrs :: Maybe [LHsTyVarBndr pass] -- ^ Optional quantified type vars- , feqn_pats :: pats- , feqn_fixity :: LexicalFixity -- ^ Fixity used in the declaration- , feqn_rhs :: rhs- }--}-- markAST _ (GHC.FamEqn _ _ _ (GHC.XLHsQTyVars _) _ _)- = error "TyFamDefltEqn hit extension point"- markAST _ (GHC.XFamEqn _)- = error "TyFamDefltEqn hit extension point"---- ------------------------------------------------------------------------- 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 ds) -> GHC.unpackHDS ds- (GHC.DocCommentPrev ds) -> GHC.unpackHDS ds- (GHC.DocCommentNamed _s ds) -> GHC.unpackHDS ds- (GHC.DocGroup _i ds) -> GHC.unpackHDS ds- in- markExternal l GHC.AnnVal str >> markTrailingSemi-{--data DocDecl- = DocCommentNext HsDocString- | DocCommentPrev HsDocString- | DocCommentNamed String HsDocString- | DocGroup Int HsDocString---}---- -----------------------------------------------------------------------markDataDefn :: GHC.SrcSpan -> GHC.HsDataDefn GHC.GhcPs -> 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-markDataDefn _ (GHC.XHsDataDefn x) = error $ "got XHsDataDefn for:" ++ showGhc x---- ------------------------------------------------------------------------- Note: GHC.HsContext name aliases to here too-instance Annotate [GHC.LHsType GHC.GhcPs] where- markAST l ts = do- -- Note: A single item in parens in a standalone deriving clause- -- is parsed as a HsSigType, which is always a HsForAllTy or- -- HsQualTy. 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- [GHC.L _ GHC.HsQualTy{}] -> markMany pa- [_] -> markManyOptional pa- _ -> markMany pa-- parenIfNeeded'' pa =- ifInContext (Set.singleton Parens) -- AZ:TODO: this is never set?- (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.GhcPs) where- markAST _ (GHC.ConDeclH98 _ ln (GHC.L _ fa) mqtvs mctx- dets _) = do- when fa $ do- mark GHC.AnnForall- mapM_ markLocated mqtvs- mark GHC.AnnDot-- case mctx of- Just ctx -> do- setContext (Set.fromList [NoDarrow]) $ markLocated 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-{-- | ConDeclH98- { con_ext :: XConDeclH98 pass- , con_name :: Located (IdP pass)-- , con_forall :: Bool -- ^ True <=> explicit user-written forall- -- e.g. data T a = forall b. MkT b (b->a)- -- con_ex_tvs = {b}- -- False => con_ex_tvs is empty- , con_ex_tvs :: [LHsTyVarBndr pass] -- ^ Existentials only- , con_mb_cxt :: Maybe (LHsContext pass) -- ^ User-written context (if any)- , con_args :: HsConDeclDetails pass -- ^ Arguments; can be InfixCon-- , con_doc :: Maybe LHsDocString- -- ^ A possible Haddock comment.- }---}- markAST _ (GHC.ConDeclGADT _ lns (GHC.L l forall) (GHC.HsQTvs _ qvars) mbCxt args typ _) = do- setContext (Set.singleton PrefixOp) $ markListIntercalate lns- mark GHC.AnnDcolon- annotationsToComments [GHC.AnnOpenP]- markLocated (GHC.L l (ResTyGADTHook forall qvars))- markMaybe mbCxt- markHsConDeclDetails False True lns args- markLocated typ- markManyOptional GHC.AnnCloseP- markTrailingSemi-{-- = ConDeclGADT- { con_g_ext :: XConDeclGADT pass- , con_names :: [Located (IdP pass)]-- -- The next four fields describe the type after the '::'- -- See Note [GADT abstract syntax]- , con_forall :: Located Bool -- ^ True <=> explicit forall- -- False => hsq_explicit is empty- , con_qvars :: LHsQTyVars pass- -- Whether or not there is an /explicit/ forall, we still- -- need to capture the implicitly-bound type/kind variables-- , con_mb_cxt :: Maybe (LHsContext pass) -- ^ User-written context (if any)- , con_args :: HsConDeclDetails pass -- ^ Arguments; never InfixCon- , con_res_ty :: LHsType pass -- ^ Result type-- , con_doc :: Maybe LHsDocString- -- ^ A possible Haddock comment.- }---}-- markAST _ (GHC.ConDeclGADT _ _ (GHC.L _ _) (GHC.XLHsQTyVars _) _ _ _ _)- = error "hit extension point in ConDecl"- markAST _ (GHC.XConDecl _)- = error "hit extension point in ConDecl"---- ResTyGADT has a SrcSpan for the original sigtype, we need to create--- a type for exactPC and annotatePC-data ResTyGADTHook = ResTyGADTHook Bool [GHC.LHsTyVarBndr GHC.GhcPs]- deriving (Typeable)-deriving instance Data (ResTyGADTHook)--instance GHC.Outputable ResTyGADTHook where- ppr (ResTyGADTHook b bs) = GHC.text "ResTyGADTHook" GHC.<+> GHC.ppr b 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 where- markAST _ (ResTyGADTHook forall bndrs) = do- when forall $ mark GHC.AnnForall- mapM_ markLocated bndrs- when forall $ mark GHC.AnnDot---- -----------------------------------------------------------------------instance Annotate (GHC.HsRecField GHC.GhcPs (GHC.LPat GHC.GhcPs)) 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.GhcPs (GHC.LHsExpr GHC.GhcPs)) 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.FunDep (GHC.Located GHC.RdrName)) 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-ghc90/Language/Haskell/GHC/ExactPrint/Annotater.hs
@@ -1,2813 +0,0 @@-{-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE GADTs #-}-{-# LANGUAGE PatternSynonyms #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE StandaloneDeriving #-}-{-# LANGUAGE ViewPatterns #-}----- | '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 GHC as GHC-import qualified GHC.Core.Class as GHC-import qualified GHC.Core.Coercion.Axiom as GHC-import qualified GHC.Data.Bag as GHC-import qualified GHC.Data.BooleanFormula as GHC-import qualified GHC.Data.FastString as GHC-import qualified GHC.Parser.Annotation as GHC-import qualified GHC.Types.Basic as GHC-import qualified GHC.Types.ForeignCall as GHC-import qualified GHC.Types.Name as GHC-import qualified GHC.Types.Name.Reader as GHC-import qualified GHC.Types.SrcLoc as GHC-import qualified GHC.Types.Var as GHC-import qualified GHC.Utils.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, Data (GHC.SrcSpanLess ast), GHC.HasSrcSpan ast) => ast -> Annotated ()-annotate :: (Annotate ast) => GHC.Located ast -> Annotated ()-annotate = markLocated---- instance Annotate (GHC.SrcSpanLess ast) where--- markAST s ast = undefined-instance (Data ast, Annotate ast) => Annotate (GHC.Located ast) where- markAST l (GHC.L _ ast) = markAST l ast---- ------------------------------------------------------------------------- | 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.GhcPs) 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.GhcPs -> 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 (GHC.RealSrcSpan ss' Nothing) a)---- -----------------------------------------------------------------------markMaybe :: (Annotate ast) => Maybe (GHC.Located ast) -> Annotated ()-markMaybe Nothing = return ()-markMaybe (Just ast) = markLocated ast---- -----------------------------------------------------------------------markTightPrefix :: Annotated () -> Annotated ()-markTightPrefix action = setContext (Set.singleton InTypeApp) action---- ------------------------------------------------------------------------ Managing lists which have been separated, e.g. Sigs and Binds--prepareListAnnotation :: Annotate a => [GHC.Located a] -> [(GHC.RealSrcSpan,Annotated ())]-prepareListAnnotation ls = map (\b -> (rs $ GHC.getLoc b,markLocated b)) ls---- -----------------------------------------------------------------------instance Annotate GHC.HsModule where- markAST _ (GHC.HsModule _lo 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- 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 Annotate [GHC.LIE GHC.GhcPs] 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-- markOptional GHC.AnnComma- mark GHC.AnnCloseP -- ')'--instance Annotate (GHC.IE GHC.GhcPs) 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- unsetContext Intercalate $ setContext (Set.fromList [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)---- -----------------------------------------------------------------------instance Annotate (GHC.IEWrappedName GHC.RdrName) 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---- -----------------------------------------------------------------------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- 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 isSym- then ifInContext (Set.fromList [PrefixOp,PrefixOpDollar])- (mark pa) -- '('- (markOptional pa)- else markOptional pa-- markOptional GHC.AnnSimpleQuote- 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- -- then error $ "GHC.orig:(isSym,canParen)=" ++ show (isSym,canParen)- 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- doNormalRdrName- "*" -> 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")---- -----------------------------------------------------------------------instance Annotate (GHC.ImportDecl GHC.GhcPs) 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)- case qualFlag of- GHC.QualifiedPre -- 'qualified' appears in prepositive position.- -> (unsetContext TopLevel $ mark GHC.AnnQualified)- _ -> return ()- case mpkg of- Just (GHC.StringLiteral (GHC.SourceText srcPkg) _) ->- markWithString GHC.AnnPackageName srcPkg- _ -> return ()-- markLocated modname-- case qualFlag of- GHC.QualifiedPost -- 'qualified' appears in postpositive position.- -> (unsetContext TopLevel $ mark GHC.AnnQualified)- _ -> return ()-- 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.GhcPs -> 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.KindSigD _ 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.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.GhcPs) where- markAST l d = markLHsDecl (GHC.L l d)---- -----------------------------------------------------------------------instance Annotate (GHC.RoleAnnotDecl GHC.GhcPs) where- markAST _ (GHC.RoleAnnotDecl _ ln mr) = do- mark GHC.AnnType- mark GHC.AnnRole- setContext (Set.singleton PrefixOp) $ 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.GhcPs) 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.RuleDecls GHC.GhcPs) where- markAST _ (GHC.HsRules _ src rules) = do- markAnnOpen src "{-# RULES"- setLayoutFlag $ markListIntercalateWithFunLevel markLocated 2 rules- markWithString GHC.AnnClose "#-}"- markTrailingSemi---- -----------------------------------------------------------------------instance Annotate (GHC.RuleDecl GHC.GhcPs) where- markAST l (GHC.HsRule _ ln act mtybndrs termbndrs lhs rhs) = do- markLocated ln- setContext (Set.singleton ExplicitNeverActive) $ markActivation l act-- case mtybndrs of- Nothing -> return ()- Just bndrs -> do- mark GHC.AnnForall- mapM_ markLocated bndrs- mark GHC.AnnDot-- mark GHC.AnnForall- mapM_ markLocated termbndrs- mark GHC.AnnDot-- markLocated lhs- mark GHC.AnnEqual- markLocated rhs- inContext (Set.singleton Intercalate) $ mark GHC.AnnSemi- markTrailingSemi-{-- = HsRule -- Source rule- { rd_ext :: XHsRule pass- -- ^ After renamer, free-vars from the LHS and RHS- , rd_name :: Located (SourceText,RuleName)- -- ^ Note [Pragma source text] in BasicTypes- , rd_act :: Activation- , rd_tyvs :: Maybe [LHsTyVarBndr (NoGhcTc pass)]- -- ^ Forall'd type vars- , rd_tmvs :: [LRuleBndr pass]- -- ^ Forall'd term vars, before typechecking; after typechecking- -- this includes all forall'd vars- , rd_lhs :: Located (HsExpr pass)- , rd_rhs :: Located (HsExpr pass)- }---}---- -----------------------------------------------------------------------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.GhcPs) where-{-- = RuleBndr (XCRuleBndr pass) (Located (IdP pass))- | RuleBndrSig (XRuleBndrSig pass) (Located (IdP pass)) (HsPatSigType pass)--}- markAST _ (GHC.RuleBndr _ ln) = markLocated ln- markAST _ (GHC.RuleBndrSig _ ln (GHC.HsPS _ ty)) = do- mark GHC.AnnOpenP -- "("- markLocated ln- mark GHC.AnnDcolon- markLocated ty- mark GHC.AnnCloseP -- ")"---- -----------------------------------------------------------------------markLHsSigWcType :: GHC.LHsSigWcType GHC.GhcPs -> Annotated ()-markLHsSigWcType (GHC.HsWC _ (GHC.HsIB _ ty)) = do- markLocated ty---- -----------------------------------------------------------------------instance Annotate (GHC.AnnDecl GHC.GhcPs) 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 (GHC.WarnDecls GHC.GhcPs) where- markAST _ (GHC.Warnings _ src warns) = do- markAnnOpen src "{-# WARNING" -- Note: might be {-# DEPRECATED- mapM_ markLocated warns- markWithString GHC.AnnClose "#-}"---- -----------------------------------------------------------------------instance Annotate (GHC.WarnDecl GHC.GhcPs) 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.GhcPs) 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.GhcPs) where-- markAST _ (GHC.DerivDecl _ (GHC.HsWC _ (GHC.HsIB _ typ)) ms mov) = do- mark GHC.AnnDeriving- markMaybe ms- mark GHC.AnnInstance- markMaybe mov- markLocated typ- markTrailingSemi--{--data DerivDecl pass = DerivDecl- { deriv_ext :: XCDerivDecl pass- , deriv_type :: LHsSigWcType pass- -- ^ The instance type to derive.- --- -- It uses an 'LHsSigWcType' because the context is allowed to be a- -- single wildcard:- --- -- > deriving instance _ => Eq (Foo a)- --- -- Which signifies that the context should be inferred.-- -- See Note [Inferring the instance context] in TcDerivInfer.-- , deriv_strategy :: Maybe (LDerivStrategy pass)- , deriv_overlap_mode :: Maybe (Located OverlapMode)--type LHsSigWcType pass = HsWildCardBndrs pass (LHsSigType pass) -- Both--data HsWildCardBndrs pass thing- -- See Note [HsType binders]- -- See Note [The wildcard story for types]- = HsWC { hswc_ext :: XHsWC pass thing- -- after the renamer- -- Wild cards, both named and anonymous-- , hswc_body :: thing- -- Main payload (type or list of types)- -- If there is an extra-constraints wildcard,- -- it's still there in the hsc_body.- }----}---- -----------------------------------------------------------------------instance Annotate (GHC.DerivStrategy GHC.GhcPs) where-- markAST _ GHC.StockStrategy = mark GHC.AnnStock- markAST _ GHC.AnyclassStrategy = mark GHC.AnnAnyclass- markAST _ GHC.NewtypeStrategy = mark GHC.AnnNewtype- markAST _ (GHC.ViaStrategy (GHC.HsIB _ ty)) = do- mark GHC.AnnVia- markLocated ty---- -----------------------------------------------------------------------instance Annotate (GHC.DefaultDecl GHC.GhcPs) where-- markAST _ (GHC.DefaultDecl _ typs) = do- mark GHC.AnnDefault- mark GHC.AnnOpenP -- '('- markListIntercalate typs- mark GHC.AnnCloseP -- ')'- markTrailingSemi---- -----------------------------------------------------------------------instance Annotate (GHC.InstDecl GHC.GhcPs) 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.GhcPs) 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.GhcPs) where-{--newtype TyFamInstDecl pass = TyFamInstDecl { tfid_eqn :: TyFamInstEqn pass }--type TyFamInstEqn pass = FamInstEqn pass (LHsType pass)--type FamInstEqn pass rhs- = HsImplicitBndrs pass (FamEqn pass (HsTyPats pass) rhs)----}- markAST _ (GHC.TyFamInstDecl (GHC.HsIB _ eqn)) = do- mark GHC.AnnType- mark GHC.AnnInstance -- Note: this keyword is optional- markFamEqn eqn- markTrailingSemi---- ------------------------------------------------------------------------- markFamEqn :: (GHC.HasOccName (GHC.IdP pass),--- Annotate (GHC.IdP pass), Annotate ast1, Annotate ast2)--- => GHC.FamEqn pass [GHC.Located ast1] (GHC.Located ast2)--- -> Annotated ()--- markFamEqn :: GHC.FamEqn GhcPs [GHC.LHsTypeArg GhcPs] (GHC.LHsType GHC.GhcPs)-markFamEqn :: GHC.FamEqn GhcPs (GHC.LHsType GHC.GhcPs)- -> Annotated ()-markFamEqn (GHC.FamEqn _ ln bndrs pats fixity rhs) = do- markTyClassArgs bndrs fixity ln pats- mark GHC.AnnEqual- markLocated rhs-{--data FamEqn pass pats rhs- = FamEqn- { feqn_ext :: XCFamEqn pass pats rhs- , feqn_tycon :: Located (IdP pass)- , feqn_bndrs :: Maybe [LHsTyVarBndr pass] -- ^ Optional quantified type vars- , feqn_pats :: pats- , feqn_fixity :: LexicalFixity -- ^ Fixity used in the declaration- , feqn_rhs :: rhs- }--}---- -----------------------------------------------------------------------instance Annotate (GHC.DataFamInstDecl GHC.GhcPs) where-- markAST l (GHC.DataFamInstDecl (GHC.HsIB _ (GHC.FamEqn _ ln bndrs 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- mark GHC.AnnInstance-- markLocated ctx-- markTyClassArgs bndrs 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 unless (null cons) $ mark GHC.AnnEqual- markDataDefn l (GHC.HsDataDefn GHC.NoExtField nd (GHC.noLoc []) typ _mk cons mderivs)- markOptional GHC.AnnWhere- markTrailingSemi---- -----------------------------------------------------------------------instance Annotate (GHC.HsBind GHC.GhcPs) 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)) _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-- -- ------------------------------------- -- Introduced after renaming.- markAST _ (GHC.AbsBinds {}) =- traceM "warning: AbsBinds introduced after renaming"-- -- ------------------------------------- markAST l (GHC.PatSynBind _ (GHC.PSB _ ln args def dir)) = do- mark GHC.AnnPattern- case args of- GHC.InfixCon la lb -> do- markLocated la- setContext (Set.singleton InfixOp) $ markLocated ln- markLocated lb- GHC.PrefixCon ns -> do- setContext (Set.singleton PrefixOp) $ markLocated ln- mapM_ markLocated ns- GHC.RecCon 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---- -----------------------------------------------------------------------instance Annotate (GHC.IPBind GHC.GhcPs) 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.GhcPs (GHC.Located body)) where-- markAST l (GHC.Match _ mln pats (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 _ s -> do- setContext (Set.fromList [NoPrecedingSpace,PrefixOp]) $ do- if (s == GHC.SrcStrict)- then do- markExternal (GHC.srcSpanFirstCharacter l) GHC.AnnBang "!"- markTightPrefix $ markLocated n- else 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.GhcPs (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.GhcPs) 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- setContext (Set.singleton PrefixOp) $ 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---- -----------------------------------------------------------------------instance Annotate (GHC.StandaloneKindSig GHC.GhcPs) where-- markAST _ (GHC.StandaloneKindSig _ ln st) = do- mark GHC.AnnType- setContext (Set.singleton PrefixOp) $ markLocated ln- mark GHC.AnnDcolon- markLHsSigType st- markTrailingSemi- tellContext (Set.singleton FollowingLine)---- ----------------------------------------------------------------------markLHsSigType :: GHC.LHsSigType GHC.GhcPs -> Annotated ()-markLHsSigType (GHC.HsIB _ typ) = markLocated typ--instance Annotate [GHC.LHsSigType GHC.GhcPs] 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.- let marker = case ls of- [] -> markManyOptional- [GHC.HsIB _ t] -> if GHC.hsTypeNeedsParens GHC.appPrec (GHC.unLoc t)- then markMany- else markManyOptional- _ -> markMany -- Need parens if more than one entry- marker GHC.AnnOpenP- markListIntercalateWithFun markLHsSigType ls- marker 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 (Data flag) => Annotate (GHC.HsTyVarBndr flag GHC.GhcPs) where- markAST _l (GHC.UserTyVar _ f n) = do- markInferred f GHC.AnnOpenC Nothing -- '{'- markLocated n- markInferred f GHC.AnnCloseC Nothing -- '}'-- markAST _ (GHC.KindedTyVar _ f n ty) = do- markInferred f GHC.AnnOpenC (Just GHC.AnnOpenP)- markLocated n- mark GHC.AnnDcolon -- '::'- markLocated ty- markInferred f GHC.AnnCloseC (Just GHC.AnnCloseP)--markInferred :: Typeable a- => a -> GHC.AnnKeywordId -> (Maybe GHC.AnnKeywordId) -> Annotated ()-markInferred flag kw kw2 =- case (cast flag :: Maybe GHC.Specificity) of- (Just GHC.InferredSpec) -> mark kw- _ -> mapM_ mark kw2---- -----------------------------------------------------------------------instance Annotate (GHC.HsType GHC.GhcPs) where- markAST loc ty = do- markType loc ty- inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma- (inContext (Set.singleton AddVbar) $ mark GHC.AnnVbar)- inContext (Set.singleton InGadt) $ do- mark GHC.AnnRarrow- -- markOptional GHC.AnnLolly- where-- -- markType :: GHC.SrcSpan -> ast -> Annotated ()- markType :: GHC.SrcSpan -> (GHC.HsType GHC.GhcPs) -> Annotated ()- markType _ (GHC.HsForAllTy _ tele typ) = do- mark GHC.AnnForall- case tele of- (GHC.HsForAllVis _ qtvs) -> do- mapM_ markLocated qtvs- mark GHC.AnnRarrow- (GHC.HsForAllInvis _ qtvs) -> do- mapM_ markLocated qtvs- mark GHC.AnnDot- markLocated typ-- markType _ (GHC.HsQualTy _ cxt typ) = do- markLocated cxt- markLocated typ-- markType _ (GHC.HsTyVar _ promoted name) = do- when (promoted == GHC.IsPromoted) $ mark GHC.AnnSimpleQuote- unsetContext InfixOp $ setContext (Set.singleton PrefixOp) $ markLocated name-- markType _ (GHC.HsAppTy _ t1 t2) = do- setContext (Set.singleton PrefixOp) $ markLocated t1- markLocated t2-- markType _ (GHC.HsAppKindTy l t k) = do- setContext (Set.singleton PrefixOp) $ markLocated t- markTypeApp l- markTightPrefix $ markLocated k-- markType _ (GHC.HsFunTy _ arrow t1 t2) = do- markLocated t1- markArrow arrow- -- case arrow of- -- GHC.HsLinearArrow -> do- -- case u of- -- GHC.NormalSyntax -> do- -- mark GHC.AnnMult -- "%1"- -- mark GHC.AnnRarrow- -- GHC.UnicodeSyntax -> mark GHC.AnnLollyU- -- GHC.HsUnrestrictedArrow -> mark GHC.AnnRarrow -- a -> b- -- GHC.HsExplicitMult _ -> do- -- mark GHC.AnnMult -- "%1"- -- mark GHC.AnnRarrow- -- arr = case mult of- -- HsLinearArrow -> lollipop- -- HsUnrestrictedArrow -> arrow- -- HsExplicitMult p -> mulArrow (ppr p)--- lollipop = unicodeSyntax (char '⊸') (docToSDoc $ Pretty.text "%1 ->")--- mulArrow d = text "%" <> d <+> arrow--- markLocated t2-- markType _ (GHC.HsListTy _ t) = do- mark GHC.AnnOpenS -- '['- markLocated t- mark GHC.AnnCloseS -- ']'-- 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 l (GHC.HsStarTy _ isUnicode) = do- if isUnicode- then markExternal l GHC.AnnVal "\x2605" -- Unicode star- else markExternal l GHC.AnnVal "*"-- markType _ (GHC.HsKindSig _ t k) = do- markOptional GHC.AnnOpenP -- '('- markLocated t- mark GHC.AnnDcolon -- '::'- markLocated k- markOptional 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 -> do- mark GHC.AnnTilde- markTightPrefix $ markLocated t- GHC.SrcStrict -> do- mark GHC.AnnBang- markTightPrefix $ markLocated t- GHC.NoSrcStrict -> markLocated t--- markType _ (GHC.HsRecTy _ cons) = do- mark GHC.AnnOpenC -- '{'- markListIntercalate cons- mark GHC.AnnCloseC -- '}'-- markType _ (GHC.HsExplicitListTy _ promoted ts) = do- when (promoted == GHC.IsPromoted) $ 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 _) = do- markExternal l GHC.AnnVal "_"-- markType _ (GHC.XHsType x) = error $ "got XHsType for:" ++ showGhc x----- ------------------------------------------------------------------------- instance Annotate (GHC.HsAppType GHC.GhcPs) 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.GhcPs) 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 _ decoration _n b -> do- if (decoration == GHC.DollarSplice)- then do- mark GHC.AnnDollarDollar- markTightPrefix $ markLocated b- else markLocated b-- GHC.HsUntypedSplice _ decoration _n b -> do- if (decoration == GHC.DollarSplice)- then do- mark GHC.AnnDollar- markTightPrefix $ markLocated b- else markLocated b-- GHC.HsSpliced{} -> error "HsSpliced only exists between renamer and typechecker in GHC"---- -----------------------------------------------------------------------instance Annotate (GHC.ConDeclField GHC.GhcPs) 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 Annotate (GHC.FieldOcc GHC.GhcPs) where- markAST _ (GHC.FieldOcc _ rn) = do- markLocated rn- inContext (Set.fromList [Intercalate]) $ mark GHC.AnnComma---- -----------------------------------------------------------------------instance Annotate GHC.HsDocString where- markAST l s = do- markExternal l GHC.AnnVal (GHC.unpackHDS s)---- -----------------------------------------------------------------------instance Annotate (GHC.Pat GHC.GhcPs) 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)- -- unsetContext Intercalate $ setContext (Set.singleton PrefixOp) $ markLocated n- markPat _ (GHC.LazyPat _ p) = do- mark GHC.AnnTilde- markTightPrefix $ markLocated p-- markPat _ (GHC.AsPat _ ln p) = do- markLocated ln- mark GHC.AnnAt- markTightPrefix $ markLocated p-- markPat _ (GHC.ParPat _ p) = do- mark GHC.AnnOpenP- markLocated p- mark GHC.AnnCloseP-- markPat _ (GHC.BangPat _ p) = do- mark GHC.AnnBang- markTightPrefix $ 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.ConPat _ n dets) = do- markHsConPatDetails n dets-- 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.SigPat _ pat (GHC.HsPS _ ty)) = do- markLocated pat- mark GHC.AnnDcolon- markLocated ty---- -----------------------------------------------------------------------hsLit2String :: GHC.HsLit GHC.GhcPs -> 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 _ (GHC.IL 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 _ v) _ -> toSourceTextWithSuffix src v ""- GHC.HsFloatPrim _ (GHC.FL src _ v) -> toSourceTextWithSuffix src v "#"- GHC.HsDoublePrim _ (GHC.FL src _ v) -> toSourceTextWithSuffix src v "##"--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.GhcPs -> 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--{--type HsConDeclDetails pass- = HsConDetails (HsScaled pass (LBangType pass)) (Located [LConDeclField pass])--}-markHsConDeclDetails ::- Bool -> Bool -> [GHC.Located GHC.RdrName] -> GHC.HsConDeclDetails GHC.GhcPs -> Annotated ()-markHsConDeclDetails isDeprecated inGadt lns dets = do- case dets of- GHC.PrefixCon args ->- if inGadt- then setContextLevel (Set.fromList [InGadt,PrefixOp]) 2 $- mapM_ markScaled args- else setContextLevel (Set.singleton PrefixOp ) 2 $- mapM_ markScaled args- GHC.RecCon fs -> do- mark GHC.AnnOpenC- if inGadt- then do- if isDeprecated- then setContextLevel (Set.fromList [InGadt]) 2 $ markLocated fs- else setContextLevel (Set.fromList [InGadt,InRecCon]) 2 $ markLocated fs- else do- if isDeprecated- then markLocated fs- else setContextLevel (Set.fromList [InRecCon]) 2 $ markLocated fs- GHC.InfixCon a1 a2 -> do- markScaled a1- setContext (Set.singleton InfixOp) $ mapM_ markLocated lns- markScaled a2---- ------------------------------------------------------------------------- markScaled :: (GHC.HsScaled GHC.GhcPs (GHC.Located a)) -> Annotated ()-markScaled :: (GHC.HsScaled GHC.GhcPs (GHC.LBangType GHC.GhcPs)) -> Annotated ()-markScaled a@(GHC.HsScaled _rr (GHC.L l _)) = markLocated (GHC.L l a)--instance Annotate (GHC.HsScaled GHC.GhcPs (GHC.LBangType GHC.GhcPs)) where- markAST _ (GHC.HsScaled arrow a) = do- markLocated a- inContext (Set.singleton InGadt) $ do- markArrow arrow- -- -- AZ:TODO: fix this, with the new syntax- -- case arrow of- -- GHC.HsUnrestrictedArrow -> mark GHC.AnnRarrow -- a -> b- -- GHC.HsLinearArrow -> mark GHC.AnnLollyU -- a #-> b- -- GHC.HsExplicitMult _ -> mark GHC.AnnLollyU -- a #-> b- -- markOptional GHC.AnnRarrow -- See https://gitlab.haskell.org/ghc/ghc/-/commit/7f418acf61e#note_304011--- -----------------------------------------------------------------------markArrow :: GHC.HsArrow GhcPs -> Annotated ()-markArrow arrow = do- case arrow of- GHC.HsLinearArrow u -> do- case u of- GHC.NormalSyntax -> do- mark GHC.AnnPercentOne -- "%1"- mark GHC.AnnRarrow- GHC.UnicodeSyntax -> mark GHC.AnnLollyU- GHC.HsUnrestrictedArrow u ->- case u of- GHC.NormalSyntax -> mark GHC.AnnRarrow -- a -> b- GHC.UnicodeSyntax -> mark GHC.AnnRarrowU -- a ⊸ b- GHC.HsExplicitMult u t -> do- mark GHC.AnnPercent- setContextLevel (Set.fromList [NoPrecedingSpace, InTypeApp]) 2 $ markLocated t- case u of- GHC.NormalSyntax -> mark GHC.AnnRarrow -- ->- GHC.UnicodeSyntax -> mark GHC.AnnRarrowU -- ⊸---- data HsArrow pass--- = HsUnrestrictedArrow IsUnicodeSyntax--- -- ^ a -> b or a → b--- | HsLinearArrow IsUnicodeSyntax--- -- ^ a %1 -> b or a %1 → b, or a ⊸ b--- | HsExplicitMult IsUnicodeSyntax (LHsType pass)--- -- ^ a %m -> b or a %m → b (very much including `a %Many -> b`!----- -----------------------------------------------------------------------instance Annotate [GHC.LConDeclField GHC.GhcPs] where- markAST _ fs = do- markOptional GHC.AnnOpenC -- '{'- markListIntercalate fs- markOptional GHC.AnnDotdot- inContext (Set.singleton InRecCon) $ mark GHC.AnnCloseC -- '}'- -- inContext (Set.singleton InRecCon) $ do- -- mark GHC.AnnRarrow- inContext (Set.singleton InGadt) $ do- mark GHC.AnnRarrow---- -----------------------------------------------------------------------instance Annotate (GHC.HsOverLit GHC.GhcPs) where- markAST l ol =- let str = case GHC.ol_val ol of- GHC.HsIntegral (GHC.IL src _ _) -> src- GHC.HsFractional (GHC.FL src _ _) -> src- GHC.HsIsString src _ -> src- in- markExternalSourceText l str ""---- -----------------------------------------------------------------------instance (Annotate arg)- => Annotate (GHC.HsImplicitBndrs GHC.GhcPs (GHC.Located arg)) where- markAST _ (GHC.HsIB _ thing) = do- markLocated thing---- -----------------------------------------------------------------------instance (Annotate body) => Annotate (GHC.Stmt GHC.GhcPs (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- markListWithLayout 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.GhcPs GHC.GhcPs) where- markAST _ (GHC.ParStmtBlock _ stmts _ns _) = do- markListIntercalate stmts---- -----------------------------------------------------------------------instance Annotate (GHC.HsLocalBinds GHC.GhcPs) where- markAST _ lb = markHsLocalBinds lb---- -----------------------------------------------------------------------markHsLocalBinds :: GHC.HsLocalBinds GHC.GhcPs -> Annotated ()-markHsLocalBinds (GHC.HsValBinds _ (GHC.ValBinds _ binds sigs)) =- applyListAnnotationsLayout- (prepareListAnnotation (GHC.bagToList binds)- ++ prepareListAnnotation sigs- )-markHsLocalBinds (GHC.HsIPBinds _ (GHC.IPBinds _ binds)) = markListWithLayout binds-markHsLocalBinds GHC.EmptyLocalBinds{} = return ()--markHsLocalBinds (GHC.HsValBinds _ (GHC.XValBindsLR _)) = error "markHsLocalBinds:got extension"---- -----------------------------------------------------------------------markMatchGroup :: (Annotate body)- => GHC.SrcSpan -> GHC.MatchGroup GHC.GhcPs (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.GhcPs (GHC.Located body))] where- markAST _ ls = mapM_ markLocated ls---- -----------------------------------------------------------------------instance Annotate (GHC.HsExpr GHC.GhcPs) 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.HsUnboundVar {}) = do- ifInContext (Set.fromList [InfixOp])- (do mark GHC.AnnBackquote- markWithString GHC.AnnVal "_"- mark GHC.AnnBackquote)- (markExternal l GHC.AnnVal "_")-- 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.AnnSemi- 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- 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 Nothing -> mark GHC.AnnDo- GHC.DoExpr (Just mn) ->- markWithString GHC.AnnDo ((GHC.moduleNameString mn) ++ ".do")- GHC.MDoExpr Nothing -> mark GHC.AnnMdo- GHC.MDoExpr (Just mn) ->- markWithString GHC.AnnMdo ((GHC.moduleNameString mn) ++ ".mdo")- _ -> return ()- let (ostr,cstr) =- if isListComp cts- then ("[", "]")- 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.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) = 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.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.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.HsTick {}) = return ()- markExpr _ (GHC.HsBinTick {}) = return ()- markExpr _ (GHC.HsPragE _ prag e) = do- case prag of- (GHC.HsPragSCC _ src csFStr) -> 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-- (GHC.HsPragTick _ src (str,(v1,v2),(v3,v4)) ((s1,s2),(s3,s4))) -> 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 _ (GHC.HsAppType _ e ty) = do- markLocated e- markInstead GHC.AnnAt AnnTypeApp- markTightPrefix $ markLHsWcType ty-- -- markExpr _ (GHC.HsWrap {}) =- -- traceM "warning: HsWrap introduced after renaming"-- markExpr _ (GHC.HsConLikeOut{}) =- traceM "warning: HsConLikeOut introduced after type checking"-- -- markExpr _ x =- -- error $ "markExpr: not matched for " ++ showAnnData mempty 0 x---- -----------------------------------------------------------------------markLHsWcType :: GHC.LHsWcType GHC.GhcPs -> Annotated ()-markLHsWcType (GHC.HsWC _ ty) = do- markLocated ty---- -----------------------------------------------------------------------instance Annotate (GHC.HsLit GHC.GhcPs) where- markAST l lit = markExternal l GHC.AnnVal (hsLit2String lit)---- -----------------------------------------------------------------------instance Annotate (GHC.HsRecUpdField GHC.GhcPs) 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 Annotate (GHC.AmbiguousFieldOcc GHC.GhcPs) 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.GhcPs] where- markAST _ ls = mapM_ markLocated ls---- -----------------------------------------------------------------------instance Annotate (GHC.HsTupArg GHC.GhcPs) 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.GhcPs) where- markAST _ (GHC.HsCmdTop _ cmd) = markLocated cmd--instance Annotate (GHC.HsCmd GHC.GhcPs) 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 l (GHC.HsCmdLamCase _ matches) = do- mark GHC.AnnLam- mark GHC.AnnCase- 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"-- -- markAST _ x = error $ "got HsCmd for:" ++ showAnnData mempty 0 x---- -----------------------------------------------------------------------instance Annotate [GHC.Located (GHC.StmtLR GHC.GhcPs GHC.GhcPs (GHC.LHsCmd GHC.GhcPs))] where- markAST _ ls = mapM_ markLocated ls---- -----------------------------------------------------------------------instance Annotate (GHC.TyClDecl GHC.GhcPs) where-- markAST l (GHC.FamDecl _ famdecl) = markAST l famdecl >> markTrailingSemi-{-- SynDecl { tcdSExt :: XSynDecl pass -- ^ Post renameer, FVs- , tcdLName :: Located (IdP pass) -- ^ Type constructor- , tcdTyVars :: LHsQTyVars pass -- ^ Type variables; for an- -- associated type these- -- include outer binders- , tcdFixity :: LexicalFixity -- ^ Fixity used in the declaration- , tcdRhs :: LHsType pass } -- ^ RHS of type declaration---}- 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 _ 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 _ 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-{-- | ClassDecl { tcdCExt :: XClassDecl pass, -- ^ Post renamer, FVs- tcdCtxt :: LHsContext pass, -- ^ Context...- tcdLName :: Located (IdP pass), -- ^ Name of the class- tcdTyVars :: LHsQTyVars pass, -- ^ Class type variables- tcdFixity :: LexicalFixity, -- ^ Fixity used in the declaration- tcdFDs :: [Located (FunDep (Located (IdP pass)))],- -- ^ Functional deps- tcdSigs :: [LSig pass], -- ^ Methods' signatures- tcdMeths :: LHsBinds pass, -- ^ Default methods- tcdATs :: [LFamilyDecl pass], -- ^ Associated types;- tcdATDefs :: [LTyFamDefltEqn pass],- -- ^ Associated type defaults- tcdDocs :: [LDocDecl] -- ^ Haddock docs- }---}---- -----------------------------------------------------------------------markTypeApp :: GHC.SrcSpan -> Annotated ()-markTypeApp loc = do- let l = GHC.srcSpanFirstCharacter loc- markExternal l GHC.AnnVal "@"---- -----------------------------------------------------------------------markTyClassArgs :: (Annotate a, Data flag)- => Maybe [GHC.LHsTyVarBndr flag GhcPs] -> GHC.LexicalFixity- -> GHC.Located a -> [GHC.LHsTypeArg GhcPs] -> Annotated ()-markTyClassArgs mbndrs fixity ln tyVars = do- let- cvt (GHC.HsValArg val) = markLocated val- cvt (GHC.HsTypeArg loc typ) = do- markTypeApp loc- markTightPrefix $ markLocated typ- cvt (GHC.HsArgPar _ss) = undefined- markTyClassWorker cvt mbndrs fixity ln tyVars- {--type LHsTypeArg p = HsArg (LHsType p) (LHsKind p)--data HsArg tm ty- = HsValArg tm -- Argument is an ordinary expression (f arg)- | HsTypeArg ty -- Argument is a visible type application (f @ty)- | HsArgPar SrcSpan -- See Note [HsArgPar]--}---- TODO:AZ: simplify-markTyClass :: (Annotate a, Annotate ast)- => GHC.LexicalFixity -> GHC.Located a- -> [GHC.Located ast] -> Annotated ()-markTyClass = markTyClassWorker markLocated (Nothing :: Maybe [GHC.LHsTyVarBndr () GhcPs])--markTyClassWorker :: (Annotate a, Data flag)- => (b -> Annotated ()) -> Maybe [GHC.LHsTyVarBndr flag GhcPs] -> GHC.LexicalFixity- -> GHC.Located a -> [b] -> Annotated ()-markTyClassWorker markFn mbndrs fixity ln tyVars = do- let processBinders =- case mbndrs of- Nothing -> return ()- Just bndrs -> do- mark GHC.AnnForall- mapM_ markLocated bndrs- mark GHC.AnnDot-- -- There may be arbitrary parens around parts of the constructor- -- Turn these into comments so that they feed into the right place automatically- annotationsToComments [GHC.AnnOpenP,GHC.AnnCloseP]- let markParens = if fixity == GHC.Infix && length tyVars > 2- then markMany- else markManyOptional- if fixity == GHC.Prefix- then do- markManyOptional GHC.AnnOpenP- processBinders- setContext (Set.singleton PrefixOp) $ markLocated ln- -- setContext (Set.singleton PrefixOp) $ mapM_ markLocated tyVars- setContext (Set.singleton PrefixOp) $ mapM_ markFn $ take 2 tyVars- when (length tyVars >= 2) $ do- markParens GHC.AnnCloseP- setContext (Set.singleton PrefixOp) $ mapM_ markFn $ drop 2 tyVars- markManyOptional GHC.AnnCloseP- else do- case tyVars of- (x:y:xs) -> do- markParens GHC.AnnOpenP- processBinders- markFn x- setContext (Set.singleton InfixOp) $ markLocated ln- markFn y- markParens GHC.AnnCloseP- mapM_ markFn xs- markManyOptional GHC.AnnCloseP- _ -> error $ "markTyClass: Infix op without operands"---- -----------------------------------------------------------------------instance Annotate [GHC.LHsDerivingClause GHC.GhcPs] where- markAST _ ds = mapM_ markLocated ds---- -----------------------------------------------------------------------instance Annotate (GHC.HsDerivingClause GHC.GhcPs) where- markAST _ (GHC.HsDerivingClause _ mstrategy typs) = do- mark GHC.AnnDeriving- case mstrategy of- Nothing -> return ()- Just (GHC.L _ (GHC.ViaStrategy{})) -> return ()- Just s -> markLocated s- markLocated typs- case mstrategy of- Just s@(GHC.L _ (GHC.ViaStrategy{})) -> markLocated s- _ -> return ()---- -----------------------------------------------------------------------instance Annotate (GHC.FamilyDecl GHC.GhcPs) 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.GhcPs) where- markAST _ (GHC.NoSig _) = return ()- markAST _ (GHC.KindSig _ k) = markLocated k- markAST _ (GHC.TyVarSig _ ltv) = markLocated ltv---- -----------------------------------------------------------------------instance Annotate (GHC.InjectivityAnn GHC.GhcPs) where- markAST _ (GHC.InjectivityAnn ln lns) = do- markLocated ln- mark GHC.AnnRarrow- mapM_ markLocated lns---- -----------------------------------------------------------------------instance Annotate (GHC.TyFamInstEqn GHC.GhcPs) where-{--type TyFamInstEqn pass = FamInstEqn pass (LHsType pass)--type FamInstEqn pass rhs- = HsImplicitBndrs pass (FamEqn pass (HsTyPats pass) rhs)--type HsTyPats pass = [LHsTypeArg pass]---}- markAST _ (GHC.HsIB _ eqn) = do- markFamEqn eqn- markTrailingSemi---- ------------------------------------------------------------------------- instance Annotate (GHC.TyFamDefltEqn GHC.GhcPs) where---- markAST _ (GHC.FamEqn _ ln mbndrs (GHC.HsQTvs _ bndrs) fixity typ) = do--- mark GHC.AnnType--- mark GHC.AnnInstance--- markTyClass mbndrs fixity ln bndrs--- mark GHC.AnnEqual--- markLocated typ-- -- markAST _ (GHC.FamEqn _ _ _ (GHC.XLHsQTyVars _) _ _)- -- = error "TyFamDefltEqn hit extension point"- -- markAST _ (GHC.XFamEqn _)- -- = error "TyFamDefltEqn hit extension point"---- ------------------------------------------------------------------------- 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 ds) -> GHC.unpackHDS ds- (GHC.DocCommentPrev ds) -> GHC.unpackHDS ds- (GHC.DocCommentNamed _s ds) -> GHC.unpackHDS ds- (GHC.DocGroup _i ds) -> GHC.unpackHDS ds- in- markExternal l GHC.AnnVal str >> markTrailingSemi-{--data DocDecl- = DocCommentNext HsDocString- | DocCommentPrev HsDocString- | DocCommentNamed String HsDocString- | DocGroup Int HsDocString---}---- -----------------------------------------------------------------------markDataDefn :: GHC.SrcSpan -> GHC.HsDataDefn GHC.GhcPs -> 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.GhcPs] where- markAST l ts = do- -- Note: A single item in parens in a standalone deriving clause- -- is parsed as a HsSigType, which is always a HsForAllTy or- -- HsQualTy. 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- [GHC.L _ GHC.HsQualTy{}] -> markMany pa- [_] -> markManyOptional pa- _ -> markMany pa-- parenIfNeeded'' pa =- ifInContext (Set.singleton Parens) -- AZ:TODO: this is never set?- (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.GhcPs) where- markAST _ (GHC.ConDeclH98 _ ln (GHC.L _ fa) mqtvs mctx- dets _) = do- when fa $ do- mark GHC.AnnForall- mapM_ markLocated mqtvs- mark GHC.AnnDot-- case mctx of- Just ctx -> do- setContext (Set.fromList [NoDarrow]) $ markLocated 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.L l forall) qvars mbCxt args typ _) = do- let- surroundParens- = case args of- GHC.PrefixCon [] -> null qvars && not (isJust mbCxt)- _ -> False-- -- null qvars &&- -- mbCxt == Nothing &&- setContext (Set.singleton PrefixOp) $ markListIntercalate lns- mark GHC.AnnDcolon- annotationsToComments [GHC.AnnOpenP]- if surroundParens- then mark GHC.AnnOpenP- else return ()- markLocated (GHC.L l (ResTyGADTHook forall qvars))- markMaybe mbCxt- markHsConDeclDetails False True lns args- markLocated typ- if surroundParens- then mark GHC.AnnCloseP- else markManyOptional GHC.AnnCloseP- markTrailingSemi---- ------------------------------------------------------------------------- ResTyGADT has a SrcSpan for the original sigtype, we need to create--- a type for exactPC and annotatePC-data ResTyGADTHook = ResTyGADTHook Bool [GHC.LHsTyVarBndr GHC.Specificity GHC.GhcPs]- deriving (Typeable)-deriving instance Data (ResTyGADTHook)--instance GHC.Outputable ResTyGADTHook where- ppr (ResTyGADTHook b bs) = GHC.text "ResTyGADTHook" GHC.<+> GHC.ppr b 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 where- markAST _ (ResTyGADTHook forall bndrs) = do- -- markManyOptional GHC.AnnOpenP- when forall $ mark GHC.AnnForall- mapM_ markLocated bndrs- when forall $ mark GHC.AnnDot- -- markManyOptional GHC.AnnCloseP---- -----------------------------------------------------------------------instance Annotate (GHC.HsRecField GHC.GhcPs (GHC.Located (GHC.Pat GHC.GhcPs))) 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.GhcPs (GHC.LPat GHC.GhcPs)) 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.GhcPs (GHC.LHsExpr GHC.GhcPs)) 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.FunDep (GHC.Located GHC.RdrName)) where-- markAST _ (ls,rss) = do- mapM_ markLocated ls- mark GHC.AnnRarrow- mapM_ markLocated rss- 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.hs view
@@ -1,11 +1,8 @@-{-# LANGUAGE LambdaCase #-} -- | @ghc-exactprint@ is a library to manage manipulating Haskell -- source files. There are four components. module Language.Haskell.GHC.ExactPrint ( -- * Relativising- relativiseApiAnns- , relativiseApiAnnsWithComments- , Anns+ Anns , Comment , Annotation(..) , AnnKey(..)@@ -16,17 +13,12 @@ -- * Transformation , module Language.Haskell.GHC.ExactPrint.Transform - -- * Adding default annotations- , addAnnotationsForPretty- -- * Printing , exactPrint ) where -import Language.Haskell.GHC.ExactPrint.Delta-import Language.Haskell.GHC.ExactPrint.Pretty-import Language.Haskell.GHC.ExactPrint.Print+import Language.Haskell.GHC.ExactPrint.ExactPrint import Language.Haskell.GHC.ExactPrint.Transform import Language.Haskell.GHC.ExactPrint.Types import Language.Haskell.GHC.ExactPrint.Parsers
− src/Language/Haskell/GHC/ExactPrint/Annotate.hs
@@ -1,36 +0,0 @@-{-# 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.Annotate- (- annotate- , AnnotationF(..)- , Annotated- , Annotate(..)- , withSortKeyContextsHelper-- ) where---import Language.Haskell.GHC.ExactPrint.Annotater
− src/Language/Haskell/GHC/ExactPrint/AnnotateTypes.hs
@@ -1,387 +0,0 @@-{-# 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-{-# LANGUAGE ViewPatterns #-}---- | '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--#if __GLASGOW_HASKELL__ >= 900-import qualified GHC.Types.Basic as GHC-#elif __GLASGOW_HASKELL__ > 800-import qualified BasicTypes as GHC-#endif-import qualified GHC 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 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-#if __GLASGOW_HASKELL__ >= 800- MarkInstead :: GHC.AnnKeywordId -> KeywordId -> next -> AnnotationF next-#endif- 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-#if (__GLASGOW_HASKELL__ > 806) && (__GLASGOW_HASKELL__ < 900)- WithAST :: (Data a,Data (GHC.SrcSpanLess a), GHC.HasSrcSpan a) =>- a -> Annotated b -> next -> AnnotationF next-#else- WithAST :: Data a => GHC.Located a- -> Annotated b -> next -> AnnotationF next-#endif- CountAnns :: GHC.AnnKeywordId -> (Int -> next) -> AnnotationF next- WithSortKey :: [(AnnSpan, 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 -> [(AnnSpan, 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-#if __GLASGOW_HASKELL__ >= 800-makeFreeCon 'MarkInstead-#endif-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.-#if (__GLASGOW_HASKELL__ > 806) && (__GLASGOW_HASKELL__ < 900)-withAST :: (Data a, Data (GHC.SrcSpanLess a), GHC.HasSrcSpan a)- => a -> Annotated () -> Annotated ()-#else-withAST :: Data a => GHC.Located a -> Annotated () -> Annotated ()-#endif-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---- -----------------------------------------------------------------------#if (__GLASGOW_HASKELL__ > 806) && (__GLASGOW_HASKELL__ < 900)-withLocated :: (Data a, Data (GHC.SrcSpanLess a), GHC.HasSrcSpan a)- => a- -> (GHC.SrcSpan -> a -> Annotated ())- -> Annotated ()-withLocated a@(GHC.dL->GHC.L l _) action =- withAST a (action l a)-#else-withLocated :: Data a- => GHC.Located a- -> (GHC.SrcSpan -> a -> Annotated ())- -> Annotated ()-withLocated a@(GHC.L l t) action =- withAST a (action l t)-#endif---- ------------------------------------------------------------------------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 -> [(AnnSpan, 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 :: [(AnnSpan, Annotated ())] -> Annotated ()-applyListAnnotations ls = withSortKey ls--applyListAnnotationsContexts :: ListContexts -> [(AnnSpan, 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 :: [(AnnSpan, 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
@@ -1,921 +0,0 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE NamedFieldPuns #-}-{-# LANGUAGE ViewPatterns #-}---- | This module converts 'GHC.ApiAnns' into 'Anns' by traversing a--- structure created by the "Annotate" module.------ == Structure of an Annotation------ As a rule of thumb, every located element in the GHC AST will have--- a corresponding entry in 'Anns'. An 'Annotation' contains 6 fields which--- can be modifed to change how the AST is printed.------ == Layout Calculation------ 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:------ @--- 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--- 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--- block.------ @--- foo = do--- baz--- bar--- @------ A useful way to think of these rules is that the 'DeltaPos' is relative--- to the further left an expression could have been placed. In the--- previous example, we could have placed @baz@ anywhere on the line as its--- position determines where the other statements must be. @bar@ could have--- not been placed any further left without resulting in a syntax error--- which is why the relative column is 0.------ === annTrueEntryDelta--- A very useful function is 'annTrueEntryDelta' which calculates the--- offset from the last syntactic element (ignoring comments). This is--- different to 'annEntryDelta' which does not ignore comments.----------module Language.Haskell.GHC.ExactPrint.Delta- ( relativiseApiAnns- , relativiseApiAnnsWithComments- , relativiseApiAnnsWithOptions-- -- * Configuration- , DeltaOptions(drRigidity)- , deltaOptions- , normalLayout- ) where---- import Control.Exception-import Control.Monad.RWS-import Control.Monad.Trans.Free--import Data.Data (Data)-import Data.List (sort, nub, partition, sortBy, sortOn)--import Data.Ord--import Language.Haskell.GHC.ExactPrint.Utils-#if __GLASGOW_HASKELL__ <= 710-import Language.Haskell.GHC.ExactPrint.Lookup-#endif-import Language.Haskell.GHC.ExactPrint.Types-import Language.Haskell.GHC.ExactPrint.Annotate--import qualified GHC-#if __GLASGOW_HASKELL__ >= 900--- import qualified GHC.Parser.Annotation as GHC--- import qualified GHC.Types.SrcLoc as GHC-#endif--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" #-}---- ------------------------------------------------------------------------ | Transform concrete annotations into relative annotations which are--- more useful when transforming an AST.-#if (__GLASGOW_HASKELL__ > 806) && (__GLASGOW_HASKELL__ < 900)-relativiseApiAnns :: (Data (GHC.SrcSpanLess ast), Annotate ast, GHC.HasSrcSpan ast)- => ast-#else-relativiseApiAnns :: Annotate ast- => GHC.Located ast-#endif- -> GHC.ApiAnns- -> Anns-relativiseApiAnns = relativiseApiAnnsWithComments []---- | Exactly the same as 'relativiseApiAnns' but with the possibilty to--- inject comments. This is typically used if the source has been preprocessed--- by e.g. CPP, and the parts stripped out of the original source are re-added--- as comments so they are not lost for round tripping.-relativiseApiAnnsWithComments ::-#if (__GLASGOW_HASKELL__ > 806) && (__GLASGOW_HASKELL__ < 900)- (Data (GHC.SrcSpanLess ast), Annotate ast, GHC.HasSrcSpan ast)- => [Comment]- -> ast-#else- Annotate ast- => [Comment]- -> GHC.Located ast-#endif- -> GHC.ApiAnns- -> Anns-relativiseApiAnnsWithComments =- relativiseApiAnnsWithOptions normalLayout--relativiseApiAnnsWithOptions ::-#if (__GLASGOW_HASKELL__ > 806) && (__GLASGOW_HASKELL__ < 900)- (Data (GHC.SrcSpanLess ast), Annotate ast, GHC.HasSrcSpan ast)- => DeltaOptions- -> [Comment]- -> ast-#else- Annotate ast- => DeltaOptions- -> [Comment]- -> GHC.Located ast-#endif- -> GHC.ApiAnns- -> Anns-relativiseApiAnnsWithOptions opts cs modu ghcAnns- = runDeltaWithComments- opts cs (annotate modu) ghcAnns- (ss2pos $ GHC.getLoc modu)---- --------------------------------------------------------------------------- | Type used in the Delta Monad.-type Delta a = RWS DeltaOptions DeltaWriter DeltaState a--runDeltaWithComments :: DeltaOptions -> [Comment] -> Annotated () -> GHC.ApiAnns -> Pos -> Anns-runDeltaWithComments opts cs action ga priorEnd =- mkAnns . snd- . (\next -> execRWS next opts (defaultDeltaState cs priorEnd ga))- . deltaInterpret $ action- where- mkAnns :: DeltaWriter -> Anns- mkAnns = f . dwAnns- f :: Monoid a => Endo a -> a- f = ($ mempty) . appEndo---- ------------------------------------------------------------------------- TODO: rename this, it is the R part of the RWS-data DeltaOptions = DeltaOptions- {- -- | Current `SrcSpan, part of current AnnKey`- curSrcSpan :: !GHC.SrcSpan-- -- | Constuctor of current AST element, part of current AnnKey- , annConName :: !AnnConName-- -- | Whether to use rigid or normal layout rules- , drRigidity :: !Rigidity-- -- | Current higher level context. e.g. whether a Match is part of a- -- LambdaExpr or a FunBind- , drContext :: !AstContextSet- }--data DeltaWriter = DeltaWriter- { -- | Final list of annotations, and sort keys- dwAnns :: Endo (Map.Map AnnKey Annotation)-- -- | Used locally to pass Keywords, delta pairs relevant to a specific- -- subtree to the parent.- , annKds :: ![(KeywordId, DeltaPos)]- , sortKeys :: !(Maybe [AnnSpan])- , dwCapturedSpan :: !(First AnnKey)- }--data DeltaState = DeltaState- { -- | Position reached when processing the last element- priorEndPosition :: !Pos-- -- | Ordered list of comments still to be allocated- , apComments :: ![Comment]-- -- | The original GHC Delta Annotations- , apAnns :: !GHC.ApiAnns-- , apMarkLayout :: Bool- , apLayoutStart :: LayoutStartCol-- }---- -----------------------------------------------------------------------deltaOptions :: Rigidity -> DeltaOptions-deltaOptions ridigity =- DeltaOptions- { curSrcSpan = GHC.noSrcSpan- , annConName = annGetConstr ()- , drRigidity = ridigity- , drContext = defaultACS- }--normalLayout :: DeltaOptions-normalLayout = deltaOptions NormalLayout--defaultDeltaState :: [Comment] -> Pos -> GHC.ApiAnns -> DeltaState-defaultDeltaState injectedComments priorEnd ga =- DeltaState- { priorEndPosition = priorEnd- , apComments = cs ++ injectedComments- , apAnns = ga- , apLayoutStart = 1- , apMarkLayout = False- }- where- cs :: [Comment]- cs = extractComments ga----- Writer helpers--tellFinalAnn :: (AnnKey, Annotation) -> Delta ()-tellFinalAnn (k, v) =- -- tell (mempty { dwAnns = Endo (Map.insertWith (<>) k v) })- tell (mempty { dwAnns = Endo (Map.insert k v) })--tellSortKey :: [AnnSpan] -> Delta ()-tellSortKey xs = tell (mempty { sortKeys = Just xs } )--tellCapturedSpan :: AnnKey -> Delta ()-tellCapturedSpan key = tell ( mempty { dwCapturedSpan = First $ Just key })--tellKd :: (KeywordId, DeltaPos) -> Delta ()-tellKd kd = tell (mempty { annKds = [kd] })--#if __GLASGOW_HASKELL__ >= 804-instance Semigroup DeltaWriter where- (<>) = mappend-#endif--instance Monoid DeltaWriter where- mempty = DeltaWriter mempty mempty mempty mempty- (DeltaWriter a b e g) `mappend` (DeltaWriter c d f h)- = DeltaWriter (a <> c) (b <> d) (e <> f) (g <> h)---------------------------------------- Free Monad Interpretation code--deltaInterpret :: Annotated a -> Delta a-deltaInterpret = iterTM go- where- go :: AnnotationF (Delta a) -> Delta a- go (MarkEOF next) = addEofAnnotation >> next- go (MarkPrim kwid _ next) = addDeltaAnnotation kwid >> next- go (MarkPPOptional kwid _ next) = addDeltaAnnotation kwid >> next-#if __GLASGOW_HASKELL__ >= 800- go (MarkInstead akwid kwid next) = addDeltaAnnotationInstead akwid kwid >> next-#endif- go (MarkOutside akwid kwid next) = addDeltaAnnotationsOutside akwid kwid >> next- go (MarkInside akwid next) = addDeltaAnnotationsInside akwid >> next- go (MarkMany akwid next) = addDeltaAnnotations akwid >> next- go (MarkManyOptional akwid next) = addDeltaAnnotations akwid >> next- go (MarkOffsetPrim akwid n _ next) = addDeltaAnnotationLs akwid n >> next- go (MarkOffsetPrimOptional akwid n _ next) = addDeltaAnnotationLs akwid n >> next- go (WithAST lss prog next) = withAST lss (deltaInterpret prog) >> next- go (CountAnns kwid next) = countAnnsDelta kwid >>= next- go (SetLayoutFlag r action next) = do- rigidity <- asks drRigidity- (if r <= rigidity then setLayoutFlag else id) (deltaInterpret action)- next- go (MarkAnnBeforeAnn ann1 ann2 next) = deltaMarkAnnBeforeAnn ann1 ann2 >> next- go (MarkExternal ss akwid _ next) = addDeltaAnnotationExt (rs ss) akwid >> next- go (StoreOriginalSrcSpan _ key next) = storeOriginalSrcSpanDelta key >>= next- go (GetSrcSpanForKw ss kw next) = getSrcSpanForKw ss kw >>= next-#if __GLASGOW_HASKELL__ <= 710- go (StoreString s ss next) = storeString s ss >> next-#endif- go (AnnotationsToComments kws next) = annotationsToCommentsDelta kws >> next-#if __GLASGOW_HASKELL__ <= 710- go (AnnotationsToCommentsBF _ kws next) = annotationsToCommentsDelta kws >> next- go (FinalizeBF _ next) = next-#endif- go (WithSortKey kws next) = withSortKey kws >> next- go (WithSortKeyContexts ctx kws next) = withSortKeyContexts ctx kws >> next-- go (SetContextLevel ctxt lvl action next) = setContextDelta ctxt lvl (deltaInterpret action) >> next- go (UnsetContext _ctxt action next) = deltaInterpret action >> next- go (IfInContext ctxt ifAction elseAction next) = ifInContextDelta ctxt ifAction elseAction >> next- go (TellContext _ next) = next--withSortKey :: [(AnnSpan, Annotated b)] -> Delta ()-withSortKey kws =- let order = sortBy (comparing fst) kws- in do- tellSortKey (map fst order)- mapM_ (deltaInterpret . snd) order---withSortKeyContexts :: ListContexts -> [(AnnSpan, Annotated ())] -> Delta ()-withSortKeyContexts ctxts kws = do- tellSortKey (map fst order)- withSortKeyContextsHelper deltaInterpret ctxts order- where- order = sortBy (comparing fst) kws---setLayoutFlag :: Delta () -> Delta ()-setLayoutFlag action = do- oldLay <- gets apLayoutStart- modify (\s -> s { apMarkLayout = True } )- let reset = do- modify (\s -> s { apMarkLayout = False- , apLayoutStart = oldLay })- action <* reset---- -----------------------------------------------------------------------setContextDelta :: Set.Set AstContext -> Int -> Delta () -> Delta ()-setContextDelta ctxt lvl =- local (\s -> s { drContext = setAcsWithLevel ctxt lvl (drContext s) } )--ifInContextDelta :: Set.Set AstContext -> Annotated () -> Annotated () -> Delta ()-ifInContextDelta ctxt ifAction elseAction = do- cur <- asks drContext- let inContext = inAcs ctxt cur- if inContext- then deltaInterpret ifAction- else deltaInterpret elseAction---- -----------------------------------------------------------------------storeOriginalSrcSpanDelta :: AnnKey -> Delta AnnKey-storeOriginalSrcSpanDelta key = do- tellCapturedSpan key- return key--#if __GLASGOW_HASKELL__ <= 710-storeString :: String -> GHC.SrcSpan -> Delta ()-storeString s ss = addAnnotationWorker (AnnString s) ss-#endif---- ------------------------------------------------------------------------- |In order to interleave annotations into the stream, we turn them into--- comments.-annotationsToCommentsDelta :: [GHC.AnnKeywordId] -> Delta ()-annotationsToCommentsDelta kws = do- ss <- getSrcSpan- cs <- gets apComments- let- doOne :: GHC.AnnKeywordId -> Delta [Comment]- doOne kw = do- (spans,_) <- getAndRemoveAnnotationDelta ss kw- return $ map (mkKWComment kw . sr) spans- -- TODO:AZ make sure these are sorted/merged properly when the invariant for- -- allocateComments is re-established.- newComments <- mapM doOne kws- putUnallocatedComments (cs ++ concat newComments)---- ------------------------------------------------------------------------- | This function exists to overcome a shortcoming in the GHC AST for 7.10.1-getSrcSpanForKw :: GHC.SrcSpan -> GHC.AnnKeywordId -> Delta GHC.SrcSpan-getSrcSpanForKw _ kw = do- ga <- gets apAnns- ss <- getSrcSpan- case GHC.getAnnotation ga (rs ss) kw of- [] -> return GHC.noSrcSpan-#if __GLASGOW_HASKELL__ >= 900- (sp:_) -> return (GHC.RealSrcSpan sp Nothing)-#else- (sp:_) -> return sp-#endif---- -----------------------------------------------------------------------getSrcSpan :: Delta GHC.SrcSpan-getSrcSpan = asks curSrcSpan--#if (__GLASGOW_HASKELL__ > 806) && (__GLASGOW_HASKELL__ < 900)-withSrcSpanDelta :: (Data (GHC.SrcSpanLess a), GHC.HasSrcSpan a) => a -> Delta b -> Delta b-withSrcSpanDelta (GHC.dL->GHC.L l a) =-#else-withSrcSpanDelta :: Data a => GHC.Located a -> Delta b -> Delta b-withSrcSpanDelta (GHC.L l a) =-#endif- local (\s -> s { curSrcSpan = l- , annConName = annGetConstr a- , drContext = pushAcs (drContext s)- `debug` ("withSrcSpanDelta: (l,annConName,drContext)=" ++ showGhc (l,annGetConstr a, pushAcs (drContext s)))- })---getUnallocatedComments :: Delta [Comment]-getUnallocatedComments = gets apComments--putUnallocatedComments :: [Comment] -> Delta ()-putUnallocatedComments cs = modify (\s -> s { apComments = cs } )---- -----------------------------------------------------------------------adjustDeltaForOffsetM :: DeltaPos -> Delta DeltaPos-adjustDeltaForOffsetM dp = do- colOffset <- gets apLayoutStart- return (adjustDeltaForOffset colOffset dp)--adjustDeltaForOffset :: LayoutStartCol -> DeltaPos -> DeltaPos-adjustDeltaForOffset _colOffset dp@(DP (0,_)) = dp -- same line-adjustDeltaForOffset (LayoutStartCol colOffset) (DP (l,c)) = DP (l,c - colOffset)---- -----------------------------------------------------------------------getPriorEnd :: Delta Pos-getPriorEnd = gets priorEndPosition--setPriorEnd :: Pos -> Delta ()-setPriorEnd pe =- modify (\s -> s { priorEndPosition = pe })--setPriorEndAST :: AnnSpan -> Delta ()-setPriorEndAST pe = do- setLayoutStart (snd (ss2pos (sr pe)))- modify (\s -> s { priorEndPosition = ss2posEnd (sr pe) } )--setLayoutStart :: Int -> Delta ()-setLayoutStart p = do- DeltaState{apMarkLayout} <- get- when apMarkLayout (- modify (\s -> s { apMarkLayout = False- , apLayoutStart = LayoutStartCol p}))----- ---------------------------------------peekAnnotationDelta :: GHC.AnnKeywordId -> Delta [AnnSpan]-peekAnnotationDelta an = do- ga <- gets apAnns- ss <- getSrcSpan-#if __GLASGOW_HASKELL__ <= 710- return $ GHC.getAnnotation ga ss an-#else- let unicodeAnns = case unicodeEquivalent an of- [] -> []- [kw] -> GHC.getAnnotation ga (rs ss) kw- (kw:_) -> GHC.getAnnotation ga (rs ss) kw -- Keep exhaustiveness checker happy- return $ unicodeAnns ++ GHC.getAnnotation ga (rs ss) an-#endif--getAnnotationDelta :: GHC.AnnKeywordId -> Delta ([AnnSpan],GHC.AnnKeywordId)-getAnnotationDelta an = do- ss <- getSrcSpan- getAndRemoveAnnotationDelta ss an--getAndRemoveAnnotationDelta :: GHC.SrcSpan -> GHC.AnnKeywordId -> Delta ([AnnSpan],GHC.AnnKeywordId)-getAndRemoveAnnotationDelta sp an = do- ga <- gets apAnns-#if __GLASGOW_HASKELL__ <= 710- let (r,ga') = GHC.getAndRemoveAnnotation ga sp an- kw = an-#else- let (r,ga',kw) = case GHC.getAndRemoveAnnotation ga (rs sp) an of- ([],_) -> (ss,g,k)- where- k = GHC.unicodeAnn an- (ss,g) = GHC.getAndRemoveAnnotation ga (rs sp) k- (ss,g) -> (ss,g,an)-#endif- modify (\s -> s { apAnns = ga' })- return (r,kw)--getOneAnnotationDelta :: GHC.AnnKeywordId -> Delta ([AnnSpan],GHC.AnnKeywordId)-getOneAnnotationDelta an = do- ss <- getSrcSpan- getAndRemoveOneAnnotationDelta ss an--getAndRemoveOneAnnotationDelta :: GHC.SrcSpan -> GHC.AnnKeywordId -> Delta ([AnnSpan],GHC.AnnKeywordId)-getAndRemoveOneAnnotationDelta sp an = do-#if __GLASGOW_HASKELL__ >= 900- ann <- gets apAnns- let anns = GHC.apiAnnItems ann- let cs = GHC.apiAnnComments ann -- TODO:AZ: what about apiAnnRogueComments?-#else- (anns,cs) <- gets apAnns-#endif--#if __GLASGOW_HASKELL__ <= 710- let (r,ga',kw) = case Map.lookup (sp,an) anns of- Nothing -> ([],(anns,cs),an)- Just [] -> ([], (Map.delete (sp,an) anns,cs),an)- Just (s:ss) -> ([s],(Map.insert (sp,an) ss anns,cs),an)-#else- let getKw kw =- case Map.lookup (rs sp,kw) anns of- Nothing -> ([],(anns,cs),kw)- Just [] -> ([], (Map.delete (rs sp,kw) anns,cs),kw)- Just (s:ss) -> ([s],(Map.insert (rs sp,kw) ss anns,cs),kw)-- let (r,(a',c'),kw) =- case getKw an of- ([],_,_) -> getKw (GHC.unicodeAnn an)- v -> v-#if __GLASGOW_HASKELL__ >= 900- let ga' = ann { GHC.apiAnnItems = a', GHC.apiAnnComments = c' }-#else- let ga' = (a',c')-#endif-#endif- modify (\s -> s { apAnns = ga' })- return (r,kw)---- ------------------------------------------------------------------------- |Add some annotation to the currently active SrcSpan-addAnnotationsDelta :: Annotation -> Delta ()-addAnnotationsDelta ann = do- l <- ask- tellFinalAnn (getAnnKey l,ann)--getAnnKey :: DeltaOptions -> AnnKey-getAnnKey DeltaOptions {curSrcSpan, annConName}- = AnnKey (rs curSrcSpan) annConName---- ---------------------------------------addAnnDeltaPos :: KeywordId -> DeltaPos -> Delta ()-addAnnDeltaPos kw dp = tellKd (kw, dp)---- ----------------------------------------- | Enter a new AST element. Maintain SrcSpan stack-#if (__GLASGOW_HASKELL__ > 806) && (__GLASGOW_HASKELL__ < 900)-withAST :: (Data a, Data (GHC.SrcSpanLess a), GHC.HasSrcSpan a)- => a- -> Delta b -> Delta b-withAST lss@(GHC.dL->GHC.L ss _) action = do-#else-withAST :: Data a- => GHC.Located a- -> Delta b -> Delta b-withAST lss@(GHC.L ss _) action = do-#endif- -- Calculate offset required to get to the start of the SrcSPan- off <- gets apLayoutStart- (resetAnns . withSrcSpanDelta lss) (do-- let maskWriter s = s { annKds = []- , sortKeys = Nothing- , dwCapturedSpan = mempty }-- -- make sure all kds are relative to the start of the SrcSpan- let spanStart = ss2pos ss-- cs <- do- priorEndBeforeComments <- getPriorEnd- if GHC.isGoodSrcSpan ss && priorEndBeforeComments < ss2pos ss- then- commentAllocation (priorComment spanStart) return- else- return []- priorEndAfterComments <- getPriorEnd- let edp = adjustDeltaForOffset- -- Use the propagated offset if one is set- -- Note that we need to use the new offset if it has- -- changed.- off (ss2delta priorEndAfterComments ss)- -- Preparation complete, perform the action- when (GHC.isGoodSrcSpan ss && priorEndAfterComments < ss2pos ss) (do- modify (\s -> s { priorEndPosition = ss2pos ss } ))- (res, w) <- censor maskWriter (listen action)-- let kds = annKds w- an = Ann- { annEntryDelta = edp- , annPriorComments = cs- , annFollowingComments = [] -- only used in Transform and Print- , annsDP = kds- , annSortKey = sortKeys w- , annCapturedSpan = getFirst $ dwCapturedSpan w }-- addAnnotationsDelta an- `debug` ("leaveAST:(annkey,an)=" ++ show (mkAnnKey lss,an))- return res)--resetAnns :: Delta a -> Delta a-resetAnns action = do- ans <- gets apAnns- action <* modify (\s -> s { apAnns = ans })----- ------------------------------------------------------------------------ |Split the ordered list of comments into ones that occur prior to--- the give SrcSpan and the rest-priorComment :: Pos -> Comment -> Bool-priorComment start c = (ss2pos . sr . commentIdentifier $ c) < start---- TODO:AZ: We scan the entire comment list here. It may be better to impose an--- invariant that the comments are sorted, and consume them as the pos--- advances. It then becomes a process of using `takeWhile p` rather than a full--- partition.-allocateComments :: (Comment -> Bool) -> [Comment] -> ([Comment], [Comment])-allocateComments = partition---- -----------------------------------------------------------------------addAnnotationWorker :: KeywordId -> AnnSpan -> Delta ()-addAnnotationWorker ann pa =- -- Zero-width source spans are injected by the GHC Lexer when it puts virtual- -- '{', ';' and '}' tokens in for layout- unless (isPointSrcSpan pa) $- do- pe <- getPriorEnd- ss <- getSrcSpan- let p = ss2delta pe (sr pa)- case (ann,isGoodDelta p) of- (G GHC.AnnComma,False) -> return ()- (G GHC.AnnSemi, False) -> return ()- (G GHC.AnnOpen, False) -> return ()- (G GHC.AnnClose,False) -> return ()- _ -> do- p' <- adjustDeltaForOffsetM p- commentAllocation (priorComment (ss2pos (sr pa))) (mapM_ (uncurry addDeltaComment))-#if __GLASGOW_HASKELL__ <= 710- addAnnDeltaPos (checkUnicode ann pa) p'-#else- addAnnDeltaPos ann p'-#endif- setPriorEndAST pa- `debug` ("addAnnotationWorker:(ss,ss,pe,pa,p,p',ann)=" ++ show (showGhc ss,showGhc ss,pe,showGhc pa,p,p',ann))--#if __GLASGOW_HASKELL__ <= 710-checkUnicode :: KeywordId -> GHC.SrcSpan -> KeywordId-checkUnicode gkw@(G kw) ss =- if kw `Set.member` unicodeSyntax- then- let s = keywordToString gkw in- if length s /= spanLength ss- then AnnUnicode kw- else gkw- else- gkw- where- unicodeSyntax = Set.fromList- [ GHC.AnnDcolon- , GHC.AnnDarrow- , GHC.AnnForall- , GHC.AnnRarrow- , GHC.AnnLarrow- , GHC.Annlarrowtail- , GHC.Annrarrowtail- , GHC.AnnLarrowtail- , GHC.AnnRarrowtail]-checkUnicode kwid _ = kwid-#else--unicodeEquivalent :: GHC.AnnKeywordId -> [GHC.AnnKeywordId]-unicodeEquivalent kw =- case Map.lookup kw unicodeSyntax of- Nothing -> []- Just kwu -> [kwu]- where- unicodeSyntax = Map.fromList- [ (GHC.AnnDcolon, GHC.AnnDcolonU)- , (GHC.AnnDarrow, GHC.AnnDarrowU)- , (GHC.AnnForall, GHC.AnnForallU)- , (GHC.AnnRarrow, GHC.AnnRarrowU)- , (GHC.AnnLarrow, GHC.AnnLarrowU)- , (GHC.Annlarrowtail, GHC.AnnlarrowtailU)- , (GHC.Annrarrowtail, GHC.AnnrarrowtailU)- , (GHC.AnnLarrowtail, GHC.AnnLarrowtailU)- , (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----- -----------------------------------------------------------------------commentAllocation :: (Comment -> Bool)- -> ([(Comment, DeltaPos)] -> Delta a)- -> Delta a-commentAllocation p k = do- cs <- getUnallocatedComments- let (allocated,cs') = allocateComments p cs- putUnallocatedComments cs'- k =<< mapM makeDeltaComment (sortOn (unpack . commentIdentifier) allocated)- where- -- unpack a RealSrcSpan into ((start line, start col), (end line, end col)).- -- The file name is ignored.-#if __GLASGOW_HASKELL__ >= 900- unpack :: GHC.RealSrcSpan -> Maybe ((Int, Int), (Int, Int))- unpack x =-#else- unpack :: GHC.SrcSpan -> Maybe ((Int, Int), (Int, Int))- unpack (GHC.RealSrcSpan x) =-#endif- Just ( (GHC.srcSpanStartLine x, GHC.srcSpanStartCol x)- , (GHC.srcSpanEndLine x, GHC.srcSpanEndCol x) )- unpack _ = Nothing--makeDeltaComment :: Comment -> Delta (Comment, DeltaPos)-makeDeltaComment c = do- let pa = commentIdentifier c- pe <- getPriorEnd- let p = ss2delta pe (sr pa)- p' <- adjustDeltaForOffsetM p- setPriorEnd (ss2posEnd (sr pa))- return (c, p')--addDeltaComment :: Comment -> DeltaPos -> Delta ()-addDeltaComment d p = do- addAnnDeltaPos (AnnComment d) p---- ------------------------------------------------------------------------- |If the first annotation has a smaller SrcSpan than the second, then mark it.-deltaMarkAnnBeforeAnn :: GHC.AnnKeywordId -> GHC.AnnKeywordId -> Delta ()-deltaMarkAnnBeforeAnn annBefore annAfter = do- ss <- getSrcSpan- mb <- peekAnnotationDelta annBefore- ma <- peekAnnotationDelta annAfter- let- before = sort $ filter (\s -> GHC.isSubspanOf (sr s) ss) mb- after = sort $ filter (\s -> GHC.isSubspanOf (sr s) ss) ma- case (before,after) of- (b:_, a:_) -> when (b < a) $ addDeltaAnnotation annBefore- _ -> return ()---- ------------------------------------------------------------------------- | Look up and add a Delta annotation at the current position, and--- advance the position to the end of the annotation-addDeltaAnnotation :: GHC.AnnKeywordId -> Delta ()-addDeltaAnnotation ann' = do- ss <- getSrcSpan- (ma,ann) <- getOneAnnotationDelta ann'- case nub ma of -- ++AZ++ TODO: get rid of duplicates earlier- [] -> return () `debug` ("addDeltaAnnotation empty ma for:" ++ show (ss,ann))- [pa] -> addAnnotationWorker (G ann) pa- (pa:_) -> addAnnotationWorker (G ann) pa `warn` ("addDeltaAnnotation:(ss,ann,ma)=" ++ showGhc (ss,ann,ma))---- | Look up and add a Delta annotation at the current position, and--- advance the position to the end of the annotation-addDeltaAnnotationLs :: GHC.AnnKeywordId -> Int -> Delta ()-addDeltaAnnotationLs ann off = do- ss <- getSrcSpan- ma <- peekAnnotationDelta ann- let ma' = filter (\s -> GHC.isSubspanOf (sr s) ss) ma- case drop off ma' of- [] -> return ()- `debug` ("addDeltaAnnotationLs:missed:(off,ann,ma)=" ++ showGhc (off,ss,ann))- (pa:_) -> addAnnotationWorker (G ann) pa---- | Look up and add possibly multiple Delta annotation at the current--- position, and advance the position to the end of the annotations-addDeltaAnnotations :: GHC.AnnKeywordId -> Delta ()-addDeltaAnnotations ann = do- (ma,kw) <- getAnnotationDelta ann- let do_one ap' = addAnnotationWorker (G kw) ap'- `debug` ("addDeltaAnnotations:do_one:(ap',ann)=" ++ showGhc (ap',ann))- mapM_ do_one (sort ma)---- | Look up and add possibly multiple Delta annotations enclosed by--- the current SrcSpan at the current position, and advance the--- position to the end of the annotations-addDeltaAnnotationsInside :: GHC.AnnKeywordId -> Delta ()-addDeltaAnnotationsInside ann = do- ss <- getSrcSpan- ma <- peekAnnotationDelta ann- let do_one ap' = addAnnotationWorker (G ann) ap'- -- `debug` ("addDeltaAnnotations:do_one:(ap',ann)=" ++ showGhc (ap',ann))- let filtered = sort $ filter (\s -> GHC.isSubspanOf (sr s) ss) ma- mapM_ do_one filtered---- ----------------------------------------------------------------------#if __GLASGOW_HASKELL__ >= 800-addDeltaAnnotationInstead :: GHC.AnnKeywordId -> KeywordId -> Delta ()-addDeltaAnnotationInstead ann' kw = do- ss <- getSrcSpan- (ma,ann) <- getOneAnnotationDelta ann'- case nub ma of -- ++AZ++ TODO: get rid of duplicates earlier- [] -> return () `debug` ("addDeltaAnnotation empty ma for:" ++ show (ss,ann))- [pa] -> addAnnotationWorker kw pa- (pa:_) -> addAnnotationWorker kw pa `warn` ("addDeltaAnnotationInstead:(ss,ann,kw,ma)=" ++ showGhc (ss,ann,kw,ma))-#endif--- ------------------------------------------------------------------------- | Look up and add possibly multiple Delta annotations not enclosed by--- the current SrcSpan at the current position, and advance the--- position to the end of the annotations--- The first argument (gann) is the one to look up in the GHC annotations, the--- second is the one to apply in the ghc-exactprint ones. These are different--- for GHC.AnnSemi mapping to AnnSemiSep, to ensure that it reflects the ';'--- outside the current span.-addDeltaAnnotationsOutside :: GHC.AnnKeywordId -> KeywordId -> Delta ()-addDeltaAnnotationsOutside gann ann = do- ss <- getSrcSpan- (ma,kw) <- getAndRemoveAnnotationDelta ss gann- let do_one ap' = if ann == AnnSemiSep- then addAnnotationWorker ann ap'- else addAnnotationWorker (G kw) ap'- mapM_ do_one (sort $ filter (\s -> not (GHC.isSubspanOf (sr s) ss)) ma)---- | Add a Delta annotation at the current position, and advance the--- position to the end of the annotation-addDeltaAnnotationExt :: AnnSpan -> GHC.AnnKeywordId -> Delta ()-addDeltaAnnotationExt s ann = addAnnotationWorker (G ann) s--addEofAnnotation :: Delta ()-#if __GLASGOW_HASKELL__ >= 900-addEofAnnotation = do- pe <- getPriorEnd- ga <- gets apAnns- let Just pa = GHC.apiAnnEofPos ga- commentAllocation (const True) (mapM_ (uncurry addDeltaComment))- let DP (r,c) = ss2delta pe (sr pa)- addAnnDeltaPos AnnEofPos (DP (r, c - 1))- setPriorEndAST pa-#else-addEofAnnotation = do- pe <- getPriorEnd- (ma,_kw) <- withSrcSpanDelta (GHC.noLoc () :: GHC.GenLocated GHC.SrcSpan ())- (getAnnotationDelta GHC.AnnEofPos)- case ma of- [] -> return ()- (pa:pss) -> do- commentAllocation (const True) (mapM_ (uncurry addDeltaComment))- let DP (r,c) = ss2delta pe pa- addAnnDeltaPos (G GHC.AnnEofPos) (DP (r, c - 1))- setPriorEndAST pa `warn` ("Trailing annotations after Eof: " ++ showGhc pss)-#endif---- -----------------------------------------------------------------------countAnnsDelta :: GHC.AnnKeywordId -> Delta Int-countAnnsDelta ann = do- ma <- peekAnnotationDelta ann- return (length ma)
+ src/Language/Haskell/GHC/ExactPrint/ExactPrint.hs view
@@ -0,0 +1,3884 @@+{-# LANGUAGE DeriveDataTypeable #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE MultiWayIf #-}+{-# LANGUAGE NamedFieldPuns #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeSynonymInstances #-}+{-# LANGUAGE ViewPatterns #-}+{-# LANGUAGE UndecidableInstances #-} -- For the (StmtLR GhcPs GhcPs (LocatedA (body GhcPs))) ExactPrint instance++module Language.Haskell.GHC.ExactPrint.ExactPrint+ (+ ExactPrint(..)+ , exactPrint+ -- , exactPrintWithOptions+ ) where++import GHC+import GHC.Core.Coercion.Axiom (Role(..))+import GHC.Data.Bag+import qualified GHC.Data.BooleanFormula as BF+import GHC.Data.FastString+import GHC.Types.Basic hiding (EP)+import GHC.Types.Fixity+import GHC.Types.ForeignCall+import GHC.Types.SourceText+import GHC.Types.Var+import GHC.Utils.Outputable hiding ( (<>) )+import GHC.Unit.Module.Warnings+import GHC.Utils.Misc+import GHC.Utils.Panic++import Control.Monad.Identity+import Control.Monad.RWS+import Data.Data ( Data )+import Data.Foldable+import qualified Data.Set.Ordered as OSet+import Data.Typeable+import Data.List ( partition, sort, sortBy)+import Data.Maybe ( isJust )++import Data.Void++import Language.Haskell.GHC.ExactPrint.Lookup+import Language.Haskell.GHC.ExactPrint.Utils+import Language.Haskell.GHC.ExactPrint.Types++-- import Debug.Trace++-- ---------------------------------------------------------------------++exactPrint :: ExactPrint ast => Located ast -> String+exactPrint ast = runIdentity (runEP stringOptions (markAnnotated ast))++type EP w m a = RWST (PrintOptions m w) (EPWriter w) EPState m a+type EPP a = EP String Identity a++runEP :: PrintOptions Identity String+ -> Annotated () -> Identity String+runEP epReader action =+ fmap (output . snd) .+ (\next -> execRWST next epReader defaultEPState)+ . xx $ action++xx :: Annotated () -> EP String Identity ()+-- xx :: Annotated() -> RWST (PrintOptions m w) (EPWriter w) EPState m ()+xx = id++-- ---------------------------------------------------------------------++defaultEPState :: EPState+defaultEPState = EPState+ { epPos = (1,1)+ , dLHS = 0+ , pMarkLayout = False+ , pLHS = 0+ , dMarkLayout = False+ , dPriorEndPosition = (1,1)+ , uAnchorSpan = badRealSrcSpan+ , uExtraDP = Nothing+ , epComments = []+ }+++-- ---------------------------------------------------------------------+-- The EP monad and basic combinators++-- | The R part of RWS. The environment. Updated via 'local' as we+-- enter a new AST element, having a different anchor point.+data PrintOptions m a = PrintOptions+ {+ epAnn :: !Annotation+ , epAstPrint :: forall ast . Data ast => GHC.Located ast -> a -> m a+ , epTokenPrint :: String -> m a+ , epWhitespacePrint :: String -> m a+ , epRigidity :: Rigidity+ }++-- | Helper to create a 'PrintOptions'+printOptions ::+ (forall ast . Data ast => GHC.Located ast -> a -> m a)+ -> (String -> m a)+ -> (String -> m a)+ -> Rigidity+ -> PrintOptions m a+printOptions astPrint tokenPrint wsPrint rigidity = PrintOptions+ {+ epAnn = annNone+ , epAstPrint = astPrint+ , epWhitespacePrint = wsPrint+ , epTokenPrint = tokenPrint+ , epRigidity = rigidity+ }++-- | Options which can be used to print as a normal String.+stringOptions :: PrintOptions Identity String+stringOptions = printOptions (\_ b -> return b) return return NormalLayout++data EPWriter a = EPWriter+ { output :: !a }++instance Monoid w => Semigroup (EPWriter w) where+ (EPWriter a) <> (EPWriter b) = EPWriter (a <> b)++instance Monoid w => Monoid (EPWriter w) where+ mempty = EPWriter mempty++data EPState = EPState+ { uAnchorSpan :: !RealSrcSpan -- ^ in pre-changed AST+ -- reference frame, from+ -- Annotation+ , uExtraDP :: !(Maybe Anchor) -- ^ Used to anchor a+ -- list++ -- Print phase+ , epPos :: !Pos -- ^ Current output position+ , pMarkLayout :: !Bool+ , pLHS :: !LayoutStartCol++ -- Delta phase+ , dPriorEndPosition :: !Pos -- ^ End of Position reached+ -- when processing the+ -- preceding element+ , dMarkLayout :: !Bool+ , dLHS :: !LayoutStartCol++ -- Shared+ , epComments :: ![Comment]+ }++-- ---------------------------------------------------------------------++-- AZ:TODO: this can just be a function :: (EpAnn a) -> Entry+class HasEntry ast where+ fromAnn :: ast -> Entry++-- ---------------------------------------------------------------------++-- type Annotated = FreeT AnnotationF Identity+type Annotated a = EP String Identity a++-- ---------------------------------------------------------------------++-- | Key entry point. Switches to an independent AST element with its+-- own annotation, calculating new offsets, etc+markAnnotated :: ExactPrint a => a -> Annotated ()+markAnnotated a = enterAnn (getAnnotationEntry a) a++-- | For HsModule, because we do not have a proper SrcSpan, we must+-- indicate to flush trailing comments when done.+data FlushComments = FlushComments+ | NoFlushComments+ deriving (Eq, Show)++data Entry = Entry Anchor EpAnnComments FlushComments+ | NoEntryVal++instance HasEntry (SrcSpanAnn' (EpAnn an)) where+ fromAnn (SrcSpanAnn EpAnnNotUsed ss) = Entry (spanAsAnchor ss) emptyComments NoFlushComments+ fromAnn (SrcSpanAnn an _) = fromAnn an++instance HasEntry (EpAnn a) where+ fromAnn (EpAnn anchor _ cs) = Entry anchor cs NoFlushComments+ fromAnn EpAnnNotUsed = NoEntryVal++-- ---------------------------------------------------------------------++fromAnn' :: (HasEntry a) => a -> Entry+fromAnn' an = case fromAnn an of+ NoEntryVal -> NoEntryVal+ Entry a c _ -> Entry a c FlushComments++-- ---------------------------------------------------------------------++astId :: (Typeable a) => a -> String+astId a = show (typeOf a)++-- | "Enter" an annotation, by using the associated 'anchor' field as+-- the new reference point for calculating all DeltaPos positions.+--+-- This is combination of the ghc=exactprint Delta.withAST and+-- Print.exactPC functions and effectively does the delta processing+-- immediately followed by the print processing. JIT ghc-exactprint.+enterAnn :: (ExactPrint a) => Entry -> a -> Annotated ()+enterAnn NoEntryVal a = do+ p <- getPosP+ debugM $ "enterAnn:NO ANN:(p,a) =" ++ show (p, astId a) ++ " starting"+ exact a+ debugM $ "enterAnn:NO ANN:p =" ++ show (p, astId a) ++ " done"+enterAnn (Entry anchor' cs flush) a = do+ p <- getPosP+ debugM $ "enterAnn:(p,a) =" ++ show (p, astId a) ++ " starting"+ -- debugM $ "enterAnn:(cs) =" ++ showGhc (cs)+ let curAnchor = anchor anchor' -- As a base for the current AST element+ debugM $ "enterAnn:(curAnchor):=" ++ show (rs2range curAnchor)+ addCommentsA (priorComments cs)+ printComments curAnchor+ -- -------------------------+ case anchor_op anchor' of+ MovedAnchor dp -> do+ debugM $ "enterAnn: MovedAnchor:" ++ show dp+ -- Set the original anchor as prior end, so the rest of this AST+ -- fragment has a reference+ -- BUT: this means the entry DP can be calculated incorrectly too,+ -- for immediately nested items.+ setPriorEndNoLayoutD (ss2pos curAnchor)+ _ -> do+ return ()+ -- -------------------------+ setAnchorU curAnchor+ -- -------------------------------------------------------------------+ -- The first part corresponds to the delta phase, so should only use+ -- delta phase variables+ -- -----------------------------------+ -- Calculate offset required to get to the start of the SrcSPan+ off <- gets dLHS+ let spanStart = ss2pos curAnchor+ priorEndAfterComments <- getPriorEndD+ let edp' = adjustDeltaForOffset 0+ -- Use the propagated offset if one is set+ -- Note that we need to use the new offset if it has+ -- changed.+ off (ss2delta priorEndAfterComments curAnchor)+ debugM $ "enterAnn: (edp',off,priorEndAfterComments,curAnchor):" ++ show (edp',off,priorEndAfterComments,rs2range curAnchor)+ let edp'' = case anchor_op anchor' of+ MovedAnchor dp -> dp+ _ -> edp'+ -- ---------------------------------------------+ -- let edp = edp''+ med <- getExtraDP+ setExtraDP Nothing+ let edp = case med of+ Nothing -> edp''+ Just (Anchor _ (MovedAnchor dp)) -> dp+ -- Replace original with desired one. Allows all+ -- list entry values to be DP (1,0)+ Just (Anchor r _) -> dp+ where+ dp = adjustDeltaForOffset 0+ off (ss2delta priorEndAfterComments r)+ when (isJust med) $ debugM $ "enterAnn:(med,edp)=" ++ show (med,edp)+ -- ---------------------------------------------+ -- Preparation complete, perform the action+ when (priorEndAfterComments < spanStart) (do+ debugM $ "enterAnn.dPriorEndPosition:spanStart=" ++ show spanStart+ modify (\s -> s { dPriorEndPosition = spanStart } ))++ debugM $ "enterAnn: (anchor_op, curAnchor):" ++ show (anchor_op anchor', rs2range curAnchor)+ debugM $ "enterAnn: (dLHS,spanStart,pec,edp)=" ++ show (off,spanStart,priorEndAfterComments,edp)++ -- end of delta phase processing+ -- -------------------------------------------------------------------+ -- start of print phase processing++ let mflush = when (flush == FlushComments) $ do+ debugM $ "flushing comments in enterAnn"+ flushComments (getFollowingComments cs)+ -- flushComments []++ let+ st = annNone { annEntryDelta = edp }+ withOffset st (advance edp >> exact a >> mflush)++ when (flush == NoFlushComments) $ do+ when ((getFollowingComments cs) /= []) $ do+ debugM $ "starting trailing comments:" ++ showAst (getFollowingComments cs)+ mapM_ printOneComment (map tokComment $ getFollowingComments cs)+ debugM $ "ending trailing comments"++-- ---------------------------------------------------------------------++addCommentsA :: [LEpaComment] -> EPP ()+addCommentsA csNew = addComments (map tokComment csNew)++addComments :: [Comment] -> EPP ()+addComments csNew = do+ debugM $ "addComments:" ++ show csNew+ cs <- getUnallocatedComments+ -- Make sure we merge duplicates while sorting, needed until+ -- https://gitlab.haskell.org/ghc/ghc/-/issues/20239 is resolved+ let ocs = OSet.fromList cs+ let ncs = OSet.fromList csNew+ putUnallocatedComments (OSet.toAscList (ocs OSet.<>| ncs))+++-- ---------------------------------------------------------------------++-- | Just before we print out the EOF comments, flush the remaining+-- ones in the state.+flushComments :: [LEpaComment] -> EPP ()+flushComments trailing = do+ addCommentsA trailing+ cs <- getUnallocatedComments+ -- Must compare without span filenames, for CPP injected comments with fake filename+ let cmp (Comment _ l1 _) (Comment _ l2 _) = compare (ss2pos $ anchor l1) (ss2pos $ anchor l2)+ debugM $ "flushing comments starting"+ mapM_ printOneComment (sortBy cmp cs)+ debugM $ "flushing comments done"++-- ---------------------------------------------------------------------++-- |In order to interleave annotations into the stream, we turn them into+-- comments.+annotationsToComments :: [AddEpAnn] -> [AnnKeywordId] -> EPP ()+annotationsToComments ans kws = do+ let+ getSpans _ [] = []+ getSpans k1 (AddEpAnn k2 ss:as)+ | k1 == k2 = ss : getSpans k1 as+ | otherwise = getSpans k1 as+ doOne :: AnnKeywordId -> EPP [Comment]+ doOne kw = do+ let sps =getSpans kw ans+ return $ map (mkKWComment kw ) sps+ -- TODO:AZ make sure these are sorted/merged properly when the invariant for+ -- allocateComments is re-established.+ newComments <- mapM doOne kws+ addComments (concat newComments)++annotationsToCommentsA :: EpAnn [AddEpAnn] -> [AnnKeywordId] -> EPP ()+annotationsToCommentsA EpAnnNotUsed _ = return ()+annotationsToCommentsA an kws = annotationsToComments (anns an) kws++-- ---------------------------------------------------------------------++-- Temporary function to simply reproduce the "normal" pretty printer output+withPpr :: (Outputable a) => a -> Annotated ()+withPpr a = do+ ss <- getAnchorU+ debugM $ "withPpr: ss=" ++ show ss+ printStringAtKw' ss (showPprUnsafe a)++-- ---------------------------------------------------------------------+-- Modeled on Outputable++-- | An AST fragment with an annotation must be able to return the+-- requirements for nesting another one, captured in an 'Entry', and+-- to be able to use the rest of the exactprint machinery to print the+-- element. In the analogy to Outputable, 'exact' plays the role of+-- 'ppr'.+class (Typeable a) => ExactPrint a where+ getAnnotationEntry :: a -> Entry+ exact :: a -> Annotated ()++-- ---------------------------------------------------------------------++-- | Bare Located elements are simply stripped off without further+-- processing.+instance (ExactPrint a) => ExactPrint (Located a) where+ getAnnotationEntry (L l _) = Entry (spanAsAnchor l) emptyComments NoFlushComments+ exact (L _ a) = markAnnotated a++instance (ExactPrint a) => ExactPrint (LocatedA a) where+ getAnnotationEntry = entryFromLocatedA+ exact (L la a) = do+ debugM $ "LocatedA a:la loc=" ++ show (ss2range $ locA la)+ markAnnotated a+ markALocatedA (ann la)++instance (ExactPrint a) => ExactPrint [a] where+ getAnnotationEntry = const NoEntryVal+ exact ls = mapM_ markAnnotated ls++instance (ExactPrint a) => ExactPrint (Maybe a) where+ getAnnotationEntry = const NoEntryVal+ exact Nothing = return ()+ exact (Just a) = markAnnotated a++-- ---------------------------------------------------------------------++-- | 'Located (HsModule GhcPs)' corresponds to 'ParsedSource'+instance ExactPrint HsModule where+ getAnnotationEntry hsmod = fromAnn' (hsmodAnn hsmod)++ exact hsmod@(HsModule EpAnnNotUsed _ _ _ _ _ _ _) = withPpr hsmod+ exact (HsModule an _lo mmn mexports imports decls mdeprec mbDoc) = do++ markAnnotated mbDoc++ case mmn of+ Nothing -> return ()+ Just (L ln mn) -> do+ markEpAnn' an am_main AnnModule+ markAnnotated (L ln mn)++ -- forM_ mdeprec markLocated+ setLayoutTopLevelP $ markAnnotated mdeprec++ setLayoutTopLevelP $ markAnnotated mexports++ debugM $ "HsModule.AnnWhere coming"+ setLayoutTopLevelP $ markEpAnn' an am_main AnnWhere++ markAnnList' False (am_decls $ anns an) $ do+ markTopLevelList imports+ markTopLevelList decls++-- ---------------------------------------------------------------------++-- TODO:AZ: do we *need* the following, or can we capture it in the AST?+-- | We can have a list with its own entry point defined. Create a+-- data structure to capture this, for defining an ExactPrint instance+data AnnotatedList a = AnnotatedList (Maybe Anchor) a+ deriving (Eq,Show)++instance (ExactPrint a) => ExactPrint (AnnotatedList a) where+ getAnnotationEntry (AnnotatedList (Just anc) _) = Entry anc (EpaComments []) NoFlushComments+ getAnnotationEntry (AnnotatedList Nothing _) = NoEntryVal++ exact (AnnotatedList an ls) = do+ debugM $ "AnnotatedList:an=" ++ show an+ markAnnotatedWithLayout ls+++-- ---------------------------------------------------------------------+-- Start of utility functions+-- ---------------------------------------------------------------------++printSourceText :: SourceText -> String -> EPP ()+printSourceText NoSourceText txt = printStringAdvance txt+printSourceText (SourceText txt) _ = printStringAdvance txt++-- ---------------------------------------------------------------------++printStringAtRs :: RealSrcSpan -> String -> EPP ()+printStringAtRs ss str = printStringAtKw' ss str++printStringAtSs :: SrcSpan -> String -> EPP ()+printStringAtSs ss str = printStringAtKw' (realSrcSpan ss) str++-- ---------------------------------------------------------------------++-- AZ:TODO get rid of this+printStringAtMkw :: Maybe EpaLocation -> String -> EPP ()+printStringAtMkw (Just aa) s = printStringAtAA aa s+printStringAtMkw Nothing s = printStringAtLsDelta (SameLine 1) s+++printStringAtAA :: EpaLocation -> String -> EPP ()+printStringAtAA (EpaSpan r) s = printStringAtKw' r s+printStringAtAA (EpaDelta d) s = do+ pe <- getPriorEndD+ p1 <- getPosP+ printStringAtLsDelta d s+ p2 <- getPosP+ debugM $ "printStringAtAA:(pe,p1,p2)=" ++ show (pe,p1,p2)+ setPriorEndASTPD True (p1,p2)++-- Based on Delta.addAnnotationWorker+printStringAtKw' :: RealSrcSpan -> String -> EPP ()+printStringAtKw' pa str = do+ printComments pa+ pe <- getPriorEndD+ debugM $ "printStringAtKw':pe=" ++ show pe+ let p = ss2delta pe pa+ p' <- adjustDeltaForOffsetM p+ printStringAtLsDelta p' str+ setPriorEndASTD True pa++-- ---------------------------------------------------------------------++markExternalSourceText :: SrcSpan -> SourceText -> String -> EPP ()+markExternalSourceText l NoSourceText txt = printStringAtKw' (realSrcSpan l) txt+markExternalSourceText l (SourceText txt) _ = printStringAtKw' (realSrcSpan l) txt++-- ---------------------------------------------------------------------++markAddEpAnn :: AddEpAnn -> EPP ()+markAddEpAnn a@(AddEpAnn kw _) = mark [a] kw++markLocatedMAA :: EpAnn a -> (a -> Maybe AddEpAnn) -> EPP ()+markLocatedMAA EpAnnNotUsed _ = return ()+markLocatedMAA (EpAnn _ a _) f =+ case f a of+ Nothing -> return ()+ Just aa -> markAddEpAnn aa++markLocatedAA :: EpAnn a -> (a -> AddEpAnn) -> EPP ()+markLocatedAA EpAnnNotUsed _ = return ()+markLocatedAA (EpAnn _ a _) f = markKw (f a)++markLocatedAAL :: EpAnn a -> (a -> [AddEpAnn]) -> AnnKeywordId -> EPP ()+markLocatedAAL EpAnnNotUsed _ _ = return ()+markLocatedAAL (EpAnn _ a _) f kw = go (f a)+ where+ go [] = return ()+ go (aa@(AddEpAnn kw' _):as)+ | kw' == kw = mark [aa] kw+ | otherwise = go as++markLocatedAALS :: EpAnn a -> (a -> [AddEpAnn]) -> AnnKeywordId -> Maybe String -> EPP ()+markLocatedAALS an f kw Nothing = markLocatedAAL an f kw+markLocatedAALS EpAnnNotUsed _ _ _ = return ()+markLocatedAALS (EpAnn _ a _) f kw (Just str) = go (f a)+ where+ go [] = return ()+ go (AddEpAnn kw' r:as)+ | kw' == kw = printStringAtAA r str+ | otherwise = go as++-- ---------------------------------------------------------------------++markArrow :: EpAnn TrailingAnn -> HsArrow GhcPs -> EPP ()+markArrow an arr = do+ case arr of+ HsUnrestrictedArrow _u ->+ return ()+ HsLinearArrow _u ma -> do+ mapM_ markAddEpAnn ma+ HsExplicitMult _u ma t -> do+ mapM_ markAddEpAnn ma+ markAnnotated t++ case an of+ EpAnnNotUsed -> pure ()+ _ -> markKwT (anns an)++-- ---------------------------------------------------------------------++markAnnCloseP :: EpAnn AnnPragma -> EPP ()+markAnnCloseP an = markLocatedAALS an (pure . apr_close) AnnClose (Just "#-}")++markAnnOpenP :: EpAnn AnnPragma -> SourceText -> String -> EPP ()+markAnnOpenP an NoSourceText txt = markLocatedAALS an (pure . apr_open) AnnOpen (Just txt)+markAnnOpenP an (SourceText txt) _ = markLocatedAALS an (pure . apr_open) AnnOpen (Just txt)++markAnnOpen :: EpAnn [AddEpAnn] -> SourceText -> String -> EPP ()+markAnnOpen an NoSourceText txt = markLocatedAALS an id AnnOpen (Just txt)+markAnnOpen an (SourceText txt) _ = markLocatedAALS an id AnnOpen (Just txt)++markAnnOpen' :: Maybe EpaLocation -> SourceText -> String -> EPP ()+markAnnOpen' ms NoSourceText txt = printStringAtMkw ms txt+markAnnOpen' ms (SourceText txt) _ = printStringAtMkw ms txt++-- ---------------------------------------------------------------------++markOpeningParen, markClosingParen :: EpAnn AnnParen -> EPP ()+markOpeningParen an = markParen an fst+markClosingParen an = markParen an snd++markParen :: EpAnn AnnParen -> (forall a. (a,a) -> a) -> EPP ()+markParen EpAnnNotUsed _ = return ()+markParen (EpAnn _ (AnnParen pt o c) _) f = markKwA (f $ kw pt) (f (o, c))+ where+ kw AnnParens = (AnnOpenP, AnnCloseP)+ kw AnnParensHash = (AnnOpenPH, AnnClosePH)+ kw AnnParensSquare = (AnnOpenS, AnnCloseS)+++markAnnKw :: EpAnn a -> (a -> EpaLocation) -> AnnKeywordId -> EPP ()+markAnnKw EpAnnNotUsed _ _ = return ()+markAnnKw (EpAnn _ a _) f kw = markKwA kw (f a)++markAnnKwAll :: EpAnn a -> (a -> [EpaLocation]) -> AnnKeywordId -> EPP ()+markAnnKwAll EpAnnNotUsed _ _ = return ()+markAnnKwAll (EpAnn _ a _) f kw = mapM_ (markKwA kw) (sort (f a))++markAnnKwM :: EpAnn a -> (a -> Maybe EpaLocation) -> AnnKeywordId -> EPP ()+markAnnKwM EpAnnNotUsed _ _ = return ()+markAnnKwM (EpAnn _ a _) f kw = go (f a)+ where+ go Nothing = return ()+ go (Just s) = markKwA kw s++markALocatedA :: EpAnn AnnListItem -> EPP ()+markALocatedA EpAnnNotUsed = return ()+markALocatedA (EpAnn _ a _) = markTrailing (lann_trailing a)++markEpAnn :: EpAnn [AddEpAnn] -> AnnKeywordId -> EPP ()+markEpAnn EpAnnNotUsed _ = return ()+markEpAnn (EpAnn _ a _) kw = mark a kw++markEpAnn' :: EpAnn ann -> (ann -> [AddEpAnn]) -> AnnKeywordId -> EPP ()+markEpAnn' EpAnnNotUsed _ _ = return ()+markEpAnn' (EpAnn _ a _) f kw = mark (f a) kw++markEpAnnAll :: EpAnn ann -> (ann -> [AddEpAnn]) -> AnnKeywordId -> EPP ()+markEpAnnAll EpAnnNotUsed _ _ = return ()+markEpAnnAll (EpAnn _ a _) f kw = mapM_ markKw (sort anns)+ where+ anns = filter (\(AddEpAnn ka _) -> ka == kw) (f a)++markAnnAll :: [AddEpAnn] -> AnnKeywordId -> EPP ()+markAnnAll a kw = mapM_ markKw (sort anns)+ where+ anns = filter (\(AddEpAnn ka _) -> ka == kw) a++mark :: [AddEpAnn] -> AnnKeywordId -> EPP ()+mark anns kw = do+ case find (\(AddEpAnn k _) -> k == kw) anns of+ Just aa -> markKw aa+ Nothing -> case find (\(AddEpAnn k _) -> k == (unicodeAnn kw)) anns of+ Just aau -> markKw aau+ Nothing -> return ()++markKwT :: TrailingAnn -> EPP ()+markKwT (AddSemiAnn ss) = markKwA AnnSemi ss+markKwT (AddCommaAnn ss) = markKwA AnnComma ss+markKwT (AddVbarAnn ss) = markKwA AnnVbar ss+markKwT (AddRarrowAnn ss) = markKwA AnnRarrow ss+markKwT (AddRarrowAnnU ss) = markKwA AnnRarrowU ss+markKwT (AddLollyAnnU ss) = markKwA AnnLollyU ss++markKw :: AddEpAnn -> EPP ()+markKw (AddEpAnn kw ss) = markKwA kw ss++-- | This should be the main driver of the process, managing comments+markKwA :: AnnKeywordId -> EpaLocation -> EPP ()+markKwA kw aa = printStringAtAA aa (keywordToString (G kw))++-- ---------------------------------------------------------------------++markAnnList :: Bool -> EpAnn AnnList -> EPP () -> EPP ()+markAnnList _ EpAnnNotUsed action = action+markAnnList reallyTrail (EpAnn _ ann _) action = markAnnList' reallyTrail ann action++markAnnList' :: Bool -> AnnList -> EPP () -> EPP ()+markAnnList' reallyTrail ann action = do+ p <- getPosP+ debugM $ "markAnnList : " ++ showPprUnsafe (p, ann)+ mapM_ markAddEpAnn (al_open ann)+ unless reallyTrail $ markTrailing (al_trailing ann) -- Only makes sense for HsModule.+ markAnnAll (sort $ al_rest ann) AnnSemi+ action+ mapM_ markAddEpAnn (al_close ann)+ debugM $ "markAnnList: calling markTrailing with:" ++ showPprUnsafe (al_trailing ann)+ when reallyTrail $ markTrailing (al_trailing ann) -- normal case++-- ---------------------------------------------------------------------++printComments :: RealSrcSpan -> EPP ()+printComments ss = do+ cs <- commentAllocation ss+ debugM $ "printComments: (ss): " ++ showPprUnsafe (rs2range ss)+ -- debugM $ "printComments: (ss,comment locations): " ++ showPprUnsafe (rs2range ss,map commentAnchor cs)+ mapM_ printOneComment cs++-- ---------------------------------------------------------------------++printOneComment :: Comment -> EPP ()+printOneComment c@(Comment _str loc _mo) = do+ debugM $ "printOneComment:c=" ++ showGhc c+ dp <-case anchor_op loc of+ MovedAnchor dp -> return dp+ _ -> do+ pe <- getPriorEndD+ let dp = ss2delta pe (anchor loc)+ debugM $ "printOneComment:(dp,pe,anchor loc)=" ++ showGhc (dp,pe,ss2pos $ anchor loc)+ return dp+ dp'' <- adjustDeltaForOffsetM dp+ mep <- getExtraDP+ dp' <- case mep of+ Just (Anchor _ (MovedAnchor edp)) -> do+ debugM $ "printOneComment:edp=" ++ show edp+ return edp+ _ -> return dp''+ LayoutStartCol dOff <- gets dLHS+ debugM $ "printOneComment:(dp,dp',dp'',dOff)=" ++ showGhc (dp,dp',dp'',dOff)+ setPriorEndD (ss2posEnd (anchor loc))+ printQueuedComment (anchor loc) c dp'++-- ---------------------------------------------------------------------++commentAllocation :: RealSrcSpan -> EPP [Comment]+commentAllocation ss = do+ cs <- getUnallocatedComments+ -- Note: The CPP comment injection may change the file name in the+ -- RealSrcSpan, which affects comparison, as the Ord instance for+ -- RealSrcSpan compares the file first. So we sort via ss2pos+ -- TODO: this is inefficient, use Pos all the way through+ let (earlier,later) = partition (\(Comment _str loc _mo) -> (ss2pos $ anchor loc) <= (ss2pos ss)) cs+ putUnallocatedComments later+ -- debugM $ "commentAllocation:(ss,earlier,later)" ++ show (rs2range ss,earlier,later)+ return earlier++-- ---------------------------------------------------------------------+++markAnnotatedWithLayout :: ExactPrint ast => ast -> EPP ()+markAnnotatedWithLayout a = setLayoutBoth $ markAnnotated a++-- ---------------------------------------------------------------------++markTopLevelList :: ExactPrint ast => [ast] -> EPP ()+markTopLevelList ls = mapM_ (\a -> setLayoutTopLevelP $ markAnnotated a) ls++-- ---------------------------------------------------------------------++instance ExactPrint ModuleName where+ getAnnotationEntry _ = NoEntryVal+ exact n = do+ debugM $ "ModuleName: " ++ showPprUnsafe n+ withPpr n++-- ---------------------------------------------------------------------++instance ExactPrint (LocatedP WarningTxt) where+ getAnnotationEntry = entryFromLocatedA+ exact (L (SrcSpanAnn an _) (WarningTxt (L _ src) ws)) = do+ markAnnOpenP an src "{-# WARNING"+ markLocatedAAL an apr_rest AnnOpenS+ markAnnotated ws+ markLocatedAAL an apr_rest AnnCloseS+ markAnnCloseP an++ exact (L (SrcSpanAnn an _) (DeprecatedTxt (L _ src) ws)) = do+ markAnnOpenP an src "{-# DEPRECATED"+ markLocatedAAL an apr_rest AnnOpenS+ markAnnotated ws+ markLocatedAAL an apr_rest AnnCloseS+ markAnnCloseP an++-- ---------------------------------------------------------------------++instance ExactPrint (ImportDecl GhcPs) where+ getAnnotationEntry idecl = fromAnn (ideclExt idecl)+ exact x@(ImportDecl EpAnnNotUsed _ _ _ _ _ _ _ _ _) = withPpr x+ exact (ImportDecl ann@(EpAnn _ an _) msrc (L lm modname) mpkg _src safeflag qualFlag _impl mAs hiding) = do++ markAnnKw ann importDeclAnnImport AnnImport++ -- "{-# SOURCE" and "#-}"+ case msrc of+ SourceText _txt -> do+ debugM $ "ImportDecl sourcetext"+ let mo = fmap fst $ importDeclAnnPragma an+ let mc = fmap snd $ importDeclAnnPragma an+ markAnnOpen' mo msrc "{-# SOURCE"+ printStringAtMkw mc "#-}"+ NoSourceText -> return ()+ when safeflag (markAnnKwM ann importDeclAnnSafe AnnSafe)+ case qualFlag of+ QualifiedPre -- 'qualified' appears in prepositive position.+ -> printStringAtMkw (importDeclAnnQualified an) "qualified"+ _ -> return ()+ case mpkg of+ Just (StringLiteral src v _) ->+ printStringAtMkw (importDeclAnnPackage an) (sourceTextToString src (show v))+ _ -> return ()++ printStringAtKw' (realSrcSpan lm) (moduleNameString modname)++ case qualFlag of+ QualifiedPost -- 'qualified' appears in postpositive position.+ -> printStringAtMkw (importDeclAnnQualified an) "qualified"+ _ -> return ()++ case mAs of+ Nothing -> return ()+ Just (L l mn) -> do+ printStringAtMkw (importDeclAnnAs an) "as"+ printStringAtKw' (realSrcSpan l) (moduleNameString mn)++ case hiding of+ Nothing -> return ()+ Just (_isHiding,lie) -> markAnnotated lie+ -- markTrailingSemi+++-- ---------------------------------------------------------------------++instance ExactPrint HsDocString where+ getAnnotationEntry _ = NoEntryVal+ exact = withPpr -- TODO:AZ use annotations++-- ---------------------------------------------------------------------++instance ExactPrint (HsDecl GhcPs) where+ getAnnotationEntry (TyClD _ _) = NoEntryVal+ getAnnotationEntry (InstD _ _) = NoEntryVal+ getAnnotationEntry (DerivD _ _) = NoEntryVal+ getAnnotationEntry (ValD _ _) = NoEntryVal+ getAnnotationEntry (SigD _ _) = NoEntryVal+ getAnnotationEntry (KindSigD _ _) = NoEntryVal+ getAnnotationEntry (DefD _ _) = NoEntryVal+ getAnnotationEntry (ForD _ _) = NoEntryVal+ getAnnotationEntry (WarningD _ _) = NoEntryVal+ getAnnotationEntry (AnnD _ _) = NoEntryVal+ getAnnotationEntry (RuleD _ _) = NoEntryVal+ getAnnotationEntry (SpliceD _ _) = NoEntryVal+ getAnnotationEntry (DocD _ _) = NoEntryVal+ getAnnotationEntry (RoleAnnotD _ _) = NoEntryVal++ exact (TyClD _ d) = markAnnotated d+ exact (InstD _ d) = markAnnotated d+ exact (DerivD _ d) = markAnnotated d+ exact (ValD _ d) = markAnnotated d+ exact (SigD _ d) = markAnnotated d+ exact (KindSigD _ d) = markAnnotated d+ exact (DefD _ d) = markAnnotated d+ exact (ForD _ d) = markAnnotated d+ exact (WarningD _ d) = markAnnotated d+ exact (AnnD _ d) = markAnnotated d+ exact (RuleD _ d) = markAnnotated d+ exact (SpliceD _ d) = markAnnotated d+ exact (DocD _ d) = markAnnotated d+ exact (RoleAnnotD _ d) = markAnnotated d++-- ---------------------------------------------------------------------++instance ExactPrint (InstDecl GhcPs) where+ getAnnotationEntry (ClsInstD _ _) = NoEntryVal+ getAnnotationEntry (DataFamInstD an _) = fromAnn an+ getAnnotationEntry (TyFamInstD _ _) = NoEntryVal+++ exact (ClsInstD _ cid) = markAnnotated cid+ exact (DataFamInstD an decl) = do+ exactDataFamInstDecl an TopLevel decl+ exact (TyFamInstD _ eqn) = do+ markAnnotated eqn++-- ---------------------------------------------------------------------++exactDataFamInstDecl :: EpAnn [AddEpAnn] -> TopLevelFlag -> (DataFamInstDecl GhcPs) -> EPP ()+exactDataFamInstDecl an top_lvl+ (DataFamInstDecl ( FamEqn { feqn_ext = an2+ , feqn_tycon = tycon+ , feqn_bndrs = bndrs+ , feqn_pats = pats+ , feqn_fixity = fixity+ , feqn_rhs = defn }))+ = markAnnotated (DataDefnWithContext an2 pp_hdr defn) -- See Note [an and an2 in exactDataFamInstDecl]+ where+ pp_hdr mctxt = do+ case top_lvl of+ TopLevel -> markEpAnn an AnnInstance -- TODO: maybe in toplevel+ NotTopLevel -> return ()+ exactHsFamInstLHS an tycon bndrs pats fixity mctxt++{-+Note [an and an2 in exactDataFamInstDecl]+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~++The exactDataFamInstDecl function is called to render a+DataFamInstDecl within its surrounding context. This context is+rendered via the 'pp_hdr' function, which uses the exact print+annotations from that context, named 'an'. The EPAs used for+rendering the DataDefn are contained in the FamEqn, and are called+'an2'.++-}++-- ---------------------------------------------------------------------++instance ExactPrint (DerivDecl GhcPs) where+ getAnnotationEntry (DerivDecl {deriv_ext = an} ) = fromAnn an+ exact (DerivDecl an typ ms mov) = do+ markEpAnn an AnnDeriving+ mapM_ markAnnotated ms+ markEpAnn an AnnInstance+ mapM_ markAnnotated mov+ markAnnotated typ+ -- markAST _ (GHC.DerivDecl _ (GHC.HsWC _ (GHC.HsIB _ typ)) ms mov) = do+ -- mark GHC.AnnDeriving+ -- markMaybe ms+ -- mark GHC.AnnInstance+ -- markMaybe mov+ -- markLocated typ+ -- markTrailingSemi++-- ---------------------------------------------------------------------++instance ExactPrint (ForeignDecl GhcPs) where+ getAnnotationEntry (ForeignImport an _ _ _) = fromAnn an+ getAnnotationEntry (ForeignExport an _ _ _) = fromAnn an++ exact (ForeignImport an n ty fimport) = do+ markEpAnn an AnnForeign+ markEpAnn an AnnImport++ markAnnotated fimport++ markAnnotated n+ markEpAnn an AnnDcolon+ markAnnotated ty++ exact (ForeignExport an n ty fexport) = do+ markEpAnn an AnnForeign+ markEpAnn an AnnExport+ markAnnotated fexport+ markAnnotated n+ markEpAnn an AnnDcolon+ markAnnotated ty++-- ---------------------------------------------------------------------++instance ExactPrint ForeignImport where+ getAnnotationEntry = const NoEntryVal+ exact (CImport cconv safety@(L ll _) _mh _imp (L ls src)) = do+ markAnnotated cconv+ unless (ll == noSrcSpan) $ markAnnotated safety+ unless (ls == noSrcSpan) $ markExternalSourceText ls src ""++-- ---------------------------------------------------------------------++instance ExactPrint ForeignExport where+ getAnnotationEntry = const NoEntryVal+ exact (CExport spec (L ls src)) = do+ debugM $ "CExport starting"+ markAnnotated spec+ unless (ls == noSrcSpan) $ markExternalSourceText ls src ""++-- ---------------------------------------------------------------------++instance ExactPrint CExportSpec where+ getAnnotationEntry = const NoEntryVal+ exact (CExportStatic _st _lbl cconv) = do+ debugM $ "CExportStatic starting"+ markAnnotated cconv++-- ---------------------------------------------------------------------++instance ExactPrint Safety where+ getAnnotationEntry = const NoEntryVal+ exact = withPpr++-- ---------------------------------------------------------------------++instance ExactPrint CCallConv where+ getAnnotationEntry = const NoEntryVal+ exact = withPpr++-- ---------------------------------------------------------------------++instance ExactPrint (WarnDecls GhcPs) where+ getAnnotationEntry (Warnings an _ _) = fromAnn an+ exact (Warnings an src warns) = do+ markAnnOpen an src "{-# WARNING" -- Note: might be {-# DEPRECATED+ markAnnotated warns+ markLocatedAALS an id AnnClose (Just "#-}")++-- ---------------------------------------------------------------------++instance ExactPrint (WarnDecl GhcPs) where+ getAnnotationEntry (Warning an _ _) = fromAnn an++ exact (Warning an lns txt) = do+ markAnnotated lns+ markEpAnn an AnnOpenS -- "["+ case txt of+ WarningTxt _src ls -> markAnnotated ls+ DeprecatedTxt _src ls -> markAnnotated ls+ markEpAnn an AnnCloseS -- "]"++-- ---------------------------------------------------------------------++instance ExactPrint StringLiteral where+ getAnnotationEntry = const NoEntryVal++ exact (StringLiteral src fs mcomma) = do+ printSourceText src (show (unpackFS fs))+ mapM_ (\r -> printStringAtKw' r ",") mcomma++-- ---------------------------------------------------------------------++instance ExactPrint FastString where+ getAnnotationEntry = const NoEntryVal++ -- TODO: https://ghc.haskell.org/trac/ghc/ticket/10313 applies.+ -- exact fs = printStringAdvance (show (unpackFS fs))+ exact fs = printStringAdvance (unpackFS fs)+++-- ---------------------------------------------------------------------++instance ExactPrint (RuleDecls GhcPs) where+ getAnnotationEntry (HsRules an _ _) = fromAnn an+ exact (HsRules an src rules) = do+ case src of+ NoSourceText -> markLocatedAALS an id AnnOpen (Just "{-# RULES")+ SourceText srcTxt -> markLocatedAALS an id AnnOpen (Just srcTxt)+ markAnnotated rules+ markLocatedAALS an id AnnClose (Just "#-}")+ -- markTrailingSemi++-- ---------------------------------------------------------------------++instance ExactPrint (RuleDecl GhcPs) where+ getAnnotationEntry (HsRule {rd_ext = an}) = fromAnn an+ exact (HsRule an ln act mtybndrs termbndrs lhs rhs) = do+ debugM "HsRule entered"+ markAnnotated ln+ debugM "HsRule after ln"+ markActivation an ra_rest act+ debugM "HsRule after act"+ case mtybndrs of+ Nothing -> return ()+ Just bndrs -> do+ markLocatedMAA an (\a -> fmap fst (ra_tyanns a)) -- AnnForall+ mapM_ markAnnotated bndrs+ markLocatedMAA an (\a -> fmap snd (ra_tyanns a)) -- AnnDot++ markLocatedMAA an (\a -> fmap fst (ra_tmanns a)) -- AnnForall+ mapM_ markAnnotated termbndrs+ markLocatedMAA an (\a -> fmap snd (ra_tmanns a)) -- AnnDot++ markAnnotated lhs+ markEpAnn' an ra_rest AnnEqual+ markAnnotated rhs+ -- markAST l (GHC.HsRule _ ln act mtybndrs termbndrs lhs rhs) = do+ -- markLocated ln+ -- setContext (Set.singleton ExplicitNeverActive) $ markActivation l act+++ -- mark GHC.AnnForall+ -- mapM_ markLocated termbndrs+ -- mark GHC.AnnDot++ -- markLocated lhs+ -- mark GHC.AnnEqual+ -- markLocated rhs+ -- inContext (Set.singleton Intercalate) $ mark GHC.AnnSemi+ -- markTrailingSemi++markActivation :: EpAnn a -> (a -> [AddEpAnn]) -> Activation -> Annotated ()+markActivation an fn act = do+ case act of+ ActiveBefore src phase -> do+ markEpAnn' an fn AnnOpenS -- '['+ markEpAnn' an fn AnnTilde -- ~+ markLocatedAALS an fn AnnVal (Just (toSourceTextWithSuffix src (show phase) ""))+ markEpAnn' an fn AnnCloseS -- ']'+ ActiveAfter src phase -> do+ markEpAnn' an fn AnnOpenS -- '['+ markLocatedAALS an fn AnnVal (Just (toSourceTextWithSuffix src (show phase) ""))+ markEpAnn' an fn AnnCloseS -- ']'+ NeverActive -> do+ markEpAnn' an fn AnnOpenS -- '['+ markEpAnn' an fn AnnTilde -- ~+ markEpAnn' an fn AnnCloseS -- ']'+ _ -> return ()++-- ---------------------------------------------------------------------++instance ExactPrint (SpliceDecl GhcPs) where+ getAnnotationEntry = const NoEntryVal++ exact (SpliceDecl _ splice _flag) = do+ markAnnotated splice++-- ---------------------------------------------------------------------++instance ExactPrint DocDecl where+ getAnnotationEntry = const NoEntryVal++ exact v =+ let str =+ case v of+ (DocCommentNext ds) -> unpackHDS ds+ (DocCommentPrev ds) -> unpackHDS ds+ (DocCommentNamed _s ds) -> unpackHDS ds+ (DocGroup _i ds) -> unpackHDS ds+ in+ printStringAdvance str++-- ---------------------------------------------------------------------++instance ExactPrint (RoleAnnotDecl GhcPs) where+ getAnnotationEntry (RoleAnnotDecl an _ _) = fromAnn an+ exact (RoleAnnotDecl an ltycon roles) = do+ markEpAnn an AnnType+ markEpAnn an AnnRole+ markAnnotated ltycon+ let markRole (L l (Just r)) = markAnnotated (L l r)+ markRole (L l Nothing) = printStringAtSs l "_"+ mapM_ markRole roles++-- ---------------------------------------------------------------------++instance ExactPrint Role where+ getAnnotationEntry = const NoEntryVal+ exact = withPpr++-- ---------------------------------------------------------------------++instance ExactPrint (RuleBndr GhcPs) where+ getAnnotationEntry = const NoEntryVal++{-+ = RuleBndr (XCRuleBndr pass) (Located (IdP pass))+ | RuleBndrSig (XRuleBndrSig pass) (Located (IdP pass)) (HsPatSigType pass)+-}+ exact (RuleBndr _ ln) = markAnnotated ln+ exact (RuleBndrSig an ln (HsPS _ ty)) = do+ markEpAnn an AnnOpenP -- "("+ markAnnotated ln+ markEpAnn an AnnDcolon+ markAnnotated ty+ markEpAnn an AnnCloseP -- ")"++-- ---------------------------------------------------------------------++instance (ExactPrint body) => ExactPrint (FamEqn GhcPs body) where+ getAnnotationEntry (FamEqn { feqn_ext = an}) = fromAnn an+ exact (FamEqn { feqn_ext = an+ , feqn_tycon = tycon+ , feqn_bndrs = bndrs+ , feqn_pats = pats+ , feqn_fixity = fixity+ , feqn_rhs = rhs }) = do+ exactHsFamInstLHS an tycon bndrs pats fixity Nothing+ markEpAnn an AnnEqual+ markAnnotated rhs++-- ---------------------------------------------------------------------++exactHsFamInstLHS ::+ EpAnn [AddEpAnn]+ -> LocatedN RdrName+ -- -> Maybe [LHsTyVarBndr () GhcPs]+ -> HsOuterTyVarBndrs () GhcPs+ -> HsTyPats GhcPs+ -> LexicalFixity+ -> Maybe (LHsContext GhcPs)+ -> EPP ()+exactHsFamInstLHS an thing bndrs typats fixity mb_ctxt = do+ markEpAnn an AnnForall+ markAnnotated bndrs+ markEpAnn an AnnDot+ mapM_ markAnnotated mb_ctxt+ exact_pats typats+ where+ exact_pats :: HsTyPats GhcPs -> EPP ()+ exact_pats (patl:patr:pats)+ | Infix <- fixity+ = let exact_op_app = do+ markAnnAll (epAnnAnns an) AnnOpenP+ markAnnotated patl+ markAnnotated thing+ markAnnotated patr+ markAnnAll (epAnnAnns an) AnnCloseP+ in case pats of+ [] -> exact_op_app+ _ -> do+ -- markEpAnn an AnnOpenP+ exact_op_app+ -- markEpAnn an AnnCloseP+ mapM_ markAnnotated pats++ exact_pats pats = do+ markAnnAll (epAnnAnns an) AnnOpenP+ markAnnotated thing+ markAnnotated pats+ markAnnAll (epAnnAnns an) AnnCloseP++-- ---------------------------------------------------------------------++-- instance ExactPrint (LHsTypeArg GhcPs) where+instance (ExactPrint tm, ExactPrint ty, Outputable tm, Outputable ty)+ => ExactPrint (HsArg tm ty) where+ getAnnotationEntry = const NoEntryVal++ exact (HsValArg tm) = markAnnotated tm+ exact (HsTypeArg ss ty) = printStringAtSs ss "@" >> markAnnotated ty+ exact x@(HsArgPar _sp) = withPpr x -- Does not appear in original source++-- ---------------------------------------------------------------------++-- instance ExactPrint [LHsTyVarBndr () GhcPs] where+-- getAnnotationEntry = const NoEntryVal+-- exact bs = mapM_ markAnnotated bs++-- ---------------------------------------------------------------------++instance ExactPrint (ClsInstDecl GhcPs) where+ getAnnotationEntry cid = fromAnn (fst $ cid_ext cid)++ exact (ClsInstDecl { cid_ext = (an, sortKey)+ , cid_poly_ty = inst_ty, cid_binds = binds+ , cid_sigs = sigs, cid_tyfam_insts = ats+ , cid_overlap_mode = mbOverlap+ , cid_datafam_insts = adts })+ -- | null sigs, null ats, null adts, isEmptyBag binds -- No "where" part+ -- = top_matter++ -- | otherwise -- Laid out+ = do+ top_matter+ markEpAnn an AnnWhere+ markEpAnn an AnnOpenC+ markEpAnnAll an id AnnSemi+ withSortKey sortKey+ (prepareListAnnotationA ats+ ++ prepareListAnnotationF (exactDataFamInstDecl an NotTopLevel ) adts+ ++ prepareListAnnotationA (bagToList binds)+ ++ prepareListAnnotationA sigs+ )+ markEpAnn an AnnCloseC -- '}'++ where+ top_matter = do+ markEpAnn an AnnInstance+ mapM_ markAnnotated mbOverlap+ markAnnotated inst_ty+ markEpAnn an AnnWhere -- Optional+ -- text "instance" <+> ppOverlapPragma mbOverlap+ -- <+> ppr inst_ty+ -- markEpAnn an AnnOpenC -- Optional '{'+ -- markEpAnn an AnnCloseC -- Optional '}'++-- ---------------------------------------------------------------------++instance ExactPrint (TyFamInstDecl GhcPs) where+ getAnnotationEntry (TyFamInstDecl an _) = fromAnn an++ exact (TyFamInstDecl { tfid_xtn = an, tfid_eqn = eqn }) = do+ markEpAnn an AnnType+ markEpAnn an AnnInstance+ markAnnotated eqn++-- ---------------------------------------------------------------------++instance ExactPrint (LocatedP OverlapMode) where+ getAnnotationEntry = entryFromLocatedA++ -- NOTE: NoOverlap is only used in the typechecker+ exact (L (SrcSpanAnn an _) (NoOverlap src)) = do+ markAnnOpenP an src "{-# NO_OVERLAP"+ markAnnCloseP an++ exact (L (SrcSpanAnn an _) (Overlappable src)) = do+ markAnnOpenP an src "{-# OVERLAPPABLE"+ markAnnCloseP an++ exact (L (SrcSpanAnn an _) (Overlapping src)) = do+ markAnnOpenP an src "{-# OVERLAPPING"+ markAnnCloseP an++ exact (L (SrcSpanAnn an _) (Overlaps src)) = do+ markAnnOpenP an src "{-# OVERLAPS"+ markAnnCloseP an++ exact (L (SrcSpanAnn an _) (Incoherent src)) = do+ markAnnOpenP an src "{-# INCOHERENT"+ markAnnCloseP an++-- ---------------------------------------------------------------------++instance ExactPrint (HsBind GhcPs) where+ getAnnotationEntry FunBind{} = NoEntryVal+ getAnnotationEntry PatBind{pat_ext=an} = fromAnn an+ getAnnotationEntry VarBind{} = NoEntryVal+ getAnnotationEntry AbsBinds{} = NoEntryVal+ getAnnotationEntry PatSynBind{} = NoEntryVal++ exact (FunBind _ _ matches _) = do+ markAnnotated matches+ exact (PatBind _ pat grhss _) = do+ markAnnotated pat+ markAnnotated grhss+ exact (PatSynBind _ bind) = markAnnotated bind++ exact x = error $ "HsBind: exact for " ++ showAst x++-- ---------------------------------------------------------------------++instance ExactPrint (PatSynBind GhcPs GhcPs) where+ getAnnotationEntry (PSB { psb_ext = an}) = fromAnn an++ exact (PSB{ psb_ext = an+ , psb_id = psyn, psb_args = details+ , psb_def = pat+ , psb_dir = dir }) = do+ markEpAnn an AnnPattern+ case details of+ InfixCon v1 v2 -> do+ markAnnotated v1+ markAnnotated psyn+ markAnnotated v2+ PrefixCon tvs vs -> do+ markAnnotated psyn+ markAnnotated tvs+ markAnnotated vs+ RecCon vs -> do+ markAnnotated psyn+ markEpAnn an AnnOpenC -- '{'+ markAnnotated vs+ markEpAnn an AnnCloseC -- '}'++ case dir of+ Unidirectional -> do+ markEpAnn an AnnLarrow+ markAnnotated pat+ ImplicitBidirectional -> do+ markEpAnn an AnnEqual+ markAnnotated pat+ ExplicitBidirectional mg -> do+ markEpAnn an AnnLarrow+ markAnnotated pat+ markEpAnn an AnnWhere+ markAnnotated mg++ -- 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+++-- ---------------------------------------------------------------------++instance ExactPrint (RecordPatSynField GhcPs) where+ getAnnotationEntry = const NoEntryVal+ exact (RecordPatSynField { recordPatSynField = v }) = markAnnotated v++-- ---------------------------------------------------------------------++instance ExactPrint (Match GhcPs (LocatedA (HsCmd GhcPs))) where+ getAnnotationEntry (Match ann _ _ _) = fromAnn ann++ -- exact match@(Match EpAnnNotUsed _ _ _) = withPpr match+ exact (Match an mctxt pats grhss) = do+ exactMatch (Match an mctxt pats grhss)++-- -------------------------------------++instance ExactPrint (Match GhcPs (LocatedA (HsExpr GhcPs))) where+ getAnnotationEntry (Match ann _ _ _) = fromAnn ann++ -- exact match@(Match EpAnnNotUsed _ _ _) = withPpr match+ exact (Match an mctxt pats grhss) = do+ exactMatch (Match an mctxt pats grhss)++-- ---------------------------------------------------------------------++exactMatch :: (ExactPrint (GRHSs GhcPs body)) => (Match GhcPs body) -> Annotated ()+exactMatch (Match an mctxt pats grhss) = do+-- Based on Expr.pprMatch++ debugM $ "exact Match entered"++ -- herald+ case mctxt of+ FunRhs fun fixity strictness -> do+ debugM $ "exact Match FunRhs:" ++ showPprUnsafe fun+ case strictness of+ SrcStrict -> markEpAnn an AnnBang+ _ -> pure ()+ case fixity of+ Prefix -> do+ annotationsToCommentsA an [AnnOpenP,AnnCloseP]+ markAnnotated fun+ markAnnotated pats+ Infix ->+ case pats of+ (p1:p2:rest)+ | null rest -> do+ markAnnotated p1+ markAnnotated fun+ markAnnotated p2+ | otherwise -> do+ markEpAnn an AnnOpenP+ markAnnotated p1+ markAnnotated fun+ markAnnotated p2+ markEpAnn an AnnCloseP+ mapM_ markAnnotated rest+ _ -> panic "FunRhs"+ LambdaExpr -> do+ markEpAnn an AnnLam+ markAnnotated pats+ GHC.CaseAlt -> do+ markAnnotated pats+ _ -> withPpr mctxt++ markAnnotated grhss++-- ---------------------------------------------------------------------++instance ExactPrint (GRHSs GhcPs (LocatedA (HsExpr GhcPs))) where+ getAnnotationEntry (GRHSs _ _ _) = NoEntryVal++ exact (GRHSs _ grhss binds) = do+ markAnnotated grhss+ markAnnotated binds+++instance ExactPrint (GRHSs GhcPs (LocatedA (HsCmd GhcPs))) where+ getAnnotationEntry (GRHSs _ _ _) = NoEntryVal++ exact (GRHSs _an grhss binds) = do+ markAnnotated grhss+ markAnnotated binds++-- ---------------------------------------------------------------------++-- Temporary until https://gitlab.haskell.org/ghc/ghc/-/issues/20247+-- is fixed+fixValbindsAnn :: EpAnn AnnList -> EpAnn AnnList+fixValbindsAnn EpAnnNotUsed = EpAnnNotUsed+fixValbindsAnn (EpAnn anchor (AnnList ma o c r t) cs)+ = (EpAnn (widenAnchor anchor (map toEpaAnn t)) (AnnList ma o c r t) cs)+ where+ toEpaAnn (AddSemiAnn ss) = AddEpAnn AnnSemi ss+ toEpaAnn (AddCommaAnn ss) = AddEpAnn AnnComma ss+ toEpaAnn (AddVbarAnn ss) = AddEpAnn AnnVbar ss+ toEpaAnn (AddRarrowAnn ss) = AddEpAnn AnnRarrow ss+ toEpaAnn (AddRarrowAnnU ss) = AddEpAnn AnnRarrowU ss+ toEpaAnn (AddLollyAnnU ss) = AddEpAnn AnnLollyU ss++-- See https://gitlab.haskell.org/ghc/ghc/-/issues/20256+fixAnnListAnn :: EpAnn AnnList -> EpAnn AnnList+fixAnnListAnn EpAnnNotUsed = EpAnnNotUsed+fixAnnListAnn (EpAnn anchor (AnnList ma o c r t) cs)+ = (EpAnn (widenAnchor anchor r) (AnnList ma o c r t) cs)++-- See https://gitlab.haskell.org/ghc/ghc/-/issues/20256+fixSrcAnnL :: SrcSpanAnnL -> SrcSpanAnnL+fixSrcAnnL (SrcSpanAnn an l) = SrcSpanAnn (fixAnnListAnn an) l++-- ---------------------------------------------------------------------++instance ExactPrint (HsLocalBinds GhcPs) where+ getAnnotationEntry (HsValBinds an _) = fromAnn (fixValbindsAnn an)+ getAnnotationEntry (HsIPBinds{}) = NoEntryVal+ getAnnotationEntry (EmptyLocalBinds{}) = NoEntryVal++ exact (HsValBinds an' valbinds) = do+ let an = fixValbindsAnn an'+ markLocatedAAL an al_rest AnnWhere+ let manc = case an of+ EpAnnNotUsed -> Nothing+ _ -> al_anchor $ anns an++ case manc of+ Just anc -> do+ when (not $ isEmptyValBinds valbinds) $ setExtraDP (Just anc)+ _ -> return ()++ markAnnList False an $ markAnnotatedWithLayout valbinds++ exact (HsIPBinds an bs)+ = markAnnList True an (markLocatedAAL an al_rest AnnWhere >> markAnnotated bs)+ exact (EmptyLocalBinds _) = return ()+++-- ---------------------------------------------------------------------+instance ExactPrint (HsValBindsLR GhcPs GhcPs) where+ getAnnotationEntry _ = NoEntryVal++ exact (ValBinds sortKey binds sigs) = do+ setLayoutBoth $ withSortKey sortKey+ (prepareListAnnotationA (bagToList binds)+ ++ prepareListAnnotationA sigs+ )+ exact (XValBindsLR _) = panic "XValBindsLR"++-- ---------------------------------------------------------------------++instance ExactPrint (HsIPBinds GhcPs) where+ getAnnotationEntry = const NoEntryVal++ exact (IPBinds _ binds) = setLayoutBoth $ markAnnotated binds++-- ---------------------------------------------------------------------++instance ExactPrint (IPBind GhcPs) where+ getAnnotationEntry (IPBind an _ _) = fromAnn an++ exact (IPBind an (Left lr) rhs) = do+ markAnnotated lr+ markEpAnn an AnnEqual+ markAnnotated rhs++ exact (IPBind _ (Right _) _) = error $ "ExactPrint IPBind: Right only after typechecker"++-- ---------------------------------------------------------------------++instance ExactPrint HsIPName where+ getAnnotationEntry = const NoEntryVal++ exact (HsIPName fs) = printStringAdvance ("?" ++ (unpackFS fs))++-- ---------------------------------------------------------------------+-- Managing lists which have been separated, e.g. Sigs and Binds++prepareListAnnotationF :: (a -> EPP ()) -> [LocatedAn an a] -> [(RealSrcSpan,EPP ())]+prepareListAnnotationF f ls+ = map (\b -> (realSrcSpan $ getLocA b, f (unLoc b))) ls++prepareListAnnotationA :: ExactPrint (LocatedAn an a)+ => [LocatedAn an a] -> [(RealSrcSpan,EPP ())]+prepareListAnnotationA ls = map (\b -> (realSrcSpan $ getLocA b,markAnnotated b)) ls++withSortKey :: AnnSortKey -> [(RealSrcSpan, EPP ())] -> EPP ()+withSortKey annSortKey xs = do+ debugM $ "withSortKey:annSortKey=" ++ showAst annSortKey+ let ordered = case annSortKey of+ NoAnnSortKey -> sortBy orderByFst xs+ -- Just keys -> error $ "withSortKey: keys" ++ show keys+ AnnSortKey keys -> orderByKey xs keys+ -- `debug` ("withSortKey:" +++ -- showPprUnsafe (map fst (sortBy (comparing (flip elemIndex keys . fst)) xs),+ -- map fst xs,+ -- keys)+ -- )+ mapM_ snd ordered++orderByFst :: Ord a => (a, b1) -> (a, b2) -> Ordering+orderByFst (a,_) (b,_) = compare a b++-- ---------------------------------------------------------------------++instance ExactPrint (Sig GhcPs) where+ getAnnotationEntry (TypeSig a _ _) = fromAnn a+ getAnnotationEntry (PatSynSig a _ _) = fromAnn a+ getAnnotationEntry (ClassOpSig a _ _ _) = fromAnn a+ getAnnotationEntry (IdSig {}) = NoEntryVal+ getAnnotationEntry (FixSig a _) = fromAnn a+ getAnnotationEntry (InlineSig a _ _) = fromAnn a+ getAnnotationEntry (SpecSig a _ _ _) = fromAnn a+ getAnnotationEntry (SpecInstSig a _ _) = fromAnn a+ getAnnotationEntry (MinimalSig a _ _) = fromAnn a+ getAnnotationEntry (SCCFunSig a _ _ _) = fromAnn a+ getAnnotationEntry (CompleteMatchSig a _ _ _) = fromAnn a++-- instance Annotate (Sig GhcPs) where++ exact (TypeSig an vars ty) = exactVarSig an vars ty++ exact (PatSynSig an lns typ) = do+ markLocatedAAL an asRest AnnPattern+ markAnnotated lns+ markLocatedAA an asDcolon+ markAnnotated typ++ exact (ClassOpSig an is_deflt vars ty)+ | is_deflt = markLocatedAAL an asRest AnnDefault >> exactVarSig an vars ty+ | otherwise = exactVarSig an vars ty++-- markAST _ (IdSig {}) =+-- traceM "warning: Introduced after renaming"++ exact (FixSig an (FixitySig _ names (Fixity src v fdir))) = do+ let fixstr = case fdir of+ InfixL -> "infixl"+ InfixR -> "infixr"+ InfixN -> "infix"+ markLocatedAALS an id AnnInfix (Just fixstr)+-- markSourceText src (show v)+ markLocatedAALS an id AnnVal (Just (sourceTextToString src (show v)))+ markAnnotated names+++ exact (InlineSig an ln inl) = do+ markAnnOpen an (inl_src inl) "{-# INLINE"+ -- markActivation l (inl_act inl)+ markActivation an id (inl_act inl)+ markAnnotated ln+ -- markWithString AnnClose "#-}" -- '#-}'+ debugM $ "InlineSig:an=" ++ showAst an+ p <- getPosP+ debugM $ "InlineSig: p=" ++ show p+ markLocatedAALS an id AnnClose (Just "#-}")+ debugM $ "InlineSig:done"++ exact (SpecSig an ln typs inl) = do+ markAnnOpen an (inl_src inl) "{-# SPECIALISE" -- Note: may be {-# SPECIALISE_INLINE+ markActivation an id (inl_act inl)+ markAnnotated ln+ markEpAnn an AnnDcolon+ markAnnotated typs+ markLocatedAALS an id AnnClose (Just "#-}")++ exact (SpecInstSig an src typ) = do+ markAnnOpen an src "{-# SPECIALISE"+ markEpAnn an AnnInstance+ markAnnotated typ+ markLocatedAALS an id AnnClose (Just "#-}")++-- markAST _ (SpecInstSig _ src typ) = do+-- markAnnOpen src "{-# SPECIALISE"+-- mark AnnInstance+-- markLHsSigType typ+-- markWithString AnnClose "#-}" -- '#-}'+-- markTrailingSemi++ exact (MinimalSig an src formula) = do+ markAnnOpen an src "{-# MINIMAL"+ markAnnotated formula+ markLocatedAALS an id AnnClose (Just "#-}")++-- markAST _ (MinimalSig _ src formula) = do+-- markAnnOpen src "{-# MINIMAL"+-- markLocated formula+-- markWithString AnnClose "#-}"+-- markTrailingSemi++ exact (SCCFunSig an src ln ml) = do+ markAnnOpen an src "{-# SCC"+ markAnnotated ln+ markAnnotated ml+ markLocatedAALS an id AnnClose (Just "#-}")++ exact (CompleteMatchSig an src cs mty) = do+ markAnnOpen an src "{-# COMPLETE"+ markAnnotated cs+ case mty of+ Nothing -> return ()+ Just ty -> do+ markEpAnn an AnnDcolon+ markAnnotated ty+ markLocatedAALS an id AnnClose (Just "#-}")++ exact x = error $ "exact Sig for:" ++ showAst x++-- ---------------------------------------------------------------------++exactVarSig :: (ExactPrint a) => EpAnn AnnSig -> [LocatedN RdrName] -> a -> EPP ()+exactVarSig an vars ty = do+ mapM_ markAnnotated vars+ markLocatedAA an asDcolon+ markAnnotated ty++-- ---------------------------------------------------------------------++-- instance ExactPrint (FixitySig GhcPs) where+-- getAnnotationEntry = const NoEntryVal++-- exact (FixitySig an names (Fixity src v fdir)) = do+-- let fixstr = case fdir of+-- InfixL -> "infixl"+-- InfixR -> "infixr"+-- InfixN -> "infix"+-- markAnnotated names+-- markLocatedAALS an id AnnInfix (Just fixstr)+-- -- markAST _ (FixSig _ (FixitySig _ lns (Fixity src v fdir))) = do+-- -- let fixstr = case fdir of+-- -- InfixL -> "infixl"+-- -- InfixR -> "infixr"+-- -- InfixN -> "infix"+-- -- markWithString AnnInfix fixstr+-- -- markSourceText src (show v)+-- -- setContext (Set.singleton InfixOp) $ markListIntercalate lns+-- -- markTrailingSemi+-- ---------------------------------------------------------------------++instance ExactPrint (StandaloneKindSig GhcPs) where+ getAnnotationEntry (StandaloneKindSig an _ _) = fromAnn an++ exact (StandaloneKindSig an vars sig) = do+ markEpAnn an AnnType+ markAnnotated vars+ markEpAnn an AnnDcolon+ markAnnotated sig++-- ---------------------------------------------------------------------++instance ExactPrint (DefaultDecl GhcPs) where+ getAnnotationEntry (DefaultDecl an _) = fromAnn an++ exact (DefaultDecl an tys) = do+ markEpAnn an AnnDefault+ markEpAnn an AnnOpenP+ markAnnotated tys+ markEpAnn an AnnCloseP++-- ---------------------------------------------------------------------++instance ExactPrint (AnnDecl GhcPs) where+ getAnnotationEntry (HsAnnotation an _ _ _) = fromAnn an++ exact (HsAnnotation an src prov e) = do+ markAnnOpenP an src "{-# ANN"+ case prov of+ (ValueAnnProvenance n) -> markAnnotated n+ (TypeAnnProvenance n) -> do+ markLocatedAAL an apr_rest AnnType+ markAnnotated n+ ModuleAnnProvenance -> markLocatedAAL an apr_rest AnnModule++ markAnnotated e+ markAnnCloseP an++-- ---------------------------------------------------------------------++instance ExactPrint (BF.BooleanFormula (LocatedN RdrName)) where+ getAnnotationEntry = const NoEntryVal++ exact (BF.Var x) = do+ markAnnotated x+ exact (BF.Or ls) = markAnnotated ls+ exact (BF.And ls) = do+ markAnnotated ls+ exact (BF.Parens x) = do+ -- mark AnnOpenP -- '('+ markAnnotated x+ -- mark 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 ExactPrint (LHsSigWcType GhcPs) where+-- instance ExactPrint (HsWildCardBndrs GhcPs (LHsSigType GhcPs)) where+instance (ExactPrint body) => ExactPrint (HsWildCardBndrs GhcPs body) where+ getAnnotationEntry = const NoEntryVal+ exact (HsWC _ ty) = markAnnotated ty++-- ---------------------------------------------------------------------++instance ExactPrint (GRHS GhcPs (LocatedA (HsExpr GhcPs))) where+ getAnnotationEntry (GRHS an _ _) = fromAnn an++ exact (GRHS an guards expr) = do+ debugM $ "GRHS comments:" ++ showGhc (comments an)+ markAnnKwM an ga_vbar AnnVbar+ markAnnotated guards+ debugM $ "GRHS before matchSeparator"+ markLocatedAA an ga_sep -- Mark the matchSeparator for these GRHSs+ debugM $ "GRHS after matchSeparator"+ markAnnotated expr+ -- markLocatedAA an ga_sep++instance ExactPrint (GRHS GhcPs (LocatedA (HsCmd GhcPs))) where+ getAnnotationEntry (GRHS ann _ _) = fromAnn ann++ exact (GRHS an guards expr) = do+ markAnnKwM an ga_vbar AnnVbar+ markAnnotated guards+ markLocatedAA an ga_sep -- Mark the matchSeparator for these GRHSs+ markAnnotated expr++-- ---------------------------------------------------------------------++instance ExactPrint (HsExpr GhcPs) where+ getAnnotationEntry (HsVar{}) = NoEntryVal+ getAnnotationEntry (HsUnboundVar an _) = fromAnn an+ getAnnotationEntry (HsConLikeOut{}) = NoEntryVal+ getAnnotationEntry (HsRecFld{}) = NoEntryVal+ getAnnotationEntry (HsOverLabel an _) = fromAnn an+ getAnnotationEntry (HsIPVar an _) = fromAnn an+ getAnnotationEntry (HsOverLit an _) = fromAnn an+ getAnnotationEntry (HsLit an _) = fromAnn an+ getAnnotationEntry (HsLam _ _) = NoEntryVal+ getAnnotationEntry (HsLamCase an _) = fromAnn an+ getAnnotationEntry (HsApp an _ _) = fromAnn an+ getAnnotationEntry (HsAppType _ _ _) = NoEntryVal+ getAnnotationEntry (OpApp an _ _ _) = fromAnn an+ getAnnotationEntry (NegApp an _ _) = fromAnn an+ getAnnotationEntry (HsPar an _) = fromAnn an+ getAnnotationEntry (SectionL an _ _) = fromAnn an+ getAnnotationEntry (SectionR an _ _) = fromAnn an+ getAnnotationEntry (ExplicitTuple an _ _) = fromAnn an+ getAnnotationEntry (ExplicitSum an _ _ _) = fromAnn an+ getAnnotationEntry (HsCase an _ _) = fromAnn an+ getAnnotationEntry (HsIf an _ _ _) = fromAnn an+ getAnnotationEntry (HsMultiIf an _) = fromAnn an+ getAnnotationEntry (HsLet an _ _) = fromAnn an+ getAnnotationEntry (HsDo an _ _) = fromAnn an+ getAnnotationEntry (ExplicitList an _) = fromAnn an+ getAnnotationEntry (RecordCon an _ _) = fromAnn an+ getAnnotationEntry (RecordUpd an _ _) = fromAnn an+ getAnnotationEntry (HsGetField an _ _) = fromAnn an+ getAnnotationEntry (HsProjection an _) = fromAnn an+ getAnnotationEntry (ExprWithTySig an _ _) = fromAnn an+ getAnnotationEntry (ArithSeq an _ _) = fromAnn an+ getAnnotationEntry (HsBracket an _) = fromAnn an+ getAnnotationEntry (HsRnBracketOut{}) = NoEntryVal+ getAnnotationEntry (HsTcBracketOut{}) = NoEntryVal+ getAnnotationEntry (HsSpliceE an _) = fromAnn an+ getAnnotationEntry (HsProc an _ _) = fromAnn an+ getAnnotationEntry (HsStatic an _) = fromAnn an+ getAnnotationEntry (HsTick {}) = NoEntryVal+ getAnnotationEntry (HsBinTick {}) = NoEntryVal+ getAnnotationEntry (HsPragE{}) = NoEntryVal+++ exact (HsVar _ n) = markAnnotated n+ exact x@(HsUnboundVar an _v) = do+ case an of+ EpAnnNotUsed -> withPpr x+ EpAnn _ (EpAnnUnboundVar (ob,cb) l) _ -> do+ printStringAtAA ob "`"+ printStringAtAA l "_"+ printStringAtAA cb "`"+ -- exact x@(HsConLikeOut{}) = withPpr x+ -- exact x@(HsRecFld{}) = withPpr x+ exact x@(HsOverLabel _ _) = withPpr x++ exact (HsIPVar _ (HsIPName n))+ = printStringAdvance ("?" ++ unpackFS n)++ exact x@(HsOverLit _an ol) = do+ let str = case ol_val ol of+ HsIntegral (IL src _ _) -> src+ HsFractional (FL { fl_text = src }) -> src+ HsIsString src _ -> src+ -- markExternalSourceText l str ""+ case str of+ SourceText s -> printStringAdvance s+ NoSourceText -> withPpr x++ exact (HsLit _an lit) = withPpr lit+ exact (HsLam _ (MG _ (L _ [match]) _)) = do+ markAnnotated match+ -- markExpr _ (HsLam _ (MG _ (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 _ (HsLam _ _) = error $ "HsLam with other than one match"+ exact (HsLam _ _) = error $ "HsLam with other than one match"++ exact (HsLamCase an mg) = do+ markEpAnn an AnnLam+ markEpAnn an AnnCase+ markAnnotated mg++ exact (HsApp _an e1 e2) = do+ p <- getPosP+ debugM $ "HsApp entered. p=" ++ show p+ markAnnotated e1+ markAnnotated e2+ exact (HsAppType ss fun arg) = do+ markAnnotated fun+ printStringAtSs ss "@"+ markAnnotated arg+ exact (OpApp _an e1 e2 e3) = do+ markAnnotated e1+ markAnnotated e2+ markAnnotated e3++ exact (NegApp an e _) = do+ markEpAnn an AnnMinus+ markAnnotated e++ exact (HsPar an e) = do+ markOpeningParen an+ markAnnotated e+ debugM $ "HsPar closing paren"+ markClosingParen an+ debugM $ "HsPar done"++ exact (SectionL _an expr op) = do+ markAnnotated expr+ markAnnotated op++ exact (SectionR _an op expr) = do+ markAnnotated op+ markAnnotated expr++ exact (ExplicitTuple an args b) = do+ if b == Boxed then markEpAnn an AnnOpenP+ else markEpAnn an AnnOpenPH++ mapM_ markAnnotated args++ if b == Boxed then markEpAnn an AnnCloseP+ else markEpAnn an AnnClosePH+ debugM $ "ExplicitTuple done"++ exact (ExplicitSum an _alt _arity expr) = do+ -- markEpAnn an AnnOpenPH+ markAnnKw an aesOpen AnnOpenPH+ markAnnKwAll an aesBarsBefore AnnVbar+ markAnnotated expr+ markAnnKwAll an aesBarsAfter AnnVbar+ markAnnKw an aesClose AnnClosePH++ exact (HsCase an e alts) = do+ markAnnKw an hsCaseAnnCase AnnCase+ markAnnotated e+ markAnnKw an hsCaseAnnOf AnnOf+ markEpAnn' an hsCaseAnnsRest AnnOpenC+ markEpAnnAll an hsCaseAnnsRest AnnSemi+ setLayoutBoth $ markAnnotated alts+ markEpAnn' an hsCaseAnnsRest AnnCloseC++ -- exact x@(HsCase EpAnnNotUsed _ _) = withPpr x+ exact (HsIf an e1 e2 e3) = do+ markAnnKw an aiIf AnnIf+ markAnnotated e1+ markAnnKwM an aiThenSemi AnnSemi+ markAnnKw an aiThen AnnThen+ markAnnotated e2+ markAnnKwM an aiElseSemi AnnSemi+ markAnnKw an aiElse AnnElse+ markAnnotated e3++ exact (HsMultiIf an mg) = do+ markEpAnn an AnnIf+ markEpAnn an AnnOpenC -- optional+ markAnnotated mg+ markEpAnn an AnnCloseC -- optional++ exact (HsLet an binds e) = do+ setLayoutBoth $ do -- Make sure the 'in' gets indented too+ markAnnKw an alLet AnnLet+ debugM $ "HSlet:binds coming"+ setLayoutBoth $ markAnnotated binds+ debugM $ "HSlet:binds done"+ markAnnKw an alIn AnnIn+ debugM $ "HSlet:expr coming"+ markAnnotated e++ exact (HsDo an do_or_list_comp stmts) = do+ debugM $ "HsDo"+ markAnnList True an $ exactDo an do_or_list_comp stmts++ exact (ExplicitList an es) = do+ debugM $ "ExplicitList start"+ markLocatedMAA an al_open+ markAnnotated es+ markLocatedMAA an al_close+ debugM $ "ExplicitList end"+ exact (RecordCon an con_id binds) = do+ markAnnotated con_id+ markEpAnn an AnnOpenC+ markAnnotated binds+ markEpAnn an AnnCloseC+ exact (RecordUpd an expr fields) = do+ markAnnotated expr+ markEpAnn an AnnOpenC+ markAnnotated fields+ markEpAnn an AnnCloseC+ exact (HsGetField _an expr field) = do+ markAnnotated expr+ markAnnotated field+ exact (HsProjection an flds) = do+ markAnnKw an apOpen AnnOpenP+ markAnnotated flds+ markAnnKw an apClose AnnCloseP+ exact (ExprWithTySig an expr sig) = do+ markAnnotated expr+ markEpAnn an AnnDcolon+ markAnnotated sig+ exact (ArithSeq an _ seqInfo) = do+ markEpAnn an AnnOpenS -- '['+ case seqInfo of+ From e -> do+ markAnnotated e+ markEpAnn an AnnDotdot+ FromTo e1 e2 -> do+ markAnnotated e1+ markEpAnn an AnnDotdot+ markAnnotated e2+ FromThen e1 e2 -> do+ markAnnotated e1+ markEpAnn an AnnComma+ markAnnotated e2+ markEpAnn an AnnDotdot+ FromThenTo e1 e2 e3 -> do+ markAnnotated e1+ markEpAnn an AnnComma+ markAnnotated e2+ markEpAnn an AnnDotdot+ markAnnotated e3+ markEpAnn an AnnCloseS -- ']'+++ exact (HsBracket an (ExpBr _ e)) = do+ markEpAnn an AnnOpenEQ -- "[|"+ markEpAnn an AnnOpenE -- "[e|" -- optional+ markAnnotated e+ markEpAnn an AnnCloseQ -- "|]"+ exact (HsBracket an (PatBr _ e)) = do+ markLocatedAALS an id AnnOpen (Just "[p|")+ markAnnotated e+ markEpAnn an AnnCloseQ -- "|]"+ exact (HsBracket an (DecBrL _ e)) = do++ markLocatedAALS an id AnnOpen (Just "[d|")+ -- See https://gitlab.haskell.org/ghc/ghc/-/issues/20257, we need+ -- to mark braces here for the time being+ markEpAnn an AnnOpenC -- "{"+ markAnnotated e+ markEpAnn an AnnCloseC -- "}"+ markEpAnn an AnnCloseQ -- "|]"+ -- -- exact (HsBracket an (DecBrG _ _)) =+ -- -- traceM "warning: DecBrG introduced after renamer"+ exact (HsBracket an (TypBr _ e)) = do+ markLocatedAALS an id AnnOpen (Just "[t|")+ markAnnotated e+ markEpAnn an AnnCloseQ -- "|]"+ exact (HsBracket an (VarBr _ b e)) = do+ if b+ then do+ markEpAnn an AnnSimpleQuote+ markAnnotated e+ else do+ markEpAnn an AnnThTyQuote+ markAnnotated e+ exact (HsBracket an (TExpBr _ e)) = do+ markLocatedAALS an id AnnOpen (Just "[||")+ markLocatedAALS an id AnnOpenE (Just "[e||")+ markAnnotated e+ markLocatedAALS an id AnnClose (Just "||]")+++ -- exact x@(HsRnBracketOut{}) = withPpr x+ -- exact x@(HsTcBracketOut{}) = withPpr x+ exact (HsSpliceE _ sp) = markAnnotated sp++ exact (HsProc an p c) = do+ debugM $ "HsProc start"+ markEpAnn an AnnProc+ markAnnotated p+ markEpAnn an AnnRarrow+ debugM $ "HsProc after AnnRarrow"+ markAnnotated c++ exact (HsStatic an e) = do+ markEpAnn an AnnStatic+ markAnnotated e++ -- exact x@(HsTick {}) = withPpr x+ -- exact x@(HsBinTick {}) = withPpr x+ exact (HsPragE _ prag e) = do+ markAnnotated prag+ markAnnotated e+ exact x = error $ "exact HsExpr for:" ++ showAst x++-- ---------------------------------------------------------------------++exactDo :: (ExactPrint body)+ => EpAnn AnnList -> (HsStmtContext any) -> body -> EPP ()+exactDo an (DoExpr m) stmts = exactMdo an m AnnDo >> markAnnotatedWithLayout stmts+exactDo an GhciStmtCtxt stmts = markLocatedAAL an al_rest AnnDo >> markAnnotatedWithLayout stmts+exactDo an ArrowExpr stmts = markLocatedAAL an al_rest AnnDo >> markAnnotatedWithLayout stmts+exactDo an (MDoExpr m) stmts = exactMdo an m AnnMdo >> markAnnotatedWithLayout stmts+exactDo _ ListComp stmts = markAnnotatedWithLayout stmts+exactDo _ MonadComp stmts = markAnnotatedWithLayout stmts+exactDo _ _ _ = panic "pprDo" -- PatGuard, ParStmtCxt++exactMdo :: EpAnn AnnList -> Maybe ModuleName -> AnnKeywordId -> EPP ()+exactMdo an Nothing kw = markLocatedAAL an al_rest kw+exactMdo an (Just module_name) kw = markLocatedAALS an al_rest kw (Just n)+ where+ n = (moduleNameString module_name) ++ "." ++ (keywordToString (G kw))+++-- ---------------------------------------------------------------------+instance ExactPrint (HsPragE GhcPs) where+ getAnnotationEntry HsPragSCC{} = NoEntryVal++ exact (HsPragSCC an st sl) = do+ markAnnOpenP an st "{-# SCC"+ let txt = sourceTextToString (sl_st sl) (unpackFS $ sl_fs sl)+ markLocatedAALS an apr_rest AnnVal (Just txt) -- optional+ markLocatedAALS an apr_rest AnnValStr (Just txt) -- optional+ markAnnCloseP an++ -- markExpr _ (GHC.HsPragE _ prag e) = do+ -- case prag of+ -- (GHC.HsPragSCC _ src csFStr) -> 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++ -- (GHC.HsPragTick _ src (str,(v1,v2),(v3,v4)) ((s1,s2),(s3,s4))) -> 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++-- ---------------------------------------------------------------------++instance ExactPrint (HsSplice GhcPs) where+ getAnnotationEntry (HsTypedSplice an _ _ _) = fromAnn an+ getAnnotationEntry (HsUntypedSplice an _ _ _) = fromAnn an+ getAnnotationEntry (HsQuasiQuote _ _ _ _ _) = NoEntryVal+ getAnnotationEntry (HsSpliced _ _ _) = NoEntryVal++ exact (HsTypedSplice an DollarSplice _n e) = do+ markEpAnn an AnnDollarDollar+ markAnnotated e++ -- = ppr_splice (text "$$") n e empty+ -- exact (HsTypedSplice _ BareSplice _ _ )+ -- = panic "Bare typed splice" -- impossible+ exact (HsUntypedSplice an decoration _n b) = do+ when (decoration == DollarSplice) $ markEpAnn an AnnDollar+ markAnnotated b++ -- exact (HsUntypedSplice _ DollarSplice n e)+ -- = ppr_splice (text "$") n e empty+ -- exact (HsUntypedSplice _ BareSplice n e)+ -- = ppr_splice empty n e empty++ exact (HsQuasiQuote _ _ q ss fs) = do+ -- The quasiquote string does not honour layout offsets. Store+ -- the colOffset for now.+ -- TODO: use local?+ oldOffset <- getLayoutOffsetP+ EPState{pMarkLayout} <- get+ unless pMarkLayout $ setLayoutOffsetP 0+ printStringAdvance+ -- Note: Lexer.x does not provide unicode alternative. 2017-02-26+ ("[" ++ (showPprUnsafe q) ++ "|" ++ (unpackFS fs) ++ "|]")+ unless pMarkLayout $ setLayoutOffsetP oldOffset+ p <- getPosP+ debugM $ "HsQuasiQuote:after:(p,ss)=" ++ show (p,ss2range ss)++ -- exact (HsSpliced _ _ thing) = ppr thing+ -- exact (XSplice x) = case ghcPass @p of+ exact x = error $ "exact HsSplice for:" ++ showAst x++-- ---------------------------------------------------------------------++-- TODO:AZ: combine these instances+instance ExactPrint (MatchGroup GhcPs (LocatedA (HsExpr GhcPs))) where+ getAnnotationEntry = const NoEntryVal+ exact (MG _ matches _) = do+ -- TODO:AZ use SortKey, in MG ann.+ markAnnotated matches++instance ExactPrint (MatchGroup GhcPs (LocatedA (HsCmd GhcPs))) where+ getAnnotationEntry = const NoEntryVal+ exact (MG _ matches _) = do+ -- TODO:AZ use SortKey, in MG ann.+ markAnnotated matches++-- ---------------------------------------------------------------------++instance (ExactPrint body) => ExactPrint (HsRecFields GhcPs body) where+ getAnnotationEntry = const NoEntryVal+ exact (HsRecFields fields mdot) = do+ markAnnotated fields+ case mdot of+ Nothing -> return ()+ Just (L ss _) ->+ printStringAtSs ss ".."+ -- Note: mdot contains the SrcSpan where the ".." appears, if present++-- ---------------------------------------------------------------------++-- instance (ExactPrint body) => ExactPrint (HsRecField GhcPs body) where+instance (ExactPrint body)+ => ExactPrint (HsRecField' (FieldOcc GhcPs) body) where+ getAnnotationEntry x = fromAnn (hsRecFieldAnn x)+ exact (HsRecField an f arg isPun) = do+ debugM $ "HsRecField"+ markAnnotated f+ if isPun then return ()+ else do+ markEpAnn an AnnEqual+ markAnnotated arg++-- ---------------------------------------------------------------------++instance (ExactPrint body)+ => ExactPrint (HsRecField' (FieldLabelStrings GhcPs) body) where+ getAnnotationEntry x = fromAnn (hsRecFieldAnn x)+ exact (HsRecField an f arg isPun) = do+ debugM $ "HsRecField FieldLabelStrings"+ markAnnotated f+ if isPun then return ()+ else do+ markEpAnn an AnnEqual+ markAnnotated arg++-- ---------------------------------------------------------------------++-- instance ExactPrint (HsRecUpdField GhcPs ) where+instance (ExactPrint (LocatedA body))+ => ExactPrint (HsRecField' (AmbiguousFieldOcc GhcPs) (LocatedA body)) where+-- instance (ExactPrint body)+ -- => ExactPrint (HsRecField' (AmbiguousFieldOcc GhcPs) body) where+ getAnnotationEntry x = fromAnn (hsRecFieldAnn x)+ exact (HsRecField an f arg isPun) = do+ debugM $ "HsRecUpdField"+ markAnnotated f+ if isPun then return ()+ else markEpAnn an AnnEqual+ unless ((locA $ getLoc arg) == noSrcSpan ) $ markAnnotated arg++-- ---------------------------------------------------------------------+instance+ (ExactPrint (HsRecField' (a GhcPs) body),+ ExactPrint (HsRecField' (b GhcPs) body))+ => ExactPrint+ (Either [LocatedA (HsRecField' (a GhcPs) body)]+ [LocatedA (HsRecField' (b GhcPs) body)]) where+ getAnnotationEntry = const NoEntryVal+ exact (Left rbinds) = markAnnotated rbinds+ exact (Right pbinds) = markAnnotated pbinds++-- ---------------------------------------------------------------------++instance ExactPrint (FieldLabelStrings GhcPs) where+ getAnnotationEntry = const NoEntryVal+ exact (FieldLabelStrings fs) = markAnnotated fs++-- ---------------------------------------------------------------------++instance ExactPrint (HsFieldLabel GhcPs) where+ getAnnotationEntry (HsFieldLabel an _) = fromAnn an++ exact (HsFieldLabel an fs) = do+ markAnnKwM an afDot AnnDot+ markAnnotated fs++-- ---------------------------------------------------------------------++instance ExactPrint (HsTupArg GhcPs) where+ getAnnotationEntry (Present an _) = fromAnn an+ getAnnotationEntry (Missing an) = fromAnn an++ exact (Present _ e) = markAnnotated e++ exact (Missing EpAnnNotUsed) = return ()+ exact (Missing _) = printStringAdvance ","++-- ---------------------------------------------------------------------++instance ExactPrint (HsCmdTop GhcPs) where+ getAnnotationEntry = const NoEntryVal+ exact (HsCmdTop _ cmd) = markAnnotated cmd++-- ---------------------------------------------------------------------++instance ExactPrint (HsCmd GhcPs) where+ getAnnotationEntry (HsCmdArrApp an _ _ _ _) = fromAnn an+ getAnnotationEntry (HsCmdArrForm an _ _ _ _ ) = fromAnn an+ getAnnotationEntry (HsCmdApp an _ _ ) = fromAnn an+ getAnnotationEntry (HsCmdLam {}) = NoEntryVal+ getAnnotationEntry (HsCmdPar an _) = fromAnn an+ getAnnotationEntry (HsCmdCase an _ _) = fromAnn an+ getAnnotationEntry (HsCmdLamCase an _) = fromAnn an+ getAnnotationEntry (HsCmdIf an _ _ _ _) = fromAnn an+ getAnnotationEntry (HsCmdLet an _ _) = fromAnn an+ getAnnotationEntry (HsCmdDo an _) = fromAnn an++++ exact (HsCmdArrApp an arr arg _o isRightToLeft) = do+ if isRightToLeft+ then do+ markAnnotated arr+ markKw (anns an)+ markAnnotated arg+ else do+ markAnnotated arg+ markKw (anns an)+ markAnnotated arr++ exact (HsCmdArrForm an e fixity _mf cs) = do+ markLocatedMAA an al_open+ case (fixity, cs) of+ (Infix, (arg1:argrest)) -> do+ markAnnotated arg1+ markAnnotated e+ markAnnotated argrest+ (Prefix, _) -> do+ markAnnotated e+ markAnnotated cs+ (Infix, []) -> error "Not possible"+ markLocatedMAA an al_close++ exact (HsCmdApp _an e1 e2) = do+ markAnnotated e1+ markAnnotated e2++ exact (HsCmdLam _ match) = markAnnotated match++ exact (HsCmdPar an e) = do+ markOpeningParen an+ markAnnotated e+ markClosingParen an++ exact (HsCmdCase an e alts) = do+ markAnnKw an hsCaseAnnCase AnnCase+ markAnnotated e+ markAnnKw an hsCaseAnnOf AnnOf+ markEpAnn' an hsCaseAnnsRest AnnOpenC+ markEpAnnAll an hsCaseAnnsRest AnnSemi+ markAnnotated alts+ markEpAnn' an hsCaseAnnsRest AnnCloseC++ exact (HsCmdLamCase an matches) = do+ markEpAnn an AnnLam+ markEpAnn an AnnCase+ markAnnotated matches++ exact (HsCmdIf an _ e1 e2 e3) = do+ markAnnKw an aiIf AnnIf+ markAnnotated e1+ markAnnKwM an aiThenSemi AnnSemi+ markAnnKw an aiThen AnnThen+ markAnnotated e2+ markAnnKwM an aiElseSemi AnnSemi+ markAnnKw an aiElse AnnElse+ markAnnotated e3++ exact (HsCmdLet an binds e) = do+ markAnnKw an alLet AnnLet+ markAnnotated binds+ markAnnKw an alIn AnnIn+ markAnnotated e++-- markAST _ (GHC.HsCmdLet _ (GHC.L _ binds) e) = do+-- mark GHC.AnnLet+-- markOptional GHC.AnnOpenC+-- markLocalBindsWithLayout binds+-- markOptional GHC.AnnCloseC+-- mark GHC.AnnIn+-- markLocated e++ exact (HsCmdDo an es) = do+ debugM $ "HsCmdDo"+ markEpAnn' an al_rest AnnDo+ markAnnotated es++ -- exact x = error $ "exact HsCmd for:" ++ showAst x++-- ---------------------------------------------------------------------++-- instance ExactPrint (CmdLStmt GhcPs) where+-- getAnnotationEntry = const NoEntryVal+-- exact (L _ a) = markAnnotated a++-- ---------------------------------------------------------------------++instance (+ ExactPrint (LocatedA (body GhcPs)),+ Anno (StmtLR GhcPs GhcPs (LocatedA (body GhcPs))) ~ SrcSpanAnnA,+ Anno [GenLocated SrcSpanAnnA (StmtLR GhcPs GhcPs (LocatedA (body GhcPs)))] ~ SrcSpanAnnL,+ (ExactPrint (LocatedL [LocatedA (StmtLR GhcPs GhcPs (LocatedA (body GhcPs)))])))+ => ExactPrint (StmtLR GhcPs GhcPs (LocatedA (body GhcPs))) where+ getAnnotationEntry (LastStmt _ _ _ _) = NoEntryVal+ getAnnotationEntry (BindStmt an _ _) = fromAnn an+ getAnnotationEntry (ApplicativeStmt _ _ _) = NoEntryVal+ getAnnotationEntry (BodyStmt _ _ _ _) = NoEntryVal+ getAnnotationEntry (LetStmt an _) = fromAnn an+ getAnnotationEntry (ParStmt _ _ _ _) = NoEntryVal+ getAnnotationEntry (TransStmt an _ _ _ _ _ _ _ _) = fromAnn an+ getAnnotationEntry (RecStmt an _ _ _ _ _ _) = fromAnn an++ -----------------------------------------------------------------++ exact (LastStmt _ body _ _) = do+ debugM $ "LastStmt"+ markAnnotated body++ exact (BindStmt an pat body) = do+ debugM $ "BindStmt"+ markAnnotated pat+ markEpAnn an AnnLarrow+ markAnnotated body++ exact (ApplicativeStmt _ _body _) = do+ debugM $ "ApplicativeStmt"+ -- TODO: ApplicativeStmt+ -- markAnnotated body+ error $ "need to complete ApplicativeStmt"++ exact (BodyStmt _ body _ _) = do+ debugM $ "BodyStmt"+ markAnnotated body++ exact (LetStmt an binds) = do+ debugM $ "LetStmt"+ markEpAnn an AnnLet+ markAnnotated binds++ exact (ParStmt _ pbs _ _) = do+ debugM $ "ParStmt"+ markAnnotated pbs++ -- 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+++-- pprStmt (TransStmt { trS_stmts = stmts, trS_by = by+-- , trS_using = using, trS_form = form })+-- = sep $ punctuate comma (map ppr stmts ++ [pprTransStmt by using form])++ exact (TransStmt an form stmts _b using by _ _ _) = do+ debugM $ "TransStmt"+ markAnnotated stmts+ exactTransStmt an by using form++ -- 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++ exact (RecStmt an stmts _ _ _ _ _) = do+ debugM $ "RecStmt"+ markLocatedAAL an al_rest AnnRec+ markAnnList True an (markAnnotated stmts)++ -- markAST _ (GHC.RecStmt _ stmts _ _ _ _ _) = do+ -- mark GHC.AnnRec+ -- markOptional GHC.AnnOpenC+ -- markInside GHC.AnnSemi+ -- markListWithLayout stmts+ -- markOptional GHC.AnnCloseC+ -- inContext (Set.singleton AddVbar) $ mark GHC.AnnVbar+ -- inContext (Set.singleton Intercalate) $ mark GHC.AnnComma+ -- markTrailingSemi++ -- exact x = error $ "exact CmdLStmt for:" ++ showAst x+ -- exact x = error $ "exact CmdLStmt for:"+++-- ---------------------------------------------------------------------++instance ExactPrint (ParStmtBlock GhcPs GhcPs) where+ getAnnotationEntry = const NoEntryVal+ exact (ParStmtBlock _ stmts _ _) = markAnnotated stmts++exactTransStmt :: EpAnn [AddEpAnn] -> Maybe (LHsExpr GhcPs) -> (LHsExpr GhcPs) -> TransForm -> EPP ()+exactTransStmt an by using ThenForm = do+ debugM $ "exactTransStmt:ThenForm"+ markEpAnn an AnnThen+ markAnnotated using+ case by of+ Nothing -> return ()+ Just b -> do+ markEpAnn an AnnBy+ markAnnotated b+exactTransStmt an by using GroupForm = do+ debugM $ "exactTransStmt:GroupForm"+ markEpAnn an AnnThen+ markEpAnn an AnnGroup+ case by of+ Just b -> do+ markEpAnn an AnnBy+ markAnnotated b+ Nothing -> return ()+ markEpAnn an AnnUsing+ markAnnotated using++-- ---------------------------------------------------------------------++instance ExactPrint (TyClDecl GhcPs) where+ getAnnotationEntry (FamDecl { }) = NoEntryVal+ getAnnotationEntry (SynDecl { tcdSExt = an }) = fromAnn an+ getAnnotationEntry (DataDecl { tcdDExt = an }) = fromAnn an+ getAnnotationEntry (ClassDecl { tcdCExt = (an, _, _) }) = fromAnn an++ exact (FamDecl _ decl) = do+ markAnnotated decl++ exact (SynDecl { tcdSExt = an+ , tcdLName = ltycon, tcdTyVars = tyvars, tcdFixity = fixity+ , tcdRhs = rhs }) = 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 (epAnnAnns an) [AnnOpenP,AnnCloseP]+ markEpAnn an AnnType++ exactVanillaDeclHead ltycon tyvars fixity Nothing+ markEpAnn an AnnEqual+ markAnnotated rhs++ exact (DataDecl { tcdDExt = an, tcdLName = ltycon, tcdTyVars = tyvars+ , tcdFixity = fixity, tcdDataDefn = defn }) =+ exactDataDefn an (exactVanillaDeclHead ltycon tyvars fixity) defn++ -- -----------------------------------++ exact (ClassDecl {tcdCExt = (an, sortKey, _),+ tcdCtxt = context, tcdLName = lclas, tcdTyVars = tyvars,+ tcdFixity = fixity,+ tcdFDs = fds,+ tcdSigs = sigs, tcdMeths = methods,+ tcdATs = ats, tcdATDefs = at_defs,+ tcdDocs = _docs})+ -- TODO: add a test that demonstrates tcdDocs+ | null sigs && isEmptyBag methods && null ats && null at_defs -- No "where" part+ = do+ top_matter+ markEpAnn an AnnOpenC+ markEpAnn an AnnCloseC++ | otherwise -- Laid out+ = do+ top_matter+ markEpAnn an AnnOpenC+ markEpAnnAll an id AnnSemi+ withSortKey sortKey+ (prepareListAnnotationA sigs+ ++ prepareListAnnotationA (bagToList methods)+ ++ prepareListAnnotationA ats+ ++ prepareListAnnotationA at_defs+ -- ++ prepareListAnnotation docs+ )+ markEpAnn an AnnCloseC+ where+ top_matter = do+ annotationsToComments (epAnnAnns an) [AnnOpenP, AnnCloseP]+ markEpAnn an AnnClass+ exactVanillaDeclHead lclas tyvars fixity context+ unless (null fds) $ do+ markEpAnn an AnnVbar+ markAnnotated fds+ markEpAnn an AnnWhere++-- ---------------------------------------------------------------------++instance ExactPrint (FunDep GhcPs) where+ getAnnotationEntry (FunDep an _ _) = fromAnn an++ exact (FunDep an ls rs') = do+ markAnnotated ls+ markEpAnn an AnnRarrow+ markAnnotated rs'++-- ---------------------------------------------------------------------++instance ExactPrint (FamilyDecl GhcPs) where+ getAnnotationEntry (FamilyDecl { fdExt = an }) = fromAnn an++ exact (FamilyDecl { fdExt = an+ , fdInfo = info+ , fdTopLevel = top_level+ , fdLName = ltycon+ , fdTyVars = tyvars+ , fdFixity = fixity+ , fdResultSig = L _ result+ , fdInjectivityAnn = mb_inj }) = do+ -- = vcat [ pprFlavour info <+> pp_top_level <+>+ -- pp_vanilla_decl_head ltycon tyvars fixity Nothing <+>+ -- pp_kind <+> pp_inj <+> pp_where+ -- , nest 2 $ pp_eqns ]+ exactFlavour an info+ exact_top_level+ annotationsToCommentsA an [AnnOpenP,AnnCloseP]+ exactVanillaDeclHead ltycon tyvars fixity Nothing+ exact_kind+ case mb_inj of+ Nothing -> return ()+ Just inj -> do+ markEpAnn an AnnVbar+ markAnnotated inj+ case info of+ ClosedTypeFamily mb_eqns -> do+ markEpAnn an AnnWhere+ markEpAnn an AnnOpenC+ case mb_eqns of+ Nothing -> markEpAnn an AnnDotdot+ Just eqns -> markAnnotated eqns+ markEpAnn an AnnCloseC+ _ -> return ()+ where+ exact_top_level = case top_level of+ TopLevel -> markEpAnn an AnnFamily+ NotTopLevel -> do+ -- It seems that in some kind of legacy+ -- mode the 'family' keyword is still+ -- accepted.+ markEpAnn an AnnFamily+ return ()++ exact_kind = case result of+ NoSig _ -> return ()+ KindSig _ kind -> markEpAnn an AnnDcolon >> markAnnotated kind+ TyVarSig _ tv_bndr -> markEpAnn an AnnEqual >> markAnnotated tv_bndr++ -- exact_inj = case mb_inj of+ -- Just (L _ (InjectivityAnn _ lhs rhs)) ->+ -- hsep [ vbar, ppr lhs, text "->", hsep (map ppr rhs) ]+ -- Nothing -> empty+ -- (pp_where, pp_eqns) = case info of+ -- ClosedTypeFamily mb_eqns ->+ -- ( text "where"+ -- , case mb_eqns of+ -- Nothing -> text ".."+ -- Just eqns -> vcat $ map (ppr_fam_inst_eqn . unLoc) eqns )+ -- _ -> (empty, empty)++exactFlavour :: EpAnn [AddEpAnn] -> FamilyInfo GhcPs -> EPP ()+exactFlavour an DataFamily = markEpAnn an AnnData+exactFlavour an OpenTypeFamily = markEpAnn an AnnType+exactFlavour an (ClosedTypeFamily {}) = markEpAnn an AnnType++-- instance Outputable (FamilyInfo pass) where+-- ppr info = pprFlavour info <+> text "family"++-- ---------------------------------------------------------------------++data DataDefnWithContext+ = DataDefnWithContext+ { ddwc_an :: EpAnn [AddEpAnn]+ , ddwc_hdr:: (Maybe (LHsContext GhcPs) -> EPP ()) -- Printing the header+ , ddwc_defn:: HsDataDefn GhcPs+ }++instance ExactPrint DataDefnWithContext where+ getAnnotationEntry DataDefnWithContext{ddwc_an = an} = fromAnn an++ exact (DataDefnWithContext an exactHdr defn)+ = exactDataDefn an exactHdr defn++exactDataDefn :: EpAnn [AddEpAnn]+ -> (Maybe (LHsContext GhcPs) -> EPP ()) -- Printing the header+ -> HsDataDefn GhcPs+ -> EPP ()+exactDataDefn an exactHdr+ (HsDataDefn { dd_ND = new_or_data, dd_ctxt = context+ , dd_cType = mb_ct+ , dd_kindSig = mb_sig+ , dd_cons = condecls, dd_derivs = derivings }) = do+ annotationsToComments (epAnnAnns an) [AnnOpenP, AnnCloseP]+ if new_or_data == DataType+ then markEpAnn an AnnData+ else markEpAnn an AnnNewtype+ markEpAnn an AnnInstance -- optional+ mapM_ markAnnotated mb_ct+ exactHdr context+ case mb_sig of+ Nothing -> return ()+ Just kind -> do+ markEpAnn an AnnDcolon+ markAnnotated kind+ when (isGadt condecls) $ markEpAnn an AnnWhere+ markEpAnn an AnnOpenC+ exact_condecls an condecls+ markEpAnn an AnnCloseC+ mapM_ markAnnotated derivings+ return ()+++exactVanillaDeclHead :: LocatedN RdrName+ -> LHsQTyVars GhcPs+ -> LexicalFixity+ -> Maybe (LHsContext GhcPs)+ -> EPP ()+exactVanillaDeclHead thing (HsQTvs { hsq_explicit = tyvars }) fixity context = do+ let+ exact_tyvars :: [LHsTyVarBndr () GhcPs] -> EPP ()+ exact_tyvars (varl:varsr)+ | fixity == Infix && length varsr > 1 = do+ -- = hsep [char '(',ppr (unLoc varl), pprInfixOcc (unLoc thing)+ -- , (ppr.unLoc) (head varsr), char ')'+ -- , hsep (map (ppr.unLoc) (tail vaprsr))]+ markAnnotated varl+ markAnnotated thing+ markAnnotated (head varsr)+ markAnnotated (tail varsr)+ return ()+ | fixity == Infix = do+ -- = hsep [ppr (unLoc varl), pprInfixOcc (unLoc thing)+ -- , hsep (map (ppr.unLoc) varsr)]+ markAnnotated varl+ markAnnotated thing+ markAnnotated varsr+ return ()+ | otherwise = do+ -- hsep [ pprPrefixOcc (unLoc thing)+ -- , hsep (map (ppr.unLoc) (varl:varsr))]+ markAnnotated thing+ mapM_ markAnnotated (varl:varsr)+ return ()+ exact_tyvars [] = do+ -- pprPrefixOcc (unLoc thing)+ markAnnotated thing+ mapM_ markAnnotated context+ exact_tyvars tyvars++-- ---------------------------------------------------------------------++instance ExactPrint (InjectivityAnn GhcPs) where+ getAnnotationEntry (InjectivityAnn an _ _) = fromAnn an+ exact (InjectivityAnn an lhs rhs) = do+ markEpAnn an AnnVbar+ markAnnotated lhs+ markEpAnn an AnnRarrow+ mapM_ markAnnotated rhs+ -- Just (L _ (InjectivityAnn _ lhs rhs)) ->+ -- hsep [ vbar, ppr lhs, text "->", hsep (map ppr rhs) ]+ -- Nothing -> empty++-- ---------------------------------------------------------------------++class Typeable flag => ExactPrintTVFlag flag where+ exactTVDelimiters :: EpAnn [AddEpAnn] -> flag -> Annotated () -> Annotated ()++instance ExactPrintTVFlag () where+ exactTVDelimiters an _ thing_inside = do+ markEpAnnAll an id AnnOpenP+ thing_inside+ markEpAnnAll an id AnnCloseP++instance ExactPrintTVFlag Specificity where+ exactTVDelimiters an s thing_inside = do+ markEpAnnAll an id open+ thing_inside+ markEpAnnAll an id close+ where+ (open, close) = case s of+ SpecifiedSpec -> (AnnOpenP, AnnCloseP)+ InferredSpec -> (AnnOpenC, AnnCloseC)++instance ExactPrintTVFlag flag => ExactPrint (HsTyVarBndr flag GhcPs) where+ getAnnotationEntry (UserTyVar an _ _) = fromAnn an+ getAnnotationEntry (KindedTyVar an _ _ _) = fromAnn an++ exact (UserTyVar an flag n) =+ exactTVDelimiters an flag $ markAnnotated n+ exact (KindedTyVar an flag n k) = exactTVDelimiters an flag $ do+ markAnnotated n+ markEpAnn an AnnDcolon+ markAnnotated k++-- ---------------------------------------------------------------------++instance ExactPrint (HsType GhcPs) where+ getAnnotationEntry (HsForAllTy _ _ _) = NoEntryVal+ getAnnotationEntry (HsQualTy _ _ _) = NoEntryVal+ getAnnotationEntry (HsTyVar an _ _) = fromAnn an+ getAnnotationEntry (HsAppTy _ _ _) = NoEntryVal+ getAnnotationEntry (HsAppKindTy _ _ _) = NoEntryVal+ getAnnotationEntry (HsFunTy an _ _ _) = fromAnn an+ getAnnotationEntry (HsListTy an _) = fromAnn an+ getAnnotationEntry (HsTupleTy an _ _) = fromAnn an+ getAnnotationEntry (HsSumTy an _) = fromAnn an+ getAnnotationEntry (HsOpTy _ _ _ _) = NoEntryVal+ getAnnotationEntry (HsParTy an _) = fromAnn an+ getAnnotationEntry (HsIParamTy an _ _) = fromAnn an+ getAnnotationEntry (HsStarTy _ _) = NoEntryVal+ getAnnotationEntry (HsKindSig an _ _) = fromAnn an+ getAnnotationEntry (HsSpliceTy _ _) = NoEntryVal+ getAnnotationEntry (HsDocTy an _ _) = fromAnn an+ getAnnotationEntry (HsBangTy an _ _) = fromAnn an+ getAnnotationEntry (HsRecTy an _) = fromAnn an+ getAnnotationEntry (HsExplicitListTy an _ _) = fromAnn an+ getAnnotationEntry (HsExplicitTupleTy an _) = fromAnn an+ getAnnotationEntry (HsTyLit _ _) = NoEntryVal+ getAnnotationEntry (HsWildCardTy _) = NoEntryVal+ getAnnotationEntry (XHsType _) = NoEntryVal+++ exact (HsForAllTy { hst_xforall = _an+ , hst_tele = tele, hst_body = ty }) = do+ markAnnotated tele+ markAnnotated ty++ exact (HsQualTy _ ctxt ty) = do+ markAnnotated ctxt+ -- markEpAnn an AnnDarrow+ markAnnotated ty+ exact (HsTyVar an promoted name) = do+ when (promoted == IsPromoted) $ markEpAnn an AnnSimpleQuote+ markAnnotated name++ exact (HsAppTy _ t1 t2) = markAnnotated t1 >> markAnnotated t2+ exact (HsAppKindTy ss ty ki) = do+ markAnnotated ty+ printStringAtSs ss "@"+ markAnnotated ki+ exact (HsFunTy an mult ty1 ty2) = do+ markAnnotated ty1+ markArrow an mult+ markAnnotated ty2+ exact (HsListTy an tys) = do+ markOpeningParen an+ markAnnotated tys+ markClosingParen an+ exact (HsTupleTy an _con tys) = do+ markOpeningParen an+ markAnnotated tys+ markClosingParen an+ exact (HsSumTy an tys) = do+ markOpeningParen an+ markAnnotated tys+ markClosingParen an+ exact (HsOpTy _an t1 lo t2) = do+ markAnnotated t1+ markAnnotated lo+ markAnnotated t2+ exact (HsParTy an ty) = do+ markOpeningParen an+ markAnnotated ty+ markClosingParen an+ exact (HsIParamTy an n t) = do+ markAnnotated n+ markEpAnn an AnnDcolon+ markAnnotated t+ exact (HsStarTy _an isUnicode)+ = if isUnicode+ then printStringAdvance "\x2605" -- Unicode star+ else printStringAdvance "*"+ exact (HsKindSig an ty k) = do+ markAnnotated ty+ markEpAnn an AnnDcolon+ markAnnotated k+ exact (HsSpliceTy _ splice) = do+ markAnnotated splice+ -- exact x@(HsDocTy an _ _) = withPpr x+ exact (HsBangTy an (HsSrcBang mt _up str) ty) = do+ case mt of+ NoSourceText -> return ()+ SourceText src -> do+ debugM $ "HsBangTy: src=" ++ showAst src+ markLocatedAALS an id AnnOpen (Just src)+ markLocatedAALS an id AnnClose (Just "#-}")+ debugM $ "HsBangTy: done unpackedness"+ case str of+ SrcLazy -> markEpAnn an AnnTilde+ SrcStrict -> markEpAnn an AnnBang+ NoSrcStrict -> return ()+ markAnnotated ty+ -- exact x@(HsRecTy an _) = withPpr x+ exact (HsExplicitListTy an prom tys) = do+ when (isPromoted prom) $ markEpAnn an AnnSimpleQuote+ markEpAnn an AnnOpenS+ markAnnotated tys+ markEpAnn an AnnCloseS+ exact (HsExplicitTupleTy an tys) = do+ markEpAnn an AnnSimpleQuote+ markEpAnn an AnnOpenP+ markAnnotated tys+ markEpAnn an AnnCloseP+ exact (HsTyLit _ lit) = do+ case lit of+ (HsNumTy src v) -> printSourceText src (show v)+ (HsStrTy src v) -> printSourceText src (show v)+ (HsCharTy src v) -> printSourceText src (show v)+ exact (HsWildCardTy _) = printStringAdvance "_"+ exact x = error $ "missing match for HsType:" ++ showAst x++-- ---------------------------------------------------------------------++instance ExactPrint (HsForAllTelescope GhcPs) where+ getAnnotationEntry (HsForAllVis an _) = fromAnn an+ getAnnotationEntry (HsForAllInvis an _) = fromAnn an++ exact (HsForAllVis an bndrs) = do+ markLocatedAA an fst -- AnnForall+ markAnnotated bndrs+ markLocatedAA an snd -- AnnRarrow++ exact (HsForAllInvis an bndrs) = do+ markLocatedAA an fst -- AnnForall+ markAnnotated bndrs+ markLocatedAA an snd -- AnnDot++-- ---------------------------------------------------------------------++instance ExactPrint (HsDerivingClause GhcPs) where+ getAnnotationEntry d@(HsDerivingClause{}) = fromAnn (deriv_clause_ext d)++ exact (HsDerivingClause { deriv_clause_ext = an+ , deriv_clause_strategy = dcs+ , deriv_clause_tys = dct }) = do+ -- = hsep [ text "deriving"+ -- , pp_strat_before+ -- , pp_dct dct+ -- , pp_strat_after ]+ markEpAnn an AnnDeriving+ exact_strat_before+ markAnnotated dct+ exact_strat_after+ where+ -- -- This complexity is to distinguish between+ -- -- deriving Show+ -- -- deriving (Show)+ -- pp_dct [HsIB { hsib_body = ty }]+ -- = ppr (parenthesizeHsType appPrec ty)+ -- pp_dct _ = parens (interpp'SP dct)++ -- @via@ is unique in that in comes /after/ the class being derived,+ -- so we must special-case it.+ (exact_strat_before, exact_strat_after) =+ case dcs of+ Just v@(L _ ViaStrategy{}) -> (pure (), markAnnotated v)+ _ -> (mapM_ markAnnotated dcs, pure ())++-- ---------------------------------------------------------------------++instance ExactPrint (DerivStrategy GhcPs) where+ getAnnotationEntry (StockStrategy an) = fromAnn an+ getAnnotationEntry (AnyclassStrategy an) = fromAnn an+ getAnnotationEntry (NewtypeStrategy an) = fromAnn an+ getAnnotationEntry (ViaStrategy (XViaStrategyPs an _)) = fromAnn an++ exact (StockStrategy an) = markEpAnn an AnnStock+ exact (AnyclassStrategy an) = markEpAnn an AnnAnyclass+ exact (NewtypeStrategy an) = markEpAnn an AnnNewtype+ exact (ViaStrategy (XViaStrategyPs an ty))+ = markEpAnn an AnnVia >> markAnnotated ty++-- ---------------------------------------------------------------------++instance (ExactPrint a) => ExactPrint (LocatedC a) where+ getAnnotationEntry (L sann _) = fromAnn sann++ exact (L (SrcSpanAnn EpAnnNotUsed _) a) = markAnnotated a+ exact (L (SrcSpanAnn (EpAnn _ (AnnContext ma opens closes) _) _) a) = do+ -- case ma of+ -- Just (UnicodeSyntax, rs) -> markKw' AnnDarrowU rs+ -- Just (NormalSyntax, rs) -> markKw' AnnDarrow rs+ -- Nothing -> pure ()+ mapM_ (markKwA AnnOpenP) (sort opens)+ markAnnotated a+ mapM_ (markKwA AnnCloseP) (sort closes)+ case ma of+ Just (UnicodeSyntax, r) -> markKwA AnnDarrowU r+ Just (NormalSyntax, r) -> markKwA AnnDarrow r+ Nothing -> pure ()++-- ---------------------------------------------------------------------++instance ExactPrint (DerivClauseTys GhcPs) where+ getAnnotationEntry = const NoEntryVal++ exact (DctSingle _ ty) = markAnnotated ty+ exact (DctMulti _ tys) = do+ -- parens (interpp'SP tys)+ markAnnotated tys++-- ---------------------------------------------------------------------++instance ExactPrint (HsSigType GhcPs) where+ getAnnotationEntry = const NoEntryVal++ exact (HsSig _ bndrs ty) = do+ markAnnotated bndrs+ markAnnotated ty++-- ---------------------------------------------------------------------++instance ExactPrint (LocatedN RdrName) where+ getAnnotationEntry (L sann _) = fromAnn sann++ exact (L (SrcSpanAnn EpAnnNotUsed l) n) = do+ p <- getPosP+ debugM $ "LocatedN RdrName:NOANN: (p,l,str)=" ++ show (p,ss2range l, showPprUnsafe n)+ let str = case (showPprUnsafe n) of+ -- TODO: unicode support?+ "forall" -> if spanLength (realSrcSpan l) == 1 then "∀" else "forall"+ s -> s+ printStringAtSs l str+ exact (L (SrcSpanAnn (EpAnn _anchor ann _cs) _ll) n) = do+ case ann of+ NameAnn a o l c t -> do+ markName a o (Just (l,n)) c+ markTrailing t+ NameAnnCommas a o cs c t -> do+ let (kwo,kwc) = adornments a+ markKw (AddEpAnn kwo o)+ forM_ cs (\loc -> markKw (AddEpAnn AnnComma loc))+ markKw (AddEpAnn kwc c)+ markTrailing t+ NameAnnOnly a o c t -> do+ markName a o Nothing c+ markTrailing t+ NameAnnRArrow nl t -> do+ markKw (AddEpAnn AnnRarrow nl)+ markTrailing t+ NameAnnQuote q name t -> do+ debugM $ "NameAnnQuote"+ markKw (AddEpAnn AnnSimpleQuote q)+ markAnnotated (L name n)+ markTrailing t+ NameAnnTrailing t -> do+ printStringAdvance (showPprUnsafe n)+ markTrailing t++markName :: NameAdornment+ -> EpaLocation -> Maybe (EpaLocation,RdrName) -> EpaLocation -> EPP ()+markName adorn open mname close = do+ let (kwo,kwc) = adornments adorn+ markKw (AddEpAnn kwo open)+ case mname of+ Nothing -> return ()+ Just (name, a) -> printStringAtAA name (showPprUnsafe a)+ markKw (AddEpAnn kwc close)++adornments :: NameAdornment -> (AnnKeywordId, AnnKeywordId)+adornments NameParens = (AnnOpenP, AnnCloseP)+adornments NameParensHash = (AnnOpenPH, AnnClosePH)+adornments NameBackquotes = (AnnBackquote, AnnBackquote)+adornments NameSquare = (AnnOpenS, AnnCloseS)++markTrailing :: [TrailingAnn] -> EPP ()+markTrailing ts = do+ p <- getPosP+ debugM $ "markTrailing:" ++ showPprUnsafe (p,ts)+ mapM_ markKwT (sort ts)++-- ---------------------------------------------------------------------++-- based on pp_condecls in Decls.hs+exact_condecls :: EpAnn [AddEpAnn] -> [LConDecl GhcPs] -> EPP ()+exact_condecls an cs+ | gadt_syntax -- In GADT syntax+ -- = hang (text "where") 2 (vcat (map ppr cs))+ = do+ -- printStringAdvance "exact_condecls:gadt"+ mapM_ markAnnotated cs+ | otherwise -- In H98 syntax+ -- = equals <+> sep (punctuate (text " |") (map ppr cs))+ = do+ -- printStringAdvance "exact_condecls:not gadt"+ markEpAnn an AnnEqual+ mapM_ markAnnotated cs+ where+ gadt_syntax = case cs of+ [] -> False+ (L _ ConDeclH98{} : _) -> False+ (L _ ConDeclGADT{} : _) -> True++-- ---------------------------------------------------------------------++instance ExactPrint (ConDecl GhcPs) where+ getAnnotationEntry x@(ConDeclGADT{}) = fromAnn (con_g_ext x)+ getAnnotationEntry x@(ConDeclH98{}) = fromAnn (con_ext x)++-- based on pprConDecl+ exact (ConDeclH98 { con_ext = an+ , con_name = con+ , con_forall = has_forall+ , con_ex_tvs = ex_tvs+ , con_mb_cxt = mcxt+ , con_args = args+ , con_doc = doc }) = do+ -- = sep [ ppr_mbDoc doc+ -- , pprHsForAll (mkHsForAllInvisTele ex_tvs) mcxt+ -- , ppr_details args ]+ mapM_ markAnnotated doc+ when has_forall $ markEpAnn an AnnForall+ mapM_ markAnnotated ex_tvs+ when has_forall $ markEpAnn an AnnDot+ -- exactHsForall (mkHsForAllInvisTele ex_tvs) mcxt+ mapM_ markAnnotated mcxt+ when (isJust mcxt) $ markEpAnn an AnnDarrow++ exact_details args++ -- case args of+ -- InfixCon _ _ -> return ()+ -- _ -> markAnnotated con+ where+ -- -- In ppr_details: let's not print the multiplicities (they are always 1, by+ -- -- definition) as they do not appear in an actual declaration.+ exact_details (InfixCon t1 t2) = do+ markAnnotated t1+ markAnnotated con+ markAnnotated t2+ exact_details (PrefixCon tyargs tys) = do+ markAnnotated con+ markAnnotated tyargs+ markAnnotated tys+ exact_details (RecCon fields) = do+ markAnnotated con+ markAnnotated fields++ -- -----------------------------------++ exact (ConDeclGADT { con_g_ext = an+ , con_names = cons+ , con_bndrs = bndrs+ , con_mb_cxt = mcxt, con_g_args = args+ , con_res_ty = res_ty, con_doc = doc }) = do+ mapM_ markAnnotated doc+ mapM_ markAnnotated cons+ markEpAnn an AnnDcolon+ annotationsToComments (epAnnAnns an) [AnnOpenP, AnnCloseP]+ -- when has_forall $ markEpAnn an AnnForall+ markAnnotated bndrs+ -- mapM_ markAnnotated qvars+ -- when has_forall $ markEpAnn an AnnDot+ mapM_ markAnnotated mcxt+ when (isJust mcxt) $ markEpAnn an AnnDarrow+ -- mapM_ markAnnotated args+ case args of+ (PrefixConGADT args') -> mapM_ markScaled args'+ (RecConGADT fields) -> markAnnotated fields+ -- mapM_ markAnnotated (unLoc fields)+ markAnnotated res_ty++-- ---------------------------------------------------------------------++instance ExactPrint Void where+ getAnnotationEntry = const NoEntryVal+ exact _ = return ()++-- ---------------------------------------------------------------------++instance ExactPrintTVFlag flag => ExactPrint (HsOuterTyVarBndrs flag GhcPs) where+ getAnnotationEntry (HsOuterImplicit _) = NoEntryVal+ getAnnotationEntry (HsOuterExplicit an _) = fromAnn an++ exact (HsOuterImplicit _) = pure ()+ exact (HsOuterExplicit an bndrs) = do+ markLocatedAA an fst -- "forall"+ markAnnotated bndrs+ markLocatedAA an snd -- "."++-- ---------------------------------------------------------------------++instance ExactPrint (ConDeclField GhcPs) where+ getAnnotationEntry f@(ConDeclField{}) = fromAnn (cd_fld_ext f)++ exact (ConDeclField an names ftype mdoc) = do+ markAnnotated names+ markEpAnn an AnnDcolon+ markAnnotated ftype+ mapM_ markAnnotated mdoc++-- ---------------------------------------------------------------------++instance ExactPrint (FieldOcc GhcPs) where+ getAnnotationEntry = const NoEntryVal+ exact (FieldOcc _ n) = markAnnotated n++-- ---------------------------------------------------------------------++instance ExactPrint (AmbiguousFieldOcc GhcPs) where+ getAnnotationEntry = const NoEntryVal+ exact (Unambiguous _ n) = markAnnotated n+ exact (Ambiguous _ n) = markAnnotated n++-- ---------------------------------------------------------------------++markScaled :: (HsScaled GhcPs (LBangType GhcPs)) -> Annotated ()+markScaled (HsScaled arr (L l c)) =+ markAnnotated ((L l (HsScaled arr (L (noAnnSrcSpan $ locA l) c)))+ :: LocatedA (HsScaled GhcPs (LBangType GhcPs)))++instance (ExactPrint a) => ExactPrint (HsScaled GhcPs a) where+ getAnnotationEntry = const NoEntryVal+ exact (HsScaled arr t) = do+ markAnnotated t+ markArrow EpAnnNotUsed arr++-- ---------------------------------------------------------------------++-- instance ExactPrint (LHsContext GhcPs) where+-- getAnnotationEntry (L (SrcSpanAnn ann _) _) = fromAnn ann+-- exact = withPpr++-- ---------------------------------------------------------------------++instance ExactPrint (LocatedP CType) where+ getAnnotationEntry = entryFromLocatedA++ exact (L (SrcSpanAnn EpAnnNotUsed _) ct) = withPpr ct+ exact (L (SrcSpanAnn an _ll)+ (CType stp mh (stct,ct))) = do+ markAnnOpenP an stp "{-# CTYPE"+ case mh of+ Nothing -> return ()+ Just (Header srcH _h) ->+ markLocatedAALS an apr_rest AnnHeader (Just (toSourceTextWithSuffix srcH "" ""))+ markLocatedAALS an apr_rest AnnVal (Just (toSourceTextWithSuffix stct (unpackFS ct) ""))+ markAnnCloseP an++-- ---------------------------------------------------------------------++instance ExactPrint (SourceText, RuleName) where+ -- We end up at the right place from the Located wrapper+ getAnnotationEntry = const NoEntryVal++ exact (st, rn)+ = printStringAdvance (toSourceTextWithSuffix st (unpackFS rn) "")+++-- =====================================================================+-- LocatedL instances start --+--+-- Each is dealt with specifically, as they have+-- different wrapping annotations in the al_rest zone.+--+-- In future, the annotation could perhaps be improved, with an+-- 'al_pre' and 'al_post' set of annotations to be simply sorted and+-- applied.+-- ---------------------------------------------------------------------++instance ExactPrint (LocatedL [LocatedA (IE GhcPs)]) where+ getAnnotationEntry = entryFromLocatedA++ exact (L (SrcSpanAnn ann _) ies) = do+ debugM $ "LocatedL [LIE"+ markLocatedAAL ann al_rest AnnHiding+ p <- getPosP+ debugM $ "LocatedL [LIE:p=" ++ showPprUnsafe p+ markAnnList True ann (markAnnotated ies)++instance (ExactPrint (Match GhcPs (LocatedA body)))+ => ExactPrint (LocatedL [LocatedA (Match GhcPs (LocatedA body))]) where+ getAnnotationEntry = entryFromLocatedA+ exact (L la a) = do+ debugM $ "LocatedL [LMatch"+ -- TODO: markAnnList?+ markEpAnnAll (ann la) al_rest AnnWhere+ markLocatedMAA (ann la) al_open+ markEpAnnAll (ann la) al_rest AnnSemi+ markAnnotated a+ markLocatedMAA (ann la) al_close++-- instance ExactPrint (LocatedL [ExprLStmt GhcPs]) where+instance ExactPrint (LocatedL [LocatedA (StmtLR GhcPs GhcPs (LocatedA (HsExpr GhcPs)))]) where+ getAnnotationEntry = entryFromLocatedAFixed+ exact (L (SrcSpanAnn an' _) stmts) = do+ let an = fixAnnListAnn an'+ debugM $ "LocatedL [ExprLStmt"+ markAnnList True an $ do+ -- markLocatedMAA an al_open+ case snocView stmts of+ Just (initStmts, ls@(L _ (LastStmt _ _body _ _))) -> do+ debugM $ "LocatedL [ExprLStmt: snocView"+ markAnnotated ls+ markAnnotated initStmts+ _ -> markAnnotated stmts+ -- x -> error $ "pprDo:ListComp" ++ showAst x+ -- markLocatedMAA an al_close++-- instance ExactPrint (LocatedL [CmdLStmt GhcPs]) where+instance ExactPrint (LocatedL [LocatedA (StmtLR GhcPs GhcPs (LocatedA (HsCmd GhcPs)))]) where+ getAnnotationEntry = entryFromLocatedAFixed+ exact (L (SrcSpanAnn ann' _) es) = do+ let ann = fixAnnListAnn ann'+ debugM $ "LocatedL [CmdLStmt"+ markLocatedMAA ann al_open+ mapM_ markAnnotated es+ markLocatedMAA ann al_close++instance ExactPrint (LocatedL [LocatedA (ConDeclField GhcPs)]) where+ getAnnotationEntry = entryFromLocatedA+ exact (L (SrcSpanAnn an _) fs) = do+ debugM $ "LocatedL [LConDeclField"+ markAnnList True an (mapM_ markAnnotated fs) -- AZ:TODO get rid of mapM_++instance ExactPrint (LocatedL (BF.BooleanFormula (LocatedN RdrName))) where+ getAnnotationEntry = entryFromLocatedA+ exact (L (SrcSpanAnn an _) bf) = do+ debugM $ "LocatedL [LBooleanFormula"+ markAnnList True an (markAnnotated bf)++-- ---------------------------------------------------------------------+-- LocatedL instances end --+-- =====================================================================++instance ExactPrint (IE GhcPs) where+ getAnnotationEntry (IEVar _ _) = NoEntryVal+ getAnnotationEntry (IEThingAbs an _) = fromAnn an+ getAnnotationEntry (IEThingAll an _) = fromAnn an+ getAnnotationEntry (IEThingWith an _ _ _) = fromAnn an+ getAnnotationEntry (IEModuleContents an _)= fromAnn an+ getAnnotationEntry (IEGroup _ _ _) = NoEntryVal+ getAnnotationEntry (IEDoc _ _) = NoEntryVal+ getAnnotationEntry (IEDocNamed _ _) = NoEntryVal++ exact (IEVar _ ln) = markAnnotated ln+ exact (IEThingAbs _ thing) = markAnnotated thing+ exact (IEThingAll an thing) = do+ markAnnotated thing+ markEpAnn an AnnOpenP+ markEpAnn an AnnDotdot+ markEpAnn an AnnCloseP++ exact (IEThingWith an thing wc withs) = do+ markAnnotated thing+ markEpAnn an AnnOpenP+ case wc of+ NoIEWildcard -> markAnnotated withs+ IEWildcard pos -> do+ let (bs, as) = splitAt pos withs+ markAnnotated bs+ markEpAnn an AnnDotdot+ markEpAnn an AnnComma+ markAnnotated as+ markEpAnn an AnnCloseP++ exact (IEModuleContents an (L lm mn)) = do+ markEpAnn an AnnModule+ printStringAtSs lm (moduleNameString mn)++ -- exact (IEGroup _ _ _) = NoEntryVal+ -- exact (IEDoc _ _) = NoEntryVal+ -- exact (IEDocNamed _ _) = NoEntryVal+ exact x = error $ "missing match for IE:" ++ showAst x++-- ---------------------------------------------------------------------++instance ExactPrint (IEWrappedName RdrName) where+ getAnnotationEntry = const NoEntryVal++ exact (IEName n) = markAnnotated n+ exact (IEPattern r n) = do+ printStringAtAA r "pattern"+ markAnnotated n+ exact (IEType r n) = do+ printStringAtAA r "type"+ markAnnotated n++-- markIEWrapped :: EpAnn -> LIEWrappedName RdrName -> EPP ()+-- markIEWrapped an (L _ (IEName n))+-- = markAnnotated n+-- markIEWrapped an (L _ (IEPattern n))+-- = markEpAnn an AnnPattern >> markAnnotated n+-- markIEWrapped an (L _ (IEType n))+-- = markEpAnn an AnnType >> markAnnotated n++-- ---------------------------------------------------------------------++-- instance ExactPrint (LocatedA (Pat GhcPs)) where+-- -- getAnnotationEntry (L (SrcSpanAnn ann _) _) = fromAnn ann+-- getAnnotationEntry = entryFromLocatedA+-- exact (L _ a) = do+-- debugM $ "exact:LPat:" ++ showPprUnsafe a+-- markAnnotated a++instance ExactPrint (Pat GhcPs) where+ getAnnotationEntry (WildPat _) = NoEntryVal+ getAnnotationEntry (VarPat _ _) = NoEntryVal+ getAnnotationEntry (LazyPat an _) = fromAnn an+ getAnnotationEntry (AsPat an _ _) = fromAnn an+ getAnnotationEntry (ParPat an _) = fromAnn an+ getAnnotationEntry (BangPat an _) = fromAnn an+ getAnnotationEntry (ListPat an _) = fromAnn an+ getAnnotationEntry (TuplePat an _ _) = fromAnn an+ getAnnotationEntry (SumPat an _ _ _) = fromAnn an+ getAnnotationEntry (ConPat an _ _) = fromAnn an+ getAnnotationEntry (ViewPat an _ _) = fromAnn an+ getAnnotationEntry (SplicePat _ _) = NoEntryVal+ getAnnotationEntry (LitPat _ _) = NoEntryVal+ getAnnotationEntry (NPat an _ _ _) = fromAnn an+ getAnnotationEntry (NPlusKPat an _ _ _ _ _) = fromAnn an+ getAnnotationEntry (SigPat an _ _) = fromAnn an++ exact (WildPat _) = do+ anchor <- getAnchorU+ debugM $ "WildPat:anchor=" ++ show anchor+ printStringAtRs anchor "_"+ exact (VarPat _ n) = do+ -- The parser inserts a placeholder value for a record pun rhs. This must be+ -- filtered.+ let pun_RDR = "pun-right-hand-side"+ when (showPprUnsafe n /= pun_RDR) $ markAnnotated n+ exact (LazyPat an pat) = do+ markEpAnn an AnnTilde+ markAnnotated pat+ exact (AsPat an n pat) = do+ markAnnotated n+ markEpAnn an AnnAt+ markAnnotated pat+ exact (ParPat an pat) = do+ markAnnKw an ap_open AnnOpenP+ markAnnotated pat+ markAnnKw an ap_close AnnCloseP++ exact (BangPat an pat) = do+ markEpAnn an AnnBang+ markAnnotated pat++ exact (ListPat an pats) = markAnnList True an (markAnnotated pats)++ exact (TuplePat an pats boxity) = do+ case boxity of+ Boxed -> markEpAnn an AnnOpenP+ Unboxed -> markEpAnn an AnnOpenPH+ markAnnotated pats+ case boxity of+ Boxed -> markEpAnn an AnnCloseP+ Unboxed -> markEpAnn an AnnClosePH++ exact (SumPat an pat _alt _arity) = do+ markLocatedAAL an sumPatParens AnnOpenPH+ markAnnKwAll an sumPatVbarsBefore AnnVbar+ markAnnotated pat+ markAnnKwAll an sumPatVbarsAfter AnnVbar+ markLocatedAAL an sumPatParens AnnClosePH++ -- | ConPat an con args)+ exact (ConPat an con details) = exactUserCon an con details+ exact (ViewPat an expr pat) = do+ markAnnotated expr+ markEpAnn an AnnRarrow+ markAnnotated pat+ exact (SplicePat _ splice) = markAnnotated splice+ exact (LitPat _ lit) = printStringAdvance (hsLit2String lit)+ exact (NPat an ol mn _) = do+ when (isJust mn) $ markEpAnn an AnnMinus+ markAnnotated ol++ -- | NPlusKPat an n lit1 lit2 _ _)+ exact (NPlusKPat an n k lit2 _ _) = do+ markAnnotated n+ -- We need a fix for+ -- https://gitlab.haskell.org/ghc/ghc/-/issues/20243 to complete+ -- this+ markAnnotated k++ exact (SigPat an pat sig) = do+ markAnnotated pat+ markEpAnn an AnnDcolon+ markAnnotated sig+ -- exact x = error $ "missing match for Pat:" ++ showAst x++-- ---------------------------------------------------------------------++instance ExactPrint (HsPatSigType GhcPs) where+ getAnnotationEntry = const NoEntryVal++ exact (HsPS an ty) = do+ markAnnKw an id AnnAt+ markAnnotated ty++-- ---------------------------------------------------------------------++instance ExactPrint (HsOverLit GhcPs) where+ getAnnotationEntry = const NoEntryVal++ exact ol =+ let str = case ol_val ol of+ HsIntegral (IL src _ _) -> src+ HsFractional (FL{ fl_text = src }) -> src+ HsIsString src _ -> src+ in+ case str of+ SourceText s -> printStringAdvance s+ NoSourceText -> return ()++-- ---------------------------------------------------------------------++hsLit2String :: HsLit GhcPs -> String+hsLit2String lit =+ case lit of+ HsChar src v -> toSourceTextWithSuffix src v ""+ -- It should be included here+ -- https://github.com/ghc/ghc/blob/master/compiler/parser/Lexer.x#L1471+ HsCharPrim src p -> toSourceTextWithSuffix src p "#"+ HsString src v -> toSourceTextWithSuffix src v ""+ HsStringPrim src v -> toSourceTextWithSuffix src v ""+ HsInt _ (IL src _ v) -> toSourceTextWithSuffix src v ""+ HsIntPrim src v -> toSourceTextWithSuffix src v ""+ HsWordPrim src v -> toSourceTextWithSuffix src v ""+ HsInt64Prim src v -> toSourceTextWithSuffix src v ""+ HsWord64Prim src v -> toSourceTextWithSuffix src v ""+ HsInteger src v _ -> toSourceTextWithSuffix src v ""+ HsRat _ fl@(FL{fl_text = src }) _ -> toSourceTextWithSuffix src fl ""+ HsFloatPrim _ fl@(FL{fl_text = src }) -> toSourceTextWithSuffix src fl "#"+ HsDoublePrim _ fl@(FL{fl_text = src }) -> toSourceTextWithSuffix src fl "##"+ -- (XLit x) -> error $ "got XLit for:" ++ showPprUnsafe x++toSourceTextWithSuffix :: (Show a) => SourceText -> a -> String -> String+toSourceTextWithSuffix (NoSourceText) alt suffix = show alt ++ suffix+toSourceTextWithSuffix (SourceText txt) _alt suffix = txt ++ suffix++sourceTextToString :: SourceText -> String -> String+sourceTextToString NoSourceText alt = alt+sourceTextToString (SourceText txt) _ = txt++-- ---------------------------------------------------------------------++exactUserCon :: (ExactPrint con) => EpAnn [AddEpAnn] -> con -> HsConPatDetails GhcPs -> EPP ()+exactUserCon _ c (InfixCon p1 p2) = markAnnotated p1 >> markAnnotated c >> markAnnotated p2+exactUserCon an c details = do+ markAnnotated c+ markEpAnn an AnnOpenC+ exactConArgs details+ markEpAnn an AnnCloseC+++exactConArgs ::HsConPatDetails GhcPs -> EPP ()+exactConArgs (PrefixCon tyargs pats) = markAnnotated tyargs >> markAnnotated pats+exactConArgs (InfixCon p1 p2) = markAnnotated p1 >> markAnnotated p2+exactConArgs (RecCon rpats) = markAnnotated rpats++-- ---------------------------------------------------------------------++entryFromLocatedA :: LocatedAn ann a -> Entry+entryFromLocatedA (L la _) = fromAnn la++-- See https://gitlab.haskell.org/ghc/ghc/-/issues/20256+entryFromLocatedAFixed :: LocatedL a -> Entry+entryFromLocatedAFixed (L la _)+ = fromAnn (fixSrcAnnL la)++-- =====================================================================+-- Utility stuff+-- ---------------------------------------------------------------------++-- |This should be the final point where things are mode concrete,+-- before output.+-- NOTE: despite the name, this is the ghc-exactprint final output for+-- the PRINT phase.+printStringAtLsDelta :: (Monad m, Monoid w) => DeltaPos -> String -> EP w m ()+printStringAtLsDelta cl s = do+ p <- getPosP+ colOffset <- getLayoutOffsetP+ if isGoodDeltaWithOffset cl colOffset+ then do+ printStringAt (undelta p cl colOffset) s+ `debug` ("printStringAtLsDelta:(pos,s):" ++ show (undelta p cl colOffset,s))+ else return () `debug` ("printStringAtLsDelta:bad delta for (mc,s):" ++ show (cl,s))++-- ---------------------------------------------------------------------++isGoodDeltaWithOffset :: DeltaPos -> LayoutStartCol -> Bool+isGoodDeltaWithOffset dp colOffset = isGoodDelta (deltaPos l c)+ where (l,c) = undelta (0,0) dp colOffset++printQueuedComment :: (Monad m, Monoid w) => RealSrcSpan -> Comment -> DeltaPos -> EP w m ()+printQueuedComment loc Comment{commentContents} dp = do+ p <- getPosP+ colOffset <- getLayoutOffsetP+ let (dr,dc) = undelta (0,0) dp colOffset+ -- do not lose comments against the left margin+ when (isGoodDelta (deltaPos dr (max 0 dc))) $ do+ printCommentAt (undelta p dp colOffset) commentContents+ setPriorEndASTD False loc+ p' <- getPosP+ debugM $ "printQueuedComment: (p,p',dp,colOffset,undelta)=" ++ show (p,p',dp,colOffset,undelta p dp colOffset)++{-+-- Print version+printQueuedComment :: (Monad m, Monoid w) => Comment -> DeltaPos -> EP w m ()+printQueuedComment Comment{commentContents} dp = do+ p <- getPos+ colOffset <- getLayoutOffset+ let (dr,dc) = undelta (0,0) dp colOffset+ -- do not lose comments against the left margin+ when (isGoodDelta (DP (dr,max 0 dc))) $+ printCommentAt (undelta p dp colOffset) commentContents++-}++-- ---------------------------------------------------------------------++-- withContext :: (Monad m, Monoid w)+-- => [(KeywordId, DeltaPos)]+-- -> Annotation+-- -> EP w m a -> EP w m a+-- withContext kds an x = withKds kds (withOffset an x)++-- ---------------------------------------------------------------------+--+-- | Given an annotation associated with a specific SrcSpan,+-- determines a new offset relative to the previous offset+--+withOffset :: (Monad m, Monoid w) => Annotation -> (EP w m a -> EP w m a)+withOffset a =+ local (\s -> s { epAnn = a })++------------------------------------------------------------------------++setLayoutBoth :: (Monad m, Monoid w) => EP w m () -> EP w m ()+setLayoutBoth k = do+ oldLHS <- gets dLHS+ oldAnchorOffset <- getLayoutOffsetP+ debugM $ "setLayoutBoth: (oldLHS,oldAnchorOffset)=" ++ show (oldLHS,oldAnchorOffset)+ modify (\a -> a { dMarkLayout = True+ , pMarkLayout = True } )+ let reset = do+ debugM $ "setLayoutBoth:reset: (oldLHS,oldAnchorOffset)=" ++ show (oldLHS,oldAnchorOffset)+ modify (\a -> a { dMarkLayout = False+ , dLHS = oldLHS+ , pMarkLayout = False+ , pLHS = oldAnchorOffset} )+ k <* reset++-- Use 'local', designed for this+setLayoutTopLevelP :: (Monad m, Monoid w) => EP w m () -> EP w m ()+setLayoutTopLevelP k = do+ debugM $ "setLayoutTopLevelP entered"+ oldAnchorOffset <- getLayoutOffsetP+ modify (\a -> a { pMarkLayout = False+ , pLHS = 0} )+ k+ debugM $ "setLayoutTopLevelP:resetting"+ setLayoutOffsetP oldAnchorOffset++------------------------------------------------------------------------++getPosP :: (Monad m, Monoid w) => EP w m Pos+getPosP = gets epPos++setPosP :: (Monad m, Monoid w) => Pos -> EP w m ()+setPosP l = do+ -- debugM $ "setPosP:" ++ show l+ modify (\s -> s {epPos = l})++getExtraDP :: (Monad m, Monoid w) => EP w m (Maybe Anchor)+getExtraDP = gets uExtraDP++setExtraDP :: (Monad m, Monoid w) => Maybe Anchor -> EP w m ()+setExtraDP md = do+ debugM $ "setExtraDP:" ++ show md+ modify (\s -> s {uExtraDP = md})++getPriorEndD :: (Monad m, Monoid w) => EP w m Pos+getPriorEndD = gets dPriorEndPosition++getAnchorU :: (Monad m, Monoid w) => EP w m RealSrcSpan+getAnchorU = gets uAnchorSpan++setPriorEndD :: (Monad m, Monoid w) => Pos -> EP w m ()+setPriorEndD pe = do+ -- setLayoutStartIfNeededD (snd pe)+ setPriorEndNoLayoutD pe++setPriorEndNoLayoutD :: (Monad m, Monoid w) => Pos -> EP w m ()+setPriorEndNoLayoutD pe = do+ debugM $ "setPriorEndNoLayout:pe=" ++ show pe+ modify (\s -> s { dPriorEndPosition = pe })++setPriorEndASTD :: (Monad m, Monoid w) => Bool -> RealSrcSpan -> EP w m ()+setPriorEndASTD layout pe = setPriorEndASTPD layout (rs2range pe)++setPriorEndASTPD :: (Monad m, Monoid w) => Bool -> (Pos,Pos) -> EP w m ()+setPriorEndASTPD layout pe@(fm,to) = do+ debugM $ "setPriorEndASTD:pe=" ++ show pe+ when layout $ setLayoutStartD (snd fm)+ modify (\s -> s { dPriorEndPosition = to } )++setLayoutStartD :: (Monad m, Monoid w) => Int -> EP w m ()+setLayoutStartD p = do+ EPState{dMarkLayout} <- get+ when dMarkLayout $ do+ debugM $ "setLayoutStartD: setting dLHS=" ++ show p+ modify (\s -> s { dMarkLayout = False+ , dLHS = LayoutStartCol p})++setAnchorU :: (Monad m, Monoid w) => RealSrcSpan -> EP w m ()+setAnchorU rss = do+ debugM $ "setAnchorU:" ++ show (rs2range rss)+ modify (\s -> s { uAnchorSpan = rss })++getUnallocatedComments :: (Monad m, Monoid w) => EP w m [Comment]+getUnallocatedComments = gets epComments++putUnallocatedComments :: (Monad m, Monoid w) => [Comment] -> EP w m ()+putUnallocatedComments cs = modify (\s -> s { epComments = cs } )++getLayoutOffsetP :: (Monad m, Monoid w) => EP w m LayoutStartCol+getLayoutOffsetP = gets pLHS++setLayoutOffsetP :: (Monad m, Monoid w) => LayoutStartCol -> EP w m ()+setLayoutOffsetP c = do+ debugM $ "setLayoutOffsetP:" ++ show c+ modify (\s -> s { pLHS = c })+++-- ---------------------------------------------------------------------+-------------------------------------------------------------------------+-- |First move to the given location, then call exactP+-- exactPC :: (Data ast, Monad m, Monoid w) => GHC.Located ast -> EP w m a -> EP w m a+-- exactPC :: (Data ast, Data (GHC.SrcSpanLess ast), GHC.HasSrcSpan ast, Monad m, Monoid w)+-- exactPC :: (Data ast, Monad m, Monoid w) => GHC.Located ast -> EP w m a -> EP w m a+-- exactPC ast action =+-- do+-- return () `debug` ("exactPC entered for:" ++ show (mkAnnKey ast))+-- ma <- getAndRemoveAnnotation ast+-- let an@Ann{ annEntryDelta=edp+-- , annPriorComments=comments+-- , annFollowingComments=fcomments+-- , annsDP=kds+-- } = fromMaybe annNone ma+-- PrintOptions{epAstPrint} <- ask+-- r <- withContext kds an+-- (mapM_ (uncurry printQueuedComment) comments+-- >> advance edp+-- >> censorM (epAstPrint ast) action+-- <* mapM_ (uncurry printQueuedComment) fcomments)+-- return r `debug` ("leaving exactPCfor:" ++ show (mkAnnKey ast))++-- censorM :: (Monoid w, Monad m) => (w -> m w) -> EP w m a -> EP w m a+-- censorM f m = passM (liftM (\x -> (x,f)) m)++-- passM :: (Monad m) => EP w m (a, w -> m w) -> EP w m a+-- passM m = RWST $ \r s -> do+-- ~((a, f),s', EPWriter w) <- runRWST m r s+-- w' <- f w+-- return (a, s', EPWriter w')++advance :: (Monad m, Monoid w) => DeltaPos -> EP w m ()+advance dp = do+ p <- getPosP+ colOffset <- getLayoutOffsetP+ debugM $ "advance:(p,dp,colOffset,ws)=" ++ show (p,dp,colOffset,undelta p dp colOffset)+ printWhitespace (undelta p dp colOffset)++{-+Version from Print.advance+advance :: (Monad m, Monoid w) => DeltaPos -> EP w m ()+advance cl = do+ p <- getPos+ colOffset <- getLayoutOffset+ printWhitespace (undelta p cl colOffset)+-}++-- ---------------------------------------------------------------------++adjustDeltaForOffsetM :: DeltaPos -> EPP DeltaPos+adjustDeltaForOffsetM dp = do+ colOffset <- gets dLHS+ return (adjustDeltaForOffset 0 colOffset dp)++-- ---------------------------------------------------------------------+-- Printing functions++printString :: (Monad m, Monoid w) => Bool -> String -> EP w m ()+printString layout str = do+ EPState{epPos = (_,c), pMarkLayout} <- get+ PrintOptions{epTokenPrint, epWhitespacePrint} <- ask+ when (pMarkLayout && layout) $ do+ debugM $ "printString: setting pLHS to " ++ show c+ modify (\s -> s { pLHS = LayoutStartCol c, pMarkLayout = False } )++ -- Advance position, taking care of any newlines in the string+ let strDP = dpFromString str+ cr = getDeltaLine strDP+ p <- getPosP+ colOffset <- getLayoutOffsetP+ -- debugM $ "printString:(p,colOffset,strDP,cr)=" ++ show (p,colOffset,strDP,cr)+ if cr == 0+ then setPosP (undelta p strDP colOffset)+ else setPosP (undelta p strDP 1)++ -- Debug stuff+ -- pp <- getPosP+ -- debugM $ "printString: (p,pp,str)" ++ show (p,pp,str)+ -- Debug end++ --+ if not layout && c == 0+ then lift (epWhitespacePrint str) >>= \s -> tell EPWriter { output = s}+ else lift (epTokenPrint str) >>= \s -> tell EPWriter { output = s}+++{-++-- Print.printString+printString :: (Monad m, Monoid w) => Bool -> String -> EP w m ()+printString layout str = do+ EPState{epPos = (_,c), epMarkLayout} <- get+ PrintOptions{epTokenPrint, epWhitespacePrint} <- ask+ when (epMarkLayout && layout) $+ modify (\s -> s { epLHS = LayoutStartCol c, epMarkLayout = False } )++ -- Advance position, taking care of any newlines in the string+ let strDP@(DP (cr,_cc)) = dpFromString str+ p <- getPos+ colOffset <- getLayoutOffset+ if cr == 0+ then setPos (undelta p strDP colOffset)+ else setPos (undelta p strDP 1)++ --+ if not layout && c == 0+ then lift (epWhitespacePrint str) >>= \s -> tell EPWriter { output = s}+ else lift (epTokenPrint str) >>= \s -> tell EPWriter { output = s}++-}++--------------------------------------------------------++printStringAdvance :: String -> EPP ()+printStringAdvance str = do+ ss <- getAnchorU+ printStringAtKw' ss str++--------------------------------------------------------++newLine :: (Monad m, Monoid w) => EP w m ()+newLine = do+ (l,_) <- getPosP+ printString False "\n"+ setPosP (l+1,1)++padUntil :: (Monad m, Monoid w) => Pos -> EP w m ()+padUntil (l,c) = do+ (l1,c1) <- getPosP+ if | l1 == l && c1 <= c -> printString False $ replicate (c - c1) ' '+ | l1 < l -> newLine >> padUntil (l,c)+ | otherwise -> return ()++printWhitespace :: (Monad m, Monoid w) => Pos -> EP w m ()+printWhitespace = padUntil++printCommentAt :: (Monad m, Monoid w) => Pos -> String -> EP w m ()+printCommentAt p str = do+ debugM $ "printCommentAt: (pos,str)" ++ show (p,str)+ printWhitespace p >> printString False str++printStringAt :: (Monad m, Monoid w) => Pos -> String -> EP w m ()+printStringAt p str = printWhitespace p >> printString True str
− src/Language/Haskell/GHC/ExactPrint/GhcInterim.hs
@@ -1,26 +0,0 @@-{-# 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-import Lexer-import SrcLoc---- ----------------------------------------------------------------------#if __GLASGOW_HASKELL__ > 800-#else--- From Lexer.x-commentToAnnotation :: Located Token -> Located AnnotationComment-commentToAnnotation (L l (ITdocCommentNext s)) = L l (AnnDocCommentNext s)-commentToAnnotation (L l (ITdocCommentPrev s)) = L l (AnnDocCommentPrev s)-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
@@ -1,17 +1,12 @@-{-# LANGUAGE CPP #-} module Language.Haskell.GHC.ExactPrint.Lookup ( keywordToString-#if __GLASGOW_HASKELL__ <= 710- , unicodeString-#endif+ , KeywordId(..)+ , Comment(..) ) where +import GHC (AnnKeywordId(..)) import Language.Haskell.GHC.ExactPrint.Types-import qualified GHC (AnnKeywordId(..))-#if __GLASGOW_HASKELL__ <= 710-import Data.Maybe-#endif -- | Maps `AnnKeywordId` to the corresponding String representation. -- There is no specific mapping for the following constructors.@@ -26,194 +21,109 @@ -- warnings if new constructors are added. AnnComment _ -> mkErr kw AnnString _ -> mkErr kw-#if __GLASGOW_HASKELL__ >= 900- (AnnEofPos ) -> mkErr kw-#endif-#if __GLASGOW_HASKELL__ <= 710- 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- (G GHC.AnnPackageName) -> mkErr kw- (G GHC.AnnHeader ) -> mkErr kw- (G GHC.AnnFunId ) -> mkErr kw- (G GHC.AnnInfix ) -> mkErr kw- (G GHC.AnnValStr ) -> mkErr kw- (G GHC.AnnName ) -> mkErr kw- (G GHC.AnnAs ) -> "as"- (G GHC.AnnAt ) -> "@"- (G GHC.AnnBang ) -> "!"- (G GHC.AnnBackquote ) -> "`"- (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 ) -> ","- (G GHC.AnnCommaTuple ) -> ","- (G GHC.AnnDarrow ) -> "=>"- (G GHC.AnnData ) -> "data"- (G GHC.AnnDcolon ) -> "::"- (G GHC.AnnDefault ) -> "default"- (G GHC.AnnDeriving ) -> "deriving"- (G GHC.AnnDo ) -> "do"- (G GHC.AnnDot ) -> "."- (G GHC.AnnDotdot ) -> ".."- (G GHC.AnnElse ) -> "else"- (G GHC.AnnEqual ) -> "="- (G GHC.AnnExport ) -> "export"- (G GHC.AnnFamily ) -> "family"- (G GHC.AnnForall ) -> "forall"- (G GHC.AnnForeign ) -> "foreign"- (G GHC.AnnGroup ) -> "group"- (G GHC.AnnHiding ) -> "hiding"- (G GHC.AnnIf ) -> "if"- (G GHC.AnnImport ) -> "import"- (G GHC.AnnIn ) -> "in"- (G GHC.AnnInstance ) -> "instance"- (G GHC.AnnLam ) -> "\\"- (G GHC.AnnLarrow ) -> "<-"- (G GHC.AnnLet ) -> "let"-#if __GLASGOW_HASKELL__ >= 900- -- (G GHC.AnnLolly ) -> "#->"- (G GHC.AnnLollyU ) -> "⊸"-#endif- (G GHC.AnnMdo ) -> "mdo"- (G GHC.AnnMinus ) -> "-"- (G GHC.AnnModule ) -> "module"-#if __GLASGOW_HASKELL__ >= 900- (G GHC.AnnPercent ) -> "%"- (G GHC.AnnPercentOne) -> "%1"-#endif- (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 ) -> "("-#if __GLASGOW_HASKELL__ < 900- (G GHC.AnnOpenPE ) -> "$("- (G GHC.AnnOpenPTE ) -> "$$("-#endif- (G GHC.AnnOpenS ) -> "["- (G GHC.AnnPattern ) -> "pattern"- (G GHC.AnnProc ) -> "proc"- (G GHC.AnnQualified ) -> "qualified"- (G GHC.AnnRarrow ) -> "->"- (G GHC.AnnRec ) -> "rec"- (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 ) -> "~"-#if __GLASGOW_HASKELL__ <= 804- (G GHC.AnnTildehsh ) -> "~#"-#endif- (G GHC.AnnType ) -> "type"- (G GHC.AnnUnit ) -> "()"- (G GHC.AnnUsing ) -> "using"- (G GHC.AnnVbar ) -> "|"- (G GHC.AnnWhere ) -> "where"- (G GHC.Annlarrowtail ) -> "-<"- (G GHC.Annrarrowtail ) -> ">-"- (G GHC.AnnLarrowtail ) -> "-<<"- (G GHC.AnnRarrowtail ) -> ">>-"- (G GHC.AnnSimpleQuote ) -> "'"- (G GHC.AnnThTyQuote ) -> "''"-#if __GLASGOW_HASKELL__ >= 900- (G GHC.AnnDollar ) -> "$"- (G GHC.AnnDollarDollar ) -> "$$"-#else- (G GHC.AnnThIdSplice ) -> "$"- (G GHC.AnnThIdTySplice ) -> "$$"-#endif-#if __GLASGOW_HASKELL__ < 900- (G GHC.AnnEofPos ) -> ""-#endif-#if __GLASGOW_HASKELL__ > 710- (G GHC.AnnDarrowU) -> "⇒"- (G GHC.AnnDcolonU) -> "∷"- (G GHC.AnnForallU) -> "∀"- (G GHC.AnnLarrowU) -> "←"- (G GHC.AnnLarrowtailU) -> "⤛"- (G GHC.AnnRarrowU) -> "→"- (G GHC.AnnRarrowtailU) -> "⤜"- (G GHC.AnnlarrowtailU) -> "⤙"- (G GHC.AnnrarrowtailU) -> "⤚"-#endif-#if __GLASGOW_HASKELL__ >= 800+ (G AnnAnyclass) -> "anyclass"+ (G AnnOpen ) -> mkErr kw+ (G AnnClose ) -> mkErr kw+ (G AnnVal ) -> mkErr kw+ (G AnnPackageName) -> mkErr kw+ (G AnnHeader ) -> mkErr kw+ (G AnnFunId ) -> mkErr kw+ (G AnnInfix ) -> mkErr kw+ (G AnnValStr ) -> mkErr kw+ (G AnnName ) -> mkErr kw+ (G AnnAs ) -> "as"+ (G AnnAt ) -> "@"+ (G AnnBang ) -> "!"+ (G AnnBackquote ) -> "`"+ (G AnnBy ) -> "by"+ (G AnnCase ) -> "case"+ (G AnnClass ) -> "class"+ (G AnnCloseB ) -> "|)"+ (G AnnCloseBU ) -> "⦈"+ (G AnnCloseC ) -> "}"+ (G AnnCloseP ) -> ")"+ (G AnnClosePH ) -> "#)"+ (G AnnCloseQ ) -> "|]"+ (G AnnCloseQU ) -> "⟧"+ (G AnnCloseS ) -> "]"+ (G AnnColon ) -> ":"+ (G AnnComma ) -> ","+ (G AnnCommaTuple ) -> ","+ (G AnnDarrow ) -> "=>"+ (G AnnData ) -> "data"+ (G AnnDcolon ) -> "::"+ (G AnnDefault ) -> "default"+ (G AnnDeriving ) -> "deriving"+ (G AnnDo ) -> "do"+ (G AnnDot ) -> "."+ (G AnnDotdot ) -> ".."+ (G AnnElse ) -> "else"+ (G AnnEqual ) -> "="+ (G AnnExport ) -> "export"+ (G AnnFamily ) -> "family"+ (G AnnForall ) -> "forall"+ (G AnnForeign ) -> "foreign"+ (G AnnGroup ) -> "group"+ (G AnnHiding ) -> "hiding"+ (G AnnIf ) -> "if"+ (G AnnImport ) -> "import"+ (G AnnIn ) -> "in"+ (G AnnInstance ) -> "instance"+ (G AnnLam ) -> "\\"+ (G AnnLarrow ) -> "<-"+ (G AnnLet ) -> "let"+ (G AnnLollyU ) -> "⊸"+ (G AnnMdo ) -> "mdo"+ (G AnnMinus ) -> "-"+ (G AnnModule ) -> "module"+ (G AnnNewtype ) -> "newtype"+ (G AnnOf ) -> "of"+ (G AnnOpenB ) -> "(|"+ (G AnnOpenBU ) -> "⦇"+ (G AnnOpenC ) -> "{"+ (G AnnOpenE ) -> "[e|"+ (G AnnOpenEQ ) -> "[|"+ (G AnnOpenEQU ) -> "⟦"+ (G AnnOpenP ) -> "("+ (G AnnOpenPH ) -> "(#"+ (G AnnOpenS ) -> "["+ (G AnnPattern ) -> "pattern"+ (G AnnPercent ) -> "%"+ (G AnnPercentOne) -> "%1"+ (G AnnProc ) -> "proc"+ (G AnnQualified ) -> "qualified"+ (G AnnRarrow ) -> "->"+ (G AnnRec ) -> "rec"+ (G AnnRole ) -> "role"+ (G AnnSafe ) -> "safe"+ (G AnnSemi ) -> ";"+ (G AnnSignature) -> "signature"+ (G AnnStock ) -> "stock"+ (G AnnStatic ) -> "static"+ (G AnnThen ) -> "then"+ (G AnnTilde ) -> "~"+ (G AnnType ) -> "type"+ (G AnnUnit ) -> "()"+ (G AnnUsing ) -> "using"+ (G AnnVbar ) -> "|"+ (G AnnWhere ) -> "where"+ (G Annlarrowtail ) -> "-<"+ (G Annrarrowtail ) -> ">-"+ (G AnnLarrowtail ) -> "-<<"+ (G AnnRarrowtail ) -> ">>-"+ (G AnnSimpleQuote ) -> "'"+ (G AnnThTyQuote ) -> "''"+ (G AnnDollar ) -> "$"+ (G AnnDollarDollar ) -> "$$"+ (G AnnDarrowU) -> "⇒"+ (G AnnDcolonU) -> "∷"+ (G AnnForallU) -> "∀"+ (G AnnLarrowU) -> "←"+ (G AnnLarrowtailU) -> "⤛"+ (G AnnRarrowU) -> "→"+ (G AnnRarrowtailU) -> "⤜"+ (G AnnlarrowtailU) -> "⤙"+ (G AnnrarrowtailU) -> "⤚" AnnTypeApp -> "@"-#endif-#if __GLASGOW_HASKELL__ > 804- (G GHC.AnnVia) -> "via"-#endif--#if __GLASGOW_HASKELL__ <= 710--- | Tries to find a unicode equivalent to a 'KeywordId'.--- If none exists then fall back to find the ASCII version.-unicodeString :: KeywordId -> String-unicodeString kw =- fromMaybe (keywordToString kw) (lookup kw unicodeChars)--unicodeChars :: [(KeywordId, String)]-unicodeChars =- -- AZ:TODO:make this a Data.Map, doing linear scan each time- [ (G GHC.AnnDarrow, "⇒")- , (G GHC.AnnDcolon, "∷")- , (G GHC.AnnForall, "∀")- , (G GHC.AnnLarrow, "←")- , (G GHC.AnnLarrowtail, "⤛")- , (G GHC.AnnRarrow, "→")- , (G GHC.AnnRarrowtail, "⤜")- , (G GHC.Annlarrowtail, "⤙")- , (G GHC.Annrarrowtail, "⤚")- ]--{--From Lexer.x-- ,("∷", ITdcolon, unicodeSyntaxEnabled)- ,("⇒", ITdarrow, unicodeSyntaxEnabled)- ,("∀", ITforall, unicodeSyntaxEnabled)- ,("→", ITrarrow, unicodeSyntaxEnabled)- ,("←", ITlarrow, unicodeSyntaxEnabled)-- ,("⤙", ITlarrowtail, \i -> unicodeSyntaxEnabled i && arrowsEnabled i)- ,("⤚", ITrarrowtail, \i -> unicodeSyntaxEnabled i && arrowsEnabled i)- ,("⤛", ITLarrowtail, \i -> unicodeSyntaxEnabled i && arrowsEnabled i)- ,("⤜", ITRarrowtail, \i -> unicodeSyntaxEnabled i && arrowsEnabled i)-- ,("★", ITstar, unicodeSyntaxEnabled)---}--#endif+ (G AnnVia) -> "via"
src/Language/Haskell/GHC/ExactPrint/Parsers.hs view
@@ -1,4 +1,3 @@-{-# LANGUAGE CPP #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE ViewPatterns #-} -----------------------------------------------------------------------------@@ -16,6 +15,7 @@ , withDynFlags , CppOptions(..) , defaultCppOptions+ , LibDir -- * Module Parsers , parseModule@@ -40,72 +40,31 @@ , initDynFlags , initDynFlagsPure , parseModuleFromStringInternal- , parseModuleApiAnnsWithCpp- , parseModuleApiAnnsWithCppInternal+ , parseModuleEpAnnsWithCpp+ , parseModuleEpAnnsWithCppInternal , postParseTransform ) where -import Language.Haskell.GHC.ExactPrint.Annotate-import Language.Haskell.GHC.ExactPrint.Delta import Language.Haskell.GHC.ExactPrint.Preprocess-import Language.Haskell.GHC.ExactPrint.Types -import Control.Exception (IOException, catch) import Control.Monad.RWS-#if __GLASGOW_HASKELL__ >= 900-#elif __GLASGOW_HASKELL__ > 806-import Data.Data (Data)-#endif-import Data.Maybe (fromMaybe) --import GHC.Paths (libdir)--import System.Environment (lookupEnv)- import qualified GHC hiding (parseModule)-#if __GLASGOW_HASKELL__ >= 900 import qualified Control.Monad.IO.Class as GHC import qualified GHC.Data.FastString as GHC import qualified GHC.Data.StringBuffer as GHC+import qualified GHC.Driver.Config as GHC import qualified GHC.Driver.Session as GHC import qualified GHC.Parser as GHC import qualified GHC.Parser.Header as GHC import qualified GHC.Parser.Lexer as GHC import qualified GHC.Parser.PostProcess as GHC+import qualified GHC.Parser.Errors.Ppr as GHC import qualified GHC.Types.SrcLoc as GHC import qualified GHC.Utils.Error as GHC-#else--- import qualified ApiAnnotation as GHC-import qualified DynFlags as GHC-#if __GLASGOW_HASKELL__ > 808-import qualified ErrUtils as GHC-#endif-import qualified FastString as GHC--- import qualified GHC as GHC hiding (parseModule)-import qualified HeaderInfo as GHC-import qualified Lexer as GHC-import qualified MonadUtils as GHC-#if __GLASGOW_HASKELL__ <= 808-import qualified Outputable as GHC-#endif-import qualified Parser as GHC-#if __GLASGOW_HASKELL__ > 808-import qualified RdrHsSyn as GHC-#endif-import qualified SrcLoc as GHC-import qualified StringBuffer as GHC-#endif -#if __GLASGOW_HASKELL__ <= 710-import qualified OrdList as OL-#else import qualified GHC.LanguageExtensions as LangExt-#endif -import qualified Data.Map as Map-- {-# ANN module "HLint: ignore Eta reduce" #-} {-# ANN module "HLint: ignore Redundant do" #-} {-# ANN module "HLint: ignore Reduce duplication" #-}@@ -113,48 +72,27 @@ -- | Wrapper function which returns Annotations along with the parsed -- element.-#if (__GLASGOW_HASKELL__ > 806) && (__GLASGOW_HASKELL__ < 900)-parseWith :: (Data (GHC.SrcSpanLess w), Annotate w, GHC.HasSrcSpan w)- => GHC.DynFlags+parseWith :: GHC.DynFlags -> FilePath -> GHC.P w -> String -> ParseResult w-#else-parseWith :: Annotate w- => GHC.DynFlags- -> FilePath- -> GHC.P (GHC.Located w)- -> String- -> ParseResult (GHC.Located w)-#endif parseWith dflags fileName parser s = case runParser parser dflags fileName s of-#if __GLASGOW_HASKELL__ > 808- GHC.PFailed pst -> Left (GHC.getErrorMessages pst dflags)-#elif __GLASGOW_HASKELL__ >= 804- GHC.PFailed _ ss m -> Left (ss, GHC.showSDoc dflags m)-#else- GHC.PFailed ss m -> Left (ss, GHC.showSDoc dflags m)-#endif- GHC.POk (mkApiAnns -> apianns) pmod -> Right (as, pmod)- where as = relativiseApiAnns pmod apianns+ GHC.PFailed pst -> Left (fmap GHC.pprError $ GHC.getErrorMessages pst)+ GHC.POk _ pmod -> Right pmod -#if __GLASGOW_HASKELL__ > 808-parseWithECP :: (GHC.DisambECP w, Annotate (GHC.Body w GHC.GhcPs))+parseWithECP :: (GHC.DisambECP w) => GHC.DynFlags -> FilePath -> GHC.P GHC.ECP -> String- -> ParseResult (GHC.Located w)+ -> ParseResult (GHC.LocatedA w) parseWithECP dflags fileName parser s =- -- case runParser ff dflags fileName s of- case runParser (parser >>= \p -> GHC.runECP_P p) dflags fileName s of- GHC.PFailed pst -> Left (GHC.getErrorMessages pst dflags)- GHC.POk (mkApiAnns -> apianns) pmod -> Right (as, pmod)- where as = relativiseApiAnns pmod apianns-#endif+ case runParser (parser >>= \p -> GHC.runPV $ GHC.unECP p) dflags fileName s of+ GHC.PFailed pst -> Left (fmap GHC.pprError $ GHC.getErrorMessages pst)+ GHC.POk _ pmod -> Right pmod -- --------------------------------------------------------------------- @@ -163,7 +101,7 @@ where location = GHC.mkRealSrcLoc (GHC.mkFastString filename) 1 1 buffer = GHC.stringToStringBuffer str- parseState = GHC.mkPState flags buffer location+ parseState = GHC.initParserState (GHC.initParserOpts flags) buffer location -- --------------------------------------------------------------------- @@ -173,57 +111,43 @@ -- @ -- myParser fname expr = withDynFlags (\\d -> parseExpr d fname expr) -- @-withDynFlags :: (GHC.DynFlags -> a) -> IO a-withDynFlags action = ghcWrapper $ do+withDynFlags :: FilePath -> (GHC.DynFlags -> a) -> IO a+withDynFlags libdir action = ghcWrapper libdir $ do dflags <- GHC.getSessionDynFlags void $ GHC.setSessionDynFlags dflags return (action dflags) -- --------------------------------------------------------------------- -#if __GLASGOW_HASKELL__ >= 900 parseFile :: GHC.DynFlags -> FilePath -> String -> GHC.ParseResult (GHC.Located GHC.HsModule)-#else-parseFile :: GHC.DynFlags -> FilePath -> String -> GHC.ParseResult (GHC.Located (GHC.HsModule GhcPs))-#endif parseFile = runParser GHC.parseModule -- --------------------------------------------------------------------- -#if __GLASGOW_HASKELL__ > 808-type ParseResult a = Either GHC.ErrorMessages (Anns, a)-#else-type ParseResult a = Either (GHC.SrcSpan, String) (Anns, a)-#endif+type LibDir = FilePath +type ParseResult a = Either GHC.ErrorMessages a+ type Parser a = GHC.DynFlags -> FilePath -> String -> ParseResult a -parseExpr :: Parser (GHC.LHsExpr GhcPs)-#if __GLASGOW_HASKELL__ > 808+parseExpr :: Parser (GHC.LHsExpr GHC.GhcPs) parseExpr df fp = parseWithECP df fp GHC.parseExpression-#else-parseExpr df fp = parseWith df fp GHC.parseExpression-#endif -parseImport :: Parser (GHC.LImportDecl GhcPs)+parseImport :: Parser (GHC.LImportDecl GHC.GhcPs) parseImport df fp = parseWith df fp GHC.parseImport -parseType :: Parser (GHC.LHsType GhcPs)+parseType :: Parser (GHC.LHsType GHC.GhcPs) parseType df fp = parseWith df fp GHC.parseType -- safe, see D1007-parseDecl :: Parser (GHC.LHsDecl GhcPs)-#if __GLASGOW_HASKELL__ <= 710-parseDecl df fp = parseWith df fp (head . OL.fromOL <$> GHC.parseDeclaration)-#else+parseDecl :: Parser (GHC.LHsDecl GHC.GhcPs) parseDecl df fp = parseWith df fp GHC.parseDeclaration-#endif -parseStmt :: Parser (GHC.ExprLStmt GhcPs)+parseStmt :: Parser (GHC.ExprLStmt GHC.GhcPs) parseStmt df fp = parseWith df fp GHC.parseStatement -parsePattern :: Parser (GHC.LPat GhcPs)+parsePattern :: Parser (GHC.LPat GHC.GhcPs) parsePattern df fp = parseWith df fp GHC.parsePattern -- ---------------------------------------------------------------------@@ -237,8 +161,8 @@ -- @ -- -- Note: 'GHC.ParsedSource' is a synonym for 'GHC.Located' ('GHC.HsModule' 'GhcPs')-parseModule :: FilePath -> IO (ParseResult GHC.ParsedSource)-parseModule = parseModuleWithCpp defaultCppOptions normalLayout+parseModule :: LibDir -> FilePath -> IO (ParseResult GHC.ParsedSource)+parseModule libdir file = parseModuleWithCpp libdir defaultCppOptions file -- | This entry point will work out which language extensions are@@ -247,10 +171,11 @@ -- string; the `FilePath` parameter solely exists to provide a name -- in source location annotations. parseModuleFromString- :: FilePath+ :: FilePath -- GHC libdir+ -> FilePath -> String -> IO (ParseResult GHC.ParsedSource)-parseModuleFromString fp s = ghcWrapper $ do+parseModuleFromString libdir fp s = ghcWrapper libdir $ do dflags <- initDynFlagsPure fp s return $ parseModuleFromStringInternal dflags fp s @@ -259,85 +184,65 @@ parseModuleFromStringInternal dflags fileName str = let (str1, lp) = stripLinePragmas str res = case runParser GHC.parseModule dflags fileName str1 of-#if __GLASGOW_HASKELL__ > 808- GHC.PFailed pst -> Left (GHC.getErrorMessages pst dflags)-#elif __GLASGOW_HASKELL__ >= 804- GHC.PFailed _ ss m -> Left (ss, GHC.showSDoc dflags m)-#else- GHC.PFailed ss m -> Left (ss, GHC.showSDoc dflags m)-#endif- GHC.POk x pmod -> Right (mkApiAnns x, lp, dflags, pmod)- in postParseTransform res normalLayout+ GHC.PFailed pst -> Left (fmap GHC.pprError $ GHC.getErrorMessages pst)+ GHC.POk _ pmod -> Right (lp, dflags, pmod)+ in postParseTransform res -parseModuleWithOptions :: DeltaOptions+parseModuleWithOptions :: FilePath -- ^ GHC libdir -> FilePath -> IO (ParseResult GHC.ParsedSource)-parseModuleWithOptions opts fp =- parseModuleWithCpp defaultCppOptions opts fp+parseModuleWithOptions libdir fp =+ parseModuleWithCpp libdir defaultCppOptions fp -- | Parse a module with specific instructions for the C pre-processor. parseModuleWithCpp- :: CppOptions- -> DeltaOptions- -> FilePath+ :: FilePath -- ^ GHC libdir+ -> CppOptions+ -> FilePath -- ^ File to be parsed -> IO (ParseResult GHC.ParsedSource)-parseModuleWithCpp cpp opts fp = do- res <- parseModuleApiAnnsWithCpp cpp fp- return $ postParseTransform res opts+parseModuleWithCpp libdir cpp fp = do+ res <- parseModuleEpAnnsWithCpp libdir cpp fp+ return $ postParseTransform res -- --------------------------------------------------------------------- -- | Low level function which is used in the internal tests. -- It is advised to use 'parseModule' or 'parseModuleWithCpp' instead of -- this function.-parseModuleApiAnnsWithCpp- :: CppOptions- -> FilePath+parseModuleEpAnnsWithCpp+ :: FilePath -- ^ GHC libdir+ -> CppOptions+ -> FilePath -- ^ File to be parsed -> IO ( Either-#if __GLASGOW_HASKELL__ > 808 GHC.ErrorMessages-#else- (GHC.SrcSpan, String)-#endif- (GHC.ApiAnns, [Comment], GHC.DynFlags, GHC.ParsedSource)+ ([GHC.LEpaComment], GHC.DynFlags, GHC.ParsedSource) )-parseModuleApiAnnsWithCpp cppOptions file = ghcWrapper $ do+parseModuleEpAnnsWithCpp libdir cppOptions file = ghcWrapper libdir $ do dflags <- initDynFlags file- parseModuleApiAnnsWithCppInternal cppOptions dflags file+ parseModuleEpAnnsWithCppInternal cppOptions dflags file -- | Internal function. Default runner of GHC.Ghc action in IO.-ghcWrapper :: GHC.Ghc a -> IO a-ghcWrapper ghc = do- let handler = return . const Nothing :: IOException -> IO (Maybe String)- rtLibdir <- liftIO $ lookupEnv "GHC_EXACTPRINT_GHC_LIBDIR" `catch` handler- let libdir' = fromMaybe libdir rtLibdir+ghcWrapper :: FilePath -> GHC.Ghc a -> IO a+ghcWrapper libdir a = GHC.defaultErrorHandler GHC.defaultFatalMessager GHC.defaultFlushOut- . GHC.runGhc (Just libdir') $ ghc+ $ GHC.runGhc (Just libdir) a -- | Internal function. Exposed if you want to muck with DynFlags -- before parsing.-parseModuleApiAnnsWithCppInternal+parseModuleEpAnnsWithCppInternal :: GHC.GhcMonad m => CppOptions -> GHC.DynFlags -> FilePath -> m ( Either-#if __GLASGOW_HASKELL__ > 808 GHC.ErrorMessages-#else- (GHC.SrcSpan, String)-#endif- (GHC.ApiAnns, [Comment], GHC.DynFlags, GHC.ParsedSource)+ ([GHC.LEpaComment], GHC.DynFlags, GHC.ParsedSource) )-parseModuleApiAnnsWithCppInternal cppOptions dflags file = do-#if __GLASGOW_HASKELL__ <= 710- let useCpp = GHC.xopt GHC.Opt_Cpp dflags-#else+parseModuleEpAnnsWithCppInternal cppOptions dflags file = do let useCpp = GHC.xopt LangExt.Cpp dflags-#endif (fileContents, injectedComments, dflags') <- if useCpp then do@@ -350,27 +255,43 @@ return (contents1,lp,dflags) return $ case parseFile dflags' file fileContents of-#if __GLASGOW_HASKELL__ > 808- GHC.PFailed pst -> Left (GHC.getErrorMessages pst dflags)-#elif __GLASGOW_HASKELL__ >= 804- GHC.PFailed _ ss m -> Left $ (ss, (GHC.showSDoc dflags m))-#else- GHC.PFailed ss m -> Left $ (ss, (GHC.showSDoc dflags m))-#endif- GHC.POk (mkApiAnns -> apianns) pmod ->- Right $ (apianns, injectedComments, dflags', pmod)+ GHC.PFailed pst -> Left (fmap GHC.pprError $ GHC.getErrorMessages pst)+ GHC.POk _ pmod ->+ Right $ (injectedComments, dflags', fixModuleTrailingComments pmod) -- | Internal function. Exposed if you want to muck with DynFlags -- before parsing. Or after parsing. postParseTransform- :: Either a (GHC.ApiAnns, [Comment], GHC.DynFlags, GHC.ParsedSource)- -> DeltaOptions- -> Either a (Anns, GHC.ParsedSource)-postParseTransform parseRes opts = fmap mkAnns parseRes+ :: Either a ([GHC.LEpaComment], GHC.DynFlags, GHC.ParsedSource)+ -> Either a (GHC.ParsedSource)+postParseTransform parseRes = fmap mkAnns parseRes where- mkAnns (apianns, cs, _, m) =- (relativiseApiAnnsWithOptions opts cs m apianns, m)+ -- TODO:AZ perhaps inject the comments into the parsedsource here already+ mkAnns (_cs, _, m) = fixModuleTrailingComments m +fixModuleTrailingComments :: GHC.ParsedSource -> GHC.ParsedSource+fixModuleTrailingComments (GHC.L l p) = GHC.L l p'+ where+ an' = case GHC.hsmodAnn p of+ (GHC.EpAnn a an ocs) -> GHC.EpAnn a an (rebalance (GHC.am_decls an) ocs)+ unused -> unused+ p' = p { GHC.hsmodAnn = an' }+ -- p' = error $ "fixModuleTrailingComments: an'=" ++ showAst an'++ rebalance :: GHC.AnnList -> GHC.EpAnnComments -> GHC.EpAnnComments+ rebalance al cs = cs'+ where+ cs' = case GHC.al_close al of+ Just (GHC.AddEpAnn _ (GHC.EpaSpan ss)) ->+ let+ pc = GHC.priorComments cs+ fc = GHC.getFollowingComments cs+ bf (GHC.L anc _) = GHC.anchor anc > ss+ (prior,f) = break bf fc+ cs'' = GHC.EpaCommentsBalanced (pc <> prior) f+ in cs''+ _ -> cs+ -- | Internal function. Initializes DynFlags value for parsing. -- -- Passes "-hide-all-packages" to the GHC API to prevent parsing of@@ -418,19 +339,3 @@ return dflags3 -- -----------------------------------------------------------------------mkApiAnns :: GHC.PState -> GHC.ApiAnns--#if __GLASGOW_HASKELL__ >= 900-mkApiAnns pstate- = GHC.ApiAnns {- GHC.apiAnnItems = Map.fromListWith (++) $ GHC.annotations pstate,- GHC.apiAnnEofPos = GHC.eof_pos pstate,- GHC.apiAnnComments = Map.fromList (GHC.annotations_comments pstate),- GHC.apiAnnRogueComments = GHC.comment_q pstate- }-#else-mkApiAnns pstate- = ( Map.fromListWith (++) . GHC.annotations $ pstate- , Map.fromList ((GHC.noSrcSpan, GHC.comment_q pstate) : GHC.annotations_comments pstate))-#endif
src/Language/Haskell/GHC/ExactPrint/Preprocess.hs view
@@ -1,4 +1,3 @@-{-# LANGUAGE CPP #-} {-# LANGUAGE RecordWildCards #-} {-# LANGUAGE OverloadedStrings #-} -- | This module provides support for CPP, interpreter directives and line@@ -16,54 +15,28 @@ import qualified GHC as GHC hiding (parseModule) -#if __GLASGOW_HASKELL__ >= 900 import qualified Control.Monad.IO.Class as GHC import qualified GHC.Data.Bag as GHC import qualified GHC.Data.FastString as GHC import qualified GHC.Data.StringBuffer as GHC+import qualified GHC.Driver.Config as GHC+import qualified GHC.Driver.Env as GHC import qualified GHC.Driver.Phases as GHC import qualified GHC.Driver.Pipeline as GHC--- import qualified GHC.Driver.Session as GHC-import qualified GHC.Driver.Types as GHC import qualified GHC.Fingerprint.Type as GHC-import qualified GHC.Utils.Fingerprint as GHC+import qualified GHC.Parser.Errors.Ppr as GHC import qualified GHC.Parser.Lexer as GHC import qualified GHC.Settings as GHC+import qualified GHC.Types.SourceError as GHC+import qualified GHC.Types.SourceFile as GHC import qualified GHC.Types.SrcLoc as GHC import qualified GHC.Utils.Error as GHC+import qualified GHC.Utils.Fingerprint as GHC import GHC.Types.SrcLoc (mkSrcSpan, mkSrcLoc) import GHC.Data.FastString (mkFastString)-#else-import qualified Bag as GHC-import qualified DriverPhases as GHC-import qualified DriverPipeline as GHC-import qualified DynFlags as GHC-import qualified ErrUtils as GHC-import qualified FastString as GHC-import qualified HscTypes as GHC-import qualified Lexer as GHC-import qualified MonadUtils as GHC-import qualified SrcLoc as GHC-import qualified StringBuffer as GHC-import SrcLoc (mkSrcSpan, mkSrcLoc)-import FastString (mkFastString)-#endif -#if (__GLASGOW_HASKELL__ > 808) && (__GLASGOW_HASKELL__ < 900)-import qualified Fingerprint as GHC-import qualified ToolSettings as GHC-#endif---#if __GLASGOW_HASKELL__ > 808-#else-import Control.Exception-#endif-import Data.List hiding (find)+import Data.List (isPrefixOf, intercalate) 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@@ -88,29 +61,29 @@ -- --------------------------------------------------------------------- -- | Remove GHC style line pragams (@{-# LINE .. #-}@) and convert them into comments.-stripLinePragmas :: String -> (String, [Comment])+stripLinePragmas :: String -> (String, [GHC.LEpaComment]) stripLinePragmas = unlines' . unzip . findLines . lines where unlines' (a, b) = (unlines a, catMaybes b) -findLines :: [String] -> [(String, Maybe Comment)]+findLines :: [String] -> [(String, Maybe GHC.LEpaComment)] findLines = zipWith checkLine [1..] -checkLine :: Int -> String -> (String, Maybe Comment)+checkLine :: Int -> String -> (String, Maybe GHC.LEpaComment) checkLine line s | "{-# LINE" `isPrefixOf` s = let (pragma, res) = getPragma s size = length pragma mSrcLoc = mkSrcLoc (mkFastString "LINE") ss = mkSrcSpan (mSrcLoc line 1) (mSrcLoc line (size+1))- in (res, Just $ mkComment pragma (rs ss))+ in (res, Just $ mkLEpaComment pragma (GHC.spanAsAnchor ss)) -- Deal with shebang/cpp directives too -- x | "#" `isPrefixOf` s = ("",Just $ Comment ((line, 1), (line, length s)) s) | "#!" `isPrefixOf` s = let mSrcLoc = mkSrcLoc (mkFastString "SHEBANG") ss = mkSrcSpan (mSrcLoc line 1) (mSrcLoc line (length s)) in- ("",Just $ mkComment s (rs ss))+ ("",Just $ mkLEpaComment s (GHC.spanAsAnchor ss)) | otherwise = (s, Nothing) getPragma :: String -> (String, String)@@ -129,46 +102,37 @@ getCppTokensAsComments :: GHC.GhcMonad m => CppOptions -- ^ Preprocessor Options -> FilePath -- ^ Path to source file- -> m [Comment]+ -> m [GHC.LEpaComment] getCppTokensAsComments cppOptions sourceFile = do source <- GHC.liftIO $ GHC.hGetStringBuffer sourceFile let startLoc = GHC.mkRealSrcLoc (GHC.mkFastString sourceFile) 1 1- (_txt,strSrcBuf,flags2) <- getPreprocessedSrcDirectPrim cppOptions sourceFile- -- #ifdef tokens+ (_txt,strSrcBuf,flags2') <- getPreprocessedSrcDirectPrim cppOptions sourceFile+ let flags2 = GHC.initParserOpts flags2'+ -- hash-ifdef tokens directiveToks <- GHC.liftIO $ getPreprocessorAsComments sourceFile- -- Tokens without #ifdef+ -- Tokens without hash-ifdef nonDirectiveToks <- tokeniseOriginalSrc startLoc flags2 source- case GHC.lexTokenStream strSrcBuf startLoc flags2 of+ case GHC.lexTokenStream flags2 strSrcBuf startLoc of GHC.POk _ ts -> do let toks = GHC.addSourceToTokens startLoc source ts cppCommentToks = getCppTokens directiveToks nonDirectiveToks toks return $ filter goodComment-#if __GLASGOW_HASKELL__ >= 900- $ map (tokComment . GHC.commentToAnnotation . toRealLocated . fst) cppCommentToks-#elif __GLASGOW_HASKELL__ > 800- $ map (tokComment . GHC.commentToAnnotation . fst) cppCommentToks-#else- $ map (tokComment . commentToAnnotation . fst) cppCommentToks-#endif-#if __GLASGOW_HASKELL__ > 808- GHC.PFailed pst -> parseError flags2 pst-#elif __GLASGOW_HASKELL__ >= 804- GHC.PFailed _ sspan err -> parseError flags2 sspan err-#else- GHC.PFailed sspan err -> parseError flags2 sspan err-#endif+ $ map (GHC.commentToAnnotation . toRealLocated . fst) cppCommentToks+ GHC.PFailed pst -> parseError pst -goodComment :: Comment -> Bool-goodComment (Comment "" _ _) = False-goodComment _ = True +goodComment :: GHC.LEpaComment -> Bool+goodComment c = isGoodComment (tokComment c)+ where+ isGoodComment :: Comment -> Bool+ isGoodComment (Comment "" _ _) = False+ isGoodComment _ = True -#if __GLASGOW_HASKELL__ >= 900+ toRealLocated :: GHC.Located a -> GHC.RealLocated a toRealLocated (GHC.L (GHC.RealSrcSpan s _) x) = GHC.L s x toRealLocated (GHC.L _ x) = GHC.L badRealSrcSpan x-#endif -- --------------------------------------------------------------------- @@ -205,7 +169,7 @@ missingAsComments = map mkCommentTok missingToks where mkCommentTok :: (GHC.Located GHC.Token,String) -> (GHC.Located GHC.Token,String)- mkCommentTok (GHC.L l _,s) = (GHC.L l (GHC.ITlineComment s),s)+ mkCommentTok (GHC.L l _,s) = (GHC.L l (GHC.ITlineComment s placeholderBufSpan),s) toks = mergeBy locFn directiveToks missingAsComments @@ -213,19 +177,13 @@ tokeniseOriginalSrc :: GHC.GhcMonad m- => GHC.RealSrcLoc -> GHC.DynFlags -> GHC.StringBuffer+ => GHC.RealSrcLoc -> GHC.ParserOpts -> GHC.StringBuffer -> m [(GHC.Located GHC.Token, String)] tokeniseOriginalSrc startLoc flags buf = do let src = stripPreprocessorDirectives buf- case GHC.lexTokenStream src startLoc flags of+ case GHC.lexTokenStream flags src startLoc of GHC.POk _ ts -> return $ GHC.addSourceToTokens startLoc src ts-#if __GLASGOW_HASKELL__ > 808- GHC.PFailed pst -> parseError flags pst-#elif __GLASGOW_HASKELL__ >= 804- GHC.PFailed _ sspan err -> parseError flags sspan err-#else- GHC.PFailed sspan err -> parseError flags sspan err-#endif+ GHC.PFailed pst -> parseError pst -- --------------------------------------------------------------------- @@ -259,8 +217,6 @@ hsc_env <- GHC.getSession let dfs = GHC.hsc_dflags hsc_env new_env = hsc_env { GHC.hsc_dflags = injectCppOptions cppOptions dfs }-#if __GLASGOW_HASKELL__ >= 808- -- (dflags', hspp_fn) <- r <- GHC.liftIO $ GHC.preprocess new_env src_fn Nothing (Just (GHC.Cpp GHC.HsSrcFile)) case r of Left err -> error $ showErrorMessages err@@ -268,18 +224,9 @@ buf <- GHC.liftIO $ GHC.hGetStringBuffer hspp_fn txt <- GHC.liftIO $ readFileGhc hspp_fn return (txt, buf, dflags')-#else- (dflags', hspp_fn) <-- GHC.liftIO $ GHC.preprocess new_env (src_fn, Just (GHC.Cpp GHC.HsSrcFile))- buf <- GHC.liftIO $ GHC.hGetStringBuffer hspp_fn- txt <- GHC.liftIO $ readFileGhc hspp_fn- return (txt, buf, dflags')-#endif -#if __GLASGOW_HASKELL__ >= 808 showErrorMessages :: GHC.ErrorMessages -> String showErrorMessages msgs = intercalate "\n" $ map show $ GHC.bagToList msgs-#endif injectCppOptions :: CppOptions -> GHC.DynFlags -> GHC.DynFlags injectCppOptions CppOptions{..} dflags =@@ -290,7 +237,6 @@ mkInclude = ("-include" ++) -#if __GLASGOW_HASKELL__ > 808 addOptP :: String -> GHC.DynFlags -> GHC.DynFlags addOptP f = alterToolSettings $ \s -> s { GHC.toolSettings_opt_P = f : GHC.toolSettings_opt_P s@@ -302,13 +248,6 @@ fingerprintStrings :: [String] -> GHC.Fingerprint fingerprintStrings ss = GHC.fingerprintFingerprints $ map GHC.fingerprintString ss -#else-addOptP :: String -> GHC.DynFlags -> GHC.DynFlags-addOptP f = alterSettings (\s -> s { GHC.sOpt_P = f : GHC.sOpt_P s})--alterSettings :: (GHC.Settings -> GHC.Settings) -> GHC.DynFlags -> GHC.DynFlags-alterSettings f dflags = dflags { GHC.settings = f (GHC.settings dflags) }-#endif -- --------------------------------------------------------------------- -- | Get the preprocessor directives as comment tokens from the@@ -319,7 +258,7 @@ let directives = filter (\(_lineNum,line) -> line /= [] && head line == '#') $ zip [1..] (lines fcontents) - let mkTok (lineNum,line) = (GHC.L l (GHC.ITlineComment line),line)+ let mkTok (lineNum,line) = (GHC.L l (GHC.ITlineComment line placeholderBufSpan),line) where start = GHC.mkSrcLoc (GHC.mkFastString srcFile) lineNum 1 end = GHC.mkSrcLoc (GHC.mkFastString srcFile) lineNum (length line)@@ -328,20 +267,21 @@ let toks = map mkTok directives return toks +placeholderBufSpan :: GHC.PsSpan+placeholderBufSpan = pspan+ where+ bl = GHC.BufPos 0+ pspan = GHC.PsSpan GHC.placeholderRealSpan (GHC.BufSpan bl bl)+ -- --------------------------------------------------------------------- -#if __GLASGOW_HASKELL__ > 808-parseError :: (GHC.MonadIO m) => GHC.DynFlags -> GHC.PState -> m b-parseError dflags pst = do+parseError :: (GHC.MonadIO m) => GHC.PState -> m b+parseError pst = do let -- (warns,errs) = GHC.getMessages pst dflags -- throw $ GHC.mkSrcErr (GHC.unitBag $ GHC.mkPlainErrMsg dflags sspan err)- GHC.throwErrors (GHC.getErrorMessages pst dflags)-#else-parseError :: GHC.DynFlags -> GHC.SrcSpan -> GHC.MsgDoc -> m b-parseError dflags sspan err = do- throw $ GHC.mkSrcErr (GHC.unitBag $ GHC.mkPlainErrMsg dflags sspan err)-#endif+ -- GHC.throwErrors (fmap GHC.mkParserErr (GHC.getErrorMessages pst))+ GHC.throwErrors (fmap GHC.pprError (GHC.getErrorMessages pst)) -- --------------------------------------------------------------------- @@ -373,4 +313,3 @@ -- Someone please put this code out of its misery. | (x `cmp` y) <= EQ = x : mergeBy cmp xs ally | otherwise = y : mergeBy cmp allx ys-
− src/Language/Haskell/GHC/ExactPrint/Pretty.hs
@@ -1,652 +0,0 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE NamedFieldPuns #-}-{-# LANGUAGE RankNTypes #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE ViewPatterns #-}---------------------------------------------------------------------------------- |--- Module : Language.Haskell.GHC.ExactPrint.Pretty------ This module adds default annotations to an AST fragment that does not have--- them, to be able to exactprint it in a way that preserves the orginal AST--- when re-parsed.-----------------------------------------------------------------------------------module Language.Haskell.GHC.ExactPrint.Pretty- (- addAnnotationsForPretty- ) where--import Language.Haskell.GHC.ExactPrint.Types-import Language.Haskell.GHC.ExactPrint.Utils-import Language.Haskell.GHC.ExactPrint.Annotate--import Control.Monad.RWS-import Control.Monad.Trans.Free-import Data.Generics-import Data.List-import Data.Ord (comparing)---#if __GLASGOW_HASKELL__ <= 710-import qualified BooleanFormula as GHC-import qualified Outputable as GHC-#endif-import qualified GHC--import qualified Data.Map as Map-import qualified Data.Set as Set--{-# ANN module "HLint: ignore Eta reduce" #-}-{-# ANN module "HLint: ignore Redundant do" #-}-{-# ANN module "HLint: ignore Reduce duplication" #-}---- ------------------------------------------------------------------------- |Add any missing annotations so that the full AST element will exactprint--- properly when done.-addAnnotationsForPretty :: (Annotate a) => [Comment] -> GHC.Located a -> Anns -> Anns-addAnnotationsForPretty cs ast ans- = runPrettyWithComments opts cs (annotate ast) ans (0,0)- where- opts = prettyOptions NormalLayout---- --------------------------------------------------------------------------- | Type used in the Pretty Monad.-type Pretty a = RWS PrettyOptions PrettyWriter PrettyState a--runPrettyWithComments :: PrettyOptions -> [Comment] -> Annotated () -> Anns -> Pos -> Anns-runPrettyWithComments opts cs action ans priorEnd =- mkAnns . snd- . (\next -> execRWS next opts (defaultPrettyState cs priorEnd ans))- . prettyInterpret $ action- where- mkAnns :: PrettyWriter -> Anns- mkAnns = f . dwAnns- f :: Monoid a => Endo a -> a- f = ($ mempty) . appEndo---- ------------------------------------------------------------------------- TODO: rename this, it is the R part of the RWS-data PrettyOptions = PrettyOptions- {- -- | Current `SrcSpan, part of current AnnKey`- curSrcSpan :: !GHC.SrcSpan-- -- | Constuctor of current AST element, part of current AnnKey- , annConName :: !AnnConName-- -- | Whether to use rigid or normal layout rules- , drRigidity :: !Rigidity-- -- | Current higher level context. e.g. whether a Match is part of a- -- LambdaExpr or a FunBind- , prContext :: !AstContextSet- } deriving Show--data PrettyWriter = PrettyWriter- { -- | Final list of annotations, and sort keys- dwAnns :: Endo (Map.Map AnnKey Annotation)-- -- | Used locally to pass Keywords, delta pairs relevant to a specific- -- subtree to the parent.- , annKds :: ![(KeywordId, DeltaPos)]- , sortKeys :: !(Maybe [AnnSpan])- , dwCapturedSpan :: !(First AnnKey)- , prLayoutContext :: !(ACS' AstContext)- }--data PrettyState = PrettyState- { -- | Position reached when processing the last element- priorEndPosition :: !Pos-- -- | Ordered list of comments still to be allocated- , apComments :: ![Comment]-- , apMarkLayout :: Bool- , apLayoutStart :: LayoutStartCol-- , apNoPrecedingSpace :: Bool-- }--#if __GLASGOW_HASKELL__ >= 804-instance Semigroup PrettyWriter where- (<>) = mappend-#endif--instance Monoid PrettyWriter where- mempty = PrettyWriter mempty mempty mempty mempty mempty- (PrettyWriter a b e g i) `mappend` (PrettyWriter c d f h j)- = PrettyWriter (a <> c) (b <> d) (e <> f) (g <> h) (i <> j)---- -----------------------------------------------------------------------prettyOptions :: Rigidity -> PrettyOptions-prettyOptions ridigity =- PrettyOptions- { curSrcSpan = GHC.noSrcSpan- , annConName = annGetConstr ()- , drRigidity = ridigity- , prContext = defaultACS- }--defaultPrettyState :: [Comment] -> Pos -> Anns -> PrettyState-defaultPrettyState injectedComments priorEnd _ans =- PrettyState- { priorEndPosition = priorEnd- , apComments = cs ++ injectedComments- , apLayoutStart = 1- , apMarkLayout = False- , apNoPrecedingSpace = False- }- where- cs :: [Comment]- cs = []---- ------------------------------------------------------------------------ Free Monad Interpretation code--prettyInterpret :: Annotated a -> Pretty a-prettyInterpret = iterTM go- where- go :: AnnotationF (Pretty a) -> Pretty a- go (MarkPrim kwid _ next) = addPrettyAnnotation (G kwid) >> next- go (MarkPPOptional _kwid _ next) = next- go (MarkEOF next) = addEofAnnotation >> next- go (MarkExternal _ss akwid _ next) = addPrettyAnnotation (G akwid) >> next-#if __GLASGOW_HASKELL__ >= 800- go (MarkInstead akwid kwid next) = addPrettyAnnotationsInstead akwid kwid >> next-#endif- go (MarkOutside akwid kwid next) = addPrettyAnnotationsOutside akwid kwid >> next- -- go (MarkOutside akwid kwid next) = addPrettyAnnotation kwid >> next- go (MarkInside akwid next) = addPrettyAnnotationsInside akwid >> next- go (MarkMany akwid next) = addPrettyAnnotation (G akwid) >> next- go (MarkManyOptional _akwid next) = next- go (MarkOffsetPrim akwid n _ next) = addPrettyAnnotationLs akwid n >> next- go (MarkOffsetPrimOptional _akwid _n _ next) = next- go (WithAST lss prog next) = withAST lss (prettyInterpret prog) >> next- go (CountAnns kwid next) = countAnnsPretty kwid >>= next- go (WithSortKey kws next) = withSortKey kws >> next- go (WithSortKeyContexts ctx kws next) = withSortKeyContexts ctx kws >> next- go (SetLayoutFlag r action next) = do- rigidity <- asks drRigidity- (if r <= rigidity then setLayoutFlag else id) (prettyInterpret action)- next- go (StoreOriginalSrcSpan l key next) = storeOriginalSrcSpanPretty l key >>= next- go (MarkAnnBeforeAnn _ann1 _ann2 next) = next- go (GetSrcSpanForKw ss kw next) = getSrcSpanForKw ss kw >>= next-#if __GLASGOW_HASKELL__ <= 710- go (StoreString s ss next) = storeString s ss >> next-#endif- go (AnnotationsToComments kws next) = annotationsToCommentsPretty kws >> next-#if __GLASGOW_HASKELL__ <= 710- go (AnnotationsToCommentsBF bf kws next) = annotationsToCommentsBFPretty bf kws >> next- go (FinalizeBF l next) = finalizeBFPretty l >> next-#endif-- go (SetContextLevel ctxt lvl action next) = setContextPretty ctxt lvl (prettyInterpret action) >> next- go (UnsetContext ctxt action next) = unsetContextPretty ctxt (prettyInterpret action) >> next- go (IfInContext ctxt ia ea next) = ifInContextPretty ctxt ia ea >> next- go (TellContext c next) = tellContext c >> next---- -----------------------------------------------------------------------addEofAnnotation :: Pretty ()-addEofAnnotation = do-#if __GLASGOW_HASKELL__ >= 900- tellKd (AnnEofPos, DP (1,0))-#else- tellKd (G GHC.AnnEofPos, DP (1,0))-#endif---- -----------------------------------------------------------------------addPrettyAnnotation :: KeywordId -> Pretty ()-addPrettyAnnotation ann = do- noPrec <- gets apNoPrecedingSpace- 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,0))-#if __GLASGOW_HASKELL__ >= 806- (G GHC.AnnAnyclass) -> tellKd (ann,DP (0,1))-#endif- (G GHC.AnnBackquote) -> tellKd (ann,DP (0,1))- (G GHC.AnnBang) -> tellKd (ann,DP (0,1))- (G GHC.AnnBy) -> tellKd (ann,DP (0,1))- (G GHC.AnnCase ) -> tellKd (ann,DP (0,1))- (G GHC.AnnClass) -> tellKd (ann,DP (0,1))- (G GHC.AnnClose) -> tellKd (ann,DP (0,1))- (G GHC.AnnCloseC) -> tellKd (ann,DP (0,0))-#if __GLASGOW_HASKELL__ >= 802- (G GHC.AnnCloseQ) -> tellKd (ann,DP (0,1))-#endif- (G GHC.AnnDcolon) -> tellKd (ann,DP (0,1))- (G GHC.AnnDeriving) -> tellKd (ann,DP (0,1))- (G GHC.AnnDo) -> tellKd (ann,DP (0,1))-#if __GLASGOW_HASKELL__ >= 900- (G GHC.AnnDollar) -> tellKd (ann,DP (0,1))- (G GHC.AnnDollarDollar) -> tellKd (ann,DP (0,1))-#endif- (G GHC.AnnDotdot) -> tellKd (ann,DP (0,1))- (G GHC.AnnElse) -> tellKd (ann,DP (1,2))- (G GHC.AnnEqual) -> tellKd (ann,DP (0,1))- (G GHC.AnnExport) -> tellKd (ann,DP (0,1))- (G GHC.AnnFamily) -> tellKd (ann,DP (0,1))- (G GHC.AnnForall) -> tellKd (ann,DP (0,1))- (G GHC.AnnGroup) -> tellKd (ann,DP (0,1))- (G GHC.AnnHiding) -> tellKd (ann,DP (0,1))- (G GHC.AnnIf) -> tellKd (ann,DP (0,1))- (G GHC.AnnImport) -> tellKd (ann,DP (0,1))- (G GHC.AnnIn) -> tellKd (ann,DP (1,0))- (G GHC.AnnInstance) -> tellKd (ann,DP (0,1))- (G GHC.AnnLam) -> tellKd (ann,DP (0,1))- (G GHC.AnnLet) -> tellKd (ann,DP (0,1))-#if __GLASGOW_HASKELL__ >= 900- -- (G GHC.AnnLolly) -> tellKd (ann,DP (0,1))- (G GHC.AnnLollyU) -> tellKd (ann,DP (0,1))- (G GHC.AnnPercentOne) -> tellKd (ann,DP (0,1))- (G GHC.AnnPercent) -> tellKd (ann,DP (0,1))-#endif- (G GHC.AnnMinus) -> tellKd (ann,DP (0,1)) -- need to separate from preceding operator- (G GHC.AnnModule) -> tellKd (ann,DP (0,1))- (G GHC.AnnNewtype) -> tellKd (ann,DP (0,1))- (G GHC.AnnOf) -> tellKd (ann,DP (0,1))- (G GHC.AnnOpenC) -> tellKd (ann,DP (0,0))- (G GHC.AnnOpenP) -> tellKd (ann,DP (0,1))- (G GHC.AnnOpenS) -> tellKd (ann,DP (0,1))-#if __GLASGOW_HASKELL__ < 900- (G GHC.AnnOpenPE) -> tellKd (ann,DP (0,1))- (G GHC.AnnOpenPTE) -> tellKd (ann,DP (0,1))-#endif- (G GHC.AnnQualified) -> tellKd (ann,DP (0,1))- (G GHC.AnnRarrow) -> tellKd (ann,DP (0,1))-#if __GLASGOW_HASKELL__ > 710- (G GHC.AnnRarrowU) -> tellKd (ann,DP (0,1))-#endif- (G GHC.AnnRole) -> tellKd (ann,DP (0,1))- (G GHC.AnnSafe) -> tellKd (ann,DP (0,1))-#if __GLASGOW_HASKELL__ >= 806- (G GHC.AnnStock) -> tellKd (ann,DP (0,1))-#endif- (G GHC.AnnSimpleQuote) -> tellKd (ann,DP (0,1))-#if __GLASGOW_HASKELL__ < 900- (G GHC.AnnThIdSplice) -> tellKd (ann,DP (0,1))- (G GHC.AnnThIdTySplice) -> tellKd (ann,DP (0,1))-#endif- (G GHC.AnnThTyQuote) -> tellKd (ann,DP (0,1))- (G GHC.AnnThen) -> tellKd (ann,DP (1,2))- (G GHC.AnnTilde) -> tellKd (ann,DP (0,1))- (G GHC.AnnType) -> tellKd (ann,DP (0,1))- (G GHC.AnnUsing) -> tellKd (ann,DP (0,1))- (G GHC.AnnVal) -> tellKd (ann,DP (0,1))- (G GHC.AnnValStr) -> tellKd (ann,DP (0,1))- (G GHC.AnnVbar) -> tellKd (ann,DP (0,1))-#if __GLASGOW_HASKELL__ >= 806- (G GHC.AnnVia) -> tellKd (ann,DP (0,1))-#endif- (G GHC.AnnWhere) -> tellKd (ann,DP (1,2))-#if __GLASGOW_HASKELL__ >= 800- AnnTypeApp -> tellKd (ann,DP (0,1))-#endif- _ -> tellKd (ann,DP (0,0))- fromNoPrecedingSpace (tellKd (ann,DP (0,0))) dp---- -----------------------------------------------------------------------#if __GLASGOW_HASKELL__ >= 800-addPrettyAnnotationsInstead :: GHC.AnnKeywordId -> KeywordId -> Pretty ()-addPrettyAnnotationsInstead _akwid AnnSemiSep = return ()-addPrettyAnnotationsInstead _akwid kwid = addPrettyAnnotation kwid-#endif---- -----------------------------------------------------------------------addPrettyAnnotationsOutside :: GHC.AnnKeywordId -> KeywordId -> Pretty ()-addPrettyAnnotationsOutside _akwid AnnSemiSep = return ()-addPrettyAnnotationsOutside _akwid kwid = addPrettyAnnotation kwid---- -----------------------------------------------------------------------addPrettyAnnotationsInside :: GHC.AnnKeywordId -> Pretty ()-addPrettyAnnotationsInside _ann = return ()---- -----------------------------------------------------------------------addPrettyAnnotationLs :: GHC.AnnKeywordId -> Int -> Pretty ()-addPrettyAnnotationLs ann _off = addPrettyAnnotation (G ann)---- -----------------------------------------------------------------------#if __GLASGOW_HASKELL__ <= 710-getUnallocatedComments :: Pretty [Comment]-getUnallocatedComments = gets apComments--putUnallocatedComments :: [Comment] -> Pretty ()-putUnallocatedComments cs = modify (\s -> s { apComments = cs } )-#endif---- -----------------------------------------------------------------------#if (__GLASGOW_HASKELL__ > 806) && (__GLASGOW_HASKELL__ < 900)-withSrcSpanPretty :: (Data (GHC.SrcSpanLess a), GHC.HasSrcSpan a) => a -> Pretty b -> Pretty b-withSrcSpanPretty (GHC.dL->GHC.L l a) action = do-#else-withSrcSpanPretty :: Data a => GHC.Located a -> Pretty b -> Pretty b-withSrcSpanPretty (GHC.L l a) action = do-#endif- -- peek into the current state of the output, to extract the layout context- -- flags passed up from subelements of the AST.- (_,w) <- listen (return () :: Pretty ())-- _ <- debugP ("withSrcSpanPretty: prLayoutContext w=" ++ show (prLayoutContext w) ) (return ())-- local (\s -> s { curSrcSpan = l- , annConName = annGetConstr a- -- , prContext = pushAcs (prContext s)- , prContext = (pushAcs (prContext s)) <> (prLayoutContext w)- })- action---- ------------------------------------------------------------------------- | Enter a new AST element. Maintain SrcSpan stack-#if (__GLASGOW_HASKELL__ > 806) && (__GLASGOW_HASKELL__ < 900)-withAST :: (Data a, Data (GHC.SrcSpanLess a), GHC.HasSrcSpan a)- => a- -> Pretty b -> Pretty b-withAST lss@(GHC.dL->GHC.L ss t) action = do-#else-withAST :: Data a- => GHC.Located a- -> Pretty b -> Pretty b-withAST lss@(GHC.L ss t) action = do-#endif- return () `debug` ("Pretty.withAST:enter 1:(ss)=" ++ showGhc (ss,showConstr (toConstr t)))- -- Calculate offset required to get to the start of the SrcSPan- -- off <- gets apLayoutStart- withSrcSpanPretty lss $ do- return () `debug` ("Pretty.withAST:enter:(ss)=" ++ showGhc (ss,showConstr (toConstr t)))-- let maskWriter s = s { annKds = []- , sortKeys = Nothing- , dwCapturedSpan = mempty- -- , prLayoutContext = pushAcs (prLayoutContext s)- }--#if __GLASGOW_HASKELL__ <= 710- let spanStart = ss2pos ss- cs <- do- if GHC.isGoodSrcSpan ss- then- commentAllocation (priorComment spanStart) return- else- return []-#else- let cs = []-#endif-- -- ctx <- debugP ("Pretty.withAST:cs:(ss,cs,uncs)=" ++ showGhc (ss,cs,uncs)) $ asks prContext- ctx <- asks prContext-- noPrec <- gets apNoPrecedingSpace- 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 = debugP ("Pretty.withAST:edp:(ss,constr,edp)=" ++ showGhc (ss,showConstr (toConstr t),edp)) ctx- -- (res, w) <- if inAcs (Set.fromList [ListItem,TopLevel]) ctx1- (res, w) <- if inAcs (Set.fromList [ListItem,TopLevel,InTypeApp]) ctx1- then- -- debugP ("Pretty.withAST:setNoPrecedingSpace") $- censor maskWriter (listen (setNoPrecedingSpace action))- else- -- debugP ("Pretty.withAST:setNoPrecedingSpace") $- censor maskWriter (listen action)-- let kds = annKds w- an = Ann- { annEntryDelta = edp- , annPriorComments = cs- , annFollowingComments = [] -- only used in Transform and Print- , annsDP = kds- , annSortKey = sortKeys w- , annCapturedSpan = getFirst $ dwCapturedSpan w- }-- addAnnotationsPretty an- `debug` ("Pretty.withAST:(annkey,an)=" ++ show (mkAnnKey lss,an))- return res---- -----------------------------------------------------------------------entryDpFor :: Typeable a => AstContextSet -> a -> Pretty DeltaPos-entryDpFor ctx a = (def `extQ` grhs) a- where- lineDefault = if inAcs (Set.singleton AdvanceLine) ctx- then 1 else 0- noAdvanceLine = inAcs (Set.singleton NoAdvanceLine) ctx &&- inAcs (Set.singleton ListStart) ctx-- def :: a -> Pretty DeltaPos- def _ =- debugP ("entryDpFor:(topLevel,listStart,inList,noAdvanceLine,ctx)=" ++ show (topLevel,listStart,inList,noAdvanceLine,ctx)) $- if noAdvanceLine- then (if inTypeApp then return (DP (0,0)) else return (DP (0,1)))- -- then (if inTypeApp then error "inTypeAp" else return (DP (0,1)))- else- if listStart- then return (DP (1,2))- else if inList- then if topLevel then return (DP (2,0)) else return (DP (1,0))- else if topLevel then return (DP (2,0)) else return (DP (lineDefault,0))-- topLevel = inAcs (Set.singleton TopLevel) ctx- listStart = inAcs (Set.singleton ListStart) ctx- && not (inAcs (Set.singleton TopLevel) ctx)- inList = inAcs (Set.singleton ListItem) ctx- inLambda = inAcs (Set.singleton LambdaExpr) ctx- inTypeApp = inAcs (Set.singleton InTypeApp) ctx-- grhs :: GHC.GRHS GHC.RdrName (GHC.LHsExpr GHC.RdrName) -> Pretty DeltaPos- grhs _ = do- if inLambda- then return (DP (0,1))- else return (DP (1,2))---- -----------------------------------------------------------------------fromNoPrecedingSpace :: Pretty a -> Pretty a -> Pretty a-fromNoPrecedingSpace def lay = do- PrettyState{apNoPrecedingSpace} <- get- -- ctx <- asks prContext- if apNoPrecedingSpace- then do- modify (\s -> s { apNoPrecedingSpace = False- })- debugP ("fromNoPrecedingSpace:def") def- -- def- else- -- lay- debugP ("fromNoPrecedingSpace:lay") lay----- ------------------------------------------------------------------------- |Add some annotation to the currently active SrcSpan-addAnnotationsPretty :: Annotation -> Pretty ()-addAnnotationsPretty ann = do- l <- ask- return () `debug` ("addAnnotationsPretty:=" ++ showGhc (curSrcSpan l,prContext l))- tellFinalAnn (getAnnKey l,ann)--getAnnKey :: PrettyOptions -> AnnKey-getAnnKey PrettyOptions {curSrcSpan, annConName}- = AnnKey (rs curSrcSpan) annConName---- -----------------------------------------------------------------------countAnnsPretty :: GHC.AnnKeywordId -> Pretty Int-countAnnsPretty _ann = return 0---- -----------------------------------------------------------------------withSortKey :: [(AnnSpan, Annotated b)] -> Pretty ()-withSortKey kws =- let order = sortBy (comparing fst) kws- in do- tellSortKey (map fst order)- mapM_ (prettyInterpret . snd) order--withSortKeyContexts :: ListContexts -> [(AnnSpan, Annotated ())] -> Pretty ()-withSortKeyContexts ctxts kws =- let order = sortBy (comparing fst) kws- in do- tellSortKey (map fst order)- withSortKeyContextsHelper prettyInterpret ctxts order---- -----------------------------------------------------------------------storeOriginalSrcSpanPretty :: GHC.SrcSpan -> AnnKey -> Pretty AnnKey-storeOriginalSrcSpanPretty _s key = do- tellCapturedSpan key- return key---- -----------------------------------------------------------------------getSrcSpanForKw :: GHC.SrcSpan -> GHC.AnnKeywordId -> Pretty GHC.SrcSpan-getSrcSpanForKw ss _kw = return ss---- -----------------------------------------------------------------------#if __GLASGOW_HASKELL__ <= 710-storeString :: String -> GHC.SrcSpan -> Pretty ()-storeString s _ss = addPrettyAnnotation (AnnString s)-#endif---- -----------------------------------------------------------------------setLayoutFlag :: Pretty () -> Pretty ()-setLayoutFlag action = do- oldLay <- gets apLayoutStart- modify (\s -> s { apMarkLayout = True } )- let reset = modify (\s -> s { apMarkLayout = False- , apLayoutStart = oldLay })- action <* reset---- -----------------------------------------------------------------------setNoPrecedingSpace :: Pretty a -> Pretty a-setNoPrecedingSpace action = do- oldVal <- gets apNoPrecedingSpace- modify (\s -> s { apNoPrecedingSpace = True } )- let reset = modify (\s -> s { apNoPrecedingSpace = oldVal })- action <* reset---- -----------------------------------------------------------------------setContextPretty :: Set.Set AstContext -> Int -> Pretty () -> Pretty ()-setContextPretty ctxt lvl =- local (\s -> s { prContext = setAcsWithLevel ctxt lvl (prContext s) } )--unsetContextPretty :: AstContext -> Pretty () -> Pretty ()-unsetContextPretty ctxt =- local (\s -> s { prContext = unsetAcs ctxt (prContext s) } )---ifInContextPretty :: Set.Set AstContext -> Annotated () -> Annotated () -> Pretty ()-ifInContextPretty ctxt ifAction elseAction = do- cur <- asks prContext- let inContext = inAcs ctxt cur- if inContext- then prettyInterpret ifAction- else prettyInterpret elseAction---- -----------------------------------------------------------------------annotationsToCommentsPretty :: [GHC.AnnKeywordId] -> Pretty ()-annotationsToCommentsPretty _kws = return ()---- -----------------------------------------------------------------------#if __GLASGOW_HASKELL__ <= 710-annotationsToCommentsBFPretty :: (GHC.Outputable a) => GHC.BooleanFormula (GHC.Located a) -> [GHC.AnnKeywordId] -> Pretty ()-annotationsToCommentsBFPretty bf _kws = do- -- cs <- gets apComments- cs <- 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- newComments = map (uncurry mkKWComment ) kws- putUnallocatedComments (cs ++ newComments)---finalizeBFPretty :: GHC.SrcSpan -> Pretty ()-finalizeBFPretty _ss = do- commentAllocation (const True) (mapM_ (uncurry addPrettyComment))- return ()-#endif---- ----------------------------------------------------------------------#if __GLASGOW_HASKELL__ <= 710--- |Split the ordered list of comments into ones that occur prior to--- the give SrcSpan and the rest-priorComment :: Pos -> Comment -> Bool-priorComment start c = (ss2pos . commentIdentifier $ c) < start---- TODO:AZ: We scan the entire comment list here. It may be better to impose an--- invariant that the comments are sorted, and consume them as the pos--- advances. It then becomes a process of using `takeWhile p` rather than a full--- partition.-allocateComments :: (Comment -> Bool) -> [Comment] -> ([Comment], [Comment])-allocateComments = partition-#endif---- -----------------------------------------------------------------------#if __GLASGOW_HASKELL__ <= 710-commentAllocation :: (Comment -> Bool)- -> ([(Comment, DeltaPos)] -> Pretty a)- -> Pretty a-commentAllocation p k = do- cs <- getUnallocatedComments- let (allocated,cs') = allocateComments p cs- putUnallocatedComments cs'- k =<< mapM makeDeltaComment (sortBy (comparing commentIdentifier) allocated)--makeDeltaComment :: Comment -> Pretty (Comment, DeltaPos)-makeDeltaComment c = do- return (c, DP (0,1))--addPrettyComment :: Comment -> DeltaPos -> Pretty ()-addPrettyComment d p = do- tellKd (AnnComment d, p)-#endif---- ------------------------------------------------------------------------- Writer helpers--tellFinalAnn :: (AnnKey, Annotation) -> Pretty ()-tellFinalAnn (k, v) =- tell (mempty { dwAnns = Endo (Map.insert k v) })--tellCapturedSpan :: AnnKey -> Pretty ()-tellCapturedSpan key = tell ( mempty { dwCapturedSpan = First $ Just key })--tellKd :: (KeywordId, DeltaPos) -> Pretty ()-tellKd kd = tell (mempty { annKds = [kd] })--tellSortKey :: [AnnSpan] -> Pretty ()-tellSortKey xs = tell (mempty { sortKeys = Just xs } )--tellContext :: Set.Set AstContext -> Pretty ()-tellContext lc = tell (mempty { prLayoutContext = setAcsWithLevel lc 2 mempty} )
− src/Language/Haskell/GHC/ExactPrint/Print.hs
@@ -1,572 +0,0 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE MultiWayIf #-}-{-# LANGUAGE NamedFieldPuns #-}-{-# LANGUAGE RankNTypes #-}-{-# LANGUAGE RecordWildCards #-}-{-# LANGUAGE ScopedTypeVariables #-}---------------------------------------------------------------------------------- |--- Module : Language.Haskell.GHC.ExactPrint.Print------ This module inverts the process performed by "Delta". Given 'Anns' and--- a corresponding AST we produce a source file based on this information.----------------------------------------------------------------------------------module Language.Haskell.GHC.ExactPrint.Print- (- exactPrint- , exactPrintWithOptions-- -- * Configuration- , PrintOptions(epRigidity, epAstPrint, epTokenPrint, epWhitespacePrint)- , stringOptions- , printOptions-- ) where--import Language.Haskell.GHC.ExactPrint.Types-import Language.Haskell.GHC.ExactPrint.Utils-import Language.Haskell.GHC.ExactPrint.Annotate-import Language.Haskell.GHC.ExactPrint.Lookup--import Control.Monad.Identity-import Control.Monad.RWS-import Control.Monad.Trans.Free-import Data.Data (Data)-import Data.List (sortBy, elemIndex)-import Data.Maybe (fromMaybe)-import Data.Ord (comparing)--import qualified Data.Set as Set--import qualified GHC--{-# ANN module "HLint: ignore Eta reduce" #-}-{-# ANN module "HLint: ignore Redundant do" #-}-{-# ANN module "HLint: ignore Reduce duplication" #-}--- ------------------------------------------------------------------------ Printing of source elements---- | Print an AST with a map of potential modified `Anns`. The usual way to--- generate such a map is by using one of the parsers in--- "Language.Haskell.GHC.ExactPrint.Parsers".-exactPrint :: Annotate ast- => GHC.Located ast- -> Anns- -> String-exactPrint ast as = runIdentity (exactPrintWithOptions stringOptions ast as)---- | The additional option to specify the rigidity and printing--- configuration.-exactPrintWithOptions :: (Annotate ast, Monoid b, Monad m)- => PrintOptions m b- -> GHC.Located ast- -> Anns- -> m b-exactPrintWithOptions r ast as =- runEP r (annotate ast) as----------------------------------------------------------- The EP monad and basic combinators--data PrintOptions m a = PrintOptions- {- epAnn :: !Annotation-#if (__GLASGOW_HASKELL__ > 806) && (__GLASGOW_HASKELL__ < 900)- , epAstPrint :: forall ast . (Data ast, GHC.HasSrcSpan ast) => ast -> a -> m a-#else- , epAstPrint :: forall ast . Data ast => GHC.Located ast -> a -> m a-#endif- , epTokenPrint :: String -> m a- , epWhitespacePrint :: String -> m a- , epRigidity :: Rigidity- , epContext :: !AstContextSet- }---- | Helper to create a 'PrintOptions'-printOptions ::-#if (__GLASGOW_HASKELL__ > 806) && (__GLASGOW_HASKELL__ < 900)- (forall ast . (Data ast, GHC.HasSrcSpan ast) => ast -> a -> m a)-#else- (forall ast . Data ast => GHC.Located ast -> a -> m a)-#endif- -> (String -> m a)- -> (String -> m a)- -> Rigidity- -> PrintOptions m a-printOptions astPrint tokenPrint wsPrint rigidity = PrintOptions- {- epAnn = annNone- , epAstPrint = astPrint- , epWhitespacePrint = wsPrint- , epTokenPrint = tokenPrint- , epRigidity = rigidity- , epContext = defaultACS- }---- | Options which can be used to print as a normal String.-stringOptions :: PrintOptions Identity String-stringOptions = printOptions (\_ b -> return b) return return NormalLayout--data EPWriter a = EPWriter- { output :: !a }--#if __GLASGOW_HASKELL__ >= 804-instance Monoid w => Semigroup (EPWriter w) where- (<>) = mappend-#endif--instance Monoid w => Monoid (EPWriter w) where- mempty = EPWriter mempty- (EPWriter a) `mappend` (EPWriter b) = EPWriter (a <> b)--data EPState = EPState- { epPos :: !Pos -- ^ Current output position- , epAnns :: !Anns- , epAnnKds :: ![[(KeywordId, DeltaPos)]] -- MP: Could this be moved to the local statE w mith suitable refactoring?- , epMarkLayout :: Bool- , epLHS :: LayoutStartCol- }-------------------------------------------------------------type EP w m a = RWST (PrintOptions m w) (EPWriter w) EPState m a----runEP :: (Monad m, Monoid a)- => PrintOptions m a- -> Annotated () -> Anns -> m a-runEP epReader action ans =- fmap (output . snd) .- (\next -> execRWST next epReader- (defaultEPState ans))- . printInterpret $ action---- -----------------------------------------------------------------------defaultEPState :: Anns -> EPState-defaultEPState as = EPState- { epPos = (1,1)- , epAnns = as- , epAnnKds = []- , epLHS = 1- , epMarkLayout = False- }----- -----------------------------------------------------------------------printInterpret :: forall w m a . (Monad m, Monoid w)- => Annotated a -> EP w m a-printInterpret m = iterTM go (hoistFreeT (return . runIdentity) m)- where- go :: AnnotationF (EP w m a) -> EP w m a- go (MarkEOF next) =-#if __GLASGOW_HASKELL__ >= 900- printStringAtMaybeAnn AnnEofPos (Just "") >> next-#else- printStringAtMaybeAnn (G GHC.AnnEofPos) (Just "") >> next-#endif- go (MarkPrim kwid mstr next) =- markPrim (G kwid) mstr >> next- go (MarkPPOptional kwid mstr next) =- markPrim (G kwid) mstr >> next-#if __GLASGOW_HASKELL__ >= 800- go (MarkInstead _ kwid next) =- printStringAtMaybeAnnAll kwid Nothing >> next-#endif- go (MarkOutside _ kwid next) =- printStringAtMaybeAnnAll kwid Nothing >> next- go (MarkInside akwid next) =- allAnns akwid >> next- go (MarkMany akwid next) =- allAnns akwid >> next- go (MarkManyOptional akwid next) =- allAnns akwid >> next- go (MarkOffsetPrim kwid _ mstr next) =- printStringAtMaybeAnn (G kwid) mstr >> next- go (MarkOffsetPrimOptional kwid _ mstr next) =- printStringAtMaybeAnn (G kwid) mstr >> next- go (WithAST lss action next) =- exactPC lss (printInterpret action) >> next- go (CountAnns kwid next) =- countAnnsEP (G kwid) >>= next- go (SetLayoutFlag r action next) = do- rigidity <- asks epRigidity- (if r <= rigidity then setLayout else id) (printInterpret action)- next-- go (MarkAnnBeforeAnn ann1 ann2 next) = printMarkAnnBeforeAnn (G ann1) (G ann2) >> next- go (MarkExternal _ akwid s next) =- printStringAtMaybeAnn (G akwid) (Just s) >> next- go (StoreOriginalSrcSpan _ _ next) = storeOriginalSrcSpanPrint >>= next- go (GetSrcSpanForKw _ _ next) = return GHC.noSrcSpan >>= next-#if __GLASGOW_HASKELL__ <= 710- go (StoreString _ _ next) =- printStoredString >> next-#endif- go (AnnotationsToComments _ next) = next-#if __GLASGOW_HASKELL__ <= 710- go (AnnotationsToCommentsBF _ _ next) = next- go (FinalizeBF _ next) = next-#endif- go (WithSortKey ks next) = withSortKey ks >> next- go (WithSortKeyContexts ctx ks next) = withSortKeyContexts ctx ks >> next-- go (SetContextLevel ctxt lvl action next) = setContextPrint ctxt lvl (printInterpret action) >> next- go (UnsetContext _ctxt action next) = printInterpret action >> next- go (IfInContext ctxt ifAction elseAction next) = ifInContextPrint ctxt ifAction elseAction >> next- go (TellContext _ next) = next-----------------------------------------------------------------------------storeOriginalSrcSpanPrint :: (Monad m, Monoid w) => EP w m AnnKey-storeOriginalSrcSpanPrint = do- Ann{..} <- asks epAnn- case annCapturedSpan of- Nothing -> error "Missing captured SrcSpan"- Just v -> return v--#if __GLASGOW_HASKELL__ <= 710-printStoredString :: (Monad m, Monoid w) => EP w m ()-printStoredString = do- kd <- gets epAnnKds-- let- isAnnString (AnnString _,_) = True- isAnnString _ = False-- case filter isAnnString (ghead "printStoredString" kd) of- ((AnnString ss,_):_) -> printStringAtMaybeAnn (AnnString ss) (Just ss)- _ -> return ()-#endif--withSortKey :: (Monad m, Monoid w) => [(AnnSpan, Annotated ())] -> EP w m ()-withSortKey xs = do- Ann{..} <- asks epAnn- let ordered = case annSortKey of- Nothing -> xs- Just keys -> orderByKey xs keys- `debug` ("withSortKey:" ++- showGhc (map fst (sortBy (comparing (flip elemIndex keys . fst)) xs),- map fst xs,- keys)- )- mapM_ (printInterpret . snd) ordered--withSortKeyContexts :: (Monad m, Monoid w) => ListContexts -> [(AnnSpan, Annotated ())] -> EP w m ()-withSortKeyContexts ctxts xs = do- Ann{..} <- asks epAnn- let ordered = case annSortKey of- Nothing -> xs- Just keys -> orderByKey xs keys- `debug` ("withSortKey:" ++- showGhc (map fst (sortBy (comparing (flip elemIndex keys . fst)) xs),- map fst xs,- keys)- )- -- mapM_ printInterpret ordered- withSortKeyContextsHelper printInterpret ctxts ordered---- -----------------------------------------------------------------------setContextPrint :: (Monad m, Monoid w) => Set.Set AstContext -> Int -> EP w m () -> EP w m ()-setContextPrint ctxt lvl =- local (\s -> s { epContext = setAcsWithLevel ctxt lvl (epContext s) } )--ifInContextPrint :: (Monad m, Monoid w) => Set.Set AstContext -> Annotated () -> Annotated () -> EP w m ()-ifInContextPrint ctxt ifAction elseAction = do- cur <- asks epContext- let inContext = inAcs ctxt cur- if inContext- then printInterpret ifAction- else printInterpret elseAction---- -----------------------------------------------------------------------allAnns :: (Monad m, Monoid w) => GHC.AnnKeywordId -> EP w m ()-allAnns kwid = printStringAtMaybeAnnAll (G kwid) Nothing------------------------------------------------------------------------------ |First move to the given location, then call exactP--- exactPC :: (Data ast, Monad m, Monoid w) => GHC.Located ast -> EP w m a -> EP w m a--- exactPC :: (Data ast, Data (GHC.SrcSpanLess ast), GHC.HasSrcSpan ast, Monad m, Monoid w)-#if (__GLASGOW_HASKELL__ > 806) && (__GLASGOW_HASKELL__ < 900)-exactPC :: (Data ast, Data (GHC.SrcSpanLess ast), GHC.HasSrcSpan ast, Monad m, Monoid w)- => ast -> EP w m a -> EP w m a-#else-exactPC :: (Data ast, Monad m, Monoid w) => GHC.Located ast -> EP w m a -> EP w m a-#endif-exactPC ast action =- do- return () `debug` ("exactPC entered for:" ++ show (mkAnnKey ast))- ma <- getAndRemoveAnnotation ast- let an@Ann{ annEntryDelta=edp- , annPriorComments=comments- , annFollowingComments=fcomments- , annsDP=kds- } = fromMaybe annNone ma- PrintOptions{epAstPrint} <- ask- r <- withContext kds an- (mapM_ (uncurry printQueuedComment) comments- >> advance edp- >> censorM (epAstPrint ast) action- <* mapM_ (uncurry printQueuedComment) fcomments)- return r `debug` ("leaving exactPCfor:" ++ show (mkAnnKey ast))--censorM :: (Monoid w, Monad m) => (w -> m w) -> EP w m a -> EP w m a-censorM f m = passM (liftM (\x -> (x,f)) m)--passM :: (Monad m) => EP w m (a, w -> m w) -> EP w m a-passM m = RWST $ \r s -> do- ~((a, f),s', EPWriter w) <- runRWST m r s- w' <- f w- return (a, s', EPWriter w')--advance :: (Monad m, Monoid w) => DeltaPos -> EP w m ()-advance cl = do- p <- getPos- colOffset <- getLayoutOffset- printWhitespace (undelta p cl colOffset)--#if (__GLASGOW_HASKELL__ > 806) && (__GLASGOW_HASKELL__ < 900)-getAndRemoveAnnotation :: (Monad m, Monoid w, Data a, Data (GHC.SrcSpanLess a), GHC.HasSrcSpan a)- => a -> EP w m (Maybe Annotation)-#else-getAndRemoveAnnotation :: (Monad m, Monoid w, Data a) => GHC.Located a -> EP w m (Maybe Annotation)-#endif-getAndRemoveAnnotation a = gets (getAnnotationEP a . epAnns)--markPrim :: (Monad m, Monoid w) => KeywordId -> Maybe String -> EP w m ()-markPrim kwid mstr =- printStringAtMaybeAnn kwid mstr--withContext :: (Monad m, Monoid w)- => [(KeywordId, DeltaPos)]- -> Annotation- -> EP w m a -> EP w m a-withContext kds an x = withKds kds (withOffset an x)---- --------------------------------------------------------------------------- | Given an annotation associated with a specific SrcSpan, determines a new offset relative to the previous--- offset----withOffset :: (Monad m, Monoid w) => Annotation -> (EP w m a -> EP w m a)-withOffset a =- local (\s -> s { epAnn = a, epContext = pushAcs (epContext s) })----- --------------------------------------------------------------------------- Necessary as there are destructive gets of Kds across scopes-withKds :: (Monad m, Monoid w) => [(KeywordId, DeltaPos)] -> EP w m a -> EP w m a-withKds kd action = do- modify (\s -> s { epAnnKds = kd : epAnnKds s })- r <- action- modify (\s -> s { epAnnKds = tail (epAnnKds s) })- return r----------------------------------------------------------------------------setLayout :: (Monad m, Monoid w) => EP w m () -> EP w m ()-setLayout k = do- oldLHS <- gets epLHS- modify (\a -> a { epMarkLayout = True } )- let reset = modify (\a -> a { epMarkLayout = False- , epLHS = oldLHS } )- k <* reset--getPos :: (Monad m, Monoid w) => EP w m Pos-getPos = gets epPos--setPos :: (Monad m, Monoid w) => Pos -> EP w m ()-setPos l = modify (\s -> s {epPos = l})---- |Get the current column offset-getLayoutOffset :: (Monad m, Monoid w) => EP w m LayoutStartCol-getLayoutOffset = gets epLHS---- ------------------------------------------------------------------------- |If the first annotation has a smaller SrcSpan than the second, then mark it.--- In the printer this means the first appearing before the second in the list--- of annotations remaining-printMarkAnnBeforeAnn :: (Monad m, Monoid w) => KeywordId -> KeywordId -> EP w m ()-printMarkAnnBeforeAnn annBefore annAfter = do- kd <- gets epAnnKds- case kd of- [] -> return () -- Should never be triggered- (k:_kds) -> do- -- find the first ann, then the second. If found in that order, annotate.- let find a = (\(kw,_) -> kw == a)- case break (find annBefore) k of- (_,[]) -> return () -- annBefore not present- (_,rest) -> if null (snd $ break (find annAfter) rest)- then return ()- else markPrim annBefore (Nothing)---- -----------------------------------------------------------------------printStringAtMaybeAnn :: (Monad m, Monoid w) => KeywordId -> Maybe String -> EP w m ()-printStringAtMaybeAnn an mstr = printStringAtMaybeAnnThen an mstr (return ())--printStringAtMaybeAnnAll :: (Monad m, Monoid w) => KeywordId -> Maybe String -> EP w m ()-printStringAtMaybeAnnAll an mstr = go- where- go = printStringAtMaybeAnnThen an mstr go--printStringAtMaybeAnnThen :: (Monad m, Monoid w) => KeywordId -> Maybe String -> EP w m () -> EP w m ()-printStringAtMaybeAnnThen an mstr next = do- let str = fromMaybe (keywordToString an) mstr- annFinal <- getAnnFinal an- case (annFinal, an) of-#if __GLASGOW_HASKELL__ <= 710- -- Could be unicode syntax- -- TODO: This is a bit fishy, refactor- (Nothing, G kw) -> do- res <- getAnnFinal (AnnUnicode kw)- return () `debug` ("printStringAtMaybeAnn:missed:Unicode:(an,res)" ++ show (an,res))- unless (null res) $ do- forM_- res- (\(comments, ma) -> printStringAtLsDelta comments ma (unicodeString (G kw)))- next-#else- -- Could be unicode syntax- -- TODO: This is a bit fishy, refactor- (Nothing, G kw') -> do- let kw = GHC.unicodeAnn kw'- let str' = fromMaybe (keywordToString (G kw)) mstr- res <- getAnnFinal (G kw)- return () `debug` ("printStringAtMaybeAnn:missed:Unicode:(an,res)" ++ show (an,res))- unless (null res) $ do- forM_- res- (\(comments, ma) -> printStringAtLsDelta comments ma str')- next-#endif- (Just (comments, ma),_) -> printStringAtLsDelta comments ma str >> next- (Nothing, _) -> return () `debug` ("printStringAtMaybeAnn:missed:(an)" ++ show an)- -- Note: do not call next, nothing to chain- -- ++AZ++: Enabling the following line causes a very weird error associated with AnnPackageName. I suspect it is because it is forcing the evaluation of a non-existent an or str- -- `debug` ("printStringAtMaybeAnn:(an,ma,str)=" ++ show (an,ma,str))---- ------------------------------------------------------------------------- |destructive get, hence use an annotation once only-getAnnFinal :: (Monad m, Monoid w) => KeywordId -> EP w m (Maybe ([(Comment, DeltaPos)], DeltaPos))-getAnnFinal kw = do- kd <- gets epAnnKds- case kd of- [] -> return Nothing -- Should never be triggered- (k:kds) -> do- let (res, kd') = destructiveGetFirst kw ([],k)- modify (\s -> s { epAnnKds = kd' : kds })- return res---- | Get and remove the first item in the (k,v) list for which the k matches.--- Return the value, together with any comments skipped over to get there.-destructiveGetFirst :: KeywordId- -> ([(KeywordId, v)],[(KeywordId,v)])- -> (Maybe ([(Comment, v)], v),[(KeywordId,v)])-destructiveGetFirst _key (acc,[]) = (Nothing, acc)-destructiveGetFirst key (acc, (k,v):kvs )- | k == key = (Just (skippedComments, v), others ++ kvs)- | otherwise = destructiveGetFirst key (acc ++ [(k,v)], kvs)- where- (skippedComments, others) = foldr comments ([], []) acc- comments (AnnComment comment , dp ) (cs, kws) = ((comment, dp) : cs, kws)- comments kw (cs, kws) = (cs, kw : kws)----- ------------------------------------------------------------------------- |This should be the final point where things are mode concrete,--- before output. Hence the point where comments can be inserted-printStringAtLsDelta :: (Monad m, Monoid w) => [(Comment, DeltaPos)] -> DeltaPos -> String -> EP w m ()-printStringAtLsDelta cs cl s = do- p <- getPos- colOffset <- getLayoutOffset- if isGoodDeltaWithOffset cl colOffset- then do- mapM_ (uncurry printQueuedComment) cs- printStringAt (undelta p cl colOffset) s- `debug` ("printStringAtLsDelta:(pos,s):" ++ show (undelta p cl colOffset,s))- else return () `debug` ("printStringAtLsDelta:bad delta for (mc,s):" ++ show (cl,s))---isGoodDeltaWithOffset :: DeltaPos -> LayoutStartCol -> Bool-isGoodDeltaWithOffset dp colOffset = isGoodDelta (DP (undelta (0,0) dp colOffset))--printQueuedComment :: (Monad m, Monoid w) => Comment -> DeltaPos -> EP w m ()-printQueuedComment Comment{commentContents} dp = do- p <- getPos- colOffset <- getLayoutOffset- let (dr,dc) = undelta (0,0) dp colOffset- -- do not lose comments against the left margin- when (isGoodDelta (DP (dr,max 0 dc))) $- printCommentAt (undelta p dp colOffset) commentContents---- ------------------------------------------------------------------------- |non-destructive get-peekAnnFinal :: (Monad m, Monoid w) => KeywordId -> EP w m (Maybe DeltaPos)-peekAnnFinal kw = do- (r, _) <- (\kd -> destructiveGetFirst kw ([], kd)) <$> gets (ghead "peekAnnFinal" . epAnnKds)- return (snd <$> r)--countAnnsEP :: (Monad m, Monoid w) => KeywordId -> EP w m Int-countAnnsEP an = length <$> peekAnnFinal an---- -------------------------------------------------------------------------- ------------------------------------------------------------------------ Printing functions--printString :: (Monad m, Monoid w) => Bool -> String -> EP w m ()-printString layout str = do- EPState{epPos = (_,c), epMarkLayout} <- get- PrintOptions{epTokenPrint, epWhitespacePrint} <- ask- when (epMarkLayout && layout) $- modify (\s -> s { epLHS = LayoutStartCol c, epMarkLayout = False } )-- -- Advance position, taking care of any newlines in the string- let strDP@(DP (cr,_cc)) = dpFromString str- p <- getPos- colOffset <- getLayoutOffset- if cr == 0- then setPos (undelta p strDP colOffset)- else setPos (undelta p strDP 1)-- --- if not layout && c == 0- then lift (epWhitespacePrint str) >>= \s -> tell EPWriter { output = s}- else lift (epTokenPrint str) >>= \s -> tell EPWriter { output = s}---newLine :: (Monad m, Monoid w) => EP w m ()-newLine = do- (l,_) <- getPos- printString False "\n"- setPos (l+1,1)--padUntil :: (Monad m, Monoid w) => Pos -> EP w m ()-padUntil (l,c) = do- (l1,c1) <- getPos- if | l1 == l && c1 <= c -> printString False $ replicate (c - c1) ' '- | l1 < l -> newLine >> padUntil (l,c)- | otherwise -> return ()--printWhitespace :: (Monad m, Monoid w) => Pos -> EP w m ()-printWhitespace = padUntil--printCommentAt :: (Monad m, Monoid w) => Pos -> String -> EP w m ()-printCommentAt p str = printWhitespace p >> printString False str--printStringAt :: (Monad m, Monoid w) => Pos -> String -> EP w m ()-printStringAt p str = printWhitespace p >> printString True str
src/Language/Haskell/GHC/ExactPrint/Transform.hs view
@@ -1,1398 +1,1491 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE NamedFieldPuns #-}-{-# LANGUAGE RankNTypes #-}-{-# LANGUAGE RecordWildCards #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE ViewPatterns #-}--------------------------------------------------------------------------------- |--- Module : Language.Haskell.GHC.ExactPrint.Transform------ This module is currently under heavy development, and no promises are made--- about API stability. Use with care.------ We welcome any feedback / contributions on this, as it is the main point of--- the library.----------------------------------------------------------------------------------module Language.Haskell.GHC.ExactPrint.Transform- (- -- * The Transform Monad- Transform- , TransformT(..)- , hoistTransform- , runTransform- , runTransformT- , runTransformFrom- , runTransformFromT-- -- * Transform monad operations- , logTr- , logDataWithAnnsTr- , getAnnsT, putAnnsT, modifyAnnsT- , uniqueSrcSpanT-- , cloneT- , graftT-- , getEntryDPT- , setEntryDPT- , transferEntryDPT- , setPrecedingLinesDeclT- , setPrecedingLinesT- , addSimpleAnnT- , addTrailingCommaT- , removeTrailingCommaT-- -- ** Managing declarations, in Transform monad- , HasTransform (..)- , HasDecls (..)- , hasDeclsSybTransform- , hsDeclsGeneric- , hsDeclsPatBind, hsDeclsPatBindD- , replaceDeclsPatBind, replaceDeclsPatBindD- , modifyDeclsT- , modifyValD- -- *** Utility, does not manage layout- , hsDeclsValBinds, replaceDeclsValbinds-- -- ** Managing lists, Transform monad- , insertAtStart- , insertAtEnd- , insertAfter- , insertBefore-- -- *** Low level operations used in 'HasDecls'- , balanceComments- , balanceTrailingComments- , moveTrailingComments-- -- ** Managing lists, pure functions- , captureOrder- , captureOrderAnnKey-- -- * Operations- , isUniqueSrcSpan-- -- * Pure functions- , mergeAnns- , mergeAnnList- , setPrecedingLinesDecl- , setPrecedingLines- , getEntryDP- , setEntryDP- , transferEntryDP- , addTrailingComma- , wrapSig, wrapDecl- , decl2Sig, decl2Bind-- ) where--import Language.Haskell.GHC.ExactPrint.Types-import Language.Haskell.GHC.ExactPrint.Utils--import Control.Monad.RWS-import qualified Control.Monad.Fail as Fail--import qualified GHC as GHC hiding (parseModule)-#if __GLASGOW_HASKELL__ >= 900-import qualified GHC.Data.Bag as GHC-import qualified GHC.Data.FastString as GHC-#else-import qualified Bag as GHC-import qualified FastString as GHC-#endif--import qualified Data.Generics as SYB--import Data.Data-import Data.List-import Data.Maybe--import qualified Data.Map as Map--import Data.Functor.Identity-import Control.Monad.State-import Control.Monad.Writer---- import Debug.Trace----------------------------------------------------------------------------------- Transformation of source elements---- | Monad type for updating the AST and managing the annotations at the same--- time. The W state is used to generate logging information if required.-type Transform = TransformT Identity---- |Monad transformer version of 'Transform' monad-newtype TransformT m a = TransformT { unTransformT :: RWST () [String] (Anns,Int) m a }- deriving (Monad,Applicative,Functor- ,MonadReader ()- ,MonadWriter [String]- ,MonadState (Anns,Int)- ,MonadTrans- )--instance Fail.MonadFail m => Fail.MonadFail (TransformT m) where- fail msg = TransformT $ RWST $ \_ _ -> Fail.fail msg---- | Run a transformation in the 'Transform' monad, returning the updated--- annotations and any logging generated via 'logTr'-runTransform :: Anns -> Transform a -> (a,(Anns,Int),[String])-runTransform ans f = runTransformFrom 0 ans f--runTransformT :: Anns -> TransformT m a -> m (a,(Anns,Int),[String])-runTransformT ans f = runTransformFromT 0 ans f---- | Run a transformation in the 'Transform' monad, returning the updated--- annotations and any logging generated via 'logTr', allocating any new--- SrcSpans from the provided initial value.-runTransformFrom :: Int -> Anns -> Transform a -> (a,(Anns,Int),[String])-runTransformFrom seed ans f = runRWS (unTransformT f) () (ans,seed)---- |Run a monad transformer stack for the 'TransformT' monad transformer-runTransformFromT :: Int -> Anns -> TransformT m a -> m (a,(Anns,Int),[String])-runTransformFromT seed ans f = runRWST (unTransformT f) () (ans,seed)---- | Change inner monad of 'TransformT'.-hoistTransform :: (forall x. m x -> n x) -> TransformT m a -> TransformT n a-hoistTransform nt (TransformT m) = TransformT (mapRWST nt m)---- |Log a string to the output of the Monad-logTr :: (Monad m) => String -> TransformT m ()-logTr str = tell [str]---- |Log a representation of the given AST with annotations to the output of the--- Monad-logDataWithAnnsTr :: (Monad m) => (SYB.Data a) => String -> a -> TransformT m ()-logDataWithAnnsTr str ast = do- anns <- getAnnsT- logTr $ str ++ showAnnData anns 0 ast---- |Access the 'Anns' being modified in this transformation-getAnnsT :: (Monad m) => TransformT m Anns-getAnnsT = gets fst---- |Replace the 'Anns' after any changes-putAnnsT :: (Monad m) => Anns -> TransformT m ()-putAnnsT ans = do- (_,col) <- get- put (ans,col)---- |Change the stored 'Anns'-modifyAnnsT :: (Monad m) => (Anns -> Anns) -> TransformT m ()-modifyAnnsT f = do- ans <- getAnnsT- putAnnsT (f ans)---- ------------------------------------------------------------------------- |Once we have 'Anns', a 'GHC.SrcSpan' is used purely as part of an 'AnnKey'--- to index into the 'Anns'. If we need to add new elements to the AST, they--- need their own 'GHC.SrcSpan' for this.-uniqueSrcSpanT :: (Monad m) => TransformT m GHC.SrcSpan-uniqueSrcSpanT = do- (an,col) <- get- put (an,col + 1 )- let pos = GHC.mkSrcLoc (GHC.mkFastString "ghc-exactprint") (-1) col- return $ GHC.mkSrcSpan pos pos---- |Test whether a given 'GHC.SrcSpan' was generated by 'uniqueSrcSpanT'-isUniqueSrcSpan :: GHC.SrcSpan -> Bool-isUniqueSrcSpan ss = srcSpanStartLine ss == -1---- ------------------------------------------------------------------------ |Make a copy of an AST element, replacing the existing SrcSpans with new--- ones, and duplicating the matching annotations.-cloneT :: (Data a,Monad m) => a -> TransformT m (a, [(GHC.SrcSpan, GHC.SrcSpan)])-cloneT ast = do- runWriterT $ SYB.everywhereM (return `SYB.ext2M` replaceLocated) ast- where- replaceLocated :: forall loc a m. (Typeable loc,Data a,Monad m)- => (GHC.GenLocated loc a) -> WriterT [(GHC.SrcSpan, GHC.SrcSpan)] (TransformT m) (GHC.GenLocated loc a)- replaceLocated (GHC.L l t) = do- case cast l :: Maybe GHC.SrcSpan of- Just ss -> do- newSpan <- lift uniqueSrcSpanT- lift $ modifyAnnsT (\anns -> case Map.lookup (mkAnnKey (GHC.L ss t)) anns of- Nothing -> anns- Just an -> Map.insert (mkAnnKey (GHC.L newSpan t)) an anns)- tell [(ss, newSpan)]- return $ fromJust . cast $ GHC.L newSpan t- Nothing -> return (GHC.L l t)---- ------------------------------------------------------------------------ |Slightly more general form of cloneT-graftT :: (Data a,Monad m) => Anns -> a -> TransformT m a-graftT origAnns = SYB.everywhereM (return `SYB.ext2M` replaceLocated)- where- replaceLocated :: forall loc a m. (Typeable loc, Data a, Monad m)- => GHC.GenLocated loc a -> TransformT m (GHC.GenLocated loc a)- replaceLocated (GHC.L l t) = do- case cast l :: Maybe GHC.SrcSpan of- Just ss -> do- newSpan <- uniqueSrcSpanT- modifyAnnsT (\anns -> case Map.lookup (mkAnnKey (GHC.L ss t)) origAnns of- Nothing -> anns- Just an -> Map.insert (mkAnnKey (GHC.L newSpan t)) an anns)- return $ fromJust $ cast $ GHC.L newSpan t- Nothing -> return (GHC.L l t)---- ------------------------------------------------------------------------- |If a list has been re-ordered or had items added, capture the new order in--- the appropriate 'annSortKey' attached to the 'Annotation' for the first--- parameter.-captureOrder :: (Data a) => GHC.Located a -> [GHC.Located b] -> Anns -> Anns-captureOrder parent ls ans = captureOrderAnnKey (mkAnnKey parent) ls ans---- |If a list has been re-ordered or had items added, capture the new order in--- the appropriate 'annSortKey' item of the supplied 'AnnKey'-captureOrderAnnKey :: AnnKey -> [GHC.Located b] -> Anns -> Anns-captureOrderAnnKey parentKey ls ans = ans'- where- newList = map (rs . GHC.getLoc) ls- reList = Map.adjust (\an -> an {annSortKey = Just newList }) parentKey- ans' = reList ans---- ------------------------------------------------------------------------- |Pure function to convert a 'GHC.LHsDecl' to a 'GHC.LHsBind'. This does--- nothing to any annotations that may be attached to either of the elements.--- It is used as a utility function in 'replaceDecls'-decl2Bind :: GHC.LHsDecl name -> [GHC.LHsBind name]-#if __GLASGOW_HASKELL__ > 804-decl2Bind (GHC.L l (GHC.ValD _ s)) = [GHC.L l s]-#else-decl2Bind (GHC.L l (GHC.ValD s)) = [GHC.L l s]-#endif-decl2Bind _ = []---- |Pure function to convert a 'GHC.LSig' to a 'GHC.LHsBind'. This does--- nothing to any annotations that may be attached to either of the elements.--- It is used as a utility function in 'replaceDecls'-decl2Sig :: GHC.LHsDecl name -> [GHC.LSig name]-#if __GLASGOW_HASKELL__ > 804-decl2Sig (GHC.L l (GHC.SigD _ s)) = [GHC.L l s]-#else-decl2Sig (GHC.L l (GHC.SigD s)) = [GHC.L l s]-#endif-decl2Sig _ = []---- ------------------------------------------------------------------------- |Convert a 'GHC.LSig' into a 'GHC.LHsDecl'-wrapSig :: GHC.LSig GhcPs -> GHC.LHsDecl GhcPs-#if __GLASGOW_HASKELL__ > 808-wrapSig (GHC.L l s) = GHC.L l (GHC.SigD GHC.NoExtField s)-#elif __GLASGOW_HASKELL__ > 804-wrapSig (GHC.L l s) = GHC.L l (GHC.SigD GHC.noExt s)-#else-wrapSig (GHC.L l s) = GHC.L l (GHC.SigD s)-#endif---- ------------------------------------------------------------------------- |Convert a 'GHC.LHsBind' into a 'GHC.LHsDecl'-wrapDecl :: GHC.LHsBind GhcPs -> GHC.LHsDecl GhcPs-#if __GLASGOW_HASKELL__ > 808-wrapDecl (GHC.L l s) = GHC.L l (GHC.ValD GHC.NoExtField s)-#elif __GLASGOW_HASKELL__ > 804-wrapDecl (GHC.L l s) = GHC.L l (GHC.ValD GHC.noExt s)-#else-wrapDecl (GHC.L l s) = GHC.L l (GHC.ValD s)-#endif---- ------------------------------------------------------------------------- |Create a simple 'Annotation' without comments, and attach it to the first--- parameter.-addSimpleAnnT :: (Constraints a,Monad m)-#if (__GLASGOW_HASKELL__ >= 808) && (__GLASGOW_HASKELL__ < 900)- => a -> DeltaPos -> [(KeywordId, DeltaPos)] -> TransformT m ()-#else- => GHC.Located a -> DeltaPos -> [(KeywordId, DeltaPos)] -> TransformT m ()-#endif-addSimpleAnnT ast dp kds = do- let ann = annNone { annEntryDelta = dp- , annsDP = kds- }- modifyAnnsT (Map.insert (mkAnnKey ast) ann)---- ------------------------------------------------------------------------- |Add a trailing comma annotation, unless there is already one-addTrailingCommaT :: (Data a,Monad m) => GHC.Located a -> TransformT m ()-addTrailingCommaT ast = do- modifyAnnsT (addTrailingComma ast (DP (0,0)))---- ------------------------------------------------------------------------- |Remove a trailing comma annotation, if there is one one-removeTrailingCommaT :: (Data a,Monad m) => GHC.Located a -> TransformT m ()-removeTrailingCommaT ast = do- modifyAnnsT (removeTrailingComma ast)---- ------------------------------------------------------------------------- |'Transform' monad version of 'getEntryDP'-#if (__GLASGOW_HASKELL__ >= 808) && (__GLASGOW_HASKELL__ < 900)-getEntryDPT :: (Constraints a,Monad m) => a -> TransformT m DeltaPos-#else-getEntryDPT :: (Data a,Monad m) => GHC.Located a -> TransformT m DeltaPos-#endif-getEntryDPT ast = do- anns <- getAnnsT- return (getEntryDP anns ast)---- ------------------------------------------------------------------------- |'Transform' monad version of 'getEntryDP'-#if (__GLASGOW_HASKELL__ >= 808) && (__GLASGOW_HASKELL__ < 900)-setEntryDPT :: (Constraints a,Monad m) => a -> DeltaPos -> TransformT m ()-#else-setEntryDPT :: (Data a,Monad m) => GHC.Located a -> DeltaPos -> TransformT m ()-#endif-setEntryDPT ast dp = do- modifyAnnsT (setEntryDP ast dp)---- ------------------------------------------------------------------------- |'Transform' monad version of 'transferEntryDP'-transferEntryDPT :: (Data a,Data b,Monad m) => GHC.Located a -> GHC.Located b -> TransformT m ()-transferEntryDPT a b =- modifyAnnsT (transferEntryDP a b)---- ------------------------------------------------------------------------- |'Transform' monad version of 'setPrecedingLinesDecl'-setPrecedingLinesDeclT :: (Monad m) => GHC.LHsDecl GhcPs -> Int -> Int -> TransformT m ()-setPrecedingLinesDeclT ld n c =- modifyAnnsT (setPrecedingLinesDecl ld n c)---- ------------------------------------------------------------------------- |'Transform' monad version of 'setPrecedingLines'-setPrecedingLinesT :: (SYB.Data a,Monad m) => GHC.Located a -> Int -> Int -> TransformT m ()-setPrecedingLinesT ld n c =- modifyAnnsT (setPrecedingLines ld n c)---- ------------------------------------------------------------------------- | Left bias pair union-mergeAnns :: Anns -> Anns -> Anns-mergeAnns- = Map.union---- |Combine a list of annotations-mergeAnnList :: [Anns] -> Anns-mergeAnnList [] = error "mergeAnnList must have at lease one entry"-mergeAnnList (x:xs) = foldr mergeAnns x xs---- ------------------------------------------------------------------------- |Unwrap a HsDecl and call setPrecedingLines on it--- ++AZ++ TODO: get rid of this, it is a synonym only-setPrecedingLinesDecl :: GHC.LHsDecl GhcPs -> Int -> Int -> Anns -> Anns-setPrecedingLinesDecl ld n c ans = setPrecedingLines ld n c ans---- ------------------------------------------------------------------------- | Adjust the entry annotations to provide an `n` line preceding gap-setPrecedingLines :: (SYB.Data a) => GHC.Located a -> Int -> Int -> Anns -> Anns-setPrecedingLines ast n c anne = setEntryDP ast (DP (n,c)) anne---- ------------------------------------------------------------------------- |Return the true entry 'DeltaPos' from the annotation for a given AST--- element. This is the 'DeltaPos' ignoring any comments.-#if (__GLASGOW_HASKELL__ >= 808) && (__GLASGOW_HASKELL__ < 900)-getEntryDP :: (Constraints a) => Anns -> a -> DeltaPos-#else-getEntryDP :: (Data a) => Anns -> GHC.Located a -> DeltaPos-#endif-getEntryDP anns ast =- case Map.lookup (mkAnnKey ast) anns of- Nothing -> DP (0,0)- Just ann -> annTrueEntryDelta ann---- ------------------------------------------------------------------------- |Set the true entry 'DeltaPos' from the annotation for a given AST--- element. This is the 'DeltaPos' ignoring any comments.-#if (__GLASGOW_HASKELL__ >= 808) && (__GLASGOW_HASKELL__ < 900)-setEntryDP :: (Constraints a) => a -> DeltaPos -> Anns -> Anns-#else-setEntryDP :: (Data a) => GHC.Located a -> DeltaPos -> Anns -> Anns-#endif-setEntryDP ast dp anns =- case Map.lookup (mkAnnKey ast) anns of- Nothing -> Map.insert (mkAnnKey ast) (annNone { annEntryDelta = dp}) anns- Just ann -> Map.insert (mkAnnKey ast) (ann' { annEntryDelta = annCommentEntryDelta ann' dp}) anns- where- ann' = setCommentEntryDP ann dp---- ------------------------------------------------------------------------- |When setting an entryDP, the leading comment needs to be adjusted too-setCommentEntryDP :: Annotation -> DeltaPos -> Annotation--- setCommentEntryDP ann dp = error $ "setCommentEntryDP:ann'=" ++ show ann'-setCommentEntryDP ann dp = ann'- where- ann' = case (annPriorComments ann) of- [] -> ann- [(pc,_)] -> ann { annPriorComments = [(pc,dp)] }- ((pc,_):pcs) -> ann { annPriorComments = ((pc,dp):pcs) }---- ------------------------------------------------------------------------- |Take the annEntryDelta associated with the first item and associate it with the second.--- Also transfer any comments occuring before it.-transferEntryDP :: (SYB.Data a, SYB.Data b) => GHC.Located a -> GHC.Located b -> Anns -> Anns-transferEntryDP a b anns = (const anns2) anns- where- maybeAnns = do -- Maybe monad- anA <- Map.lookup (mkAnnKey a) anns- anB <- Map.lookup (mkAnnKey b) anns- let anB' = Ann- { annEntryDelta = DP (0,0) -- Need to adjust for comments after- , annPriorComments = annPriorComments anB- , annFollowingComments = annFollowingComments anB- , annsDP = annsDP anB- , annSortKey = annSortKey anB- , annCapturedSpan = annCapturedSpan anB- }- return ((Map.insert (mkAnnKey b) anB' anns),annLeadingCommentEntryDelta anA)- (anns',dp) = fromMaybe- (error $ "transferEntryDP: lookup failed (a,b)=" ++ show (mkAnnKey a,mkAnnKey b))- maybeAnns- anns2 = setEntryDP b dp anns'---- -----------------------------------------------------------------------addTrailingComma :: (SYB.Data a) => GHC.Located a -> DeltaPos -> Anns -> Anns-addTrailingComma a dp anns =- case Map.lookup (mkAnnKey a) anns of- Nothing -> anns- Just an ->- case find isAnnComma (annsDP an) of- Nothing -> Map.insert (mkAnnKey a) (an { annsDP = annsDP an ++ [(G GHC.AnnComma,dp)]}) anns- Just _ -> anns- where- isAnnComma (G GHC.AnnComma,_) = True- isAnnComma _ = False---- -----------------------------------------------------------------------removeTrailingComma :: (SYB.Data a) => GHC.Located a -> Anns -> Anns-removeTrailingComma a anns =- case Map.lookup (mkAnnKey a) anns of- Nothing -> anns- Just an ->- case find isAnnComma (annsDP an) of- Nothing -> anns- Just _ -> Map.insert (mkAnnKey a) (an { annsDP = filter (not.isAnnComma) (annsDP an) }) anns- where- isAnnComma (G GHC.AnnComma,_) = True- isAnnComma _ = False---- ------------------------------------------------------------------------- |The relatavise phase puts all comments appearing between the end of one AST--- item and the beginning of the next as 'annPriorComments' for the second one.--- This function takes two adjacent AST items and moves any 'annPriorComments'--- from the second one to the 'annFollowingComments' of the first if they belong--- to it instead. This is typically required before deleting or duplicating--- either of the AST elements.-balanceComments :: (Data a,Data b,Monad m) => GHC.Located a -> GHC.Located b -> TransformT m ()-balanceComments first second = do- -- ++AZ++ : replace the nested casts with appropriate SYB.gmapM- -- logTr $ "balanceComments entered"- -- logDataWithAnnsTr "first" first- case cast first :: Maybe (GHC.LHsDecl GhcPs) of-#if __GLASGOW_HASKELL__ > 804- Just (GHC.L l (GHC.ValD _ fb@(GHC.FunBind{}))) -> do-#else- Just (GHC.L l (GHC.ValD fb@(GHC.FunBind{}))) -> do-#endif- balanceCommentsFB (GHC.L l fb) second- _ -> case cast first :: Maybe (GHC.LHsBind GhcPs) of- Just fb'@(GHC.L _ (GHC.FunBind{})) -> do- balanceCommentsFB fb' second- _ -> balanceComments' first second---- |Prior to moving an AST element, make sure any trailing comments belonging to--- it are attached to it, and not the following element. Of necessity this is a--- heuristic process, to be tuned later. Possibly a variant should be provided--- with a passed-in decision function.-balanceComments' :: (Data a,Data b,Monad m) => GHC.Located a -> GHC.Located b -> TransformT m ()-balanceComments' first second = do- let- k1 = mkAnnKey first- k2 = mkAnnKey second- moveComments p ans = ans'- where- an1 = gfromJust "balanceComments' k1" $ Map.lookup k1 ans- an2 = gfromJust "balanceComments' k2" $ Map.lookup k2 ans- cs1f = annFollowingComments an1- cs2b = annPriorComments an2- (move,stay) = break p cs2b- an1' = an1 { annFollowingComments = cs1f ++ move}- an2' = an2 { annPriorComments = stay}- ans' = Map.insert k1 an1' $ Map.insert k2 an2' ans-- simpleBreak (_,DP (r,_c)) = r > 0-- modifyAnnsT (moveComments simpleBreak)---- |Once 'balanceComments' has been called to move trailing comments to a--- 'GHC.FunBind', these need to be pushed down from the top level to the last--- 'GHC.Match' if that 'GHC.Match' needs to be manipulated.-balanceCommentsFB :: (Data b,Monad m) => GHC.LHsBind GhcPs -> GHC.Located b -> TransformT m ()-#if __GLASGOW_HASKELL__ >= 900-balanceCommentsFB (GHC.L _ (GHC.FunBind _ _ (GHC.MG _ (GHC.L _ matches) _) _)) second = do-#elif __GLASGOW_HASKELL__ > 808-balanceCommentsFB (GHC.L _ (GHC.FunBind _ _ (GHC.MG _ (GHC.L _ matches) _) _ _)) second = do-#elif __GLASGOW_HASKELL__ > 804-balanceCommentsFB (GHC.L _ (GHC.FunBind _ _ (GHC.MG _ (GHC.L _ matches) _) _ _)) second = do-#elif __GLASGOW_HASKELL__ > 710-balanceCommentsFB (GHC.L _ (GHC.FunBind _ (GHC.MG (GHC.L _ matches) _ _ _) _ _ _)) second = do-#else-balanceCommentsFB (GHC.L _ (GHC.FunBind _ _ (GHC.MG matches _ _ _) _ _ _)) second = do-#endif- -- logTr $ "balanceCommentsFB entered"- balanceComments' (last matches) second-balanceCommentsFB f s = balanceComments' f s---- -------------------------------------------------------------------------- |After moving an AST element, make sure any comments that may belong--- with the following element in fact do. Of necessity this is a heuristic--- process, to be tuned later. Possibly a variant should be provided with a--- passed-in decision function.-balanceTrailingComments :: (Monad m) => (Data a,Data b) => GHC.Located a -> GHC.Located b- -> TransformT m [(Comment, DeltaPos)]-balanceTrailingComments first second = do- let- k1 = mkAnnKey first- k2 = mkAnnKey second- moveComments p ans = (ans',move)- where- an1 = gfromJust "balanceTrailingComments k1" $ Map.lookup k1 ans- an2 = gfromJust "balanceTrailingComments k2" $ Map.lookup k2 ans- cs1f = annFollowingComments an1- (move,stay) = break p cs1f- an1' = an1 { annFollowingComments = stay }- ans' = Map.insert k1 an1' $ Map.insert k2 an2 ans-- simpleBreak (_,DP (r,_c)) = r > 0-- ans <- getAnnsT- let (ans',mov) = moveComments simpleBreak ans- putAnnsT ans'- return mov---- ------------------------------------------------------------------------- ++AZ++ TODO: This needs to be renamed/reworked, based on what it actually gets used for--- |Move any 'annFollowingComments' values from the 'Annotation' associated to--- the first parameter to that of the second.-moveTrailingComments :: (Data a,Data b)- => GHC.Located a -> GHC.Located b -> Transform ()-moveTrailingComments first second = do- let- k1 = mkAnnKey first- k2 = mkAnnKey second- moveComments ans = ans'- where- an1 = gfromJust "moveTrailingComments k1" $ Map.lookup k1 ans- an2 = gfromJust "moveTrailingComments k2" $ Map.lookup k2 ans- cs1f = annFollowingComments an1- cs2f = annFollowingComments an2- an1' = an1 { annFollowingComments = [] }- an2' = an2 { annFollowingComments = cs1f ++ cs2f }- ans' = Map.insert k1 an1' $ Map.insert k2 an2' ans-- modifyAnnsT moveComments---- ------------------------------------------------------------------------- |Insert a declaration into an AST element having sub-declarations--- (@HasDecls@) according to the given location function.-insertAt :: (HasDecls (GHC.Located ast))- => (GHC.LHsDecl GhcPs- -> [GHC.LHsDecl GhcPs]- -> [GHC.LHsDecl GhcPs])- -> GHC.Located ast- -> GHC.LHsDecl GhcPs- -> Transform (GHC.Located ast)-insertAt f t decl = do- oldDecls <- hsDecls t- replaceDecls t (f decl oldDecls)---- |Insert a declaration at the beginning or end of the subdecls of the given--- AST item-insertAtStart, insertAtEnd :: (HasDecls (GHC.Located ast))- => GHC.Located ast- -> GHC.LHsDecl GhcPs- -> Transform (GHC.Located ast)--insertAtStart = insertAt (:)-insertAtEnd = insertAt (\x xs -> xs ++ [x])---- |Insert a declaration at a specific location in the subdecls of the given--- AST item-insertAfter, insertBefore :: (HasDecls (GHC.Located ast))- => GHC.Located old- -> GHC.Located ast- -> GHC.LHsDecl GhcPs- -> Transform (GHC.Located ast)-insertAfter (GHC.getLoc -> k) = insertAt findAfter- where- findAfter x xs =- let (fs, b:bs) = span (\(GHC.L l _) -> l /= k) xs- in fs ++ (b : x : bs)-insertBefore (GHC.getLoc -> k) = insertAt findBefore- where- findBefore x xs =- let (fs, bs) = span (\(GHC.L l _) -> l /= k) xs- in fs ++ (x : bs)---- =====================================================================--- start of HasDecls instances--- =====================================================================---- |Provide a means to get and process the immediate child declartions of a--- given AST element.-class (Data t) => HasDecls t where--- ++AZ++: TODO: add tests to confirm that hsDecls followed by replaceDecls is idempotent-- -- | Return the 'GHC.HsDecl's that are directly enclosed in the- -- given syntax phrase. They are always returned in the wrapped 'GHC.HsDecl'- -- form, even if orginating in local decls. This is safe, as annotations- -- never attach to the wrapper, only to the wrapped item.- hsDecls :: (Monad m) => t -> TransformT m [GHC.LHsDecl GhcPs]-- -- | Replace the directly enclosed decl list by the given- -- decl list. Runs in the 'Transform' monad to be able to update list order- -- annotations, and rebalance comments and other layout changes as needed.- --- -- For example, a call on replaceDecls for a wrapped 'GHC.FunBind' having no- -- where clause will convert- --- -- @- -- -- |This is a function- -- foo = x -- comment1- -- @- -- in to- --- -- @- -- -- |This is a function- -- foo = x -- comment1- -- where- -- nn = 2- -- @- replaceDecls :: (Monad m) => t -> [GHC.LHsDecl GhcPs] -> TransformT m t---- -----------------------------------------------------------------------instance HasDecls GHC.ParsedSource where-#if __GLASGOW_HASKELL__ >= 900- hsDecls (GHC.L _ (GHC.HsModule _lo _mn _exps _imps decls _ _)) = return decls- replaceDecls m@(GHC.L l (GHC.HsModule lo mn exps imps _decls deps haddocks)) decls- = do- logTr "replaceDecls LHsModule"- modifyAnnsT (captureOrder m decls)- return (GHC.L l (GHC.HsModule lo mn exps imps decls deps haddocks))-#else- hsDecls (GHC.L _ (GHC.HsModule _mn _exps _imps decls _ _)) = return decls- replaceDecls m@(GHC.L l (GHC.HsModule mn exps imps _decls deps haddocks)) decls- = do- logTr "replaceDecls LHsModule"- modifyAnnsT (captureOrder m decls)- return (GHC.L l (GHC.HsModule mn exps imps decls deps haddocks))-#endif---- -----------------------------------------------------------------------instance HasDecls (GHC.LMatch GhcPs (GHC.LHsExpr GhcPs)) where-#if __GLASGOW_HASKELL__ > 804- hsDecls d@(GHC.L _ (GHC.Match _ _ _ (GHC.GRHSs _ _ (GHC.L _ lb)))) = do-#elif __GLASGOW_HASKELL__ >= 804- hsDecls d@(GHC.L _ (GHC.Match _ _ (GHC.GRHSs _ (GHC.L _ lb)))) = do-#elif __GLASGOW_HASKELL__ >= 800- hsDecls d@(GHC.L _ (GHC.Match _ _ _ (GHC.GRHSs _ (GHC.L _ lb)))) = do-#elif __GLASGOW_HASKELL__ >= 710- hsDecls d@(GHC.L _ (GHC.Match _ _ _ (GHC.GRHSs _ lb))) = do-#else- hsDecls d@(GHC.L _ (GHC.Match _ _ _ (GHC.GRHSs _ lb))) = do-#endif- decls <- hsDeclsValBinds lb- orderedDecls d decls-#if __GLASGOW_HASKELL__ > 804- hsDecls (GHC.L _ (GHC.Match _ _ _ (GHC.XGRHSs _))) = return []- hsDecls (GHC.L _ (GHC.XMatch _)) = return []-#endif---#if __GLASGOW_HASKELL__ > 804- replaceDecls m@(GHC.L l (GHC.Match xm c p (GHC.GRHSs xr rhs binds))) []-#elif __GLASGOW_HASKELL__ >= 804- replaceDecls m@(GHC.L l (GHC.Match c p (GHC.GRHSs rhs binds))) []-#else- replaceDecls m@(GHC.L l (GHC.Match mf p t (GHC.GRHSs rhs binds))) []-#endif- = do- logTr "replaceDecls LMatch"- let- noWhere (G GHC.AnnWhere,_) = False- noWhere _ = True-- removeWhere mkds =- case Map.lookup (mkAnnKey m) mkds of- Nothing -> error "wtf"- Just ann -> Map.insert (mkAnnKey m) ann1 mkds- where- ann1 = ann { annsDP = filter noWhere (annsDP ann)- }- modifyAnnsT removeWhere--#if __GLASGOW_HASKELL__ <= 710- binds' <- replaceDeclsValbinds binds []-#else- binds'' <- replaceDeclsValbinds (GHC.unLoc binds) []- let binds' = GHC.L (GHC.getLoc binds) binds''-#endif-#if __GLASGOW_HASKELL__ > 804- return (GHC.L l (GHC.Match xm c p (GHC.GRHSs xr rhs binds')))-#elif __GLASGOW_HASKELL__ >= 804- return (GHC.L l (GHC.Match c p (GHC.GRHSs rhs binds')))-#else- return (GHC.L l (GHC.Match mf p t (GHC.GRHSs rhs binds')))-#endif--#if __GLASGOW_HASKELL__ > 804- replaceDecls m@(GHC.L l (GHC.Match xm c p (GHC.GRHSs xr rhs binds))) newBinds-#elif __GLASGOW_HASKELL__ >= 804- replaceDecls m@(GHC.L l (GHC.Match c p (GHC.GRHSs rhs binds))) newBinds-#else- replaceDecls m@(GHC.L l (GHC.Match mf p t (GHC.GRHSs rhs binds))) newBinds-#endif- = do- logTr "replaceDecls LMatch"- -- Need to throw in a fresh where clause if the binds were empty,- -- in the annotations.-#if __GLASGOW_HASKELL__ <= 710- case binds of-#else- case GHC.unLoc binds of-#endif-#if __GLASGOW_HASKELL__ > 804- GHC.EmptyLocalBinds{} -> do-#else- GHC.EmptyLocalBinds -> do-#endif- let- addWhere mkds =- case Map.lookup (mkAnnKey m) mkds of- Nothing -> error "wtf"- Just ann -> Map.insert (mkAnnKey m) ann1 mkds- where- ann1 = ann { annsDP = annsDP ann ++ [(G GHC.AnnWhere,DP (1,2))]- }- modifyAnnsT addWhere- modifyAnnsT (setPrecedingLines (ghead "LMatch.replaceDecls" newBinds) 1 4)-- -- only move the comment if the original where clause was empty.- toMove <- balanceTrailingComments m m- insertCommentBefore (mkAnnKey m) toMove (matchApiAnn GHC.AnnWhere)- _ -> return ()-- modifyAnnsT (captureOrderAnnKey (mkAnnKey m) newBinds)-#if __GLASGOW_HASKELL__ <= 710- binds' <- replaceDeclsValbinds binds newBinds-#else- binds'' <- replaceDeclsValbinds (GHC.unLoc binds) newBinds- let binds' = GHC.L (GHC.getLoc binds) binds''-#endif- -- logDataWithAnnsTr "Match.replaceDecls:binds'" binds'-#if __GLASGOW_HASKELL__ > 804- return (GHC.L l (GHC.Match xm c p (GHC.GRHSs xr rhs binds')))-#elif __GLASGOW_HASKELL__ >= 804- return (GHC.L l (GHC.Match c p (GHC.GRHSs rhs binds')))-#else- return (GHC.L l (GHC.Match mf p t (GHC.GRHSs rhs binds')))-#endif-#if __GLASGOW_HASKELL__ > 804- replaceDecls (GHC.L _ (GHC.Match _ _ _ (GHC.XGRHSs _))) _ = error "replaceDecls"- replaceDecls (GHC.L _ (GHC.XMatch _)) _ = error "replaceDecls"-#endif---- -----------------------------------------------------------------------instance HasDecls (GHC.LHsExpr GhcPs) where-#if __GLASGOW_HASKELL__ > 804- hsDecls ls@(GHC.L _ (GHC.HsLet _ (GHC.L _ decls) _ex)) = do-#elif __GLASGOW_HASKELL__ > 710- hsDecls ls@(GHC.L _ (GHC.HsLet (GHC.L _ decls) _ex)) = do-#else- hsDecls ls@(GHC.L _ (GHC.HsLet decls _ex)) = do-#endif- ds <- hsDeclsValBinds decls- orderedDecls ls ds- hsDecls _ = return []--#if __GLASGOW_HASKELL__ > 804- replaceDecls e@(GHC.L l (GHC.HsLet x decls ex)) newDecls-#else- replaceDecls e@(GHC.L l (GHC.HsLet decls ex)) newDecls-#endif- = do- logTr "replaceDecls HsLet"- modifyAnnsT (captureOrder e newDecls)-#if __GLASGOW_HASKELL__ <= 710- decls' <- replaceDeclsValbinds decls newDecls-#else- decls'' <- replaceDeclsValbinds (GHC.unLoc decls) newDecls- let decls' = GHC.L (GHC.getLoc decls) decls''-#endif-#if __GLASGOW_HASKELL__ > 804- return (GHC.L l (GHC.HsLet x decls' ex))-#else- return (GHC.L l (GHC.HsLet decls' ex))-#endif--#if __GLASGOW_HASKELL__ > 804- replaceDecls (GHC.L l (GHC.HsPar x e)) newDecls-#else- replaceDecls (GHC.L l (GHC.HsPar e)) newDecls-#endif- = do- logTr "replaceDecls HsPar"- e' <- replaceDecls e newDecls-#if __GLASGOW_HASKELL__ > 804- return (GHC.L l (GHC.HsPar x e'))-#else- return (GHC.L l (GHC.HsPar e'))-#endif- replaceDecls old _new = error $ "replaceDecls (GHC.LHsExpr GhcPs) undefined for:" ++ showGhc old---- ------------------------------------------------------------------------- | Extract the immediate declarations for a 'GHC.PatBind' wrapped in a 'GHC.ValD'. This--- cannot be a member of 'HasDecls' because a 'GHC.FunBind' is not idempotent--- for 'hsDecls' \/ 'replaceDecls'. 'hsDeclsPatBindD' \/ 'replaceDeclsPatBindD' is--- idempotent.-hsDeclsPatBindD :: (Monad m) => GHC.LHsDecl GhcPs -> TransformT m [GHC.LHsDecl GhcPs]-#if __GLASGOW_HASKELL__ > 804-hsDeclsPatBindD (GHC.L l (GHC.ValD _ d)) = hsDeclsPatBind (GHC.L l d)-#else-hsDeclsPatBindD (GHC.L l (GHC.ValD d)) = hsDeclsPatBind (GHC.L l d)-#endif-hsDeclsPatBindD x = error $ "hsDeclsPatBindD called for:" ++ showGhc x---- | Extract the immediate declarations for a 'GHC.PatBind'. This--- cannot be a member of 'HasDecls' because a 'GHC.FunBind' is not idempotent--- for 'hsDecls' \/ 'replaceDecls'. 'hsDeclsPatBind' \/ 'replaceDeclsPatBind' is--- idempotent.-hsDeclsPatBind :: (Monad m) => GHC.LHsBind GhcPs -> TransformT m [GHC.LHsDecl GhcPs]-#if __GLASGOW_HASKELL__ > 804-hsDeclsPatBind d@(GHC.L _ (GHC.PatBind _ _ (GHC.GRHSs _ _grhs (GHC.L _ lb)) _)) = do-#elif __GLASGOW_HASKELL__ > 710-hsDeclsPatBind d@(GHC.L _ (GHC.PatBind _ (GHC.GRHSs _grhs (GHC.L _ lb)) _ _ _)) = do-#else-hsDeclsPatBind d@(GHC.L _ (GHC.PatBind _ (GHC.GRHSs _grhs lb) _ _ _)) = do-#endif- decls <- hsDeclsValBinds lb- orderedDecls d decls-hsDeclsPatBind x = error $ "hsDeclsPatBind called for:" ++ showGhc x---- ----------------------------------------- | Replace the immediate declarations for a 'GHC.PatBind' wrapped in a 'GHC.ValD'. This--- cannot be a member of 'HasDecls' because a 'GHC.FunBind' is not idempotent--- for 'hsDecls' \/ 'replaceDecls'. 'hsDeclsPatBindD' \/ 'replaceDeclsPatBindD' is--- idempotent.-replaceDeclsPatBindD :: (Monad m) => GHC.LHsDecl GhcPs -> [GHC.LHsDecl GhcPs]- -> TransformT m (GHC.LHsDecl GhcPs)-#if __GLASGOW_HASKELL__ > 804-replaceDeclsPatBindD (GHC.L l (GHC.ValD x d)) newDecls = do- (GHC.L _ d') <- replaceDeclsPatBind (GHC.L l d) newDecls- return (GHC.L l (GHC.ValD x d'))-#else-replaceDeclsPatBindD (GHC.L l (GHC.ValD d)) newDecls = do- (GHC.L _ d') <- replaceDeclsPatBind (GHC.L l d) newDecls- return (GHC.L l (GHC.ValD d'))-#endif-replaceDeclsPatBindD x _ = error $ "replaceDeclsPatBindD called for:" ++ showGhc x---- | Replace the immediate declarations for a 'GHC.PatBind'. This--- cannot be a member of 'HasDecls' because a 'GHC.FunBind' is not idempotent--- for 'hsDecls' \/ 'replaceDecls'. 'hsDeclsPatBind' \/ 'replaceDeclsPatBind' is--- idempotent.-replaceDeclsPatBind :: (Monad m) => GHC.LHsBind GhcPs -> [GHC.LHsDecl GhcPs]- -> TransformT m (GHC.LHsBind GhcPs)-#if __GLASGOW_HASKELL__ > 804-replaceDeclsPatBind p@(GHC.L l (GHC.PatBind x a (GHC.GRHSs xr rhss binds) b)) newDecls-#else-replaceDeclsPatBind p@(GHC.L l (GHC.PatBind a (GHC.GRHSs rhss binds) b c d)) newDecls-#endif- = do- logTr "replaceDecls PatBind"- -- Need to throw in a fresh where clause if the binds were empty,- -- in the annotations.-#if __GLASGOW_HASKELL__ <= 710- case binds of-#else- case GHC.unLoc binds of-#endif-#if __GLASGOW_HASKELL__ > 804- GHC.EmptyLocalBinds{} -> do-#else- GHC.EmptyLocalBinds -> do-#endif- let- addWhere mkds =- case Map.lookup (mkAnnKey p) mkds of- Nothing -> error "wtf"- Just ann -> Map.insert (mkAnnKey p) ann1 mkds- where- ann1 = ann { annsDP = annsDP ann ++ [(G GHC.AnnWhere,DP (1,2))]- }- modifyAnnsT addWhere- modifyAnnsT (setPrecedingLines (ghead "LMatch.replaceDecls" newDecls) 1 4)-- _ -> return ()-- modifyAnnsT (captureOrderAnnKey (mkAnnKey p) newDecls)-#if __GLASGOW_HASKELL__ <= 710- binds' <- replaceDeclsValbinds binds newDecls-#else- binds'' <- replaceDeclsValbinds (GHC.unLoc binds) newDecls- let binds' = GHC.L (GHC.getLoc binds) binds''-#endif-#if __GLASGOW_HASKELL__ > 804- return (GHC.L l (GHC.PatBind x a (GHC.GRHSs xr rhss binds') b))-#else- return (GHC.L l (GHC.PatBind a (GHC.GRHSs rhss binds') b c d))-#endif-replaceDeclsPatBind x _ = error $ "replaceDeclsPatBind called for:" ++ showGhc x---- -----------------------------------------------------------------------instance HasDecls (GHC.LStmt GhcPs (GHC.LHsExpr GhcPs)) where-#if __GLASGOW_HASKELL__ > 804- hsDecls ls@(GHC.L _ (GHC.LetStmt _ (GHC.L _ lb))) = do-#elif __GLASGOW_HASKELL__ > 710- hsDecls ls@(GHC.L _ (GHC.LetStmt (GHC.L _ lb))) = do-#else- hsDecls ls@(GHC.L _ (GHC.LetStmt lb)) = do-#endif- decls <- hsDeclsValBinds lb- orderedDecls ls decls-#if __GLASGOW_HASKELL__ > 804- hsDecls (GHC.L _ (GHC.LastStmt _ e _ _)) = hsDecls e-#elif __GLASGOW_HASKELL__ >= 804- hsDecls (GHC.L _ (GHC.LastStmt e _ _)) = hsDecls e-#elif __GLASGOW_HASKELL__ > 800- hsDecls (GHC.L _ (GHC.LastStmt e _ _)) = hsDecls e-#elif __GLASGOW_HASKELL__ > 710- hsDecls (GHC.L _ (GHC.LastStmt e _ _)) = hsDecls e-#else- hsDecls (GHC.L _ (GHC.LastStmt e _)) = hsDecls e-#endif-#if __GLASGOW_HASKELL__ >= 900- hsDecls (GHC.L _ (GHC.BindStmt _ _pat e)) = hsDecls e-#elif __GLASGOW_HASKELL__ > 804- hsDecls (GHC.L _ (GHC.BindStmt _ _pat e _ _)) = hsDecls e-#elif __GLASGOW_HASKELL__ > 710- hsDecls (GHC.L _ (GHC.BindStmt _pat e _ _ _)) = hsDecls e-#else- hsDecls (GHC.L _ (GHC.BindStmt _pat e _ _)) = hsDecls e-#endif-#if __GLASGOW_HASKELL__ > 804- hsDecls (GHC.L _ (GHC.BodyStmt _ e _ _)) = hsDecls e-#else- hsDecls (GHC.L _ (GHC.BodyStmt e _ _ _)) = hsDecls e-#endif- hsDecls _ = return []--#if __GLASGOW_HASKELL__ > 804- replaceDecls s@(GHC.L l (GHC.LetStmt x lb)) newDecls-#else- replaceDecls s@(GHC.L l (GHC.LetStmt lb)) newDecls-#endif- = do- modifyAnnsT (captureOrder s newDecls)-#if __GLASGOW_HASKELL__ <= 710- lb' <- replaceDeclsValbinds lb newDecls-#else- lb'' <- replaceDeclsValbinds (GHC.unLoc lb) newDecls- let lb' = GHC.L (GHC.getLoc lb) lb''-#endif-#if __GLASGOW_HASKELL__ > 804- return (GHC.L l (GHC.LetStmt x lb'))-#else- return (GHC.L l (GHC.LetStmt lb'))-#endif-#if __GLASGOW_HASKELL__ > 804- replaceDecls (GHC.L l (GHC.LastStmt x e d se)) newDecls- = do- e' <- replaceDecls e newDecls- return (GHC.L l (GHC.LastStmt x e' d se))-#elif __GLASGOW_HASKELL__ > 710- replaceDecls (GHC.L l (GHC.LastStmt e d se)) newDecls- = do- e' <- replaceDecls e newDecls- return (GHC.L l (GHC.LastStmt e' d se))-#else- replaceDecls (GHC.L l (GHC.LastStmt e se)) newDecls- = do- e' <- replaceDecls e newDecls- return (GHC.L l (GHC.LastStmt e' se))-#endif-#if __GLASGOW_HASKELL__ >= 900- replaceDecls (GHC.L l (GHC.BindStmt x pat e)) newDecls- = do- e' <- replaceDecls e newDecls- return (GHC.L l (GHC.BindStmt x pat e'))-#elif __GLASGOW_HASKELL__ > 804- replaceDecls (GHC.L l (GHC.BindStmt x pat e a b)) newDecls- = do- e' <- replaceDecls e newDecls- return (GHC.L l (GHC.BindStmt x pat e' a b))-#elif __GLASGOW_HASKELL__ > 710- replaceDecls (GHC.L l (GHC.BindStmt pat e a b c)) newDecls- = do- e' <- replaceDecls e newDecls- return (GHC.L l (GHC.BindStmt pat e' a b c))-#else- replaceDecls (GHC.L l (GHC.BindStmt pat e a b)) newDecls- = do- e' <- replaceDecls e newDecls- return (GHC.L l (GHC.BindStmt pat e' a b))-#endif--#if __GLASGOW_HASKELL__ > 804- replaceDecls (GHC.L l (GHC.BodyStmt x e a b)) newDecls- = do- e' <- replaceDecls e newDecls- return (GHC.L l (GHC.BodyStmt x e' a b))-#else- replaceDecls (GHC.L l (GHC.BodyStmt e a b c)) newDecls- = do- e' <- replaceDecls e newDecls- return (GHC.L l (GHC.BodyStmt e' a b c))-#endif- replaceDecls x _newDecls = return x---- =====================================================================--- end of HasDecls instances--- =====================================================================---- ------------------------------------------------------------------------- |Do a transformation on an AST fragment by providing a function to process--- the general case and one specific for a 'GHC.LHsBind'. This is required--- because a 'GHC.FunBind' may have multiple 'GHC.Match' items, so we cannot--- gurantee that 'replaceDecls' after 'hsDecls' is idempotent.-hasDeclsSybTransform :: (SYB.Data t2,Monad m)- => (forall t. HasDecls t => t -> m t)- -- ^Worker function for the general case- -> (GHC.LHsBind GhcPs -> m (GHC.LHsBind GhcPs))- -- ^Worker function for FunBind/PatBind- -> t2 -- ^Item to be updated- -> m t2-hasDeclsSybTransform workerHasDecls workerBind t = trf t- where- trf = SYB.mkM parsedSource- `SYB.extM` lmatch- `SYB.extM` lexpr- `SYB.extM` lstmt- `SYB.extM` lhsbind- `SYB.extM` lvald-- parsedSource (p::GHC.ParsedSource) = workerHasDecls p-- lmatch (lm::GHC.LMatch GhcPs (GHC.LHsExpr GhcPs))- = workerHasDecls lm-- lexpr (le::GHC.LHsExpr GhcPs)- = workerHasDecls le-- lstmt (d::GHC.LStmt GhcPs (GHC.LHsExpr GhcPs))- = workerHasDecls d-- lhsbind (b@(GHC.L _ GHC.FunBind{}):: GHC.LHsBind GhcPs)- = workerBind b- lhsbind b@(GHC.L _ GHC.PatBind{})- = workerBind b- lhsbind x = return x--#if __GLASGOW_HASKELL__ > 804- lvald (GHC.L l (GHC.ValD x d)) = do- (GHC.L _ d') <- lhsbind (GHC.L l d)- return (GHC.L l (GHC.ValD x d'))-#else- lvald (GHC.L l (GHC.ValD d)) = do- (GHC.L _ d') <- lhsbind (GHC.L l d)- return (GHC.L l (GHC.ValD d'))-#endif- lvald x = return x---- ------------------------------------------------------------------------- |A 'GHC.FunBind' wraps up one or more 'GHC.Match' items. 'hsDecls' cannot--- return anything for these as there is not meaningful 'replaceDecls' for it.--- This function provides a version of 'hsDecls' that returns the 'GHC.FunBind'--- decls too, where they are needed for analysis only.-hsDeclsGeneric :: (SYB.Data t,Monad m) => t -> TransformT m [GHC.LHsDecl GhcPs]-hsDeclsGeneric t = q t- where- q = return []- `SYB.mkQ` parsedSource- `SYB.extQ` lmatch- `SYB.extQ` lexpr- `SYB.extQ` lstmt- `SYB.extQ` lhsbind- `SYB.extQ` lhsbindd- `SYB.extQ` llocalbinds- `SYB.extQ` localbinds-- parsedSource (p::GHC.ParsedSource) = hsDecls p-- lmatch (lm::GHC.LMatch GhcPs (GHC.LHsExpr GhcPs)) = hsDecls lm-- lexpr (le::GHC.LHsExpr GhcPs) = hsDecls le-- lstmt (d::GHC.LStmt GhcPs (GHC.LHsExpr GhcPs)) = hsDecls d-- -- ----------------------------------- lhsbind :: (Monad m) => GHC.LHsBind GhcPs -> TransformT m [GHC.LHsDecl GhcPs]-#if __GLASGOW_HASKELL__ >= 900- lhsbind (GHC.L _ (GHC.FunBind _ _ (GHC.MG _ (GHC.L _ matches) _) _)) = do-#elif __GLASGOW_HASKELL__ > 808- lhsbind (GHC.L _ (GHC.FunBind _ _ (GHC.MG _ (GHC.L _ matches) _) _ _)) = do-#elif __GLASGOW_HASKELL__ > 804- lhsbind (GHC.L _ (GHC.FunBind _ _ (GHC.MG _ (GHC.L _ matches) _) _ _)) = do-#elif __GLASGOW_HASKELL__ > 710- lhsbind (GHC.L _ (GHC.FunBind _ (GHC.MG (GHC.L _ matches) _ _ _) _ _ _)) = do-#else- lhsbind (GHC.L _ (GHC.FunBind _ _ (GHC.MG matches _ _ _) _ _ _)) = do-#endif- dss <- mapM hsDecls matches- return (concat dss)- lhsbind p@(GHC.L _ (GHC.PatBind{})) = do- hsDeclsPatBind p- lhsbind _ = return []-- -- -----------------------------------#if __GLASGOW_HASKELL__ > 804- lhsbindd (GHC.L l (GHC.ValD _ d)) = lhsbind (GHC.L l d)-#else- lhsbindd (GHC.L l (GHC.ValD d)) = lhsbind (GHC.L l d)-#endif- lhsbindd _ = return []-- -- ----------------------------------- llocalbinds :: (Monad m) => GHC.Located (GHC.HsLocalBinds GhcPs) -> TransformT m [GHC.LHsDecl GhcPs]- llocalbinds (GHC.L _ ds) = localbinds ds-- -- ----------------------------------- localbinds :: (Monad m) => GHC.HsLocalBinds GhcPs -> TransformT m [GHC.LHsDecl GhcPs]- localbinds d = hsDeclsValBinds d---- ------------------------------------------------------------------------- |Look up the annotated order and sort the decls accordingly-orderedDecls :: (Data a,Monad m) => GHC.Located a -> [GHC.LHsDecl GhcPs] -> TransformT m [GHC.LHsDecl GhcPs]-orderedDecls parent decls = do- ans <- getAnnsT- case getAnnotationEP parent ans of- Nothing -> error $ "orderedDecls:no annotation for:" ++ showAnnData emptyAnns 0 parent- Just ann -> case annSortKey ann of- Nothing -> do- return decls- Just keys -> do- let ds = map (\s -> (rs $ GHC.getLoc s,s)) decls- ordered = map snd $ orderByKey ds keys- return ordered---- ------------------------------------------------------------------------- | Utility function for extracting decls from 'GHC.HsLocalBinds'. Use with--- care, as this does not necessarily return the declarations in order, the--- ordering should be done by the calling function from the 'GHC.HsLocalBinds'--- context in the AST.-hsDeclsValBinds :: (Monad m) => GHC.HsLocalBinds GhcPs -> TransformT m [GHC.LHsDecl GhcPs]-hsDeclsValBinds lb = case lb of-#if __GLASGOW_HASKELL__ > 804- GHC.HsValBinds _ (GHC.ValBinds _ bs sigs) -> do- let- bds = map wrapDecl (GHC.bagToList bs)- sds = map wrapSig sigs- return (bds ++ sds)- GHC.HsValBinds _ (GHC.XValBindsLR _) -> error $ "hsDecls.XValBindsLR not valid"- GHC.HsIPBinds {} -> return []- GHC.EmptyLocalBinds {} -> return []- GHC.XHsLocalBindsLR {} -> return []-#else- GHC.HsValBinds (GHC.ValBindsIn bs sigs) -> do- let- bds = map wrapDecl (GHC.bagToList bs)- sds = map wrapSig sigs- return (bds ++ sds)- GHC.HsValBinds (GHC.ValBindsOut _ _) -> error $ "hsDecls.ValbindsOut not valid"- GHC.HsIPBinds _ -> return []- GHC.EmptyLocalBinds -> return []-#endif---- | Utility function for returning decls to 'GHC.HsLocalBinds'. Use with--- care, as this does not manage the declaration order, the--- ordering should be done by the calling function from the 'GHC.HsLocalBinds'--- context in the AST.-replaceDeclsValbinds :: (Monad m)- => GHC.HsLocalBinds GhcPs -> [GHC.LHsDecl GhcPs]- -> TransformT m (GHC.HsLocalBinds GhcPs)-replaceDeclsValbinds _ [] = do-#if __GLASGOW_HASKELL__ > 808- return (GHC.EmptyLocalBinds GHC.NoExtField)-#elif __GLASGOW_HASKELL__ > 804- return (GHC.EmptyLocalBinds GHC.noExt)-#else- return (GHC.EmptyLocalBinds)-#endif-#if __GLASGOW_HASKELL__ > 804-replaceDeclsValbinds (GHC.HsValBinds _ _b) new-#else-replaceDeclsValbinds (GHC.HsValBinds _b) new-#endif- = do- logTr "replaceDecls HsLocalBinds"- let decs = GHC.listToBag $ concatMap decl2Bind new- let sigs = concatMap decl2Sig new-#if __GLASGOW_HASKELL__ > 808- return (GHC.HsValBinds GHC.NoExtField (GHC.ValBinds GHC.NoExtField decs sigs))-#elif __GLASGOW_HASKELL__ > 804- return (GHC.HsValBinds GHC.noExt (GHC.ValBinds GHC.noExt decs sigs))-#else- return (GHC.HsValBinds (GHC.ValBindsIn decs sigs))-#endif-replaceDeclsValbinds (GHC.HsIPBinds {}) _new = error "undefined replaceDecls HsIPBinds"-#if __GLASGOW_HASKELL__ > 804-replaceDeclsValbinds (GHC.EmptyLocalBinds _) new-#else-replaceDeclsValbinds (GHC.EmptyLocalBinds) new-#endif- = do- logTr "replaceDecls HsLocalBinds"- let newBinds = map decl2Bind new- newSigs = map decl2Sig new- let decs = GHC.listToBag $ concat newBinds- let sigs = concat newSigs-#if __GLASGOW_HASKELL__ > 808- return (GHC.HsValBinds GHC.NoExtField (GHC.ValBinds GHC.NoExtField decs sigs))-#elif __GLASGOW_HASKELL__ > 804- return (GHC.HsValBinds GHC.noExt (GHC.ValBinds GHC.noExt decs sigs))-#else- return (GHC.HsValBinds (GHC.ValBindsIn decs sigs))-#endif-#if __GLASGOW_HASKELL__ > 804-replaceDeclsValbinds (GHC.XHsLocalBindsLR _) _ = error "replaceDeclsValbinds. XHsLocalBindsLR"-#endif---- -----------------------------------------------------------------------type Decl = GHC.LHsDecl GhcPs-type Match = GHC.LMatch GhcPs (GHC.LHsExpr GhcPs)---- |Modify a 'GHC.LHsBind' wrapped in a 'GHC.ValD'. For a 'GHC.PatBind' the--- declarations are extracted and returned after modification. For a--- 'GHC.FunBind' the supplied 'GHC.SrcSpan' is used to identify the specific--- 'GHC.Match' to be transformed, for when there are multiple of them.-modifyValD :: forall m t. (HasTransform m)- => GHC.SrcSpan- -> Decl- -> (Match -> [Decl] -> m ([Decl], Maybe t))- -> m (Decl,Maybe t)-#if __GLASGOW_HASKELL__ > 804-modifyValD p pb@(GHC.L ss (GHC.ValD _ (GHC.PatBind {} ))) f =-#else-modifyValD p pb@(GHC.L ss (GHC.ValD (GHC.PatBind {} ))) f =-#endif- if ss == p- then do- ds <- liftT $ hsDeclsPatBindD pb- (ds',r) <- f (error "modifyValD.PatBind should not touch Match") ds- pb' <- liftT $ replaceDeclsPatBindD pb ds'- return (pb',r)- else return (pb,Nothing)-modifyValD p ast f = do- (ast',r) <- runStateT (SYB.everywhereM (SYB.mkM doModLocal) ast) Nothing- return (ast',r)- where- doModLocal :: Match -> StateT (Maybe t) m Match- doModLocal (match@(GHC.L ss _) :: Match) = do- let- if ss == p- then do- ds <- lift $ liftT $ hsDecls match- (ds',r) <- lift $ f match ds- put r- match' <- lift $ liftT $ replaceDecls match ds'- return match'- else return match---- ------------------------------------------------------------------------- |Used to integrate a @Transform@ into other Monad stacks-class (Monad m) => (HasTransform m) where- liftT :: Transform a -> m a--instance Monad m => HasTransform (TransformT m) where- liftT = hoistTransform (return . runIdentity)---- ------------------------------------------------------------------------- | Apply a transformation to the decls contained in @t@-modifyDeclsT :: (HasDecls t,HasTransform m)- => ([GHC.LHsDecl GhcPs] -> m [GHC.LHsDecl GhcPs])- -> t -> m t-modifyDeclsT action t = do- decls <- liftT $ hsDecls t- decls' <- action decls- liftT $ replaceDecls t decls'---- -----------------------------------------------------------------------matchApiAnn :: GHC.AnnKeywordId -> (KeywordId,DeltaPos) -> Bool-matchApiAnn mkw (kw,_)- = case kw of- (G akw) -> mkw == akw- _ -> False----- We comments extracted from annPriorComments or annFollowingComments, which--- need to move to just before the item identified by the predicate, if it--- fires, else at the end of the annotations.-insertCommentBefore :: (Monad m) => AnnKey -> [(Comment, DeltaPos)]- -> ((KeywordId, DeltaPos) -> Bool) -> TransformT m ()-insertCommentBefore key toMove p = do- let- doInsert ans =- case Map.lookup key ans of- Nothing -> error $ "insertCommentBefore:no AnnKey for:" ++ showGhc key- Just ann -> Map.insert key ann' ans- where- (before,after) = break p (annsDP ann)- ann' = ann { annsDP = before ++ (map comment2dp toMove) ++ after}-- modifyAnnsT doInsert+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE NamedFieldPuns #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE ViewPatterns #-}+-----------------------------------------------------------------------------+-- |+-- Module : Language.Haskell.GHC.ExactPrint.Transform+--+-- This module is currently under heavy development, and no promises are made+-- about API stability. Use with care.+--+-- We welcome any feedback / contributions on this, as it is the main point of+-- the library.+--+-----------------------------------------------------------------------------+module Language.Haskell.GHC.ExactPrint.Transform+ (+ -- * The Transform Monad+ Transform+ , TransformT(..)+ , hoistTransform+ , runTransform+ , runTransformT+ , runTransformFrom+ , runTransformFromT++ -- * Transform monad operations+ , logTr+ , logDataWithAnnsTr+ , getAnnsT, putAnnsT, modifyAnnsT+ , uniqueSrcSpanT++ , cloneT+ , graftT++ , getEntryDPT+ , setEntryDPT+ , transferEntryDPT+ , setPrecedingLinesDeclT+ , setPrecedingLinesT+ , addSimpleAnnT+ , addTrailingCommaT+ , removeTrailingCommaT++ -- ** Managing declarations, in Transform monad+ , HasTransform (..)+ , HasDecls (..)+ , hasDeclsSybTransform+ , hsDeclsGeneric+ , hsDeclsPatBind, hsDeclsPatBindD+ , replaceDeclsPatBind, replaceDeclsPatBindD+ , modifyDeclsT+ , modifyValD+ -- *** Utility, does not manage layout+ , hsDeclsValBinds, replaceDeclsValbinds+ , WithWhere(..)++ -- ** New gen functions+ , noAnnSrcSpanDP+ , noAnnSrcSpanDP0+ , noAnnSrcSpanDP1+ , noAnnSrcSpanDPn+ , d0, d1, dn+ , m0, m1, mn+ , addComma++ -- ** Managing lists, Transform monad+ , insertAt+ , insertAtStart+ , insertAtEnd+ , insertAfter+ , insertBefore++ -- *** Low level operations used in 'HasDecls'+ , balanceComments+ , balanceCommentsList+ , balanceCommentsList'+ , balanceTrailingComments+ , moveTrailingComments+ , anchorEof++ -- ** Managing lists, pure functions+ , captureOrder+ , captureLineSpacing+ , captureMatchLineSpacing+ , captureTypeSigSpacing++ -- * Operations+ , isUniqueSrcSpan++ -- * Pure functions+ , mergeAnns+ , mergeAnnList+ , setPrecedingLinesDecl+ , setPrecedingLines+ , getEntryDP+ , setEntryDP+ , setEntryDP'+ , transferEntryDP+ , transferEntryDP'+ , addTrailingComma+ , wrapSig, wrapDecl+ , decl2Sig, decl2Bind+ , deltaAnchor+ ) where++import Language.Haskell.GHC.ExactPrint.Types+import Language.Haskell.GHC.ExactPrint.Utils++import Control.Monad.RWS+import qualified Control.Monad.Fail as Fail++import GHC hiding (parseModule, parsedSource)+import GHC.Data.Bag+import GHC.Data.FastString++import Data.Generics+-- import Data.Data+import Data.List (sort, sortBy, find)+import Data.Maybe++import qualified Data.Map as Map++import Data.Functor.Identity+import Control.Monad.State+import Control.Monad.Writer+++------------------------------------------------------------------------------+-- Transformation of source elements++-- | Monad type for updating the AST and managing the annotations at the same+-- time. The W state is used to generate logging information if required.+type Transform = TransformT Identity++-- |Monad transformer version of 'Transform' monad+newtype TransformT m a = TransformT { unTransformT :: RWST () [String] (Anns,Int) m a }+ deriving (Monad,Applicative,Functor+ ,MonadReader ()+ ,MonadWriter [String]+ ,MonadState (Anns,Int)+ ,MonadTrans+ )++instance Fail.MonadFail m => Fail.MonadFail (TransformT m) where+ fail msg = TransformT $ RWST $ \_ _ -> Fail.fail msg++-- | Run a transformation in the 'Transform' monad, returning the updated+-- annotations and any logging generated via 'logTr'+runTransform :: Anns -> Transform a -> (a,(Anns,Int),[String])+runTransform ans f = runTransformFrom 0 ans f++runTransformT :: Anns -> TransformT m a -> m (a,(Anns,Int),[String])+runTransformT ans f = runTransformFromT 0 ans f++-- | Run a transformation in the 'Transform' monad, returning the updated+-- annotations and any logging generated via 'logTr', allocating any new+-- SrcSpans from the provided initial value.+runTransformFrom :: Int -> Anns -> Transform a -> (a,(Anns,Int),[String])+runTransformFrom seed ans f = runRWS (unTransformT f) () (ans,seed)++-- |Run a monad transformer stack for the 'TransformT' monad transformer+runTransformFromT :: Int -> Anns -> TransformT m a -> m (a,(Anns,Int),[String])+runTransformFromT seed ans f = runRWST (unTransformT f) () (ans,seed)++-- | Change inner monad of 'TransformT'.+hoistTransform :: (forall x. m x -> n x) -> TransformT m a -> TransformT n a+hoistTransform nt (TransformT m) = TransformT (mapRWST nt m)++-- |Log a string to the output of the Monad+logTr :: (Monad m) => String -> TransformT m ()+logTr str = tell [str]++-- |Log a representation of the given AST with annotations to the output of the+-- Monad+logDataWithAnnsTr :: (Monad m) => (Data a) => String -> a -> TransformT m ()+logDataWithAnnsTr str ast = do+ logTr $ str ++ showAst ast++-- |Access the 'Anns' being modified in this transformation+getAnnsT :: (Monad m) => TransformT m Anns+getAnnsT = gets fst++-- |Replace the 'Anns' after any changes+putAnnsT :: (Monad m) => Anns -> TransformT m ()+putAnnsT ans = do+ (_,col) <- get+ put (ans,col)++-- |Change the stored 'Anns'+modifyAnnsT :: (Monad m) => (Anns -> Anns) -> TransformT m ()+modifyAnnsT f = do+ ans <- getAnnsT+ putAnnsT (f ans)++-- ---------------------------------------------------------------------++-- |Once we have 'Anns', a 'SrcSpan' is used purely as part of an 'AnnKey'+-- to index into the 'Anns'. If we need to add new elements to the AST, they+-- need their own 'SrcSpan' for this.+uniqueSrcSpanT :: (Monad m) => TransformT m SrcSpan+uniqueSrcSpanT = do+ (an,col) <- get+ put (an,col + 1 )+ let pos = mkSrcLoc (mkFastString "ghc-exactprint") (-1) col+ return $ mkSrcSpan pos pos++-- |Test whether a given 'SrcSpan' was generated by 'uniqueSrcSpanT'+isUniqueSrcSpan :: SrcSpan -> Bool+isUniqueSrcSpan ss = srcSpanStartLine' ss == -1++srcSpanStartLine' :: SrcSpan -> Int+srcSpanStartLine' (RealSrcSpan s _) = srcSpanStartLine s+srcSpanStartLine' _ = 0++-- ---------------------------------------------------------------------+-- |Make a copy of an AST element, replacing the existing SrcSpans with new+-- ones, and duplicating the matching annotations.+cloneT :: (Data a,Monad m) => a -> TransformT m (a, [(SrcSpan, SrcSpan)])+cloneT ast = do+ runWriterT $ everywhereM (return `ext2M` replaceLocated) ast+ where+ replaceLocated :: forall loc a m. (Typeable loc,Data a,Monad m)+ => (GenLocated loc a) -> WriterT [(SrcSpan, SrcSpan)] (TransformT m) (GenLocated loc a)+ replaceLocated (L l t) = do+ case cast l :: Maybe SrcSpan of+ Just ss -> do+ newSpan <- lift uniqueSrcSpanT+ lift $ modifyAnnsT (\anns -> case Map.lookup (mkAnnKey (L ss t)) anns of+ Nothing -> anns+ Just an -> Map.insert (mkAnnKey (L newSpan t)) an anns)+ tell [(ss, newSpan)]+ return $ fromJust . cast $ L newSpan t+ Nothing -> return (L l t)++-- ---------------------------------------------------------------------+-- |Slightly more general form of cloneT+graftT :: (Data a,Monad m) => Anns -> a -> TransformT m a+graftT origAnns = everywhereM (return `ext2M` replaceLocated)+ where+ replaceLocated :: forall loc a m. (Typeable loc, Data a, Monad m)+ => GenLocated loc a -> TransformT m (GenLocated loc a)+ replaceLocated (L l t) = do+ case cast l :: Maybe SrcSpan of+ Just ss -> do+ newSpan <- uniqueSrcSpanT+ modifyAnnsT (\anns -> case Map.lookup (mkAnnKey (L ss t)) origAnns of+ Nothing -> anns+ Just an -> Map.insert (mkAnnKey (L newSpan t)) an anns)+ return $ fromJust $ cast $ L newSpan t+ Nothing -> return (L l t)++-- ---------------------------------------------------------------------++-- |If a list has been re-ordered or had items added, capture the new order in+-- the appropriate 'AnnSortKey' attached to the 'Annotation' for the list.+captureOrder :: [LocatedA b] -> AnnSortKey+captureOrder ls = AnnSortKey $ map (rs . getLocA) ls++-- ---------------------------------------------------------------------++captureMatchLineSpacing :: LHsDecl GhcPs -> LHsDecl GhcPs+captureMatchLineSpacing (L l (ValD x (FunBind a b (MG c (L d ms ) e) f)))+ = L l (ValD x (FunBind a b (MG c (L d ms') e) f))+ where+ ms' :: [LMatch GhcPs (LHsExpr GhcPs)]+ ms' = captureLineSpacing ms+captureMatchLineSpacing d = d++captureLineSpacing :: Monoid t+ => [LocatedAn t e] -> [GenLocated (SrcSpanAnn' (EpAnn t)) e]+captureLineSpacing [] = []+captureLineSpacing [d] = [d]+captureLineSpacing (de1:d2:ds) = de1:captureLineSpacing (d2':ds)+ where+ (l1,_) = ss2pos $ rs $ getLocA de1+ (l2,_) = ss2pos $ rs $ getLocA d2+ d2' = setEntryDP' d2 (deltaPos (l2-l1) 0)++-- ---------------------------------------------------------------------++captureTypeSigSpacing :: LHsDecl GhcPs -> LHsDecl GhcPs+captureTypeSigSpacing (L l (SigD x (TypeSig (EpAnn anc (AnnSig dc rs') cs) ns (HsWC xw ty))))+ = (L l (SigD x (TypeSig (EpAnn anc (AnnSig dc' rs') cs) ns (HsWC xw ty'))))+ where+ -- we want DPs for the distance from the end of the ns to the+ -- AnnDColon, and to the start of the ty+ AddEpAnn kw dca = dc+ rd = case last ns of+ L (SrcSpanAnn EpAnnNotUsed ll) _ -> realSrcSpan ll+ L (SrcSpanAnn (EpAnn anc' _ _) _) _ -> anchor anc' -- TODO MovedAnchor?+ -- DP (line, col) = ss2delta (ss2pos $ anchor $ getLoc lc) r+ dc' = case dca of+ EpaSpan r -> AddEpAnn kw (EpaDelta $ ss2delta (ss2posEnd rd) r)+ EpaDelta _ -> AddEpAnn kw dca++ -- ---------------------------------++ ty' :: LHsSigType GhcPs+ ty' = case ty of+ (L (SrcSpanAnn EpAnnNotUsed ll) b)+ -> let+ op = case dca of+ EpaSpan r -> MovedAnchor (ss2delta (ss2posEnd r) (realSrcSpan ll))+ EpaDelta _ -> MovedAnchor (SameLine 1)+ in (L (SrcSpanAnn (EpAnn (Anchor (realSrcSpan ll) op) mempty emptyComments) ll) b)+ (L (SrcSpanAnn (EpAnn (Anchor r op) a c) ll) b)+ -> let+ op' = case op of+ MovedAnchor _ -> op+ _ -> case dca of+ EpaSpan dcr -> MovedAnchor (ss2delta (ss2posEnd dcr) r)+ EpaDelta _ -> MovedAnchor (SameLine 1)+ in (L (SrcSpanAnn (EpAnn (Anchor r op') a c) ll) b)++captureTypeSigSpacing s = s++-- ---------------------------------------------------------------------++-- |Pure function to convert a 'LHsDecl' to a 'LHsBind'. This does+-- nothing to any annotations that may be attached to either of the elements.+-- It is used as a utility function in 'replaceDecls'+decl2Bind :: LHsDecl GhcPs -> [LHsBind GhcPs]+decl2Bind (L l (ValD _ s)) = [L l s]+decl2Bind _ = []++-- |Pure function to convert a 'LSig' to a 'LHsBind'. This does+-- nothing to any annotations that may be attached to either of the elements.+-- It is used as a utility function in 'replaceDecls'+decl2Sig :: LHsDecl GhcPs -> [LSig GhcPs]+decl2Sig (L l (SigD _ s)) = [L l s]+decl2Sig _ = []++-- ---------------------------------------------------------------------++-- |Convert a 'LSig' into a 'LHsDecl'+wrapSig :: LSig GhcPs -> LHsDecl GhcPs+wrapSig (L l s) = L l (SigD NoExtField s)++-- ---------------------------------------------------------------------++-- |Convert a 'LHsBind' into a 'LHsDecl'+wrapDecl :: LHsBind GhcPs -> LHsDecl GhcPs+wrapDecl (L l s) = L l (ValD NoExtField s)++-- ---------------------------------------------------------------------++-- |Create a simple 'Annotation' without comments, and attach it to the first+-- parameter.+addSimpleAnnT :: (Data a,Monad m)+ => Located a -> DeltaPos -> [(KeywordId, DeltaPos)] -> TransformT m ()+addSimpleAnnT ast dp kds = do+ let ann = annNone { annEntryDelta = dp+ , annsDP = kds+ }+ modifyAnnsT (Map.insert (mkAnnKey ast) ann)++-- ---------------------------------------------------------------------++-- |Add a trailing comma annotation, unless there is already one+addTrailingCommaT :: (Data a,Monad m) => Located a -> TransformT m ()+addTrailingCommaT ast = do+ modifyAnnsT (addTrailingComma ast (SameLine 0))++-- ---------------------------------------------------------------------++-- |Remove a trailing comma annotation, if there is one one+removeTrailingCommaT :: (Data a,Monad m) => Located a -> TransformT m ()+removeTrailingCommaT ast = do+ modifyAnnsT (removeTrailingComma ast)++-- ---------------------------------------------------------------------++-- |'Transform' monad version of 'getEntryDP'+getEntryDPT :: (Data a,Monad m) => Located a -> TransformT m DeltaPos+getEntryDPT ast = do+ anns <- getAnnsT+ return (getEntryDP anns ast)++-- ---------------------------------------------------------------------++-- |'Transform' monad version of 'getEntryDP'+setEntryDPT :: (Monad m) => LocatedA a -> DeltaPos -> TransformT m ()+setEntryDPT ast dp = do+ modifyAnnsT (setEntryDP ast dp)++-- ---------------------------------------------------------------------++-- |'Transform' monad version of 'transferEntryDP'+transferEntryDPT :: (Monad m) => LocatedA a -> LocatedA b -> TransformT m (LocatedA b)+transferEntryDPT _a b = do+ return b+ -- modifyAnnsT (transferEntryDP a b)++-- ---------------------------------------------------------------------++-- |'Transform' monad version of 'setPrecedingLinesDecl'+setPrecedingLinesDeclT :: (Monad m) => LHsDecl GhcPs -> Int -> Int -> TransformT m ()+setPrecedingLinesDeclT ld n c =+ modifyAnnsT (setPrecedingLinesDecl ld n c)++-- ---------------------------------------------------------------------++-- |'Transform' monad version of 'setPrecedingLines'+setPrecedingLinesT :: (Monad m) => LocatedA a -> Int -> Int -> TransformT m ()+setPrecedingLinesT ld n c =+ modifyAnnsT (setPrecedingLines ld n c)++-- ---------------------------------------------------------------------++-- | Left bias pair union+mergeAnns :: Anns -> Anns -> Anns+mergeAnns+ = Map.union++-- |Combine a list of annotations+mergeAnnList :: [Anns] -> Anns+mergeAnnList [] = error "mergeAnnList must have at lease one entry"+mergeAnnList (x:xs) = foldr mergeAnns x xs++-- ---------------------------------------------------------------------++-- |Unwrap a HsDecl and call setPrecedingLines on it+-- ++AZ++ TODO: get rid of this, it is a synonym only+setPrecedingLinesDecl :: LHsDecl GhcPs -> Int -> Int -> Anns -> Anns+setPrecedingLinesDecl ld n c ans = setPrecedingLines ld n c ans++-- ---------------------------------------------------------------------++-- | Adjust the entry annotations to provide an `n` line preceding gap+setPrecedingLines :: LocatedA a -> Int -> Int -> Anns -> Anns+setPrecedingLines ast n c anne = setEntryDP ast (deltaPos n c) anne++-- ---------------------------------------------------------------------++-- |Return the true entry 'DeltaPos' from the annotation for a given AST+-- element. This is the 'DeltaPos' ignoring any comments.+getEntryDP :: (Data a) => Anns -> Located a -> DeltaPos+getEntryDP anns ast =+ case Map.lookup (mkAnnKey ast) anns of+ Nothing -> SameLine 0+ Just ann -> annTrueEntryDelta ann++-- ---------------------------------------------------------------------++setEntryDPDecl :: LHsDecl GhcPs -> DeltaPos -> LHsDecl GhcPs+setEntryDPDecl decl@(L _ (ValD x (FunBind a b (MG c (L d ms ) e) f))) dp+ = L l' (ValD x (FunBind a b (MG c (L d ms') e) f))+ where+ L l' _ = setEntryDP' decl dp+ ms' :: [LMatch GhcPs (LHsExpr GhcPs)]+ ms' = case ms of+ [] -> []+ (m0':ms0) -> setEntryDP' m0' dp : ms0+setEntryDPDecl d dp = setEntryDP' d dp++-- ---------------------------------------------------------------------++-- |Set the true entry 'DeltaPos' from the annotation for a given AST+-- element. This is the 'DeltaPos' ignoring any comments.+-- setEntryDP' :: (Data a) => LocatedA a -> DeltaPos -> LocatedA a+setEntryDP' :: (Monoid t) => LocatedAn t a -> DeltaPos -> LocatedAn t a+setEntryDP' (L (SrcSpanAnn EpAnnNotUsed l) a) dp+ = L (SrcSpanAnn+ (EpAnn (Anchor (realSrcSpan l) (MovedAnchor dp)) mempty emptyComments)+ l) a+setEntryDP' (L (SrcSpanAnn (EpAnn (Anchor r _) an (EpaComments [])) l) a) dp+ = L (SrcSpanAnn+ (EpAnn (Anchor r (MovedAnchor dp)) an (EpaComments []))+ l) a+setEntryDP' (L (SrcSpanAnn (EpAnn (Anchor r _) an cs) l) a) dp+ = case sort (priorComments cs) of+ [] ->+ L (SrcSpanAnn+ (EpAnn (Anchor r (MovedAnchor dp)) an cs)+ l) a+ (L ca c:cs') ->+ L (SrcSpanAnn+ (EpAnn (Anchor r (MovedAnchor edp)) an cs'')+ l) a+ where+ cs'' = setPriorComments cs (L (Anchor (anchor ca) (MovedAnchor dp)) c:cs')+ lc = head $ reverse $ (L ca c:cs')+ delta = ss2delta (ss2pos $ anchor $ getLoc lc) r+ line = getDeltaLine delta+ col = deltaColumn delta+ -- TODO: this adjustment by 1 happens all over the place. Generalise it+ edp' = if line == 0 then SameLine col+ else DifferentLine line col+ edp = edp' `debug` ("setEntryDP' :" ++ showGhc (edp', (ss2pos $ anchor $ getLoc lc), r))++-- |Set the true entry 'DeltaPos' from the annotation for a given AST+-- element. This is the 'DeltaPos' ignoring any comments.+setEntryDP :: LocatedA a -> DeltaPos -> Anns -> Anns+setEntryDP _ast _dp anns = anns++-- ---------------------------------------------------------------------++addEpaLocationDelta :: LayoutStartCol -> RealSrcSpan -> EpaLocation -> EpaLocation+addEpaLocationDelta _off _anc (EpaDelta d) = EpaDelta d+addEpaLocationDelta off anc (EpaSpan r)+ = EpaDelta (adjustDeltaForOffset 0 off (ss2deltaEnd anc r))++-- Set the entry DP for an element coming after an existing keyword annotation+setEntryDPFromAnchor :: LayoutStartCol -> EpaLocation -> LocatedA t -> LocatedA t+setEntryDPFromAnchor _off (EpaDelta _) (L la a) = L la a+setEntryDPFromAnchor off (EpaSpan anc) ll@(L la _) = setEntryDP' ll dp'+ where+ r = case la of+ (SrcSpanAnn EpAnnNotUsed l) -> realSrcSpan l+ (SrcSpanAnn (EpAnn (Anchor r' _) _ _) _) -> r'+ dp' = adjustDeltaForOffset 0 off (ss2deltaEnd anc r)++-- ---------------------------------------------------------------------++-- |Take the annEntryDelta associated with the first item and associate it with the second.+-- Also transfer any comments occuring before it.+transferEntryDP :: (Monad m, Monoid t) => LocatedAn t a -> LocatedAn t b -> TransformT m (LocatedAn t b)+transferEntryDP (L (SrcSpanAnn EpAnnNotUsed l1) _) (L (SrcSpanAnn EpAnnNotUsed _) b) = do+ logTr $ "transferEntryDP': EpAnnNotUsed,EpAnnNotUsed"+ return (L (SrcSpanAnn EpAnnNotUsed l1) b)+transferEntryDP (L (SrcSpanAnn (EpAnn anc _an cs) _l1) _) (L (SrcSpanAnn EpAnnNotUsed l2) b) = do+ logTr $ "transferEntryDP': EpAnn,EpAnnNotUsed"+ return (L (SrcSpanAnn (EpAnn anc mempty cs) l2) b)+transferEntryDP (L (SrcSpanAnn (EpAnn anc1 _an1 cs1) _l1) _) (L (SrcSpanAnn (EpAnn _anc2 an2 cs2) l2) b) = do+ logTr $ "transferEntryDP': EpAnn,EpAnn"+ -- Problem: if the original had preceding comments, blindly+ -- transferring the location is not correct+ case priorComments cs1 of+ [] -> return (L (SrcSpanAnn (EpAnn anc1 an2 cs2) l2) b)+ -- TODO: what happens if the receiving side already has comments?+ (L anc _:_) -> do+ logDataWithAnnsTr "transferEntryDP':priorComments anc=" anc+ return (L (SrcSpanAnn (EpAnn anc an2 cs2) l2) b)+transferEntryDP (L (SrcSpanAnn EpAnnNotUsed _l1) _) (L (SrcSpanAnn (EpAnn anc2 an2 cs2) l2) b) = do+ logTr $ "transferEntryDP': EpAnnNotUsed,EpAnn"+ return (L (SrcSpanAnn (EpAnn anc2' an2 cs2) l2) b)+ where+ anc2' = case anc2 of+ Anchor _a op -> Anchor (realSrcSpan l2) op++-- |Take the annEntryDelta associated with the first item and associate it with the second.+-- Also transfer any comments occuring before it.+-- TODO: call transferEntryDP, and use pushDeclDP+transferEntryDP' :: (Monad m) => LHsDecl GhcPs -> LHsDecl GhcPs -> TransformT m (LHsDecl GhcPs)+transferEntryDP' la lb = do+ (L l2 b) <- transferEntryDP la lb+ return (L l2 (pushDeclDP b (SameLine 0)))+++pushDeclDP :: HsDecl GhcPs -> DeltaPos -> HsDecl GhcPs+pushDeclDP (ValD x (FunBind a b (MG c (L d ms ) e) f)) dp+ = ValD x (FunBind a b (MG c (L d' ms') e) f)+ where+ L d' _ = setEntryDP' (L d ms) dp+ ms' :: [LMatch GhcPs (LHsExpr GhcPs)]+ ms' = case ms of+ [] -> []+ (m0':ms0) -> setEntryDP' m0' dp : ms0+pushDeclDP d _dp = d++-- ---------------------------------------------------------------------++addTrailingComma :: (Data a) => Located a -> DeltaPos -> Anns -> Anns+addTrailingComma a dp anns =+ case Map.lookup (mkAnnKey a) anns of+ Nothing -> anns+ Just an ->+ case find isAnnComma (annsDP an) of+ Nothing -> Map.insert (mkAnnKey a) (an { annsDP = annsDP an ++ [(G AnnComma,dp)]}) anns+ Just _ -> anns+ where+ isAnnComma (G AnnComma,_) = True+ isAnnComma _ = False++-- ---------------------------------------------------------------------++removeTrailingComma :: (Data a) => Located a -> Anns -> Anns+removeTrailingComma a anns =+ case Map.lookup (mkAnnKey a) anns of+ Nothing -> anns+ Just an ->+ case find isAnnComma (annsDP an) of+ Nothing -> anns+ Just _ -> Map.insert (mkAnnKey a) (an { annsDP = filter (not.isAnnComma) (annsDP an) }) anns+ where+ isAnnComma (G AnnComma,_) = True+ isAnnComma _ = False++-- ---------------------------------------------------------------------++balanceCommentsList :: (Monad m) => [LHsDecl GhcPs] -> TransformT m [LHsDecl GhcPs]+balanceCommentsList [] = return []+balanceCommentsList [x] = return [x]+balanceCommentsList (a:b:ls) = do+ (a',b') <- balanceComments a b+ r <- balanceCommentsList (b':ls)+ return (a':r)++-- |The relatavise phase puts all comments appearing between the end of one AST+-- item and the beginning of the next as 'annPriorComments' for the second one.+-- This function takes two adjacent AST items and moves any 'annPriorComments'+-- from the second one to the 'annFollowingComments' of the first if they belong+-- to it instead. This is typically required before deleting or duplicating+-- either of the AST elements.+balanceComments :: (Monad m)+ => LHsDecl GhcPs -> LHsDecl GhcPs+ -> TransformT m (LHsDecl GhcPs, LHsDecl GhcPs)+balanceComments first second = do+ -- ++AZ++ : replace the nested casts with appropriate gmapM+ -- logTr $ "balanceComments entered"+ -- logDataWithAnnsTr "first" first+ case first of+ (L l (ValD x fb@(FunBind{}))) -> do+ (L l' fb',second') <- balanceCommentsFB (L l fb) second+ return (L l' (ValD x fb'), second')+ _ -> balanceComments' first second++-- |Once 'balanceComments' has been called to move trailing comments to a+-- 'FunBind', these need to be pushed down from the top level to the last+-- 'Match' if that 'Match' needs to be manipulated.+balanceCommentsFB :: (Monad m)+ => LHsBind GhcPs -> LocatedA b -> TransformT m (LHsBind GhcPs, LocatedA b)+balanceCommentsFB (L lf (FunBind x n (MG mx (L lm matches) o) t)) second = do+ logTr $ "balanceCommentsFB entered: " ++ showGhc (ss2range $ locA lf)+ matches' <- balanceCommentsList' matches+ let (m,ms) = case reverse matches' of+ (m':ms') -> (m',ms')+ _ -> error "balanceCommentsFB"+ (m',second') <- balanceComments' m second+ m'' <- balanceCommentsMatch m'+ logTr $ "balanceCommentsMatch done"+ return (L lf (FunBind x n (MG mx (L lm (reverse (m'':ms))) o) t), second')+balanceCommentsFB f s = balanceComments' f s++-- | Move comments on the same line as the end of the match into the+-- GRHS, prior to the binds+balanceCommentsMatch :: (Monad m)+ => LMatch GhcPs (LHsExpr GhcPs) -> TransformT m (LMatch GhcPs (LHsExpr GhcPs))+balanceCommentsMatch (L l (Match am mctxt pats (GRHSs xg grhss binds))) = do+ logTr $ "balanceCommentsMatch: (loc1)=" ++ showGhc (ss2range (locA l))+ logTr $ "balanceCommentsMatch: (move',stay')=" ++ showAst (move',stay')+ logTr $ "balanceCommentsMatch: (logInfo)=" ++ showAst (logInfo)+ logTr $ "balanceCommentsMatch: (loc1)=" ++ showGhc (ss2range (locA l))+ logTr $ "balanceCommentsMatch: (anc1,cs1f)=" ++ showAst (anc1,cs1f)+ logTr $ "balanceCommentsMatch: (l'', grhss')=" ++ showAst (l'', grhss')+ return (L l'' (Match am mctxt pats (GRHSs xg grhss' binds')))+ where+ simpleBreak (r,_) = r /= 0+ (SrcSpanAnn an1 _loc1) = l+ anc1 = addCommentOrigDeltas $ epAnnComments an1+ cs1f = getFollowingComments anc1+ (move',stay') = break simpleBreak (trailingCommentsDeltas (anchorFromLocatedA (L l ())) cs1f)+ move = map snd move'+ stay = map snd stay'+ (l'', grhss', binds', logInfo)+ = case reverse grhss of+ [] -> (l, [], binds, (EpaComments [], SrcSpanAnn EpAnnNotUsed noSrcSpan))+ (L lg g@(GRHS EpAnnNotUsed _grs _rhs):gs) -> (l, reverse (L lg g:gs), binds, (EpaComments [], SrcSpanAnn EpAnnNotUsed noSrcSpan))+ (L lg (GRHS ag grs rhs):gs) ->+ let+ anc1' = setFollowingComments anc1 stay+ an1' = setCommentsSrcAnn l anc1'++ -- ---------------------------------+ (moved,bindsm) = pushTrailingComments WithWhere (EpaCommentsBalanced [] move) binds+ -- ---------------------------------++ (EpAnn anc an lgc) = ag+ lgc' = splitComments (realSrcSpan lg) $ addCommentOrigDeltas lgc+ ag' = if moved+ then EpAnn anc an lgc'+ else EpAnn anc an (lgc' <> (EpaCommentsBalanced [] move))+ -- ag' = EpAnn anc an lgc'++ in (an1', (reverse $ (L lg (GRHS ag' grs rhs):gs)), bindsm, (anc1',an1'))++pushTrailingComments :: WithWhere -> EpAnnComments -> HsLocalBinds GhcPs -> (Bool, HsLocalBinds GhcPs)+pushTrailingComments _ _cs b@EmptyLocalBinds{} = (False, b)+pushTrailingComments _ _cs (HsIPBinds _ _) = error "TODO: pushTrailingComments:HsIPBinds"+pushTrailingComments w cs lb@(HsValBinds an _)+ = (True, HsValBinds an' vb)+ where+ (decls, _, _ws1) = runTransform mempty (hsDeclsValBinds lb)+ (an', decls') = case reverse decls of+ [] -> (addCommentsToEpAnn (spanHsLocaLBinds lb) an cs, decls)+ (L la d:ds) -> (an, L (addCommentsToSrcAnn la cs) d:ds)+ (vb,_ws2) = case runTransform mempty (replaceDeclsValbinds w lb decls') of+ ((HsValBinds _ vb'), _, ws2') -> (vb', ws2')+ _ -> (ValBinds NoAnnSortKey emptyBag [], [])+++balanceCommentsList' :: (Monad m) => [LocatedA a] -> TransformT m [LocatedA a]+balanceCommentsList' [] = return []+balanceCommentsList' [x] = return [x]+balanceCommentsList' (a:b:ls) = do+ logTr $ "balanceCommentsList' entered"+ (a',b') <- balanceComments' a b+ r <- balanceCommentsList' (b':ls)+ return (a':r)++-- |Prior to moving an AST element, make sure any trailing comments belonging to+-- it are attached to it, and not the following element. Of necessity this is a+-- heuristic process, to be tuned later. Possibly a variant should be provided+-- with a passed-in decision function.+-- The initial situation is that all comments for a given anchor appear as prior comments+-- Many of these should in fact be following comments for the previous anchor+balanceComments' :: (Monad m) => LocatedA a -> LocatedA b -> TransformT m (LocatedA a, LocatedA b)+balanceComments' la1 la2 = do+ logTr $ "balanceComments': (loc1,loc2)=" ++ showGhc (ss2range loc1,ss2range loc2)+ logTr $ "balanceComments': (anchorFromLocatedA la1)=" ++ showGhc (anchorFromLocatedA la1)+ logTr $ "balanceComments': (sort cs2b)=" ++ showAst (sort cs2b)+ logTr $ "balanceComments': (move',stay')=" ++ showAst (move',stay')+ logTr $ "balanceComments': (move'',stay'')=" ++ showAst (move'',stay'')+ logTr $ "balanceComments': (move,stay)=" ++ showAst (move,stay)+ return (la1', la2')+ where+ simpleBreak n (r,_) = r > n+ L (SrcSpanAnn an1 loc1) f = la1+ L (SrcSpanAnn an2 loc2) s = la2+ anc1 = addCommentOrigDeltas $ epAnnComments an1+ anc2 = addCommentOrigDeltas $ epAnnComments an2+ cs1f = getFollowingComments anc1+ cs2b = priorComments anc2+ (stay'',move') = break (simpleBreak 1) (priorCommentsDeltas (anchorFromLocatedA la2) cs2b)+ -- Need to also check for comments more closely attached to la1,+ -- ie trailing on the same line+ (move'',stay') = break (simpleBreak 0) (trailingCommentsDeltas (anchorFromLocatedA la1) (map snd stay''))+ move = map snd (move'' ++ move')+ stay = map snd stay'+ cs1 = setFollowingComments anc1 (sort $ cs1f ++ move)+ cs2 = setPriorComments anc2 stay++ an1' = setCommentsSrcAnn (getLoc la1) cs1+ an2' = setCommentsSrcAnn (getLoc la2) cs2+ la1' = L an1' f+ la2' = L an2' s++-- | Like commentsDeltas, but calculates the delta from the end of the anchor, not the start+trailingCommentsDeltas :: RealSrcSpan -> [LEpaComment]+ -> [(Int, LEpaComment)]+trailingCommentsDeltas _ [] = []+trailingCommentsDeltas anc (la@(L l _):las)+ = deltaComment anc la : trailingCommentsDeltas (anchor l) las+ where+ deltaComment anc' (L loc c) = (abs(ll - al), L loc c)+ where+ (al,_) = ss2posEnd anc'+ (ll,_) = ss2pos (anchor loc)++-- AZ:TODO: this is identical to commentsDeltas+priorCommentsDeltas :: RealSrcSpan -> [LEpaComment]+ -> [(Int, LEpaComment)]+priorCommentsDeltas anc cs = go anc (reverse $ sort cs)+ where+ go :: RealSrcSpan -> [LEpaComment] -> [(Int, LEpaComment)]+ go _ [] = []+ go anc' (la@(L l _):las) = deltaComment anc' la : go (anchor l) las++ deltaComment :: RealSrcSpan -> LEpaComment -> (Int, LEpaComment)+ deltaComment anc' (L loc c) = (abs(ll - al), L loc c)+ where+ (al,_) = ss2pos anc'+ (ll,_) = ss2pos (anchor loc)+++-- | Split comments into ones occuring before the end of the reference+-- span, and those after it.+splitComments :: RealSrcSpan -> EpAnnComments -> EpAnnComments+splitComments p (EpaComments cs) = cs'+ where+ cmp (L (Anchor l _) _) = ss2pos l < ss2posEnd p+ (before, after) = break cmp cs+ cs' = case after of+ [] -> EpaComments cs+ _ -> EpaCommentsBalanced before after+splitComments p (EpaCommentsBalanced cs ts) = EpaCommentsBalanced cs' ts'+ where+ cmp (L (Anchor l _) _) = ss2pos l < ss2posEnd p+ (before, after) = break cmp cs+ cs' = before+ ts' = after <> ts++-- | A GHC comment includes the span of the preceding (non-comment)+-- token. Takes an original list of comments, and converts the+-- 'Anchor's to have a have a `MovedAnchor` operation based on the+-- original locations.+commentOrigDeltas :: [LEpaComment] -> [LEpaComment]+commentOrigDeltas [] = []+commentOrigDeltas lcs = map commentOrigDelta lcs++addCommentOrigDeltas :: EpAnnComments -> EpAnnComments+addCommentOrigDeltas (EpaComments cs) = EpaComments (commentOrigDeltas cs)+addCommentOrigDeltas (EpaCommentsBalanced pcs fcs)+ = EpaCommentsBalanced (commentOrigDeltas pcs) (commentOrigDeltas fcs)++addCommentOrigDeltasAnn :: (EpAnn a) -> (EpAnn a)+addCommentOrigDeltasAnn EpAnnNotUsed = EpAnnNotUsed+addCommentOrigDeltasAnn (EpAnn e a cs) = EpAnn e a (addCommentOrigDeltas cs)++-- TODO: this is replicating functionality in ExactPrint. Sort out the+-- import loop`+anchorFromLocatedA :: LocatedA a -> RealSrcSpan+anchorFromLocatedA (L (SrcSpanAnn an loc) _)+ = case an of+ EpAnnNotUsed -> realSrcSpan loc+ (EpAnn anc _ _) -> anchor anc++-- | A GHC comment includes the span of the preceding token. Take an+-- original comment, and convert the 'Anchor to have a have a+-- `MovedAnchor` operation based on the original location, only if it+-- does not already have one.+commentOrigDelta :: LEpaComment -> LEpaComment+-- commentOrigDelta c@(L (GHC.Anchor _ (GHC.MovedAnchor _)) _) = c+commentOrigDelta (L (GHC.Anchor la _) (GHC.EpaComment t pp))+ = (L (GHC.Anchor la op) (GHC.EpaComment t pp))+ where+ (r,c) = ss2posEnd pp+ op' = if r == 0+ then MovedAnchor (ss2delta (r,c+1) la)+ else MovedAnchor (ss2delta (r,c) la)+ op = if t == EpaEofComment && op' == MovedAnchor (SameLine 0)+ then MovedAnchor (DifferentLine 1 0)+ else op'++-- ---------------------------------------------------------------------++balanceSameLineComments :: (Monad m)+ => LMatch GhcPs (LHsExpr GhcPs) -> TransformT m (LMatch GhcPs (LHsExpr GhcPs))+balanceSameLineComments (L la (Match anm mctxt pats (GRHSs x grhss lb))) = do+ logTr $ "balanceSameLineComments: (la)=" ++ showGhc (ss2range $ locA la)+ logTr $ "balanceSameLineComments: [logInfo]=" ++ showAst logInfo+ return (L la' (Match anm mctxt pats (GRHSs x grhss' lb)))+ where+ simpleBreak n (r,_) = r > n+ (la',grhss', logInfo) = case reverse grhss of+ [] -> (la,grhss,[])+ (L lg g@(GRHS EpAnnNotUsed _gs _rhs):grs) -> (la,reverse $ (L lg g):grs,[])+ (L lg (GRHS ga gs rhs):grs) -> (la'',reverse $ (L lg (GRHS ga' gs rhs)):grs,[(gac,(csp,csf))])+ where+ (SrcSpanAnn an1 _loc1) = la+ anc1 = addCommentOrigDeltas $ epAnnComments an1+ (EpAnn anc an _) = ga :: EpAnn GrhsAnn+ (csp,csf) = case anc1 of+ EpaComments cs -> ([],cs)+ EpaCommentsBalanced p f -> (p,f)+ (move',stay') = break (simpleBreak 0) (trailingCommentsDeltas (anchor anc) csf)+ move = map snd move'+ stay = map snd stay'+ cs1 = EpaCommentsBalanced csp stay++ gac = addCommentOrigDeltas $ epAnnComments ga+ gfc = getFollowingComments gac+ gac' = setFollowingComments gac (sort $ gfc ++ move)+ ga' = (EpAnn anc an gac')++ an1' = setCommentsSrcAnn la cs1+ la'' = an1'++-- ---------------------------------------------------------------------+++-- |After moving an AST element, make sure any comments that may belong+-- with the following element in fact do. Of necessity this is a heuristic+-- process, to be tuned later. Possibly a variant should be provided with a+-- passed-in decision function.+balanceTrailingComments :: (Monad m) => (Data a,Data b) => Located a -> Located b+ -> TransformT m [(Comment, DeltaPos)]+balanceTrailingComments first second = do+ let+ k1 = mkAnnKey first+ k2 = mkAnnKey second+ moveComments p ans = (ans',move)+ where+ an1 = gfromJust "balanceTrailingComments k1" $ Map.lookup k1 ans+ an2 = gfromJust "balanceTrailingComments k2" $ Map.lookup k2 ans+ cs1f = annFollowingComments an1+ (move,stay) = break p cs1f+ an1' = an1 { annFollowingComments = stay }+ ans' = Map.insert k1 an1' $ Map.insert k2 an2 ans++ simpleBreak (_,SameLine _) = False+ simpleBreak (_,DifferentLine _ _) = True++ ans <- getAnnsT+ let (ans',mov) = moveComments simpleBreak ans+ putAnnsT ans'+ return mov++-- ---------------------------------------------------------------------++-- ++AZ++ TODO: This needs to be renamed/reworked, based on what it actually gets used for+-- |Move any 'annFollowingComments' values from the 'Annotation' associated to+-- the first parameter to that of the second.+moveTrailingComments :: (Data a,Data b)+ => Located a -> Located b -> Transform ()+moveTrailingComments first second = do+ let+ k1 = mkAnnKey first+ k2 = mkAnnKey second+ moveComments ans = ans'+ where+ an1 = gfromJust "moveTrailingComments k1" $ Map.lookup k1 ans+ an2 = gfromJust "moveTrailingComments k2" $ Map.lookup k2 ans+ cs1f = annFollowingComments an1+ cs2f = annFollowingComments an2+ an1' = an1 { annFollowingComments = [] }+ an2' = an2 { annFollowingComments = cs1f ++ cs2f }+ ans' = Map.insert k1 an1' $ Map.insert k2 an2' ans++ modifyAnnsT moveComments++-- ---------------------------------------------------------------------++anchorEof :: ParsedSource -> ParsedSource+anchorEof (L l m@(HsModule an _lo _mn _exps _imps _decls _ _)) = L l (m { hsmodAnn = an' })+ where+ an' = addCommentOrigDeltasAnn an++-- ---------------------------------------------------------------------++-- | Take an anchor and a preceding location, and generate an+-- equivalent one with a 'MovedAnchor' delta.+deltaAnchor :: Anchor -> RealSrcSpan -> Anchor+deltaAnchor (Anchor anc _) ss = Anchor anc (MovedAnchor dp)+ where+ dp = ss2delta (ss2pos anc) ss++-- ---------------------------------------------------------------------++-- | Create a @SrcSpanAnn@ with a @MovedAnchor@ operation using the+-- given @DeltaPos@.+noAnnSrcSpanDP :: (Monoid ann) => SrcSpan -> DeltaPos -> SrcSpanAnn' (EpAnn ann)+noAnnSrcSpanDP l dp+ = SrcSpanAnn (EpAnn (Anchor (realSrcSpan l) (MovedAnchor dp)) mempty emptyComments) l++noAnnSrcSpanDP0 :: (Monoid ann) => SrcSpan -> SrcSpanAnn' (EpAnn ann)+noAnnSrcSpanDP0 l = noAnnSrcSpanDP l (SameLine 0)++noAnnSrcSpanDP1 :: (Monoid ann) => SrcSpan -> SrcSpanAnn' (EpAnn ann)+noAnnSrcSpanDP1 l = noAnnSrcSpanDP l (SameLine 1)++noAnnSrcSpanDPn :: (Monoid ann) => SrcSpan -> Int -> SrcSpanAnn' (EpAnn ann)+noAnnSrcSpanDPn l s = noAnnSrcSpanDP l (SameLine s)++d0 :: EpaLocation+d0 = EpaDelta $ SameLine 0++d1 :: EpaLocation+d1 = EpaDelta $ SameLine 1++dn :: Int -> EpaLocation+dn n = EpaDelta $ SameLine n++m0 :: AnchorOperation+m0 = MovedAnchor $ SameLine 0++m1 :: AnchorOperation+m1 = MovedAnchor $ SameLine 1++mn :: Int -> AnchorOperation+mn n = MovedAnchor $ SameLine n++addComma :: SrcSpanAnnA -> SrcSpanAnnA+addComma (SrcSpanAnn EpAnnNotUsed l)+ = (SrcSpanAnn (EpAnn (spanAsAnchor l) (AnnListItem [AddCommaAnn d0]) emptyComments) l)+addComma (SrcSpanAnn (EpAnn anc (AnnListItem as) cs) l)+ = (SrcSpanAnn (EpAnn anc (AnnListItem (AddCommaAnn d0:as)) cs) l)++-- ---------------------------------------------------------------------++-- | Insert a declaration into an AST element having sub-declarations+-- (@HasDecls@) according to the given location function.+insertAt :: (HasDecls ast)+ => (LHsDecl GhcPs+ -> [LHsDecl GhcPs]+ -> [LHsDecl GhcPs])+ -> ast+ -> LHsDecl GhcPs+ -> Transform ast+insertAt f t decl = do+ oldDecls <- hsDecls t+ replaceDecls t (f decl oldDecls)++-- |Insert a declaration at the beginning or end of the subdecls of the given+-- AST item+insertAtStart, insertAtEnd :: (HasDecls ast)+ => ast+ -> LHsDecl GhcPs+ -> Transform ast++insertAtStart = insertAt (:)+insertAtEnd = insertAt (\x xs -> xs ++ [x])++-- |Insert a declaration at a specific location in the subdecls of the given+-- AST item+insertAfter, insertBefore :: (HasDecls (LocatedA ast))+ => LocatedA old+ -> LocatedA ast+ -> LHsDecl GhcPs+ -> Transform (LocatedA ast)+insertAfter (getLocA -> k) = insertAt findAfter+ where+ findAfter x xs =+ case span (\(L l _) -> locA l /= k) xs of+ ([],[]) -> [x]+ (fs,[]) -> fs++[x]+ (fs, b:bs) -> fs ++ (b : x : bs)+ -- let (fs, b:bs) = span (\(L l _) -> locA l /= k) xs+ -- in fs ++ (b : x : bs)+insertBefore (getLocA -> k) = insertAt findBefore+ where+ findBefore x xs =+ let (fs, bs) = span (\(L l _) -> locA l /= k) xs+ in fs ++ (x : bs)++-- =====================================================================+-- start of HasDecls instances+-- =====================================================================++-- |Provide a means to get and process the immediate child declartions of a+-- given AST element.+class (Data t) => HasDecls t where+-- ++AZ++: TODO: add tests to confirm that hsDecls followed by replaceDecls is idempotent++ -- | Return the 'HsDecl's that are directly enclosed in the+ -- given syntax phrase. They are always returned in the wrapped 'HsDecl'+ -- form, even if orginating in local decls. This is safe, as annotations+ -- never attach to the wrapper, only to the wrapped item.+ hsDecls :: (Monad m) => t -> TransformT m [LHsDecl GhcPs]++ -- | Replace the directly enclosed decl list by the given+ -- decl list. Runs in the 'Transform' monad to be able to update list order+ -- annotations, and rebalance comments and other layout changes as needed.+ --+ -- For example, a call on replaceDecls for a wrapped 'FunBind' having no+ -- where clause will convert+ --+ -- @+ -- -- |This is a function+ -- foo = x -- comment1+ -- @+ -- in to+ --+ -- @+ -- -- |This is a function+ -- foo = x -- comment1+ -- where+ -- nn = 2+ -- @+ replaceDecls :: (Monad m) => t -> [LHsDecl GhcPs] -> TransformT m t++-- ---------------------------------------------------------------------++instance HasDecls ParsedSource where+ hsDecls (L _ (HsModule _ _lo _mn _exps _imps decls _ _)) = return decls+ replaceDecls (L l (HsModule a lo mname exps imps _decls deps haddocks)) decls+ = do+ logTr "replaceDecls LHsModule"+ -- modifyAnnsT (captureOrder m decls)+ return (L l (HsModule a lo mname exps imps decls deps haddocks))++-- ---------------------------------------------------------------------++instance HasDecls (LocatedA (Match GhcPs (LocatedA (HsExpr GhcPs)))) where+ hsDecls (L _ (Match _ _ _ (GRHSs _ _ lb))) = hsDeclsValBinds lb++ replaceDecls (L l (Match xm c p (GRHSs xr rhs binds))) []+ = do+ logTr "replaceDecls LMatch empty decls"+ binds'' <- replaceDeclsValbinds WithoutWhere binds []+ return (L l (Match xm c p (GRHSs xr rhs binds'')))++ replaceDecls m@(L l (Match xm c p (GRHSs xr rhs binds))) newBinds+ = do+ logTr "replaceDecls LMatch nonempty decls"+ -- Need to throw in a fresh where clause if the binds were empty,+ -- in the annotations.+ (l', rhs') <- case binds of+ EmptyLocalBinds{} -> do+ logTr $ "replaceDecls LMatch empty binds"+ modifyAnnsT (setPrecedingLines (ghead "LMatch.replaceDecls" newBinds) 1 4)++ -- only move the comment if the original where clause was empty.+ -- toMove <- balanceTrailingComments m m+ -- insertCommentBefore (mkAnnKey m) toMove (matchEpAnn AnnWhere)+ -- TODO: move trailing comments on the same line to before the binds+ logDataWithAnnsTr "Match.replaceDecls:balancing comments:m" m+ L l' m' <- balanceSameLineComments m+ logDataWithAnnsTr "Match.replaceDecls:(m1')" (L l' m')+ return (l', grhssGRHSs $ m_grhss m')+ _ -> return (l, rhs)+ binds'' <- replaceDeclsValbinds WithWhere binds newBinds+ logDataWithAnnsTr "Match.replaceDecls:binds'" binds''+ return (L l' (Match xm c p (GRHSs xr rhs' binds'')))++-- ---------------------------------------------------------------------++instance HasDecls (LocatedA (HsExpr GhcPs)) where+ hsDecls (L _ (HsLet _ decls _ex)) = hsDeclsValBinds decls+ hsDecls _ = return []++ replaceDecls (L ll (HsLet x binds ex)) newDecls+ = do+ logTr "replaceDecls HsLet"+ let lastAnc = realSrcSpan $ spanHsLocaLBinds binds+ -- TODO: may be an intervening comment, take account for lastAnc+ let (x', ex',newDecls') = case x of+ EpAnnNotUsed -> (x, ex, newDecls)+ (EpAnn a (AnnsLet l i) cs) ->+ let+ off = case l of+ (EpaSpan r) -> LayoutStartCol $ snd $ ss2pos r+ (EpaDelta (SameLine _)) -> LayoutStartCol 0+ (EpaDelta (DifferentLine _ c)) -> LayoutStartCol c+ ex'' = setEntryDPFromAnchor off i ex+ newDecls'' = case newDecls of+ [] -> newDecls+ (d:ds) -> setEntryDPDecl d (SameLine 0) : ds+ in ( EpAnn a (AnnsLet l (addEpaLocationDelta off lastAnc i)) cs+ , ex''+ , newDecls'')+ binds' <- replaceDeclsValbinds WithoutWhere binds newDecls'+ return (L ll (HsLet x' binds' ex'))++ -- TODO: does this make sense? Especially as no hsDecls for HsPar+ replaceDecls (L l (HsPar x e)) newDecls+ = do+ logTr "replaceDecls HsPar"+ e' <- replaceDecls e newDecls+ return (L l (HsPar x e'))+ replaceDecls old _new = error $ "replaceDecls (LHsExpr GhcPs) undefined for:" ++ showGhc old++-- ---------------------------------------------------------------------++-- | Extract the immediate declarations for a 'PatBind' wrapped in a 'ValD'. This+-- cannot be a member of 'HasDecls' because a 'FunBind' is not idempotent+-- for 'hsDecls' \/ 'replaceDecls'. 'hsDeclsPatBindD' \/ 'replaceDeclsPatBindD' is+-- idempotent.+hsDeclsPatBindD :: (Monad m) => LHsDecl GhcPs -> TransformT m [LHsDecl GhcPs]+hsDeclsPatBindD (L l (ValD _ d)) = hsDeclsPatBind (L l d)+hsDeclsPatBindD x = error $ "hsDeclsPatBindD called for:" ++ showGhc x++-- | Extract the immediate declarations for a 'PatBind'. This+-- cannot be a member of 'HasDecls' because a 'FunBind' is not idempotent+-- for 'hsDecls' \/ 'replaceDecls'. 'hsDeclsPatBind' \/ 'replaceDeclsPatBind' is+-- idempotent.+hsDeclsPatBind :: (Monad m) => LHsBind GhcPs -> TransformT m [LHsDecl GhcPs]+hsDeclsPatBind (L _ (PatBind _ _ (GRHSs _ _grhs lb) _)) = hsDeclsValBinds lb+hsDeclsPatBind x = error $ "hsDeclsPatBind called for:" ++ showGhc x++-- -------------------------------------++-- | Replace the immediate declarations for a 'PatBind' wrapped in a 'ValD'. This+-- cannot be a member of 'HasDecls' because a 'FunBind' is not idempotent+-- for 'hsDecls' \/ 'replaceDecls'. 'hsDeclsPatBindD' \/ 'replaceDeclsPatBindD' is+-- idempotent.+replaceDeclsPatBindD :: (Monad m) => LHsDecl GhcPs -> [LHsDecl GhcPs]+ -> TransformT m (LHsDecl GhcPs)+replaceDeclsPatBindD (L l (ValD x d)) newDecls = do+ (L _ d') <- replaceDeclsPatBind (L l d) newDecls+ return (L l (ValD x d'))+replaceDeclsPatBindD x _ = error $ "replaceDeclsPatBindD called for:" ++ showGhc x++-- | Replace the immediate declarations for a 'PatBind'. This+-- cannot be a member of 'HasDecls' because a 'FunBind' is not idempotent+-- for 'hsDecls' \/ 'replaceDecls'. 'hsDeclsPatBind' \/ 'replaceDeclsPatBind' is+-- idempotent.+replaceDeclsPatBind :: (Monad m) => LHsBind GhcPs -> [LHsDecl GhcPs]+ -> TransformT m (LHsBind GhcPs)+replaceDeclsPatBind (L l (PatBind x a (GRHSs xr rhss binds) b)) newDecls+ = do+ logTr "replaceDecls PatBind"+ -- Need to throw in a fresh where clause if the binds were empty,+ -- in the annotations.+ case binds of+ EmptyLocalBinds{} -> do+ let+ addWhere _mkds =+ error "TBD"+ modifyAnnsT addWhere+ modifyAnnsT (setPrecedingLines (ghead "LMatch.replaceDecls" newDecls) 1 4)++ _ -> return ()++ -- modifyAnnsT (captureOrderAnnKey (mkAnnKey p) newDecls)+ binds'' <- replaceDeclsValbinds WithWhere binds newDecls+ -- let binds' = L (getLoc binds) binds''+ return (L l (PatBind x a (GRHSs xr rhss binds'') b))+replaceDeclsPatBind x _ = error $ "replaceDeclsPatBind called for:" ++ showGhc x++-- ---------------------------------------------------------------------++instance HasDecls (LocatedA (Stmt GhcPs (LocatedA (HsExpr GhcPs)))) where+ hsDecls (L _ (LetStmt _ lb)) = hsDeclsValBinds lb+ hsDecls (L _ (LastStmt _ e _ _)) = hsDecls e+ hsDecls (L _ (BindStmt _ _pat e)) = hsDecls e+ hsDecls (L _ (BodyStmt _ e _ _)) = hsDecls e+ hsDecls _ = return []++ replaceDecls (L l (LetStmt x lb)) newDecls+ = do+ -- modifyAnnsT (captureOrder s newDecls)+ lb'' <- replaceDeclsValbinds WithWhere lb newDecls+ -- let lb' = L (getLoc lb) lb''+ return (L l (LetStmt x lb''))+ replaceDecls (L l (LastStmt x e d se)) newDecls+ = do+ e' <- replaceDecls e newDecls+ return (L l (LastStmt x e' d se))+ replaceDecls (L l (BindStmt x pat e)) newDecls+ = do+ e' <- replaceDecls e newDecls+ return (L l (BindStmt x pat e'))++ replaceDecls (L l (BodyStmt x e a b)) newDecls+ = do+ e' <- replaceDecls e newDecls+ return (L l (BodyStmt x e' a b))+ replaceDecls x _newDecls = return x++-- =====================================================================+-- end of HasDecls instances+-- =====================================================================++-- ---------------------------------------------------------------------++-- |Do a transformation on an AST fragment by providing a function to process+-- the general case and one specific for a 'LHsBind'. This is required+-- because a 'FunBind' may have multiple 'Match' items, so we cannot+-- gurantee that 'replaceDecls' after 'hsDecls' is idempotent.+hasDeclsSybTransform :: (Data t2,Monad m)+ => (forall t. HasDecls t => t -> m t)+ -- ^Worker function for the general case+ -> (LHsBind GhcPs -> m (LHsBind GhcPs))+ -- ^Worker function for FunBind/PatBind+ -> t2 -- ^Item to be updated+ -> m t2+hasDeclsSybTransform workerHasDecls workerBind t = trf t+ where+ trf = mkM parsedSource+ `extM` lmatch+ `extM` lexpr+ `extM` lstmt+ `extM` lhsbind+ `extM` lvald++ parsedSource (p::ParsedSource) = workerHasDecls p++ lmatch (lm::LMatch GhcPs (LHsExpr GhcPs))+ = workerHasDecls lm++ lexpr (le::LHsExpr GhcPs)+ = workerHasDecls le++ lstmt (d::LStmt GhcPs (LHsExpr GhcPs))+ = workerHasDecls d++ lhsbind (b@(L _ FunBind{}):: LHsBind GhcPs)+ = workerBind b+ lhsbind b@(L _ PatBind{})+ = workerBind b+ lhsbind x = return x++ lvald (L l (ValD x d)) = do+ (L _ d') <- lhsbind (L l d)+ return (L l (ValD x d'))+ lvald x = return x++-- ---------------------------------------------------------------------++-- |A 'FunBind' wraps up one or more 'Match' items. 'hsDecls' cannot+-- return anything for these as there is not meaningful 'replaceDecls' for it.+-- This function provides a version of 'hsDecls' that returns the 'FunBind'+-- decls too, where they are needed for analysis only.+hsDeclsGeneric :: (Data t,Monad m) => t -> TransformT m [LHsDecl GhcPs]+hsDeclsGeneric t = q t+ where+ q = return []+ `mkQ` parsedSource+ `extQ` lmatch+ `extQ` lexpr+ `extQ` lstmt+ `extQ` lhsbind+ `extQ` lhsbindd+ `extQ` llocalbinds+ `extQ` localbinds++ parsedSource (p::ParsedSource) = hsDecls p++ lmatch (lm::LMatch GhcPs (LHsExpr GhcPs)) = hsDecls lm++ lexpr (le::LHsExpr GhcPs) = hsDecls le++ lstmt (d::LStmt GhcPs (LHsExpr GhcPs)) = hsDecls d++ -- ---------------------------------++ lhsbind :: (Monad m) => LHsBind GhcPs -> TransformT m [LHsDecl GhcPs]+ lhsbind (L _ (FunBind _ _ (MG _ (L _ matches) _) _)) = do+ dss <- mapM hsDecls matches+ return (concat dss)+ lhsbind p@(L _ (PatBind{})) = do+ hsDeclsPatBind p+ lhsbind _ = return []++ -- ---------------------------------++ lhsbindd (L l (ValD _ d)) = lhsbind (L l d)+ lhsbindd _ = return []++ -- ---------------------------------++ llocalbinds :: (Monad m) => Located (HsLocalBinds GhcPs) -> TransformT m [LHsDecl GhcPs]+ llocalbinds (L _ ds) = localbinds ds++ -- ---------------------------------++ localbinds :: (Monad m) => HsLocalBinds GhcPs -> TransformT m [LHsDecl GhcPs]+ localbinds d = hsDeclsValBinds d++-- ---------------------------------------------------------------------++-- |Look up the annotated order and sort the decls accordingly+-- TODO:AZ: this should be pure+orderedDecls :: (Monad m)+ => AnnSortKey -> [LHsDecl GhcPs] -> TransformT m [LHsDecl GhcPs]+orderedDecls sortKey decls = do+ case sortKey of+ NoAnnSortKey -> do+ -- return decls+ return $ sortBy (\a b -> compare (realSrcSpan $ getLocA a) (realSrcSpan $ getLocA b)) decls+ AnnSortKey keys -> do+ let ds = map (\s -> (rs $ getLocA s,s)) decls+ ordered = map snd $ orderByKey ds keys+ return ordered++-- ---------------------------------------------------------------------++hsDeclsValBinds :: (Monad m) => HsLocalBinds GhcPs -> TransformT m [LHsDecl GhcPs]+hsDeclsValBinds lb = case lb of+ HsValBinds _ (ValBinds sortKey bs sigs) -> do+ let+ bds = map wrapDecl (bagToList bs)+ sds = map wrapSig sigs+ orderedDecls sortKey (bds ++ sds)+ HsValBinds _ (XValBindsLR _) -> error $ "hsDecls.XValBindsLR not valid"+ HsIPBinds {} -> return []+ EmptyLocalBinds {} -> return []++data WithWhere = WithWhere+ | WithoutWhere+ deriving (Eq,Show)++-- | Utility function for returning decls to 'HsLocalBinds'. Use with+-- care, as this does not manage the declaration order, the+-- ordering should be done by the calling function from the 'HsLocalBinds'+-- context in the AST.+replaceDeclsValbinds :: (Monad m)+ => WithWhere+ -> HsLocalBinds GhcPs -> [LHsDecl GhcPs]+ -> TransformT m (HsLocalBinds GhcPs)+replaceDeclsValbinds _ _ [] = do+ return (EmptyLocalBinds NoExtField)+replaceDeclsValbinds w b@(HsValBinds a _) new+ = do+ logTr "replaceDeclsValbinds"+ let oldSpan = spanHsLocaLBinds b+ an <- oldWhereAnnotation a w (realSrcSpan oldSpan)+ let decs = listToBag $ concatMap decl2Bind new+ let sigs = concatMap decl2Sig new+ let sortKey = captureOrder new+ return (HsValBinds an (ValBinds sortKey decs sigs))+replaceDeclsValbinds _ (HsIPBinds {}) _new = error "undefined replaceDecls HsIPBinds"+replaceDeclsValbinds w (EmptyLocalBinds _) new+ = do+ logTr "replaceDecls HsLocalBinds"+ an <- newWhereAnnotation w+ let newBinds = concatMap decl2Bind new+ newSigs = concatMap decl2Sig new+ let decs = listToBag $ newBinds+ let sigs = newSigs+ let sortKey = captureOrder new+ return (HsValBinds an (ValBinds sortKey decs sigs))++oldWhereAnnotation :: (Monad m)+ => EpAnn AnnList -> WithWhere -> RealSrcSpan -> TransformT m (EpAnn AnnList)+oldWhereAnnotation EpAnnNotUsed ww _oldSpan = do+ newSpan <- uniqueSrcSpanT+ let w = case ww of+ WithWhere -> [AddEpAnn AnnWhere (EpaDelta (SameLine 0))]+ WithoutWhere -> []+ let anc2' = Anchor (rs newSpan) (MovedAnchor (SameLine 1))+ (anc, anc2) <- do+ newSpan' <- uniqueSrcSpanT+ return ( Anchor (rs newSpan') (MovedAnchor (DifferentLine 1 2))+ , anc2')+ let an = EpAnn anc+ (AnnList (Just anc2) Nothing Nothing w [])+ emptyComments+ return an+oldWhereAnnotation (EpAnn anc an cs) ww _oldSpan = do+ -- TODO: when we set DP (0,0) for the HsValBinds EpEpaLocation, change the AnnList anchor to have the correct DP too+ let (AnnList ancl o c _r t) = an+ let w = case ww of+ WithWhere -> [AddEpAnn AnnWhere (EpaDelta (SameLine 0))]+ WithoutWhere -> []+ (anc', ancl') <- do+ case ww of+ WithWhere -> return (anc, ancl)+ WithoutWhere -> return (anc, ancl)+ let an' = EpAnn anc'+ (AnnList ancl' o c w t)+ cs+ return an'++newWhereAnnotation :: (Monad m) => WithWhere -> TransformT m (EpAnn AnnList)+newWhereAnnotation ww = do+ newSpan <- uniqueSrcSpanT+ let anc = Anchor (rs newSpan) (MovedAnchor (DifferentLine 1 3))+ let anc2 = Anchor (rs newSpan) (MovedAnchor (DifferentLine 1 5))+ let w = case ww of+ WithWhere -> [AddEpAnn AnnWhere (EpaDelta (SameLine 0))]+ WithoutWhere -> []+ let an = EpAnn anc+ (AnnList (Just anc2) Nothing Nothing w [])+ emptyComments+ return an++-- ---------------------------------------------------------------------++type Decl = LHsDecl GhcPs+type PMatch = LMatch GhcPs (LHsExpr GhcPs)++-- |Modify a 'LHsBind' wrapped in a 'ValD'. For a 'PatBind' the+-- declarations are extracted and returned after modification. For a+-- 'FunBind' the supplied 'SrcSpan' is used to identify the specific+-- 'Match' to be transformed, for when there are multiple of them.+modifyValD :: forall m t. (HasTransform m)+ => SrcSpan+ -> Decl+ -> (PMatch -> [Decl] -> m ([Decl], Maybe t))+ -> m (Decl,Maybe t)+modifyValD p pb@(L ss (ValD _ (PatBind {} ))) f =+ if (locA ss) == p+ then do+ ds <- liftT $ hsDeclsPatBindD pb+ (ds',r) <- f (error "modifyValD.PatBind should not touch Match") ds+ pb' <- liftT $ replaceDeclsPatBindD pb ds'+ return (pb',r)+ else return (pb,Nothing)+modifyValD p ast f = do+ (ast',r) <- runStateT (everywhereM (mkM doModLocal) ast) Nothing+ return (ast',r)+ where+ doModLocal :: PMatch -> StateT (Maybe t) m PMatch+ doModLocal (match@(L ss _) :: PMatch) = do+ if (locA ss) == p+ then do+ ds <- lift $ liftT $ hsDecls match+ (ds',r) <- lift $ f match ds+ put r+ match' <- lift $ liftT $ replaceDecls match ds'+ return match'+ else return match++-- ---------------------------------------------------------------------++-- |Used to integrate a @Transform@ into other Monad stacks+class (Monad m) => (HasTransform m) where+ liftT :: Transform a -> m a++instance Monad m => HasTransform (TransformT m) where+ liftT = hoistTransform (return . runIdentity)++-- ---------------------------------------------------------------------++-- | Apply a transformation to the decls contained in @t@+modifyDeclsT :: (HasDecls t,HasTransform m)+ => ([LHsDecl GhcPs] -> m [LHsDecl GhcPs])+ -> t -> m t+modifyDeclsT action t = do+ decls <- liftT $ hsDecls t+ decls' <- action decls+ liftT $ replaceDecls t decls'++-- ---------------------------------------------------------------------
src/Language/Haskell/GHC/ExactPrint/Types.hs view
@@ -1,129 +1,70 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE ConstraintKinds #-} {-# LANGUAGE DeriveDataTypeable #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE NamedFieldPuns #-}-{-# LANGUAGE RankNTypes #-}-{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE MultiWayIf #-}+{-# LANGUAGE NamedFieldPuns #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE StandaloneDeriving #-} {-# LANGUAGE TypeSynonymInstances #-}-{-# LANGUAGE ViewPatterns #-}-module Language.Haskell.GHC.ExactPrint.Types- ( -- * Core Types- Anns- , emptyAnns- , Annotation(..)- , annNone-- , KeywordId(..)- , Comment(..)- -- * Positions- , Pos- , DeltaPos(..)- , deltaRow, deltaColumn- -- * AnnKey- , AnnSpan- , AnnKey(..)- , mkAnnKey- , AnnConName(..)- , annGetConstr-#if __GLASGOW_HASKELL__ >= 900- , badRealSrcSpan-#endif-- -- * Other-- , Rigidity(..)- , AstContext(..),AstContextSet,defaultACS- , ACS'(..)- , ListContexts(..)-- -- * For managing compatibility- , Constraints-- -- * GHC version compatibility- , GhcPs- , GhcRn- , GhcTc--#if __GLASGOW_HASKELL__ > 804- , noExt-#endif-- -- * Internal Types- , LayoutStartCol(..)- , declFun-- ) where+{-# LANGUAGE ViewPatterns #-} -import Data.Data (Data, Typeable, toConstr,cast)--- import Data.Generics+module Language.Haskell.GHC.ExactPrint.Types+ where -import qualified GHC-#if __GLASGOW_HASKELL__ >= 900-import GHC.Data.FastString as GHC-import GHC.Driver.Session as GHC-import GHC.Types.SrcLoc as GHC-import GHC.Utils.Outputable as GHC-#else-import qualified DynFlags as GHC-import qualified Outputable as GHC-#endif+import GHC hiding (EpaComment)+import GHC.Utils.Outputable hiding ( (<>) )+import Data.Data (Data, toConstr,cast) import qualified Data.Map as Map-import qualified Data.Set as Set -- ---------------------------------------------------------------------+-- | This structure holds a complete set of annotations for an AST+type Anns = Map.Map AnnKey Annotation -#if (__GLASGOW_HASKELL__ >= 808) && (__GLASGOW_HASKELL__ < 900)-type Constraints a = (Data a,Data (GHC.SrcSpanLess a),GHC.HasSrcSpan a)-#else-type Constraints a = (Data a)-#endif+emptyAnns :: Anns+emptyAnns = Map.empty --- ---------------------------------------------------------------------+-- | For every @Located a@, use the @SrcSpan@ and constructor name of+-- a as the key, to store the standard annotation.+-- These are used to maintain context in the AP and EP monads+data AnnKey = AnnKey RealSrcSpan AnnConName+ deriving (Eq, Data, Ord) --- | A Haskell comment. The @AnnKeywordId@ is present if it has been converted--- from an @AnnKeywordId@ because the annotation must be interleaved into the--- stream and does not have a well-defined position-data Comment = Comment- {- commentContents :: !String -- ^ The contents of the comment including separators+-- More compact Show instance+instance Show AnnKey where+ show (AnnKey ss cn) = "AnnKey " ++ showPprUnsafe ss ++ " " ++ show cn - -- AZ:TODO: commentIdentifier is a misnomer, should be commentSrcSpan, it is- -- the thing we use to decide where in the output stream the comment should- -- go.- , commentIdentifier :: !AnnSpan -- ^ Needed to uniquely identify two comments with the same contents- , commentOrigin :: !(Maybe GHC.AnnKeywordId) -- ^ We sometimes turn syntax into comments in order to process them properly.- }- deriving (Eq,Typeable,Data,Ord)-instance Show Comment where- show (Comment cs ss o) = "(Comment " ++ show cs ++ " " ++ showGhc ss ++ " " ++ show o ++ ")"+mkAnnKeyPrim :: (Data a) => Located a -> AnnKey+mkAnnKeyPrim (L l a) = AnnKey (realSrcSpan l) (annGetConstr a) -instance GHC.Outputable Comment where- ppr x = GHC.text (show x)+mkAnnKeyPrimA :: (Data a) => LocatedA a -> AnnKey+mkAnnKeyPrimA (L l a) = AnnKey (realSrcSpan $ locA l) (annGetConstr a) -type Pos = (Int,Int)+-- Holds the name of a constructor+data AnnConName = CN { unConName :: String }+ deriving (Eq, Ord, Data) --- | A relative positions, row then column-newtype DeltaPos = DP (Int,Int) deriving (Show,Eq,Ord,Typeable,Data)+-- More compact show instance+instance Show AnnConName where+ show (CN s) = "CN " ++ show s -deltaRow, deltaColumn :: DeltaPos -> Int-deltaRow (DP (r, _)) = r-deltaColumn (DP (_, c)) = c+annGetConstr :: (Data a) => a -> AnnConName+annGetConstr a = CN (show $ toConstr a) +-- |Make an unwrapped @AnnKey@ for the @LHsDecl@ case, a normal one otherwise.+mkAnnKey :: (Data a) => Located a -> AnnKey+mkAnnKey ld =+ case cast ld :: Maybe (LHsDecl GhcPs) of+ Just d -> declFun mkAnnKeyPrimA d+ Nothing -> mkAnnKeyPrim ld --- | Marks the start column of a layout block.-newtype LayoutStartCol = LayoutStartCol { getLayoutStartCol :: Int }- deriving (Eq, Num) -instance Show LayoutStartCol where- show (LayoutStartCol sc) = "(LayoutStartCol " ++ show sc ++ ")"+type Pos = (Int,Int) +-- --------------------------------------------------------------------- annNone :: Annotation-annNone = Ann (DP (0,0)) [] [] [] Nothing Nothing+annNone = Ann (SameLine 0) [] [] [] Nothing Nothing data Annotation = Ann {@@ -144,11 +85,7 @@ -- The next three fields relate to interacing down into the AST , annsDP :: ![(KeywordId, DeltaPos)] -- ^ Annotations associated with this element.-#if __GLASGOW_HASKELL__ >= 900- , annSortKey :: !(Maybe [GHC.RealSrcSpan])-#else- , annSortKey :: !(Maybe [GHC.SrcSpan])-#endif+ , annSortKey :: !(Maybe [RealSrcSpan]) -- ^ Captures the sort order of sub elements. This is needed when the -- sub-elements have been split (as in a HsLocalBind which holds separate -- binds and sigs) or for infix patterns where the order has been@@ -163,327 +100,90 @@ -- need eo be vertically aligned for the Haskell layout rules, and this -- guarantees this property in the presence of AST edits. - } deriving (Typeable,Eq)+ } deriving (Eq) -instance Show Annotation where- show (Ann dp comments fcomments ans sk csp)- = "(Ann (" ++ show dp ++ ") " ++ show comments ++ " "- ++ show fcomments ++ " "- ++ show ans ++ " " ++ showGhc sk ++ " "- ++ showGhc csp ++ ")"+-- --------------------------------------------------------------------- +declFun :: (forall a . Data a => LocatedA a -> b) -> LHsDecl GhcPs -> b+declFun f (L l de) =+ case de of+ TyClD _ d -> f (L l d)+ InstD _ d -> f (L l d)+ DerivD _ d -> f (L l d)+ ValD _ d -> f (L l d)+ SigD _ d -> f (L l d)+ KindSigD _ d -> f (L l d)+ DefD _ d -> f (L l d)+ ForD _ d -> f (L l d)+ WarningD _ d -> f (L l d)+ AnnD _ d -> f (L l d)+ RuleD _ d -> f (L l d)+ SpliceD _ d -> f (L l d)+ DocD _ d -> f (L l d)+ RoleAnnotD _ d -> f (L l d) --- | This structure holds a complete set of annotations for an AST-type Anns = Map.Map AnnKey Annotation+-- --------------------------------------------------------------------- -emptyAnns :: Anns-emptyAnns = Map.empty+data Rigidity = NormalLayout | RigidLayout deriving (Eq, Ord, Show) --- | For every @Located a@, use the @SrcSpan@ and constructor name of--- a as the key, to store the standard annotation.--- These are used to maintain context in the AP and EP monads-data AnnKey = AnnKey AnnSpan AnnConName- deriving (Eq, Ord, Data) --- | From GHC 9.0 the ParsedSource uses RealSrcSpan instead of SrcSpan.--- Compatibility type-#if __GLASGOW_HASKELL__ >= 900-type AnnSpan = GHC.RealSrcSpan-#else-type AnnSpan = GHC.SrcSpan-#endif --- More compact Show instance-instance Show AnnKey where- show (AnnKey ss cn) = "AnnKey " ++ showGhc ss ++ " " ++ show cn---#if __GLASGOW_HASKELL__ >= 900-mkAnnKeyPrim :: (Data a) => GHC.Located a -> AnnKey-mkAnnKeyPrim (GHC.L (GHC.RealSrcSpan l _) a) = AnnKey l (annGetConstr a)-mkAnnKeyPrim (GHC.L _ a) = AnnKey badRealSrcSpan (annGetConstr a)-#elif __GLASGOW_HASKELL__ > 806-mkAnnKeyPrim :: (Constraints a)- => a -> AnnKey-mkAnnKeyPrim (GHC.dL->GHC.L l a) = AnnKey l (annGetConstr a)-#else-mkAnnKeyPrim :: (Data a) => GHC.Located a -> AnnKey-mkAnnKeyPrim (GHC.L l a) = AnnKey l (annGetConstr a)-#endif---#if __GLASGOW_HASKELL__ >= 900-badRealSrcSpan :: GHC.RealSrcSpan-badRealSrcSpan = GHC.mkRealSrcSpan bad bad- where- bad = GHC.mkRealSrcLoc (GHC.fsLit "ghc-exactprint-nospan") 0 0-#endif--#if __GLASGOW_HASKELL__ <= 802-type GhcPs = GHC.RdrName-type GhcRn = GHC.Name-type GhcTc = GHC.Id-#else-type GhcPs = GHC.GhcPs-type GhcRn = GHC.GhcRn-type GhcTc = GHC.GhcTc-#endif---#if __GLASGOW_HASKELL__ > 808-noExt :: GHC.NoExtField-noExt = GHC.NoExtField-#elif __GLASGOW_HASKELL__ > 804-noExt :: GHC.NoExt-noExt = GHC.noExt-#endif+-- | A Haskell comment. The @AnnKeywordId@ is present if it has been converted+-- from an @AnnKeywordId@ because the annotation must be interleaved into the+-- stream and does not have a well-defined position+data Comment = Comment+ {+ commentContents :: !String -- ^ The contents of the comment including separators --- |Make an unwrapped @AnnKey@ for the @LHsDecl@ case, a normal one otherwise.-#if (__GLASGOW_HASKELL__ > 806) && (__GLASGOW_HASKELL__ < 900)-mkAnnKey :: (Constraints a) => a -> AnnKey-#else-mkAnnKey :: (Data a) => GHC.Located a -> AnnKey-#endif-mkAnnKey ld =- case cast ld :: Maybe (GHC.LHsDecl GhcPs) of- Just d -> declFun mkAnnKeyPrim d- Nothing -> mkAnnKeyPrim ld+ -- AZ:TODO: commentIdentifier is a misnomer, should be commentSrcSpan, it is+ -- the thing we use to decide where in the output stream the comment should+ -- go.+ , commentAnchor :: !Anchor+ , commentOrigin :: !(Maybe AnnKeywordId) -- ^ We sometimes turn syntax into comments in order to process them properly.+ }+ deriving Eq --- Holds the name of a constructor-data AnnConName = CN { unConName :: String }- deriving (Eq, Ord, Data)+instance Show Comment where+ show (Comment cs ss o) = "(Comment " ++ show cs ++ " " ++ showPprUnsafe ss ++ " " ++ show o ++ ")" --- More compact show instance-instance Show AnnConName where- show (CN s) = "CN " ++ show s+instance Ord Comment where+ -- When we have CPP injected comments with a fake filename, or LINE+ -- pragma, the file name changes, so we need to compare the+ -- locations only, with out the filename.+ compare (Comment _ ss1 _) (Comment _ ss2 _) = compare (ss2pos $ anchor ss1) (ss2pos $ anchor ss2)+ where+ ss2pos ss = (srcSpanStartLine ss,srcSpanStartCol ss) -annGetConstr :: (Data a) => a -> AnnConName-annGetConstr a = CN (show $ toConstr a)+instance Outputable Comment where+ ppr x = text (show x) -- | The different syntactic elements which are not represented in the -- AST.-data KeywordId = G GHC.AnnKeywordId -- ^ A normal keyword+data KeywordId = G AnnKeywordId -- ^ A normal keyword | AnnSemiSep -- ^ A separating comma-#if __GLASGOW_HASKELL__ >= 900- | AnnEofPos-#endif-#if __GLASGOW_HASKELL__ >= 800 | AnnTypeApp -- ^ Visible type application annotation-#endif | AnnComment Comment | AnnString String -- ^ Used to pass information from -- Delta to Print when we have to work -- out details from the original -- SrcSpan.-#if __GLASGOW_HASKELL__ <= 710- | AnnUnicode GHC.AnnKeywordId -- ^ Used to indicate that we should print using unicode syntax if possible.-#endif- deriving (Eq, Ord, Data)+ deriving (Eq) instance Show KeywordId where show (G gc) = "(G " ++ show gc ++ ")" show AnnSemiSep = "AnnSemiSep"-#if __GLASGOW_HASKELL__ >= 900- show AnnEofPos = "AnnEofPos"-#endif-#if __GLASGOW_HASKELL__ >= 800 show AnnTypeApp = "AnnTypeApp"-#endif show (AnnComment dc) = "(AnnComment " ++ show dc ++ ")" show (AnnString s) = "(AnnString " ++ s ++ ")"-#if __GLASGOW_HASKELL__ <= 710- show (AnnUnicode gc) = "(AnnUnicode " ++ show gc ++ ")"-#endif --- -----------------------------------------------------------------------instance GHC.Outputable KeywordId where- ppr k = GHC.text (show k)--instance GHC.Outputable AnnConName where- ppr tr = GHC.text (show tr)--instance GHC.Outputable Annotation where- ppr a = GHC.text (show a)--instance GHC.Outputable AnnKey where- ppr a = GHC.text (show a)--instance GHC.Outputable DeltaPos where- ppr a = GHC.text (show a)---- --------------------------------------------------------------------------- Flag used to control whether we use rigid or normal layout rules.--- NOTE: check is done via comparison of enumeration order, be careful with any changes-data Rigidity = NormalLayout | RigidLayout deriving (Eq, Ord, Show)-{---Rigidity logic. The same type is used for two different things--1. As a flag in Annotate to the "SetLayoutFlag" operation, which specifies- NormalLayout - Layout should be captured unconditionally-- RigidLayout - Layout should be captured or not depending on a parameter kept- in the interpreter Read state--2. As the controlling parameter for the optional (Rigid) layout--The nett effect is the following, where flag is the hard-coded flag value in-Annotate, and param is the interpreter param set when the interpreter is run-- flag | param | result- -------------+--------------+--------------------- NormalLayout | either | layout captured- RigidLayout | NormalLayout | layout NOT captured- RigidLayout | RigidLayout | layout captured--The flag is only used on HsIf and HsCase--So-- state | HsCase | HsIf- ----------------------------|-----------+------- before rigidity flag (AZ) | no layout | layout- param NormalLayout | no layout | no layout- param RigidLayout | layout | layout- ----------------------------+-----------+-------- desired future HaRe | no layout | layout- desired future apply-refact | layout | layout--}---- -----------------------------------------------------------------------data ACS' a = ACS- { acs :: !(Map.Map a Int) -- ^ how many levels each AstContext should- -- propagate down the AST. Removed when it hits zero- } deriving (Show)--#if __GLASGOW_HASKELL__ >= 804-instance Semigroup (ACS' AstContext) where- (<>) = mappend-#endif--instance Monoid (ACS' AstContext) where- mempty = ACS mempty- -- ACS a `mappend` ACS b = ACS (a `mappend` b)- ACS a `mappend` ACS b = ACS (Map.unionWith max a b)- -- For Data.Map, mappend == union, which is a left-biased replace for key collisions--type AstContextSet = ACS' AstContext--- data AstContextSet = ACS--- { acs :: !(Map.Map AstContext Int) -- ^ how many levels each AstContext should--- -- propagate down the AST. Removed when it--- -- hits zero--- } deriving (Show)--defaultACS :: AstContextSet-defaultACS = ACS Map.empty---- instance GHC.Outputable AstContextSet where-instance (Show a) => GHC.Outputable (ACS' a) where- ppr x = GHC.text $ show x--data AstContext = LambdaExpr- | CaseAlt- | NoPrecedingSpace- | HasHiding- | AdvanceLine- | NoAdvanceLine- | Intercalate -- This item may have a list separator following- | InIE -- possible 'type' or 'pattern'- | PrefixOp- | PrefixOpDollar- | InfixOp -- RdrName may be used as an infix operator- | ListStart -- Identifies first element of a list in layout, so its indentation can me managed differently- | ListItem -- Identifies subsequent elements of a list in layout- | TopLevel -- top level declaration- | NoDarrow- | AddVbar- | Deriving- | Parens -- TODO: Not currently used?- | ExplicitNeverActive- | InGadt- | InRecCon- | InClassDecl- | InSpliceDecl- | LeftMost -- Is this the leftmost operator in a chain of OpApps?- | InTypeApp -- HsTyVar in a TYPEAPP context. Has AnnAt- -- TODO:AZ: do we actually need this?- -- TODO:AZ this is actually tight prefix-- -- Next four used to identify current list context- | CtxOnly- | CtxFirst- | CtxMiddle- | CtxLast- | CtxPos Int -- 0 for first, increasing for subsequent-- -- Next are used in tellContext to push context up the tree- | FollowingLine- deriving (Eq, Ord, Show)---data ListContexts = LC { lcOnly,lcInitial,lcMiddle,lcLast :: !(Set.Set AstContext) }- deriving (Eq,Show)---- ------------------------------------------------------------------------- data LayoutContext = FollowingLine -- ^Indicates that an item such as a SigD--- -- should not have blank lines after it--- deriving (Eq, Ord, Show)---- -----------------------------------------------------------------------declFun :: (forall a . Data a => GHC.Located a -> b) -> GHC.LHsDecl GhcPs -> b--#if __GLASGOW_HASKELL__ > 804-declFun f (GHC.L l de) =- case de of- GHC.TyClD _ d -> f (GHC.L l d)- GHC.InstD _ d -> f (GHC.L l d)- GHC.DerivD _ d -> f (GHC.L l d)- GHC.ValD _ d -> f (GHC.L l d)- GHC.SigD _ d -> f (GHC.L l d)-#if __GLASGOW_HASKELL__ > 808- GHC.KindSigD _ d -> f (GHC.L l d)-#endif- GHC.DefD _ d -> f (GHC.L l d)- GHC.ForD _ d -> f (GHC.L l d)- GHC.WarningD _ d -> f (GHC.L l d)- GHC.AnnD _ d -> f (GHC.L l d)- GHC.RuleD _ d -> f (GHC.L l d)- GHC.SpliceD _ d -> f (GHC.L l d)- GHC.DocD _ d -> f (GHC.L l d)- GHC.RoleAnnotD _ d -> f (GHC.L l d)- GHC.XHsDecl _ -> error "declFun:XHsDecl"-#else-declFun f (GHC.L l de) =- case de of- GHC.TyClD d -> f (GHC.L l d)- GHC.InstD d -> f (GHC.L l d)- GHC.DerivD d -> f (GHC.L l d)- GHC.ValD d -> f (GHC.L l d)- GHC.SigD d -> f (GHC.L l d)- GHC.DefD d -> f (GHC.L l d)- GHC.ForD d -> f (GHC.L l d)- GHC.WarningD d -> f (GHC.L l d)- GHC.AnnD d -> f (GHC.L l d)- GHC.RuleD d -> f (GHC.L l d)- GHC.VectD d -> f (GHC.L l d)- GHC.SpliceD d -> f (GHC.L l d)- GHC.DocD d -> f (GHC.L l d)- GHC.RoleAnnotD d -> f (GHC.L l d)-#if __GLASGOW_HASKELL__ < 711- GHC.QuasiQuoteD d -> f (GHC.L l d)-#endif-#endif+-- | Marks the start column of a layout block.+newtype LayoutStartCol = LayoutStartCol { getLayoutStartCol :: Int }+ deriving (Eq, Num) +instance Show LayoutStartCol where+ show (LayoutStartCol sc) = "(LayoutStartCol " ++ show sc ++ ")" -- --------------------------------------------------------------------- -- Duplicated here so it can be used in show instances-showGhc :: (GHC.Outputable a) => a -> String-showGhc = GHC.showPpr GHC.unsafeGlobalDynFlags---- ----------------------------------------------------------------------+showGhc :: (Outputable a) => a -> String+showGhc = showPprUnsafe
src/Language/Haskell/GHC/ExactPrint/Utils.hs view
@@ -1,129 +1,49 @@-{-# LANGUAGE CPP #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-}-module Language.Haskell.GHC.ExactPrint.Utils- (- -- * Manipulating Positons- ss2pos- , ss2posEnd- , ss2range- , undelta- , isPointSrcSpan- , pos2delta- , ss2delta- , addDP- , spanLength- , isGoodDelta- , rs, sr - -- * Manipulating Comments- , mkComment- , mkKWComment- , dpFromString- , comment2dp- , extractComments-- -- * GHC Functions- , srcSpanStartLine- , srcSpanEndLine- , srcSpanStartColumn- , srcSpanEndColumn- , rdrName2String- , isSymbolRdrName- , tokComment- , isListComp- , isGadt- , isExactName--- -- * Manipulating Annotations- , getAnnotationEP- , annTrueEntryDelta- , annCommentEntryDelta- , annLeadingCommentEntryDelta-- -- * General Utility- , orderByKey--- -- * AST Context management- , setAcs, setAcsWithLevel- , unsetAcs- , inAcs- , pushAcs- , bumpAcs--#if __GLASGOW_HASKELL__ <= 710- -- * for boolean formulas in GHC 7.10.3- -- ,LBooleanFormula, BooleanFormula(..)- , makeBooleanFormulaAnns-#endif-- -- * For tests- , debug- , debugP- , debugM- , warn- , showGhc- , showAnnData- , occAttributes-- , showSDoc_, showSDocDebug_- -- AZ's baggage- , ghead,glast,gtail,gfromJust- ) where--+module Language.Haskell.GHC.ExactPrint.Utils+ -- (+ -- -- * Manipulating Positons+ -- ss2pos+ -- , ss2posEnd+ -- , undelta+ -- , isPointSrcSpan+ -- , pos2delta+ -- , ss2delta+ -- , addDP+ -- , spanLength+ -- , isGoodDelta+ -- ) where+ where import Control.Monad.State-import qualified Data.ByteString as B-import Data.Generics+import Data.Function import Data.Ord (comparing) -import Language.Haskell.GHC.ExactPrint.Types+import Data.Generics++import GHC.Hs.Dump import Language.Haskell.GHC.ExactPrint.Lookup -#if __GLASGOW_HASKELL__ <= 710-import qualified BooleanFormula as GHC-#endif+import GHC hiding (EpaComment) import qualified GHC-#if __GLASGOW_HASKELL__ >= 900-import qualified GHC.Data.Bag as GHC-import qualified GHC.Driver.Session as GHC-import qualified GHC.Data.FastString as GHC-import qualified GHC.Types.Name as GHC-import qualified GHC.Types.Name.Set as GHC-import qualified GHC.Utils.Outputable as GHC-import qualified GHC.Types.Name.Reader as GHC-import qualified GHC.Types.SrcLoc as GHC-import qualified GHC.Types.Var as GHC-import qualified GHC.Types.Name.Occurrence as OccName (OccName(..),occNameString,pprNameSpaceBrief)-#else-import qualified Bag as GHC-import qualified DynFlags as GHC-import qualified FastString as GHC-import qualified Name as GHC-import qualified NameSet as GHC-import qualified Outputable as GHC-import qualified RdrName as GHC-import qualified SrcLoc as GHC-import qualified Var as GHC-import qualified OccName(OccName(..),occNameString,pprNameSpaceBrief)-#endif+import GHC.Types.Name+import GHC.Types.Name.Reader+import GHC.Types.SrcLoc+import GHC.Data.FastString+import GHC.Utils.Outputable (showSDocUnsafe, showPprUnsafe) +import qualified GHC.Types.Name.Occurrence as OccName (OccName(..),pprNameSpaceBrief) import Control.Arrow import qualified Data.Map as Map-import qualified Data.Set as Set-import Data.List+import Data.List (sortBy, elemIndex) import Debug.Trace+import Language.Haskell.GHC.ExactPrint.Types -{-# ANN module "HLint: ignore Eta reduce" #-}-{-# ANN module "HLint: ignore Redundant do" #-}-{-# ANN module "HLint: ignore Reduce duplication" #-} -- --------------------------------------------------------------------- -- |Global switch to enable debug tracing in ghc-exactprint Delta / Print@@ -133,8 +53,8 @@ -- |Global switch to enable debug tracing in ghc-exactprint Pretty debugPEnabledFlag :: Bool--- debugPEnabledFlag = True-debugPEnabledFlag = False+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.@@ -153,9 +73,6 @@ debugM :: Monad m => String -> m () debugM s = when debugEnabledFlag $ traceM s --- | Show a GHC.Outputable structure-showGhc :: (GHC.Outputable a) => a -> String-showGhc = GHC.showPpr GHC.unsafeGlobalDynFlags -- --------------------------------------------------------------------- @@ -165,18 +82,42 @@ -- | A good delta has no negative values. isGoodDelta :: DeltaPos -> Bool-isGoodDelta (DP (ro,co)) = ro >= 0 && co >= 0+isGoodDelta (SameLine co) = co >= 0+isGoodDelta (DifferentLine ro co) = ro > 0 && co >= 0+ -- Note: DifferentLine invariant is ro is nonzero and positive -- | Create a delta from the current position to the start of the given -- @SrcSpan@.-ss2delta :: Pos -> GHC.SrcSpan -> DeltaPos+ss2delta :: Pos -> RealSrcSpan -> DeltaPos ss2delta ref ss = pos2delta ref (ss2pos ss) +-- | create a delta from the end of a current span. The +1 is because+-- the stored position ends up one past the span, this is prior to+-- that adjustment+ss2deltaEnd :: RealSrcSpan -> RealSrcSpan -> DeltaPos+ss2deltaEnd rrs ss = ss2delta ref ss+ where+ (r,c) = ss2posEnd rrs+ ref = if r == 0+ then (r,c+1)+ else (r,c)++-- | create a delta from the start of a current span. The +1 is+-- because the stored position ends up one past the span, this is+-- prior to that adjustment+ss2deltaStart :: RealSrcSpan -> RealSrcSpan -> DeltaPos+ss2deltaStart rrs ss = ss2delta ref ss+ where+ (r,c) = ss2pos rrs+ ref = if r == 0+ then (r,c)+ else (r,c)+ -- | Convert the start of the second @Pos@ to be an offset from the -- first. The assumption is the reference starts before the second @Pos@ pos2delta :: Pos -> Pos -> DeltaPos-pos2delta (refl,refc) (l,c) = DP (lo,co)+pos2delta (refl,refc) (l,c) = deltaPos lo co where lo = l - refl co = if lo == 0 then c - refc@@ -185,106 +126,79 @@ -- | Apply the delta to the current position, taking into account the -- current column offset if advancing to a new line undelta :: Pos -> DeltaPos -> LayoutStartCol -> Pos-undelta (l,c) (DP (dl,dc)) (LayoutStartCol co) = (fl,fc)+undelta (l,c) (SameLine dc) (LayoutStartCol _co) = (l, c + dc)+undelta (l,_) (DifferentLine dl dc) (LayoutStartCol co) = (fl,fc) where+ -- Note: invariant: dl > 0 fl = l + dl- fc = if dl == 0 then c + dc- else co + dc+ fc = co + dc +undeltaSpan :: RealSrcSpan -> AnnKeywordId -> DeltaPos -> AddEpAnn+undeltaSpan anchor kw dp = AddEpAnn kw (EpaSpan sp)+ where+ (l,c) = undelta (ss2pos anchor) dp (LayoutStartCol 0)+ len = length (keywordToString (G kw))+ sp = range2rs ((l,c),(l,c+len))+ -- | Add together two @DeltaPos@ taking into account newlines -- -- > DP (0, 1) `addDP` DP (0, 2) == DP (0, 3) -- > DP (0, 9) `addDP` DP (1, 5) == DP (1, 5) -- > DP (1, 4) `addDP` DP (1, 3) == DP (2, 3) addDP :: DeltaPos -> DeltaPos -> DeltaPos-addDP (DP (a, b)) (DP (c, d)) =- if c >= 1 then DP (a+c, d)- else DP (a, b+d)+addDP dp (DifferentLine c d) = DifferentLine (getDeltaLine dp+c) d+addDP (DifferentLine a b) (SameLine d) = DifferentLine a (b+d)+addDP (SameLine b) (SameLine d) = SameLine (b+d) --- | "Subtract" two @DeltaPos@ from each other, in the sense of calculating the--- remaining delta for the second after the first has been applied.--- invariant : if c = a `addDP` b--- then a `stepDP` c == b------ Cases where first DP is <= than second--- > DP (0, 1) `addDP` DP (0, 2) == DP (0, 1)--- > DP (1, 1) `addDP` DP (2, 0) == DP (1, 0)--- > DP (1, 3) `addDP` DP (1, 4) == DP (0, 1)--- > DP (1, 4) `addDP` DP (1, 4) == DP (1, 4)------ Cases where first DP is > than second--- > DP (0, 3) `addDP` DP (0, 2) == DP (0,1) -- advance one at least--- > DP (3, 3) `addDP` DP (2, 4) == DP (1, 4) -- go one line forward and to expected col--- > DP (3, 3) `addDP` DP (0, 4) == DP (0, 1) -- maintain col delta at least--- > DP (1, 21) `addDP` DP (1, 4) == DP (1, 4) -- go one line forward and to expected col-stepDP :: DeltaPos -> DeltaPos -> DeltaPos-stepDP (DP (a,b)) (DP (c,d))- | (a,b) == (c,d) = DP (a,b)- | a == c = if b < d then DP (0,d - b)- else if d == 0- then DP (1,0)- -- else DP (0,1)- else DP (c,d)- | a < c = DP (c - a,d)- | otherwise = DP (1,d)+-- --------------------------------------------------------------------- +adjustDeltaForOffset :: Int -> LayoutStartCol -> DeltaPos -> DeltaPos+adjustDeltaForOffset _ _colOffset dp@(SameLine _) = dp+adjustDeltaForOffset d (LayoutStartCol colOffset) (DifferentLine l c)+ = DifferentLine l (c - colOffset - d)+ -- --------------------------------------------------------------------- -ss2pos :: GHC.SrcSpan -> Pos-ss2pos ss = (srcSpanStartLine ss,srcSpanStartColumn ss)+ss2pos :: RealSrcSpan -> Pos+ss2pos ss = (srcSpanStartLine ss,srcSpanStartCol ss) -ss2posEnd :: GHC.SrcSpan -> Pos-ss2posEnd ss = (srcSpanEndLine ss,srcSpanEndColumn ss)+ss2posEnd :: RealSrcSpan -> Pos+ss2posEnd ss = (srcSpanEndLine ss,srcSpanEndCol ss) -ss2range :: GHC.SrcSpan -> (Pos,Pos)-ss2range ss = (ss2pos ss, ss2posEnd ss)+ss2range :: SrcSpan -> (Pos,Pos)+ss2range ss = (ss2pos $ rs ss, ss2posEnd $ rs ss) -srcSpanEndColumn :: GHC.SrcSpan -> Int-#if __GLASGOW_HASKELL__ >= 900-srcSpanEndColumn (GHC.RealSrcSpan s _) = GHC.srcSpanEndCol s-#else-srcSpanEndColumn (GHC.RealSrcSpan s) = GHC.srcSpanEndCol s-#endif-srcSpanEndColumn _ = 0+rs2range :: RealSrcSpan -> (Pos,Pos)+rs2range ss = (ss2pos ss, ss2posEnd ss) -srcSpanStartColumn :: GHC.SrcSpan -> Int-#if __GLASGOW_HASKELL__ >= 900-srcSpanStartColumn (GHC.RealSrcSpan s _) = GHC.srcSpanStartCol s-#else-srcSpanStartColumn (GHC.RealSrcSpan s) = GHC.srcSpanStartCol s-#endif-srcSpanStartColumn _ = 0+rs :: SrcSpan -> RealSrcSpan+rs (RealSrcSpan s _) = s+rs _ = badRealSrcSpan -srcSpanEndLine :: GHC.SrcSpan -> Int-#if __GLASGOW_HASKELL__ >= 900-srcSpanEndLine (GHC.RealSrcSpan s _) = GHC.srcSpanEndLine s-#else-srcSpanEndLine (GHC.RealSrcSpan s) = GHC.srcSpanEndLine s-#endif-srcSpanEndLine _ = 0+range2rs :: (Pos,Pos) -> RealSrcSpan+range2rs (s,e) = mkRealSrcSpan (mkLoc s) (mkLoc e)+ where+ mkLoc (l,c) = mkRealSrcLoc (fsLit "ghc-exactprint") l c -srcSpanStartLine :: GHC.SrcSpan -> Int-#if __GLASGOW_HASKELL__ >= 900-srcSpanStartLine (GHC.RealSrcSpan s _) = GHC.srcSpanStartLine s-#else-srcSpanStartLine (GHC.RealSrcSpan s) = GHC.srcSpanStartLine s-#endif-srcSpanStartLine _ = 0+badRealSrcSpan :: RealSrcSpan+badRealSrcSpan = mkRealSrcSpan bad bad+ where+ bad = mkRealSrcLoc (fsLit "ghc-exactprint-nospan") 0 0 -spanLength :: GHC.SrcSpan -> Int-spanLength = (-) <$> srcSpanEndColumn <*> srcSpanStartColumn+spanLength :: RealSrcSpan -> Int+spanLength = (-) <$> srcSpanEndCol <*> srcSpanStartCol -- --------------------------------------------------------------------- -- | Checks whether a SrcSpan has zero length.-isPointSrcSpan :: AnnSpan -> Bool-isPointSrcSpan ss = spanLength (sr ss) == 0- && srcSpanStartLine (sr ss) == srcSpanEndLine (sr ss)+isPointSrcSpan :: RealSrcSpan -> Bool+isPointSrcSpan ss = spanLength ss == 0+ && srcSpanStartLine ss == srcSpanEndLine ss -- --------------------------------------------------------------------- -- |Given a list of items and a list of keys, returns a list of items -- ordered by their position in the list of keys.-orderByKey :: (Eq o) => [(o,a)] -> [o] -> [(o,a)]+orderByKey :: [(RealSrcSpan,a)] -> [RealSrcSpan] -> [(RealSrcSpan,a)] orderByKey keys order -- AZ:TODO: if performance becomes a problem, consider a Map of the order -- SrcSpan to an index, and do a lookup instead of elemIndex.@@ -294,156 +208,86 @@ -- --------------------------------------------------------------------- -isListComp :: GHC.HsStmtContext name -> Bool+isListComp :: HsStmtContext name -> Bool isListComp cts = case cts of- GHC.ListComp -> True- GHC.MonadComp -> True-#if __GLASGOW_HASKELL__ <= 804- GHC.PArrComp -> True-#endif+ ListComp -> True+ MonadComp -> True -#if __GLASGOW_HASKELL__ >= 900- GHC.DoExpr {} -> False- GHC.MDoExpr {} -> False-#else- GHC.DoExpr -> False- GHC.MDoExpr -> False-#endif- GHC.ArrowExpr -> False- GHC.GhciStmtCtxt -> False+ DoExpr {} -> False+ MDoExpr {} -> False+ ArrowExpr -> False+ GhciStmtCtxt -> False - GHC.PatGuard {} -> False- GHC.ParStmtCtxt {} -> False- GHC.TransStmtCtxt {} -> False+ PatGuard {} -> False+ ParStmtCtxt {} -> False+ TransStmtCtxt {} -> False -- --------------------------------------------------------------------- -isGadt :: [GHC.LConDecl name] -> Bool-#if __GLASGOW_HASKELL__ >= 880+isGadt :: [LConDecl (GhcPass p)] -> Bool isGadt [] = True-#else-isGadt [] = False-#endif-#if __GLASGOW_HASKELL__ >= 900-isGadt ((GHC.L _ (GHC.ConDeclGADT{})):_) = True-isGadt ((GHC.L _ (GHC.XConDecl{})):_) = True-#elif __GLASGOW_HASKELL__ > 710-isGadt ((GHC.L _ (GHC.ConDeclGADT{})):_) = True-#else-isGadt (GHC.L _ GHC.ConDecl{GHC.con_res=GHC.ResTyGADT _ _}:_) = True-#endif+isGadt ((L _ (ConDeclGADT{})):_) = True isGadt _ = False --- isGadt :: [GHC.LConDecl name] -> Bool--- isGadt [] = False--- #if __GLASGOW_HASKELL__ <= 710--- isGadt (GHC.L _ GHC.ConDecl{GHC.con_res=GHC.ResTyGADT _ _}:_) = True--- #else--- isGadt ((GHC.L _ (GHC.ConDeclGADT{})):_) = True--- #endif--- isGadt _ = False-- -- --------------------------------------------------------------------- -- Is a RdrName of type Exact? SYB query, so can be extended to other types too isExactName :: (Data name) => name -> Bool-isExactName = False `mkQ` GHC.isExact+isExactName = False `mkQ` isExact -- --------------------------------------------------------------------- -rs :: GHC.SrcSpan -> AnnSpan-#if __GLASGOW_HASKELL__ >= 900--- rs :: GHC.SrcSpan -> GHC.RealSrcSpan-rs (GHC.RealSrcSpan s _) = s-rs _ = badRealSrcSpan-#else--- rs :: GHC.SrcSpan -> GHC.SrcSpan-rs = id-#endif+insertCppComments :: ParsedSource -> [LEpaComment] -> ParsedSource+insertCppComments (L l p) cs = L l p'+ where+ ncs = EpaComments cs+ an' = case GHC.hsmodAnn p of+ (EpAnn a an ocs) -> EpAnn a an (ocs <> ncs)+ unused -> unused+ p' = p { GHC.hsmodAnn = an' } -#if __GLASGOW_HASKELL__ >= 900-sr :: GHC.RealSrcSpan -> GHC.SrcSpan-sr s = GHC.RealSrcSpan s Nothing-#else-sr :: GHC.SrcSpan -> GHC.SrcSpan-sr = id-#endif -- --------------------------------------------------------------------- -#if __GLASGOW_HASKELL__ >= 900-ghcCommentText :: GHC.RealLocated GHC.AnnotationComment -> String-#else-ghcCommentText :: GHC.Located GHC.AnnotationComment -> String-#endif-ghcCommentText (GHC.L _ (GHC.AnnDocCommentNext s)) = s-ghcCommentText (GHC.L _ (GHC.AnnDocCommentPrev s)) = s-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+ghcCommentText :: LEpaComment -> String+ghcCommentText (L _ (GHC.EpaComment (EpaDocCommentNext s) _)) = s+ghcCommentText (L _ (GHC.EpaComment (EpaDocCommentPrev s) _)) = s+ghcCommentText (L _ (GHC.EpaComment (EpaDocCommentNamed s) _)) = s+ghcCommentText (L _ (GHC.EpaComment (EpaDocSection _ s) _)) = s+ghcCommentText (L _ (GHC.EpaComment (EpaDocOptions s) _)) = s+ghcCommentText (L _ (GHC.EpaComment (EpaLineComment s) _)) = s+ghcCommentText (L _ (GHC.EpaComment (EpaBlockComment s) _)) = s+ghcCommentText (L _ (GHC.EpaComment (EpaEofComment) _)) = "" -#if __GLASGOW_HASKELL__ >= 900-tokComment :: GHC.RealLocated GHC.AnnotationComment -> Comment-tokComment t@(GHC.L lt _) = mkComment (ghcCommentText t) lt-#else-tokComment :: GHC.Located GHC.AnnotationComment -> Comment-tokComment t@(GHC.L lt _) = mkComment (ghcCommentText t) lt-#endif+tokComment :: LEpaComment -> Comment+tokComment t@(L lt _) = mkComment (normaliseCommentText $ ghcCommentText t) lt -#if __GLASGOW_HASKELL__ >= 900-mkComment :: String -> GHC.RealSrcSpan -> Comment-mkComment c ss = Comment c ss Nothing-#else-mkComment :: String -> GHC.SrcSpan -> Comment-mkComment c ss = Comment c (rs ss) Nothing-#endif+mkLEpaComment :: String -> Anchor -> LEpaComment+-- Note: fudging the ac_prior_tok value, hope it does not cause a problem+mkLEpaComment s anc = (L anc (GHC.EpaComment (EpaLineComment s) (anchor anc))) +mkComment :: String -> Anchor -> Comment+mkComment c anc = Comment c anc Nothing++-- Windows comments include \r in them from the lexer.+normaliseCommentText :: String -> String+normaliseCommentText [] = []+normaliseCommentText ('\r':xs) = normaliseCommentText xs+normaliseCommentText (x:xs) = x:normaliseCommentText xs+ -- | Makes a comment which originates from a specific keyword.-mkKWComment :: GHC.AnnKeywordId -> GHC.SrcSpan -> Comment-mkKWComment kw ss = Comment (keywordToString $ G kw) (rs ss) (Just kw)+mkKWComment :: AnnKeywordId -> EpaLocation -> Comment+mkKWComment kw (EpaSpan ss)+ = Comment (keywordToString $ G kw) (Anchor ss UnchangedAnchor) (Just kw)+mkKWComment kw (EpaDelta dp)+ = Comment (keywordToString $ G kw) (Anchor placeholderRealSpan (MovedAnchor dp)) (Just kw) comment2dp :: (Comment, DeltaPos) -> (KeywordId, DeltaPos) comment2dp = first AnnComment --- ----------------------------------------------------------------------{---GHC 9.0 version--data ApiAnns =- ApiAnns- { apiAnnItems :: Map.Map ApiAnnKey [RealSrcSpan],- apiAnnEofPos :: Maybe RealSrcSpan,- apiAnnComments :: Map.Map RealSrcSpan [RealLocated AnnotationComment],- apiAnnRogueComments :: [RealLocated AnnotationComment]- }---}---extractComments :: GHC.ApiAnns -> [Comment]-#if __GLASGOW_HASKELL__ >= 900-extractComments anns- -- cm has type :: Map SrcSpan [Located AnnotationComment]- = map tokComment $ GHC.sortRealLocated $ ((concat- $ Map.elems (GHC.apiAnnComments anns)) ++ GHC.apiAnnRogueComments anns)-#else-extractComments (_,cm)- -- cm has type :: Map SrcSpan [Located AnnotationComment]- = map tokComment . GHC.sortLocated . concat $ Map.elems cm-#endif+sortAnchorLocated :: [GenLocated Anchor a] -> [GenLocated Anchor a]+sortAnchorLocated = sortBy (compare `on` (anchor . getLoc)) -#if (__GLASGOW_HASKELL__ > 806) && (__GLASGOW_HASKELL__ < 900)-getAnnotationEP :: (Data a,Data (GHC.SrcSpanLess a),GHC.HasSrcSpan a)- => a -> Anns -> Maybe Annotation-#else-getAnnotationEP :: (Data a) => GHC.Located a -> Anns -> Maybe Annotation-#endif+getAnnotationEP :: (Data a) => Located a -> Anns -> Maybe Annotation getAnnotationEP la as = Map.lookup (mkAnnKey la) as @@ -451,18 +295,9 @@ -- start of the current element. annTrueEntryDelta :: Annotation -> DeltaPos annTrueEntryDelta Ann{annEntryDelta, annPriorComments} =- foldr addDP (DP (0,0)) (map (\(a, b) -> addDP b (dpFromString $ commentContents a)) annPriorComments )+ foldr addDP (SameLine 0) (map (\(a, b) -> addDP b (dpFromString $ commentContents a)) annPriorComments ) `addDP` annEntryDelta --- | Take an annotation and a required "true entry" and calculate an equivalent--- one relative to the last comment in the annPriorComments.-annCommentEntryDelta :: Annotation -> DeltaPos -> DeltaPos-annCommentEntryDelta Ann{annPriorComments} trueDP = dp- where- commentDP =- foldr addDP (DP (0,0)) (map (\(a, b) -> addDP b (dpFromString $ commentContents a)) annPriorComments )- dp = stepDP commentDP trueDP- -- | Return the DP of the first item that generates output, either a comment or the entry DP annLeadingCommentEntryDelta :: Annotation -> DeltaPos annLeadingCommentEntryDelta Ann{annPriorComments,annEntryDelta} = dp@@ -476,267 +311,171 @@ dpFromString :: String -> DeltaPos dpFromString xs = dpFromString' xs 0 0 where- dpFromString' "" line col = DP (line, col)+ dpFromString' "" line col =+ if line == 0+ then SameLine col+ else DifferentLine line col dpFromString' ('\n': cs) line _ = dpFromString' cs (line + 1) 0 dpFromString' (_:cs) line col = dpFromString' cs line (col + 1) -- --------------------------------------------------------------------- -isSymbolRdrName :: GHC.RdrName -> Bool-isSymbolRdrName n = GHC.isSymOcc $ GHC.rdrNameOcc n+isSymbolRdrName :: RdrName -> Bool+isSymbolRdrName n = isSymOcc $ rdrNameOcc n -rdrName2String :: GHC.RdrName -> String+rdrName2String :: RdrName -> String rdrName2String r =- case GHC.isExact_maybe r of+ case isExact_maybe r of Just n -> name2String n Nothing -> case r of- GHC.Unqual occ -> GHC.occNameString occ- GHC.Qual modname occ -> GHC.moduleNameString modname ++ "."- ++ GHC.occNameString occ- GHC.Orig _ occ -> GHC.occNameString occ- GHC.Exact n -> GHC.getOccString n+ Unqual occ -> occNameString occ+ Qual modname occ -> moduleNameString modname ++ "."+ ++ occNameString occ+ Orig _ occ -> occNameString occ+ Exact n -> getOccString n -name2String :: GHC.Name -> String-name2String = showGhc+name2String :: Name -> String+name2String = showPprUnsafe -- --------------------------------------------------------------------- --- | Put the provided context elements into the existing set with fresh level--- counts-setAcs :: Set.Set AstContext -> AstContextSet -> AstContextSet-setAcs ctxt acs = setAcsWithLevel ctxt 3 acs---- | Put the provided context elements into the existing set with given level--- counts--- setAcsWithLevel :: Set.Set AstContext -> Int -> AstContextSet -> AstContextSet--- setAcsWithLevel ctxt level (ACS a) = ACS a'--- where--- upd s (k,v) = Map.insert k v s--- a' = foldl' upd a $ zip (Set.toList ctxt) (repeat level)-setAcsWithLevel :: (Ord a) => Set.Set a -> Int -> ACS' a -> ACS' a-setAcsWithLevel ctxt level (ACS a) = ACS a'+occAttributes :: OccName.OccName -> String+occAttributes o = "(" ++ ns ++ vo ++ tv ++ tc ++ d ++ ds ++ s ++ v ++ ")" where- upd s (k,v) = Map.insert k v s- a' = foldl' upd a $ zip (Set.toList ctxt) (repeat level)---- ------------------------------------------------------------------------ | Remove the provided context element from the existing set--- unsetAcs :: AstContext -> AstContextSet -> AstContextSet-unsetAcs :: (Ord a) => a -> ACS' a -> ACS' a-unsetAcs ctxt (ACS a) = ACS $ Map.delete ctxt a+ -- ns = (showSDocUnsafe $ OccName.pprNameSpaceBrief $ occNameSpace o) ++ ", "+ ns = (showSDocUnsafe $ OccName.pprNameSpaceBrief $ occNameSpace o) ++ ", "+ vo = if isVarOcc o then "Var " else ""+ tv = if isTvOcc o then "Tv " else ""+ tc = if isTcOcc o then "Tc " else ""+ d = if isDataOcc o then "Data " else ""+ ds = if isDataSymOcc o then "DataSym " else ""+ s = if isSymOcc o then "Sym " else ""+ v = if isValOcc o then "Val " else "" --- ---------------------------------------------------------------------+ -- --------------------------------------------------------------------- --- | Are any of the contexts currently active?--- inAcs :: Set.Set AstContext -> AstContextSet -> Bool-inAcs :: (Ord a) => Set.Set a -> ACS' a -> Bool-inAcs ctxt (ACS a) = not $ Set.null $ Set.intersection ctxt (Set.fromList $ Map.keys a)+locatedAnAnchor :: LocatedAn a t -> RealSrcSpan+locatedAnAnchor (L (SrcSpanAnn EpAnnNotUsed l) _) = realSrcSpan l+locatedAnAnchor (L (SrcSpanAnn (EpAnn a _ _) _) _) = anchor a --- | propagate the ACS down a level, dropping all values which hit zero--- pushAcs :: AstContextSet -> AstContextSet-pushAcs :: ACS' a -> ACS' a-pushAcs (ACS a) = ACS $ Map.mapMaybe f a- where- f n- | n <= 1 = Nothing- | otherwise = Just (n - 1)+ -- --------------------------------------------------------------------- --- |Sometimes we have to pass the context down unchanged. Bump each count up by--- one so that it is unchanged after a @pushAcs@ call.--- bumpAcs :: AstContextSet -> AstContextSet-bumpAcs :: ACS' a -> ACS' a-bumpAcs (ACS a) = ACS $ Map.mapMaybe f a- where- f n = Just (n + 1)+showAst :: (Data a) => a -> String+showAst ast+ = showSDocUnsafe+ $ showAstData NoBlankSrcSpan NoBlankEpAnnotations ast -- -----------------------------------------------------------------------#if __GLASGOW_HASKELL__ <= 710-- -- to be called in annotationsToCommentsBF by the pretty printer-makeBooleanFormulaAnns :: (GHC.Outputable a)- => GHC.BooleanFormula (GHC.Located a) -> [(GHC.AnnKeywordId,GHC.SrcSpan)]-makeBooleanFormulaAnns bf = go 1 bf- where- go :: (GHC.Outputable a)- => Int -> GHC.BooleanFormula (GHC.Located a) -> [(GHC.AnnKeywordId,GHC.SrcSpan)]- go _ (GHC.Var _) = []- go l v@(GHC.And [a,b]) =- go 3 a ++- go 3 b ++- (if l > 3 then addParensIfNeeded v else []) ++- [(GHC.AnnComma, ssAfter (getBoolSrcSpan a))]- go l v@(GHC.Or [a,b]) =- go 2 a ++- go 2 b ++- (if l > 2 then addParensIfNeeded v else []) ++- [(GHC.AnnVbar, ssAfter (getBoolSrcSpan a) )]- go _ x = error $ "makeBooleanFormulaAnns: unexpected case:" ++ showGhc x---addParensIfNeeded :: GHC.Outputable a- => GHC.BooleanFormula (GHC.Located a)- -> [(GHC.AnnKeywordId, GHC.SrcSpan)]-addParensIfNeeded (GHC.Var _) = []-addParensIfNeeded a = [(GHC.AnnOpenP,opp),(GHC.AnnCloseP,cpp)]- where- ss = getBoolSrcSpan a- opp = ssBefore ss- cpp = ssAfter ss----- ssFor a b = GHC.combineSrcSpans (getBoolSrcSpan a) (getBoolSrcSpan b)---- | Generate a SrcSpan of single char length before the given one-ssBefore :: GHC.SrcSpan -> GHC.SrcSpan-ssBefore a = GHC.mkSrcSpan (GHC.RealSrcLoc s) (GHC.RealSrcLoc e)- where- GHC.RealSrcLoc as = GHC.srcSpanStart a- s = GHC.mkRealSrcLoc (GHC.srcLocFile as) (GHC.srcLocLine as) (GHC.srcLocCol as - 2)- e = GHC.mkRealSrcLoc (GHC.srcLocFile as) (GHC.srcLocLine as) (GHC.srcLocCol as - 1)+-- Putting these here for the time being, to avoid import loops --- | Generate a SrcSpan of single char length after the given one-ssAfter :: GHC.SrcSpan -> GHC.SrcSpan-ssAfter a = GHC.mkSrcSpan (GHC.RealSrcLoc s) (GHC.RealSrcLoc e)- where- GHC.RealSrcLoc ae = GHC.srcSpanEnd a- s = ae- e = GHC.advanceSrcLoc s ' '+ghead :: String -> [a] -> a+ghead info [] = error $ "ghead "++info++" []"+ghead _info (h:_) = h +glast :: String -> [a] -> a+glast info [] = error $ "glast " ++ info ++ " []"+glast _info h = last h -getBoolSrcSpan :: (GHC.Outputable a) => GHC.BooleanFormula (GHC.Located a) -> GHC.SrcSpan-getBoolSrcSpan (GHC.Var (GHC.L ss _)) = ss-getBoolSrcSpan (GHC.And [a,b]) = GHC.combineSrcSpans (getBoolSrcSpan a) (getBoolSrcSpan b)-getBoolSrcSpan (GHC.Or [a,b]) = GHC.combineSrcSpans (getBoolSrcSpan a) (getBoolSrcSpan b)-getBoolSrcSpan x = error $ "getBoolSrcSpan: unexpected case:" ++ showGhc x+gtail :: String -> [a] -> [a]+gtail info [] = error $ "gtail " ++ info ++ " []"+gtail _info h = tail h -#endif+gfromJust :: String -> Maybe a -> a+gfromJust _info (Just h) = h+gfromJust info Nothing = error $ "gfromJust " ++ info ++ " Nothing" -- --------------------------------------------------------------------- --- | Show a GHC AST with interleaved Annotation information.-showAnnData :: Data a => Anns -> Int -> a -> String-showAnnData anns n =- generic -- `ext1Q` located- `ext1Q` list- `extQ` string `extQ` fastString `extQ` srcSpan- `extQ` bytestring- `extQ` name `extQ` occName `extQ` moduleName `extQ` var `extQ` dataCon- -- `extQ` overLit- `extQ` bagName `extQ` bagRdrName `extQ` bagVar `extQ` nameSet- `extQ` fixity- `ext2Q` located- where generic :: Data a => a -> String- generic t = indent n ++ "(" ++ showConstr (toConstr t)- ++ space (unwords (gmapQ (showAnnData anns (n+1)) t)) ++ ")"- space "" = ""- space s = ' ':s- indent i = "\n" ++ replicate i ' '- string = show :: String -> String- fastString = ("{FastString: "++) . (++"}") . show :: GHC.FastString -> String- bytestring = show :: B.ByteString -> String- list l = indent n ++ "["- ++ intercalate "," (map (showAnnData anns (n+1)) l) ++ "]"+-- -- Copied from syb for the test - name = ("{Name: "++) . (++"}") . showSDocDebug_ . GHC.ppr :: GHC.Name -> String- -- occName = ("{OccName: "++) . (++"}") . OccName.occNameString- occName o = "{OccName: "++ OccName.occNameString o ++ " " ++ occAttributes o ++ "}"- moduleName = ("{ModuleName: "++) . (++"}") . showSDoc_ . GHC.ppr :: GHC.ModuleName -> String - -- srcSpan = ("{"++) . (++"}") . showSDoc_ . GHC.ppr :: GHC.SrcSpan -> String- srcSpan :: GHC.SrcSpan -> String- srcSpan ss = "{ "++ showSDoc_ (GHC.hang (GHC.ppr ss) (n+2)- -- (GHC.ppr (Map.lookup ss anns)- (GHC.text "")- )- ++"}"+-- -- | Generic queries of type \"r\",+-- -- i.e., take any \"a\" and return an \"r\"+-- --+-- type GenericQ r = forall a. Data a => a -> r - 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+-- -- | Make a generic query;+-- -- start from a type-specific case;+-- -- return a constant otherwise+-- --+-- mkQ :: ( Typeable a+-- , Typeable b+-- )+-- => r+-- -> (b -> r)+-- -> a+-- -> r+-- (r `mkQ` br) a = case cast a of+-- Just b -> br b+-- Nothing -> r - bagRdrName:: GHC.Bag (GHC.Located (GHC.HsBind GhcPs)) -> String- bagRdrName = ("{Bag(Located (HsBind RdrName)): "++) . (++"}") . list . GHC.bagToList- bagName :: GHC.Bag (GHC.Located (GHC.HsBind GhcRn)) -> String- bagName = ("{Bag(Located (HsBind Name)): "++) . (++"}") . list . GHC.bagToList- bagVar :: GHC.Bag (GHC.Located (GHC.HsBind GhcTc)) -> String- bagVar = ("{Bag(Located (HsBind Var)): "++) . (++"}") . list . GHC.bagToList+-- -- | Make a generic monadic transformation;+-- -- start from a type-specific case;+-- -- resort to return otherwise+-- --+-- mkM :: ( Monad m+-- , Typeable a+-- , Typeable b+-- )+-- => (b -> m b)+-- -> a+-- -> m a+-- mkM = extM return -#if __GLASGOW_HASKELL__ > 800- nameSet = ("{NameSet: "++) . (++"}") . list . GHC.nameSetElemsStable-#else- nameSet = ("{NameSet: "++) . (++"}") . list . GHC.nameSetElems-#endif+-- -- | Flexible type extension+-- ext0 :: (Typeable a, Typeable b) => c a -> c b -> c a+-- ext0 def ext = maybe def id (gcast ext) - fixity = ("{Fixity: "++) . (++"}") . showSDoc_ . GHC.ppr :: GHC.Fixity -> String - located :: (Data b,Data loc) => GHC.GenLocated loc b -> String- -- located la = show (getAnnotationEP la anns)- located (GHC.L ss a) =- indent n ++ "("- ++ case cast ss of- Just (s :: GHC.SrcSpan) ->- srcSpan s- ++ indent (n + 1) ++- show (getAnnotationEP (GHC.L s a) anns)- -- ++ case showWrappedDeclAnns (GHC.L s a) of- -- Nothing -> ""- -- Just annStr -> indent (n + 1) ++ annStr- Nothing -> "nnnnnnnn"- ++ showAnnData anns (n+1) a- ++ ")"+-- -- | Extend a generic query by a type-specific case+-- extQ :: ( Typeable a+-- , Typeable b+-- )+-- => (a -> q)+-- -> (b -> q)+-- -> a+-- -> q+-- extQ f g a = maybe (f a) g (cast a) +-- -- | Flexible type extension+-- ext2 :: (Data a, Typeable t)+-- => c a+-- -> (forall d1 d2. (Data d1, Data d2) => c (t d1 d2))+-- -> c a+-- ext2 def ext = maybe def id (dataCast2 ext) -occAttributes :: OccName.OccName -> String-occAttributes o = "(" ++ ns ++ vo ++ tv ++ tc ++ d ++ ds ++ s ++ v ++ ")"- where- ns = (GHC.showSDocUnsafe $ OccName.pprNameSpaceBrief $ GHC.occNameSpace o) ++ ", "- vo = if GHC.isVarOcc o then "Var " else ""- tv = if GHC.isTvOcc o then "Tv " else ""- tc = if GHC.isTcOcc o then "Tc " else ""- d = if GHC.isDataOcc o then "Data " else ""- ds = if GHC.isDataSymOcc o then "DataSym " else ""- s = if GHC.isSymOcc o then "Sym " else ""- v = if GHC.isValOcc o then "Val " else "" -{--data NameSpace = VarName -- Variables, including "real" data constructors- | DataName -- "Source" data constructors- | TvName -- Type variables- | TcClsName -- Type constructors and classes; Haskell has them- -- in the same name space for now.--}-- -- -----------------------------------------------------------------------showSDoc_ :: GHC.SDoc -> String-showSDoc_ = GHC.showSDoc GHC.unsafeGlobalDynFlags--showSDocDebug_ :: GHC.SDoc -> String-#if __GLASGOW_HASKELL__ <= 710-showSDocDebug_ = GHC.showSDoc GHC.unsafeGlobalDynFlags-#else-showSDocDebug_ = GHC.showSDocDebug GHC.unsafeGlobalDynFlags-#endif+-- -- | Extend a generic monadic transformation by a type-specific case+-- extM :: ( Typeable a+-- , Typeable b+-- )+-- => (a -> m a) -> (b -> m b) -> a -> m a+-- extM def ext = unM ((M def) `ext0` (M ext)) --- ------------------------------------------------------------------------ Putting these here for the time being, to avoid import loops+-- -- | Type extension of monadic transformations for type constructors+-- ext2M :: (Data d, Typeable t)+-- => (forall e. Data e => e -> m e)+-- -> (forall d1 d2. (Data d1, Data d2) => t d1 d2 -> m (t d1 d2))+-- -> d -> m d+-- ext2M def ext = unM ((M def) `ext2` (M ext)) -ghead :: String -> [a] -> a-ghead info [] = error $ "ghead "++info++" []"-ghead _info (h:_) = h+-- -- | The type constructor for transformations+-- newtype M m x = M { unM :: x -> m x } -glast :: String -> [a] -> a-glast info [] = error $ "glast " ++ info ++ " []"-glast _info h = last h+-- -- | Generic monadic transformations,+-- -- i.e., take an \"a\" and compute an \"a\"+-- --+-- type GenericM m = forall a. Data a => a -> m a -gtail :: String -> [a] -> [a]-gtail info [] = error $ "gtail " ++ info ++ " []"-gtail _info h = tail h+-- -- | Monadic variation on everywhere+-- everywhereM :: forall m. Monad m => GenericM m -> GenericM m -gfromJust :: String -> Maybe a -> a-gfromJust _info (Just h) = h-gfromJust info Nothing = error $ "gfromJust " ++ info ++ " Nothing"+-- -- Bottom-up order is also reflected in order of do-actions+-- everywhereM f = go+-- where+-- go :: GenericM m+-- go x = do+-- x' <- gmapM go x+-- f x'
tests/Roundtrip.hs view
@@ -3,6 +3,7 @@ {-# LANGUAGE OverloadedStrings #-} module Main where +import qualified GHC.Paths import Control.Exception import Control.Monad import Data.Time.Clock@@ -13,7 +14,6 @@ import System.Exit import System.FilePath import System.IO--- import System.IO.Temp import Test.Common import Test.CommonUtils import Test.HUnit@@ -74,6 +74,7 @@ main :: IO () main = do+ let libdir = GHC.Paths.libdir createDirectoryIfMissing True workDir createDirectoryIfMissing True configDir createDirectoryIfMissing True failuresDir@@ -82,7 +83,7 @@ [] -> putStrLn "Must enter directory to process" ["failures"] -> do fs <- lines <$> readFile origFailuresFile- () <$ runTests (TestList (map mkParserTest fs))+ () <$ runTests (TestList (map (mkParserTest libdir) fs)) ["clean"] -> do putStrLn "Cleaning..." writeFile processed ""@@ -101,7 +102,7 @@ !cppList <- lines <$> readFile cppFile !parseFailList <- lines <$> readFile parseFailFile let done = S.fromList (processedList ++ cppList ++ blackList ++ knownFailures ++ parseFailList)- tsts <- TestList <$> mapM (tests done) ds+ tsts <- TestList <$> mapM (tests libdir done) ds _ <- runTests tsts return () @@ -112,34 +113,34 @@ putStrLn $ "Verbosity: " ++ show verb runTestTT t -tests :: S.Set String -> FilePath -> IO Test-tests done dir = do- roundTripHackage done dir+tests :: LibDir -> S.Set String -> FilePath -> IO Test+tests libdir done dir = do+ roundTripHackage libdir done dir -- Selection: -- Hackage dir-roundTripHackage :: S.Set String -> FilePath -> IO Test-roundTripHackage done hackageDir = do+roundTripHackage :: LibDir -> S.Set String -> FilePath -> IO Test+roundTripHackage libdir done hackageDir = do packageDirs <- drop 2 <$> getDirectoryContents hackageDir when (verb <= Debug) (traceShowM hackageDir) when (verb <= Debug) (traceShowM packageDirs)- TestList <$> mapM (roundTripPackage done) (zip [0..] (map (hackageDir </>) packageDirs))+ TestList <$> mapM (roundTripPackage libdir done) (zip [0..] (map (hackageDir </>) packageDirs)) -roundTripPackage :: S.Set String -> (Int, FilePath) -> IO Test-roundTripPackage done (n, dir) = do+roundTripPackage :: LibDir -> S.Set String -> (Int, FilePath) -> IO Test+roundTripPackage libdir done (n, dir) = do putStrLn (show n) when (verb <= Status) (traceM dir) hsFiles <- filter (flip S.notMember done) <$> findSrcFiles dir - return (TestLabel (dropFileName dir) (TestList $ map mkParserTest hsFiles))+ return (TestLabel (dropFileName dir) (TestList $ map (mkParserTest libdir) hsFiles)) -mkParserTest :: FilePath -> Test-mkParserTest fp =+mkParserTest :: LibDir -> FilePath -> Test+mkParserTest libdir fp = TestLabel fp $ TestCase (do writeLog $ "starting:" ++ fp- r1 <- catchAny (roundTripTest fp) $ \e -> do+ r1 <- catchAny (roundTripTest libdir fp) $ \e -> do writeError fp throwIO e case r1 of
tests/Test.hs view
@@ -1,4 +1,3 @@-{-# LANGUAGE CPP #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TupleSections #-}@@ -6,7 +5,7 @@ module Main where -- import Language.Haskell.GHC.ExactPrint.Utils ( showGhc )-+import qualified GHC.Paths import Control.Monad import System.Directory import System.FilePath@@ -28,44 +27,21 @@ -- --------------------------------------------------------------------- -data GHCVersion = GHC710 | GHC80 | GHC82 | GHC84 | GHC86 | GHC88 | GHC810 | GHC90+data GHCVersion = GHC710 | GHC80 | GHC82 | GHC84 | GHC86 | GHC88 | GHC810 | GHC90 | GHC92 deriving (Eq, Ord, Show) ghcVersion :: GHCVersion-ghcVersion =-#if __GLASGOW_HASKELL__ >= 900- GHC90-#elif __GLASGOW_HASKELL__ > 808- GHC810-#elif __GLASGOW_HASKELL__ > 806- GHC88-#elif __GLASGOW_HASKELL__ > 804- GHC86-#elif __GLASGOW_HASKELL__ > 802- GHC84-#elif __GLASGOW_HASKELL__ > 800- GHC82-#elif __GLASGOW_HASKELL__ >= 711- GHC80-#else- GHC710-#endif+ghcVersion = GHC92 -- | Directories to automatically find roundtrip tests testDirs :: [FilePath] testDirs = case ghcVersion of- GHC710 -> ["ghc710-only", "ghc710", "vect"]- GHC80 -> [ "pre-ghc90", "ghc710", "ghc80", "vect"]- GHC82 -> ["pre-ghc86", "pre-ghc90", "ghc710", "ghc80", "ghc82", "vect"]- GHC84 -> ["pre-ghc86", "pre-ghc810", "pre-ghc90", "ghc710", "ghc80", "ghc82", "ghc84", "vect" ]- GHC86 -> ["pre-ghc810", "pre-ghc810", "pre-ghc90", "ghc710", "ghc80", "ghc82", "ghc84", "ghc86" ]- GHC88 -> ["pre-ghc810", "pre-ghc810", "pre-ghc90", "ghc710", "ghc80", "ghc82", "ghc84", "ghc86", "ghc88" ]- GHC810 -> [ "pre-ghc90", "ghc710", "ghc80", "ghc82", "ghc84", "ghc86", "ghc88", "ghc810" ]- GHC90 -> [ "ghc710", "ghc80", "ghc82", "ghc84", "ghc86", "ghc88", "ghc810", "ghc90"]+ GHC90 -> ["ghc710", "ghc80", "ghc82", "ghc84", "ghc86", "ghc88", "ghc810", "ghc90"]+ GHC92 -> ["ghc710", "ghc80", "ghc82", "ghc84", "ghc86", "ghc88", "ghc810", "ghc90", "ghc92"] - -- GHC90 -> ["ghc90-copied"]- -- GHC90 -> ["ghc90"]+ -- GHC92 -> ["ghc92-copied"]+ -- GHC92 -> ["ghc92"] -- --------------------------------------------------------------------- @@ -81,7 +57,8 @@ transform :: IO () transform = hSilence [stderr] $ do- cnts <- fst <$> runTestText (putTextToHandle stdout True) transformTests+ let libdir = GHC.Paths.libdir+ cnts <- fst <$> runTestText (putTextToHandle stdout True) (transformTestsTT libdir) putStrLn $ show cnts if errors cnts > 0 || failures cnts > 0 then exitFailure@@ -89,37 +66,21 @@ -- --------------------------------------------------------------------- -findTests :: IO Test-findTests = testList "Round-trip tests" <$> mapM (findTestsDir id mkParserTest) testDirs+findTests :: LibDir -> IO Test+findTests libdir+ = testList "Round-trip tests" <$> mapM (findTestsDir id (mkParserTest libdir)) testDirs -findPrettyTests :: IO Test-findPrettyTests =+findPrettyTests :: LibDir -> IO Test+findPrettyTests libdir = testList "Default Annotations round-trip tests"- <$> mapM (findTestsDir filterPrettyRoundTrip mkPrettyRoundtrip) testDirs+ <$> mapM (findTestsDir filterPrettyRoundTrip (mkPrettyRoundtrip libdir)) testDirs -- | 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@@ -142,48 +103,39 @@ mkTests :: IO Test mkTests = do -- listTests- roundTripTests <- findTests- prettyRoundTripTests <- findPrettyTests+ let libdir = GHC.Paths.libdir+ roundTripTests <- findTests libdir+ prettyRoundTripTests <- findPrettyTests libdir return $ TestList [ internalTests, roundTripTests ,- transformTests- , failingTests- , noAnnotationTests- ,- prettyRoundTripTests+ (transformTests libdir)+ , (failingTests libdir)+ -- , noAnnotationTests+ -- ,+ -- prettyRoundTripTests ] --- Tests that will fail until https://phabricator.haskell.org/D907 lands in a--- future GHC-failingTests :: Test-failingTests = testList "Failing tests"+failingTests :: LibDir -> Test+failingTests libdir = testList "Failing tests" [ -- Tests requiring future GHC modifications- mkTestModBad "InfixOperator.hs" -#if __GLASGOW_HASKELL__ > 802-#elif __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- , mkTestModBad "CtorOp.hs" -- Should be fixed in GHC 8.4- , mkTestModBad "UnicodeSyntax.hs"- , mkTestModBad "UnicodeRules.hs"- , mkTestModBad "Deprecation.hs"- , mkTestModBad "MultiLineWarningPragma.hs"-#endif+ -- https://gitlab.haskell.org/ghc/ghc/-/issues/20243+ mkTestModBad libdir "n-plus-k-patterns.hs" + -- https://gitlab.haskell.org/ghc/ghc/-/issues/20258+ , mkTestModBad libdir "TopLevelSemis.hs" + -- We do not capture EOF location very well any more+ , mkTestModBad libdir "T10970a.hs"+ ] -mkParserTest :: FilePath -> FilePath -> Test-mkParserTest dir fp = mkParsingTest roundTripTest dir fp+mkParserTest :: LibDir -> FilePath -> FilePath -> Test+mkParserTest libdir dir fp = mkParsingTest (roundTripTest libdir) dir fp -- --------------------------------------------------------------------- @@ -199,76 +151,161 @@ tr :: IO (Counts,Int) tr = hSilence [stderr] $ do- prettyRoundTripTests <- findPrettyTests+ let libdir = GHC.Paths.libdir+ prettyRoundTripTests <- findPrettyTests libdir runTestText (putTextToHandle stdout True) prettyRoundTripTests tt' :: IO (Counts,Int)-tt' = runTestText (putTextToHandle stdout True) $ TestList [+tt' = do+ let libdir = GHC.Paths.libdir+ runTestText (putTextToHandle stdout True) $ TestList [ - -- mkTestModChange changeRenameCase1 "RenameCase1.hs"+ -- mkTestModChange libdir changeRenameCase1 "RenameCase1.hs" - -- mkParserTest "ghc710" "Associated.hs"+ -- mkParserTest libdir "ghc710" "UnicodeSyntaxFailure.hs"+ -- mkParserTest libdir "ghc80" "Class.hs"+ -- mkParserTest libdir "ghc82" "Completesig03A.hs"+ -- mkParserTest libdir "ghc82" "brackets.hs"+ -- mkParserTest libdir "ghc84" "T13747.hs"+ -- mkParserTest libdir "ghc86" "SlidingTypeSyn.hs" - -- mkParserTest "ghc710" "BracesSemiDataDecl.hs"- -- mkParserTest "ghc710" "GADTRecords.hs"- -- mkParserTest "ghc710" "RdrNames.hs"- -- mkParserTest "ghc710" "RdrNames1.hs"+ -- mkParserTest libdir "ghc86" "dynamic-paper.hs"+ -- mkParserTest libdir "ghc90" "ArrowLambdaCase.hs"+ -- mkParserTest libdir "ghc80" "T6018failclosed.hs"+ -- mkParserTest libdir "failing" "InfixOperator.hs" - -- mkParserTest "ghc80" "T11010.hs"- -- mkParserTest "ghc80" "Test10399.hs"- -- mkParserTest "ghc90" "Linear12.hs"- -- mkParserTest "ghc90" "T17544_kw.hs"+ -- mkParserTest libdir "ghc92-copied" "AddLocalDecl5.expected.hs"+ -- mkParserTest libdir "ghc92" "ScopesBug.hs"+ -- mkParserTest libdir "ghc92-copied" "T10279.hs"+ -- mkParserTest libdir "ghc92-copied" "T10891.hs"+ -- mkParserTest libdir "ghc92-copied" "T2632.hs"+ -- mkParserTest libdir "ghc92-copied" "T4442.hs"+ -- mkParserTest libdir "ghc92-copied" "TH_reifyExplicitForAllFams.hs"+ -- mkParserTest libdir "ghc92-copied" "TH_unresolvedInfix.hs"+ -- mkParserTest libdir "ghc92-copied" "regalloc_unit_tests.hs" - -- mkParserTest "ghc90" "FromManual.hs"- -- mkPrettyRoundtrip "ghc90" "FromManual.hs"+ -- mkParserTest libdir "ghc92" "Checkpoint.hs"+ -- mkParserTest libdir "ghc710" "MultiLineCommentWithPragmas.hs" - -- mkParserTest "ghc90" "Linear1Rule.hs"- -- mkPrettyRoundtrip "ghc90" "Linear1Rule.hs"+ -- mkParserTest libdir "ghc710" "Process.hs"+ -- mkParserTest libdir "ghc92" "PostgreSQL.hs"+ -- mkParserTest libdir "ghc92" "Main.hs"+ -- mkParserTest libdir "ghc92" "MainHareTest.hs"+ -- mkParserTest libdir "ghc92" "TH.hs"+ -- mkParserTest libdir "ghc92" "LeapSeconds.hs"+ -- mkParserTest libdir "ghc92" "proc-lets.hs"+ -- mkParserTest libdir "ghc92" "n-plus-k-patterns.hs"+ -- mkParserTest libdir "ghc92" "TopLevelSemis.hs"+ -- mkParserTest libdir "ghc92" "MiniBall.hs" - -- mkParserTest "ghc80" "Test11018.hs"- -- mkPrettyRoundtrip "ghc80" "Test11018.hs"+ mkParserTest libdir "ghc80" "T10970a.hs" - -- mkParserTest "ghc86" "UnicodeSyntax.hs"- -- mkPrettyRoundtrip "ghc86" "UnicodeSyntax.hs" - mkParserTest "ghc86" "empty-foralls.hs"- -- mkPrettyRoundtrip "ghc86" "empty-foralls.hs"+ -- mkTestModChange libdir rmDecl1 "RmDecl1.hs" - -- mkParserTest "ghc710" "PatSynBind.hs"- -- mkPrettyRoundtrip "ghc710" "PatSynBind.hs"+ -- mkParserTest libdir "ghc92" "LinearArrow.hs"+ -- mkParserTest libdir "transform" "AddLocalDecl5.1.hs"+ -- mkTestModChange libdir addLocaLDecl5 "AddLocalDecl5.hs"+ -- mkTestModChange libdir changeLocalDecls2 "LocalDecls2.hs"+ -- mkTestModChange libdir addLocaLDecl1 "AddLocalDecl1.hs"+ {-+ ### Failure in: 1:Round-trip tests:1:ghc80:27:Decision.hs+ ### Failure in: 2:transformation tests:0:Low level transformations:15+ AddLocalDecl1.hs+ AddLocalDecl4.hs+ AddLocalDecl5.hs+ AddLocalDecl6.hs+ -} + -- mkParserTest libdir "ghc710" "EmptyMostly.hs"++ -- comment problem+ -- mkParserTest libdir "ghc710" "Move1.hs"+ -- mkParserTest libdir "ghc80" "Decision.hs"+ -- mkParserTest libdir "ghc80" "RandomPGC.hs"+ -- mkParserTest libdir "ghc92" "BlockComment.hs"+ -- mkParserTest libdir "ghc92" "CommentPlacement.hs"+ -- mkParserTest libdir "ghc92" "CommentPlacement2.hs"+ -- mkParserTest libdir "ghc80" "Decision.hs"++ -- mkParserTest libdir "ghc92-copied" "AddLocalDecl5.expected.hs"+ -- mkParserTest libdir "ghc92-copied" "AtomicPrimops.hs"+ -- mkParserTest libdir "ghc92-copied" "BinaryLiterals0.hs"+ -- mkParserTest libdir "ghc92-copied" "CountDeps.hs"+ -- mkParserTest libdir "ghc92-copied" "regalloc_unit_tests.hs"++++-- ### Failure in: 1:Round-trip tests:0:ghc710:20:Control.hs+-- ### Failure in: 1:Round-trip tests:0:ghc710:21:CoreIr.hs+-- ### Failure in: 1:Round-trip tests:0:ghc710:23:Cpp.hs+-- ### Failure in: 1:Round-trip tests:0:ghc710:38:EmptyMostly.hs+-- ### Failure in: 1:Round-trip tests:0:ghc710:39:EmptyMostly2.hs+-- ### Failure in: 1:Round-trip tests:0:ghc710:40:EmptyMostlyInst.hs+-- ### Failure in: 1:Round-trip tests:0:ghc710:41:EmptyMostlyNoSemis.hs+-- ### Error in: 1:Round-trip tests:0:ghc710:50:ForeignDecl.hs++ -- mkParserTest libdir "ghc710" "BracesSemiDataDecl.hs"+ -- mkParserTest libdir "ghc710" "GADTRecords.hs"+ -- mkParserTest libdir "ghc710" "RdrNames.hs"+ -- mkParserTest libdir "ghc710" "RdrNames1.hs"++ -- mkParserTest libdir "ghc80" "T11010.hs"+ -- mkParserTest libdir "ghc80" "Test10399.hs"+ -- mkParserTest libdir "ghc90" "Linear12.hs"+ -- mkParserTest libdir "ghc90" "T17544_kw.hs"++ -- mkParserTest libdir "ghc90" "FromManual.hs"+ -- mkPrettyRoundtrip libdir "ghc90" "FromManual.hs"++ -- mkParserTest libdir "ghc90" "Linear1Rule.hs"+ -- mkPrettyRoundtrip libdir "ghc90" "Linear1Rule.hs"++ -- mkParserTest libdir "ghc80" "Test11018.hs"+ -- mkPrettyRoundtrip libdir "ghc80" "Test11018.hs"++ -- mkParserTest libdir "ghc86" "UnicodeSyntax.hs"+ -- mkPrettyRoundtrip libdir "ghc86" "UnicodeSyntax.hs"++ -- mkParserTest libdir "ghc86" "empty-foralls.hs"+ -- mkPrettyRoundtrip libdir "ghc86" "empty-foralls.hs"++ -- mkParserTest libdir "ghc710" "PatSynBind.hs"+ -- mkPrettyRoundtrip libdir "ghc710" "PatSynBind.hs"+ -- --------------------------------------------- - -- mkParserTest "ghc86" "Webhook.hs"+ -- mkParserTest libdir "ghc86" "Webhook.hs" - -- mkParserTest "ghc710" "TypeBrackets2.hs"- -- mkPrettyRoundtrip "ghc710" "TypeBrackets2.hs"+ -- mkParserTest libdir "ghc710" "TypeBrackets2.hs"+ -- mkPrettyRoundtrip libdir "ghc710" "TypeBrackets2.hs" - -- mkParserTest "ghc710" "DataDecl.hs"- -- mkPrettyRoundtrip "ghc710" "DataDecl.hs"+ -- mkParserTest libdir "ghc710" "DataDecl.hs"+ -- mkPrettyRoundtrip libdir "ghc710" "DataDecl.hs" - -- mkParserTest "ghc90" "BaseDescriptor.hs"- -- mkPrettyRoundtrip "ghc90" "BaseDescriptor.hs"+ -- mkParserTest libdir "ghc90" "BaseDescriptor.hs"+ -- mkPrettyRoundtrip libdir "ghc90" "BaseDescriptor.hs" - -- mkParserTest "ghc90" "BaseDescriptors2.hs"- -- mkPrettyRoundtrip "ghc90" "BaseDescriptors2.hs"+ -- mkParserTest libdir "ghc90" "BaseDescriptors2.hs"+ -- mkPrettyRoundtrip libdir "ghc90" "BaseDescriptors2.hs" -- Needs GHC changes ] -testsTT :: Test-testsTT = TestList+testsTT :: LibDir -> Test+testsTT libdir = TestList [- mkParserTest "ghc710" "Cpp.hs"- , mkParserTest "ghc710" "DroppedDoSpace.hs"+ mkParserTest libdir "ghc710" "Cpp.hs"+ , mkParserTest libdir "ghc710" "DroppedDoSpace.hs" ] tt :: IO () -- tt = hSilence [stderr] $ do tt = do- cnts <- fst <$> runTestText (putTextToHandle stdout True) testsTT+ let libdir = GHC.Paths.libdir+ cnts <- fst <$> runTestText (putTextToHandle stdout True) (testsTT libdir) putStrLn $ show cnts if errors cnts > 0 || failures cnts > 0 then exitFailure
tests/Test/Common.hs view
@@ -1,4 +1,3 @@-{-# LANGUAGE CPP #-} {-# LANGUAGE MultiWayIf #-} {-# LANGUAGE BangPatterns #-} {-# LANGUAGE FlexibleContexts #-}@@ -22,42 +21,27 @@ , genTest , noChange , mkDebugOutput-#if __GLASGOW_HASKELL__ > 808 , showErrorMessages-#endif+ , LibDir ) where import Language.Haskell.GHC.ExactPrint import Language.Haskell.GHC.ExactPrint.Utils-import Language.Haskell.GHC.ExactPrint.Parsers (parseModuleApiAnnsWithCpp)+import Language.Haskell.GHC.ExactPrint.Parsers import Language.Haskell.GHC.ExactPrint.Preprocess-import Language.Haskell.GHC.ExactPrint.Types-+-- import Language.Haskell.GHC.ExactPrint.Types -#if __GLASGOW_HASKELL__ >= 900 import qualified Control.Monad.IO.Class as GHC import qualified GHC as GHC hiding (parseModule) import qualified GHC.Data.Bag as GHC import qualified GHC.Driver.Session as GHC import qualified GHC.Utils.Error as GHC-import qualified GHC.Utils.Outputable as GHC-#else-import qualified ApiAnnotation as GHC-import qualified DynFlags as GHC-#if __GLASGOW_HASKELL__ > 808-import qualified Bag as GHC-import qualified ErrUtils as GHC-#endif-import qualified GHC as GHC hiding (parseModule)-import qualified MonadUtils as GHC-#endif+-- import qualified GHC.Utils.Outputable as GHC+-- import qualified GHC.Hs.Dump as GHC -#if __GLASGOW_HASKELL__ <= 710-#else import qualified GHC.LanguageExtensions as LangExt-#endif -- import qualified Data.Map as Map @@ -66,7 +50,7 @@ import System.Directory -import Test.Consistency+-- import Test.Consistency import Test.HUnit import System.FilePath@@ -88,7 +72,7 @@ { debugTxt :: String , status :: ReportType , cppStatus :: Maybe String -- Result of CPP if invoked- , inconsistent :: Maybe [(AnnSpan, (GHC.AnnKeywordId, [AnnSpan]))]+ -- , inconsistent :: Maybe [(AnnSpan, (GHC.AnnKeywordId, [AnnSpan]))] } data ParseFailure = ParseFailure String@@ -116,8 +100,8 @@ removeSpaces = map (\case {'\160' -> ' '; s -> s}) -} -roundTripTest :: FilePath -> IO Report-roundTripTest f = genTest noChange f f+roundTripTest :: LibDir -> FilePath -> IO Report+roundTripTest libdir f = genTest libdir noChange f f mkParsingTest :: (FilePath -> IO Report) -> FilePath -> FilePath -> Test@@ -125,88 +109,75 @@ let basename = testPrefix </> dir </> fp writeFailure = writeFile (basename <.> "out") writeHsPP = writeFile (basename <.> "hspp")- writeIncons s = writeFile (basename <.> "incons") (showGhc s)+ -- writeIncons s = writeFile (basename <.> "incons") (showGhc s) in TestCase (do r <- either (\(ParseFailure s) -> error (s ++ basename)) id <$> tester basename writeFailure (debugTxt r)- forM_ (inconsistent r) writeIncons+ -- forM_ (inconsistent r) writeIncons forM_ (cppStatus r) writeHsPP assertBool fp (status r == Success)) -type Changer = (Anns -> GHC.ParsedSource -> IO (Anns,GHC.ParsedSource))+-- type Changer = (Anns -> GHC.ParsedSource -> IO (Anns,GHC.ParsedSource))+-- First param is libdir+type Changer = LibDir -> (GHC.ParsedSource -> IO GHC.ParsedSource) noChange :: Changer-noChange ans parsed = return (ans,parsed)+noChange _libdir parsed = return parsed -genTest :: Changer -> FilePath -> FilePath -> IO Report-genTest f origFile expectedFile = do- res <- parseModuleApiAnnsWithCpp defaultCppOptions origFile+genTest :: LibDir -> Changer -> FilePath -> FilePath -> IO Report+genTest libdir f origFile expectedFile = do+ res <- parseModuleEpAnnsWithCpp libdir defaultCppOptions origFile expected <- GHC.liftIO $ readFileGhc expectedFile orig <- GHC.liftIO $ readFileGhc origFile -- let pristine = removeSpaces expected let pristine = expected case res of-#if __GLASGOW_HASKELL__ > 808 Left m -> return . Left $ ParseFailure (showErrorMessages m)-#else- Left (_ss, m) -> return . Left $ ParseFailure m-#endif- Right (apianns, injectedComments, dflags, pmod) -> do- (printed', anns, pmod') <- GHC.liftIO (runRoundTrip f apianns pmod injectedComments)-#if __GLASGOW_HASKELL__ <= 710- let useCpp = GHC.xopt GHC.Opt_Cpp dflags-#else+ Right (injectedComments, dflags, pmod) -> do+ (printed', pmod') <- GHC.liftIO (runRoundTrip libdir f pmod injectedComments) let useCpp = GHC.xopt LangExt.Cpp dflags-#endif printed = trimPrinted printed'- -- let (printed, anns) = first trimPrinted $ runRoundTrip apianns pmod injectedComments -- Clang cpp adds an extra newline character -- Do not remove this line! trimPrinted p = if useCpp then unlines $ take (length (lines pristine)) (lines p) else p- debugTxt = mkDebugOutput origFile printed pristine apianns anns pmod'- consistency = checkConsistency apianns pmod- inconsistent = if null consistency then Nothing else Just consistency+ debugTxt = mkDebugOutput origFile printed pristine pmod'+ -- consistency = checkConsistency apianns pmod+ -- inconsistent = if null consistency then Nothing else Just consistency status = if printed == pristine then Success else RoundTripFailure cppStatus = if useCpp then Just orig else Nothing return $ Right Report {..} mkDebugOutput :: FilePath -> String -> String- -> GHC.ApiAnns- -> Anns -> GHC.ParsedSource -> String-mkDebugOutput filename printed original apianns anns parsed =+mkDebugOutput filename printed original parsed = intercalate sep [ printed , filename , "lengths:" ++ show (length printed,length original) ++ "\n"- , showAnnData anns 0 parsed- , showGhc anns- , showGhc apianns+ -- , showAnnData anns 0 parsed+ , showAst parsed+ -- , showGhc anns ] where sep = "\n==============\n" -runRoundTrip :: Changer-#if __GLASGOW_HASKELL__ >= 900- -> GHC.ApiAnns -> GHC.Located GHC.HsModule-#else- -> GHC.ApiAnns -> GHC.Located (GHC.HsModule GhcPs)-#endif- -> [Comment]- -> IO (String, Anns, GHC.ParsedSource)-runRoundTrip f !anns !parsedOrig cs = do- let !relAnns = relativiseApiAnnsWithComments cs parsedOrig anns- (annsMod, pmod) <- f relAnns parsedOrig- let !printed = exactPrint pmod annsMod- -- return (printed, relAnns, pmod)- return (printed, annsMod, pmod)+runRoundTrip :: LibDir+ -> Changer+ -> GHC.Located GHC.HsModule+ -> [GHC.LEpaComment]+ -> IO (String, GHC.ParsedSource)+runRoundTrip libdir f !parsedOrig cs = do+ let !parsedOrigWithComments = insertCppComments parsedOrig cs+ pmod <- f libdir parsedOrigWithComments+ let !printed = exactPrint pmod+ return (printed, pmod) -- ---------------------------------------------------------------------` @@ -230,11 +201,7 @@ cfileName <- GHC.liftIO $ canonicalizePath fileName graph <- GHC.getModuleGraph-#if __GLASGOW_HASKELL__ >= 804 cgraph <- GHC.liftIO $ canonicalizeGraph (GHC.mgModSummaries graph)-#else- cgraph <- GHC.liftIO $ canonicalizeGraph graph-#endif let mm = filter (\(mfn,_ms) -> mfn == Just cfileName) cgraph case mm of@@ -243,20 +210,16 @@ -- --------------------------------------------------------------------- -#if __GLASGOW_HASKELL__ > 808 showErrorMessages :: GHC.ErrorMessages -> String showErrorMessages m = show $ GHC.bagToList m-#endif -- --------------------------------------------------------------------- -#if __GLASGOW_HASKELL__ >= 900-instance GHC.Outputable GHC.ApiAnns where- ppr (GHC.ApiAnns items eof comments rogueComments)- = GHC.text "ApiAnns" GHC.<+> GHC.ppr items- GHC.<+> GHC.ppr eof- GHC.<+> GHC.ppr comments- GHC.<+> GHC.ppr rogueComments-#endif+-- instance GHC.Outputable GHC.ApiAnns where+-- ppr (GHC.ApiAnns items eof comments rogueComments)+-- = GHC.text "ApiAnns" GHC.<+> GHC.ppr items+-- GHC.<+> GHC.ppr eof+-- GHC.<+> GHC.ppr comments+-- GHC.<+> GHC.ppr rogueComments -- ---------------------------------------------------------------------
tests/Test/CommonUtils.hs view
@@ -1,4 +1,3 @@-{-# LANGUAGE CPP #-} module Test.CommonUtils ( findSrcFiles@@ -25,11 +24,7 @@ import Data.List hiding (find) import System.FilePath import System.FilePath.Find-#if __GLASGOW_HASKELL__ >= 900 import qualified GHC.Data.StringBuffer as GHC-#else-import qualified StringBuffer as GHC-#endif -- ---------------------------------------------------------------------
− tests/Test/Consistency.hs
@@ -1,33 +0,0 @@-{-# LANGUAGE CPP #-}-module Test.Consistency where--import Data.Data-import GHC-import qualified Data.Map as Map-import qualified Data.Set as Set-import Data.Generics (everything, mkQ)--import Language.Haskell.GHC.ExactPrint.Types (AnnSpan)-import Language.Haskell.GHC.ExactPrint.Utils (isPointSrcSpan, rs)---- import Debug.Trace--checkConsistency :: Data a => GHC.ApiAnns -> a -> [(AnnSpan, (AnnKeywordId, [AnnSpan]))]-checkConsistency anns ast =- let srcspans = Set.fromList $ map rs $ getAllSrcSpans ast- cons (s, (_, vs)) = Set.member s srcspans || (all (isPointSrcSpan) vs)- in filter (\s -> not (cons s)) (getAnnSrcSpans anns)--getAnnSrcSpans :: ApiAnns -> [(AnnSpan,(AnnKeywordId,[AnnSpan]))]-#if __GLASGOW_HASKELL__ >= 900-getAnnSrcSpans anns = map (\((ss,k),v) -> (ss,(k,v))) $ Map.toList (GHC.apiAnnItems anns)-#else-getAnnSrcSpans (anns,_) = map (\((ss,k),v) -> (ss,(k,v))) $ Map.toList anns-#endif--getAllSrcSpans :: (Data t) => t -> [SrcSpan]-getAllSrcSpans ast = everything (++) ([] `mkQ` getSrcSpan) ast- where- getSrcSpan :: SrcSpan -> [SrcSpan]- getSrcSpan ss = [ss]-
tests/Test/NoAnnotations.hs view
@@ -1,5 +1,4 @@ {-# LANGUAGE BangPatterns #-}-{-# LANGUAGE CPP #-} {-# LANGUAGE NamedFieldPuns #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-}@@ -9,61 +8,26 @@ -- import Control.Monad.State import Data.Algorithm.Diff import Data.Algorithm.DiffOutput-import Data.Data (Data, toConstr, showConstr, cast)-import Data.Generics (extQ, ext1Q, ext2Q, gmapQ)+-- import Data.Data (Data, toConstr, showConstr, cast)+-- import Data.Generics (extQ, ext1Q, ext2Q, gmapQ) import Data.List -- import Data.Ord (comparing)-import qualified Data.ByteString as B+-- import qualified Data.ByteString as B import Language.Haskell.GHC.ExactPrint import Language.Haskell.GHC.ExactPrint.Parsers import Language.Haskell.GHC.ExactPrint.Types import Language.Haskell.GHC.ExactPrint.Utils -#if __GLASGOW_HASKELL__ >= 900+import qualified GHC.Utils.Outputable as GHC import qualified Control.Monad.IO.Class as GHC-import qualified GHC as GHC hiding (parseModule)-import qualified GHC.Data.Bag as GHC-import qualified GHC.Data.FastString as GHC--- import qualified GHC.Data.StringBuffer as GHC--- import qualified GHC.Driver.Phases as GHC--- import qualified GHC.Driver.Pipeline as GHC--- import qualified GHC.Driver.Session as GHC--- import qualified GHC.Driver.Types as GHC--- import qualified GHC.Fingerprint.Type as GHC--- import qualified GHC.Utils.Fingerprint as GHC--- import qualified GHC.Parser.Lexer as GHC--- import qualified GHC.Settings as GHC-import qualified GHC.Types.SrcLoc as GHC--- import qualified GHC.Utils.Error as GHC-import qualified GHC.Utils.Outputable as GHC-import qualified GHC.Types.Name.Occurrence as OccName (occNameString)-import qualified GHC.Types.Var as GHC-import qualified GHC.Types.Name.Set as GHC-#else-import qualified ApiAnnotation as GHC-import qualified Bag as GHC-import qualified FastString as GHC-import qualified GHC as GHC hiding (parseModule)-import qualified MonadUtils as GHC-import qualified NameSet as GHC-import qualified Outputable as GHC-import qualified SrcLoc as GHC-import qualified Var as GHC--import qualified OccName(occNameString)-#endif---+import qualified GHC as GHC hiding (parseModule)+-- import qualified GHC.Driver.Ppr as GHC+import qualified GHC.Hs.Dump as GHC import System.Directory import System.FilePath -#if __GLASGOW_HASKELL__ < 900-import qualified Data.Map as Map-#endif- import Test.Common import Test.HUnit@@ -86,80 +50,67 @@ -- --------------------------------------------------------------------- -mkPrettyRoundtrip :: FilePath -> FilePath -> Test-mkPrettyRoundtrip dir fp = mkParsingTest prettyRoundtripTest dir fp+mkPrettyRoundtrip :: LibDir -> FilePath -> FilePath -> Test+mkPrettyRoundtrip libdir dir fp = mkParsingTest (prettyRoundtripTest libdir) dir fp -prettyRoundtripTest :: FilePath -> IO Report-prettyRoundtripTest origFile = do- res <- parseModuleApiAnnsWithCpp defaultCppOptions origFile+prettyRoundtripTest :: LibDir -> FilePath -> IO Report+prettyRoundtripTest libdir origFile = do+ -- res <- parseModuleApiAnnsWithCpp defaultCppOptions origFile+ res <- parseModuleEpAnnsWithCpp libdir defaultCppOptions origFile case res of-#if __GLASGOW_HASKELL__ > 808 Left m -> return . Left $ ParseFailure (showErrorMessages m)-#else- Left (_ss, m) -> return . Left $ ParseFailure m-#endif- Right (apianns, injectedComments, _dflags, parsed) -> do- res2 <- GHC.liftIO (runPrettyRoundTrip origFile apianns parsed injectedComments)+ Right (injectedComments, _dflags, parsed) -> do+ res2 <- GHC.liftIO (runPrettyRoundTrip libdir origFile parsed injectedComments) case res2 of-#if __GLASGOW_HASKELL__ > 808 Left m -> return . Left $ ParseFailure (showErrorMessages m)-#else- Left (_ss, m) -> return . Left $ ParseFailure m-#endif- Right (_anns', parsed') -> do+ Right parsed' -> do let- originalStructure = astStructure parsed []- roundtripStructure = astStructure parsed' []+ originalStructure = astStructure parsed+ roundtripStructure = astStructure parsed' (status,debugTxt') = if roundtripStructure == originalStructure then (Success, "ok") else (RoundTripFailure,diffText originalStructure roundtripStructure ++ sep ++ originalStructure ++ sep ++ roundtripStructure) cppStatus = Nothing- inconsistent = Nothing- !annsOrig = relativiseApiAnnsWithComments injectedComments parsed apianns debugTxt = intercalate sep [ debugTxt' , originalStructure , roundtripStructure- , showAnnData annsOrig 0 parsed+ , showAst parsed ] sep = "\n=====================================\n"- return $ Right Report {debugTxt,status,cppStatus,inconsistent}+ return $ Right Report {debugTxt,status,cppStatus} -- --------------------------------------------------------------------- -runPrettyRoundTrip :: FilePath -> GHC.ApiAnns -> GHC.ParsedSource- -> [Comment]+runPrettyRoundTrip :: LibDir -> FilePath -> GHC.ParsedSource+ -> [GHC.LEpaComment] -> IO (ParseResult GHC.ParsedSource)-runPrettyRoundTrip origFile !anns !parsedOrig _cs = do- let !newAnns = addAnnotationsForPretty [] parsedOrig mempty-#if __GLASGOW_HASKELL__ >= 900- let comments = map tokComment $ GHC.sortRealLocated (GHC.apiAnnRogueComments anns)-#else- let comments = case Map.lookup GHC.noSrcSpan (snd anns) of- Nothing -> []- Just cl -> map tokComment $ GHC.sortLocated cl-#endif+runPrettyRoundTrip libdir origFile !parsedOrig _cs = do+ -- let !newAnns = addAnnotationsForPretty [] parsedOrig mempty+ let priorComments = GHC.priorComments $ GHC.epAnnComments $ GHC.hsmodAnn $ GHC.unLoc parsedOrig+ -- let comments = map tokComment $ GHC.sortRealLocated priorComments+ let comments = map tokComment priorComments let pragmas = filter (\(Comment c _ _) -> isPrefixOf "{-#" c ) comments let pragmaStr = intercalate "\n" $ map commentContents pragmas - let !printed = pragmaStr ++ "\n" ++ exactPrint parsedOrig newAnns+ let !printed = pragmaStr ++ "\n" ++ exactPrint parsedOrig -- let !printed = pragmaStr ++ "\n" ++ (showSDoc_ $ GHC.ppr parsedOrig) - parseString origFile printed newAnns parsedOrig+ parseString libdir origFile printed parsedOrig -parseString :: FilePath -> String -> Anns -> GHC.ParsedSource+parseString :: LibDir -> FilePath -> String -> GHC.ParsedSource -> IO (ParseResult GHC.ParsedSource)-parseString origFile src newAnns origParsed = do+parseString libdir origFile src origParsed = do tmpDir <- getTemporaryDirectory let workDir = tmpDir </> "ghc-exactprint" </> "noannotations" -- putStrLn $ "workDir=" ++ workDir createDirectoryIfMissing True workDir let fileName = workDir </> takeFileName origFile writeFile (workDir </> takeFileName origFile <.> ".anns")- (showAnnData newAnns 0 origParsed)+ (showAst origParsed) writeFile fileName src- parseModule fileName+ parseModule libdir fileName -- --------------------------------------------------------------------- @@ -174,81 +125,8 @@ -- |Convert an AST with comments into a string representing the structure only -- (i.e. ignoring locations), to be used for comparisons between the original -- AST and the one after pretty-print roundtripping.--- Based on @showAnnData@-astStructure :: GHC.ParsedSource -> [Comment] -> String-astStructure parsed _cs = r+astStructure :: GHC.ParsedSource -> String+astStructure parsed = r where- r = showAstData 0 parsed------ | Show a GHC AST with interleaved Annotation information.-showAstData :: Data a => Int -> a -> String-showAstData n =- generic -- `ext1Q` located- `ext1Q` list- `extQ` string `extQ` fastString `extQ` srcSpan- `extQ` bytestring- `extQ` name `extQ` occName `extQ` moduleName `extQ` var `extQ` dataCon- `extQ` overLit- `extQ` bagName `extQ` bagRdrName `extQ` bagVar `extQ` nameSet-#if __GLASGOW_HASKELL__ >= 900- `extQ` layoutInfo-#endif- `extQ` fixity- `ext2Q` located- where generic :: Data a => a -> String- generic t = indent n ++ "(" ++ showConstr (toConstr t)- ++ space (unwords (gmapQ (showAstData (n+1)) t)) ++ ")"- space "" = ""- space s = ' ':s- indent i = "\n" ++ replicate i ' '- string = show :: String -> String- fastString = ("{FastString: "++) . (++"}") . show :: GHC.FastString -> String- bytestring = show :: B.ByteString -> String- list l = indent n ++ "["- ++ intercalate "," (map (showAstData (n+1)) l) ++ "]"-- name = ("{Name: "++) . (++"}") . showSDocDebug_ . GHC.ppr :: GHC.Name -> String- occName = ("{OccName: "++) . (++"}") . OccName.occNameString- moduleName = ("{ModuleName: "++) . (++"}") . showSDoc_ . GHC.ppr :: GHC.ModuleName -> String-- srcSpan :: GHC.SrcSpan -> String- srcSpan _ss = "{ "++ "ss" ++"}"-- var = ("{Var: "++) . (++"}") . showSDocDebug_ . GHC.ppr :: GHC.Var -> String- dataCon = ("{DataCon: "++) . (++"}") . showSDoc_ . GHC.ppr :: GHC.DataCon -> String-- overLit :: GHC.HsOverLit GhcPs -> String- overLit = ("{HsOverLit:"++) . (++"}") . showSDoc_ . GHC.ppr-- bagRdrName:: GHC.Bag (GHC.Located (GHC.HsBind GhcPs)) -> String- bagRdrName = ("{Bag(Located (HsBind RdrName)): "++) . (++"}") . list . GHC.bagToList- bagName :: GHC.Bag (GHC.Located (GHC.HsBind GhcRn)) -> String- bagName = ("{Bag(Located (HsBind Name)): "++) . (++"}") . list . GHC.bagToList- bagVar :: GHC.Bag (GHC.Located (GHC.HsBind GhcTc)) -> 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--#if __GLASGOW_HASKELL__ >= 900- layoutInfo = const "{LayoutInfo: blanked }" :: GHC.LayoutInfo -> String-#endif-- located :: (Data b,Data loc) => GHC.GenLocated loc b -> String- located (GHC.L ss a) =- indent n ++ "("- ++ case cast ss of- Just (s :: GHC.SrcSpan) ->- srcSpan s- Nothing -> "nnnnnnnn"- ++ showAstData (n+1) a- ++ ")"---- ---------------------------------------------------------------------+ r = GHC.showSDocUnsafe+ $ GHC.showAstData GHC.BlankSrcSpanFile GHC.NoBlankEpAnnotations parsed
tests/Test/Transform.hs view
@@ -1,873 +1,1118 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE TupleSections #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE ViewPatterns #-}-module Test.Transform where--import Language.Haskell.GHC.ExactPrint-import Language.Haskell.GHC.ExactPrint.Types-import Language.Haskell.GHC.ExactPrint.Parsers-import Language.Haskell.GHC.ExactPrint.Utils--#if __GLASGOW_HASKELL__ >= 900-import qualified GHC as GHC-import qualified GHC.Data.Bag as GHC-import qualified GHC.Data.FastString as GHC-import qualified GHC.Types.Name.Occurrence as GHC-import qualified GHC.Types.Name.Reader as GHC-import qualified GHC.Types.SrcLoc as GHC-#else-import qualified Bag as GHC-import qualified GHC as GHC-import qualified OccName as GHC-import qualified RdrName as GHC-import qualified SrcLoc as GHC-import qualified FastString as GHC-#endif--import qualified Data.Generics as SYB--import System.FilePath-import qualified Data.Map as Map--- import Data.List--- import Data.Maybe--import Test.Common--import Test.HUnit--transformTests :: Test-transformTests = TestLabel "transformation tests" $ TestList- [- TestLabel "Low level transformations"- (TestList transformLowLevelTests)- , TestLabel "High level transformations"- (TestList transformHighLevelTests)- ]--transformLowLevelTests :: [Test]-transformLowLevelTests = [- mkTestModChange changeRenameCase1 "RenameCase1.hs"- , mkTestModChange changeLayoutLet2 "LayoutLet2.hs"- , mkTestModChange changeLayoutLet3 "LayoutLet3.hs"- , mkTestModChange changeLayoutLet3 "LayoutLet4.hs"- , mkTestModChange changeRename1 "Rename1.hs"- , mkTestModChange changeRename2 "Rename2.hs"- , mkTestModChange changeLayoutIn1 "LayoutIn1.hs"- , mkTestModChange changeLayoutIn3 "LayoutIn3.hs"- , mkTestModChange changeLayoutIn3 "LayoutIn3a.hs"- , mkTestModChange changeLayoutIn3 "LayoutIn3b.hs"- , mkTestModChange changeLayoutIn4 "LayoutIn4.hs"- , mkTestModChange changeLocToName "LocToName.hs"- , mkTestModChange changeLetIn1 "LetIn1.hs"- , mkTestModChange changeWhereIn4 "WhereIn4.hs"- , mkTestModChange changeAddDecl "AddDecl.hs"- , mkTestModChange changeLocalDecls "LocalDecls.hs"- , mkTestModChange changeLocalDecls2 "LocalDecls2.hs"- , mkTestModChange changeWhereIn3a "WhereIn3a.hs"--- , mkTestModChange changeCifToCase "C.hs" "C"- ]--mkTestModChange :: Changer -> FilePath -> Test-mkTestModChange = mkTestMod "expected" "transform"--mkTestModBad :: FilePath -> Test-mkTestModBad = mkTestMod "bad" "failing" noChange---mkTestMod :: String -> FilePath -> Changer -> FilePath -> Test-mkTestMod suffix dir f fp =- let basename = testPrefix </> dir </> fp- expected = basename <.> suffix- writeFailure = writeFile (basename <.> "out")- in- TestCase (do r <- either (\(ParseFailure s) -> error (s ++ basename)) id- <$> genTest f basename expected- writeFailure (debugTxt r)- assertBool fp (status r == Success))----- -----------------------------------------------------------------------changeWhereIn3a :: Changer-changeWhereIn3a ans (GHC.L l p) = do- let decls = GHC.hsmodDecls p- -- (GHC.L _ (GHC.SigD sig)) = head $ drop 1 decls- d1 = head $ drop 2 decls- d2 = head $ drop 3 decls- let (_p1,(ans',_),_w) = runTransform ans (balanceComments d1 d2)- let p2 = p { GHC.hsmodDecls = d2:d1:decls}- return (ans',GHC.L l p2)---- ------------------------------------------------------------------------- | Add a local declaration with signature to LocalDecl, where there was no--- prior local decl. So it adds a "where" annotation.-changeLocalDecls2 :: Changer-changeLocalDecls2 ans (GHC.L l p) = do-#if __GLASGOW_HASKELL__ > 804- Right (declAnns, d@(GHC.L ld (GHC.ValD _ decl))) <- withDynFlags (\df -> parseDecl df "decl" "nn = 2")- Right (sigAnns, s@(GHC.L ls (GHC.SigD _ sig))) <- withDynFlags (\df -> parseDecl df "sig" "nn :: Int")-#else- Right (declAnns, d@(GHC.L ld (GHC.ValD decl))) <- withDynFlags (\df -> parseDecl df "decl" "nn = 2")- Right (sigAnns, s@(GHC.L ls (GHC.SigD sig))) <- withDynFlags (\df -> parseDecl df "sig" "nn :: Int")-#endif- let declAnns' = setPrecedingLines (GHC.L ld decl) 1 0 declAnns- let sigAnns' = setPrecedingLines (GHC.L ls sig) 1 4 sigAnns- -- putStrLn $ "changeLocalDecls:sigAnns=" ++ show sigAnns- -- putStrLn $ "changeLocalDecls:declAnns=" ++ show declAnns- -- putStrLn $ "\nchangeLocalDecls:sigAnns'=" ++ show sigAnns'- let (p',(ans',_),_w) = runTransform ans doAddLocal- doAddLocal = SYB.everywhereM (SYB.mkM replaceLocalBinds) p- replaceLocalBinds :: GHC.LMatch GhcPs (GHC.LHsExpr GhcPs)- -> Transform (GHC.LMatch GhcPs (GHC.LHsExpr GhcPs))-#if __GLASGOW_HASKELL__ <= 710- replaceLocalBinds m@(GHC.L lm (GHC.Match mln pats typ (GHC.GRHSs rhs (GHC.EmptyLocalBinds)))) = do-#elif __GLASGOW_HASKELL__ <= 802- replaceLocalBinds m@(GHC.L lm (GHC.Match mln pats typ (GHC.GRHSs rhs (GHC.L _ GHC.EmptyLocalBinds)))) = do-#elif __GLASGOW_HASKELL__ <= 804- replaceLocalBinds m@(GHC.L lm (GHC.Match mln pats (GHC.GRHSs rhs (GHC.L _ GHC.EmptyLocalBinds)))) = do-#else- replaceLocalBinds m@(GHC.L lm (GHC.Match _ mln pats (GHC.GRHSs _ rhs (GHC.L _ GHC.EmptyLocalBinds{})))) = do-#endif- newSpan <- uniqueSrcSpanT- let- newAnnKey = AnnKey (rs newSpan) (CN "HsValBinds")- addWhere mkds =- case Map.lookup (mkAnnKey m) mkds of- Nothing -> error "wtf"- Just ann -> Map.insert newAnnKey ann2 mkds2- where- ann1 = ann { annsDP = annsDP ann ++ [(G GHC.AnnWhere,DP (1,2))]- , annCapturedSpan = Just newAnnKey- , annSortKey = Just [rs ls, rs ld]- }- mkds2 = Map.insert (mkAnnKey m) ann1 mkds- ann2 = annNone- { annEntryDelta = DP (1,0) }- modifyAnnsT addWhere- let decls = [s,d]- -- logTr $ "(m,decls)=" ++ show (mkAnnKey m,map mkAnnKey decls)- modifyAnnsT (captureOrderAnnKey newAnnKey decls)-#if __GLASGOW_HASKELL__ > 804- let binds = (GHC.HsValBinds noExt (GHC.ValBinds noExt (GHC.listToBag $ [GHC.L ld decl])- [GHC.L ls sig]))-#else- let binds = (GHC.HsValBinds (GHC.ValBindsIn (GHC.listToBag $ [GHC.L ld decl])- [GHC.L ls sig]))-#endif-#if __GLASGOW_HASKELL__ <= 710- return (GHC.L lm (GHC.Match mln pats typ (GHC.GRHSs rhs binds)))-#elif __GLASGOW_HASKELL__ <= 802- bindSpan <- uniqueSrcSpanT- return (GHC.L lm (GHC.Match mln pats typ (GHC.GRHSs rhs (GHC.L bindSpan binds))))-#elif __GLASGOW_HASKELL__ <= 804- bindSpan <- uniqueSrcSpanT- return (GHC.L lm (GHC.Match mln pats (GHC.GRHSs rhs (GHC.L bindSpan binds))))-#else- bindSpan <- uniqueSrcSpanT- return (GHC.L lm (GHC.Match noExt mln pats (GHC.GRHSs noExt rhs (GHC.L bindSpan binds))))-#endif- replaceLocalBinds x = return x- -- putStrLn $ "log:" ++ intercalate "\n" w- return (mergeAnnList [declAnns',sigAnns',ans'],GHC.L l p')---- ------------------------------------------------------------------------- | Add a local declaration with signature to LocalDecl-changeLocalDecls :: Changer-changeLocalDecls ans (GHC.L l p) = do-#if __GLASGOW_HASKELL__ > 804- Right (declAnns, d@(GHC.L ld (GHC.ValD _ decl))) <- withDynFlags (\df -> parseDecl df "decl" "nn = 2")- Right (sigAnns, s@(GHC.L ls (GHC.SigD _ sig))) <- withDynFlags (\df -> parseDecl df "sig" "nn :: Int")-#else- Right (declAnns, d@(GHC.L ld (GHC.ValD decl))) <- withDynFlags (\df -> parseDecl df "decl" "nn = 2")- Right (sigAnns, s@(GHC.L ls (GHC.SigD sig))) <- withDynFlags (\df -> parseDecl df "sig" "nn :: Int")-#endif- let declAnns' = setPrecedingLines (GHC.L ld decl) 1 0 declAnns- let sigAnns' = setPrecedingLines (GHC.L ls sig) 1 4 sigAnns- -- putStrLn $ "changeLocalDecls:sigAnns=" ++ show sigAnns- -- putStrLn $ "changeLocalDecls:declAnns=" ++ show declAnns- -- putStrLn $ "\nchangeLocalDecls:sigAnns'=" ++ show sigAnns'- let (p',(ans',_),_w) = runTransform ans doAddLocal- doAddLocal = SYB.everywhereM (SYB.mkM replaceLocalBinds) p- replaceLocalBinds :: GHC.LMatch GhcPs (GHC.LHsExpr GhcPs)- -> Transform (GHC.LMatch GhcPs (GHC.LHsExpr GhcPs))-#if __GLASGOW_HASKELL__ <= 710- replaceLocalBinds m@(GHC.L lm (GHC.Match mln pats typ (GHC.GRHSs rhs (GHC.HsValBinds (GHC.ValBindsIn binds sigs))))) = do-#elif __GLASGOW_HASKELL__ <= 802- replaceLocalBinds m@(GHC.L lm (GHC.Match mln pats typ (GHC.GRHSs rhs (GHC.L lb (GHC.HsValBinds (GHC.ValBindsIn binds sigs)))))) = do-#elif __GLASGOW_HASKELL__ <= 804- replaceLocalBinds m@(GHC.L lm (GHC.Match mln pats (GHC.GRHSs rhs (GHC.L lb (GHC.HsValBinds (GHC.ValBindsIn binds sigs)))))) = do-#else- replaceLocalBinds m@(GHC.L lm (GHC.Match _ mln pats (GHC.GRHSs _ rhs (GHC.L lb (GHC.HsValBinds _ (GHC.ValBinds _ binds sigs)))))) = do-#endif- a1 <- getAnnsT- a' <- case sigs of- [] -> return a1- (s1:_) -> do- let a2 = setPrecedingLines s1 2 0 a1- return a2- putAnnsT a'- let oldDecls = GHC.sortLocated $ map wrapDecl (GHC.bagToList binds) ++ map wrapSig sigs- let decls = s:d:oldDecls- -- logTr $ "(m,decls)=" ++ show (mkAnnKey m,map mkAnnKey decls)- modifyAnnsT (captureOrder m decls)-#if __GLASGOW_HASKELL__ > 804- let binds' = (GHC.HsValBinds noExt- (GHC.ValBinds noExt (GHC.listToBag $ (GHC.L ld decl):GHC.bagToList binds)- (GHC.L ls sig:sigs)))-#else- let binds' = (GHC.HsValBinds- (GHC.ValBindsIn (GHC.listToBag $ (GHC.L ld decl):GHC.bagToList binds)- (GHC.L ls sig:sigs)))-#endif-#if __GLASGOW_HASKELL__ <= 710- return (GHC.L lm (GHC.Match mln pats typ (GHC.GRHSs rhs binds')))-#elif __GLASGOW_HASKELL__ <= 802- return (GHC.L lm (GHC.Match mln pats typ (GHC.GRHSs rhs (GHC.L lb binds'))))-#elif __GLASGOW_HASKELL__ <= 804- return (GHC.L lm (GHC.Match mln pats (GHC.GRHSs rhs (GHC.L lb binds'))))-#else- return (GHC.L lm (GHC.Match noExt mln pats (GHC.GRHSs noExt rhs (GHC.L lb binds'))))-#endif- replaceLocalBinds x = return x- -- putStrLn $ "log:" ++ intercalate "\n" w- return (mergeAnnList [declAnns',sigAnns',ans'],GHC.L l p')---- ------------------------------------------------------------------------- | Add a declaration to AddDecl-changeAddDecl :: Changer-changeAddDecl ans top = do- Right (declAnns, decl) <- withDynFlags (\df -> parseDecl df "<interactive>" "nn = n2")- -- putStrLn $ "changeDecl:(declAnns,decl)=" ++ showGhc (declAnns,decl)- let declAnns' = setPrecedingLines decl 2 0 declAnns- -- putStrLn $ "changeDecl:(declAnns',decl)=" ++ showGhc (declAnns',decl)-- let (p',(ans',_),_) = runTransform ans doAddDecl- doAddDecl = SYB.everywhereM (SYB.mkM replaceTopLevelDecls) top- replaceTopLevelDecls :: GHC.ParsedSource -> Transform (GHC.ParsedSource)- replaceTopLevelDecls m = insertAtStart m decl- return (mergeAnns declAnns' ans',p')---- ------------------------------------------------------------------------- |Remove a decl with a trailing comment, and remove the trailing comment too-changeWhereIn3 :: Int -> Changer-changeWhereIn3 declIndex ans p = return (ans',p')- where- (p',(ans',_),_) = runTransform ans doTransform- doTransform = doRmDecl p--#if __GLASGOW_HASKELL__ >= 900- doRmDecl (GHC.L l (GHC.HsModule lo mmn mexp imps decls mdepr haddock)) = do-#else- doRmDecl (GHC.L l (GHC.HsModule mmn mexp imps decls mdepr haddock)) = do-#endif- let- -- declIndex = 2 -- zero based- decls1 = take declIndex decls- decls2 = drop (declIndex + 1) decls- decls' = decls1 ++ decls2-#if __GLASGOW_HASKELL__ >= 900- return (GHC.L l (GHC.HsModule lo mmn mexp imps decls' mdepr haddock))-#else- return (GHC.L l (GHC.HsModule mmn mexp imps decls' mdepr haddock))-#endif- -- error $ "doRmDecl:decls2=" ++ showGhc (length decls,decls1,decls2)---- -----------------------------------------------------------------------changeRenameCase1 :: Changer-changeRenameCase1 ans parsed = return (ans,rename "bazLonger" [((3,15),(3,18))] parsed)--- changeRenameCase1 ans parsed = return (ans,rename "bazLonger" [((3,15),(3,17))] parsed)--changeRenameCase2 :: Changer-changeRenameCase2 ans parsed = return (ans,rename "fooLonger" [((3,1),(3,4))] parsed)--changeLayoutLet2 :: Changer-changeLayoutLet2 ans parsed = return (ans,rename "xxxlonger" [((7,5),(7,8)),((8,24),(8,27))] parsed)--changeLocToName :: Changer-changeLocToName ans parsed = return (ans,rename "LocToName.newPoint" [((20,1),(20,11)),((20,28),(20,38)),((24,1),(24,11))] parsed)--changeLayoutIn3 :: Changer-changeLayoutIn3 ans parsed = return (ans,rename "anotherX" [((7,13),(7,14)),((7,37),(7,38)),((8,37),(8,38))] parsed)--- changeLayoutIn3 parsed = rename "anotherX" [((7,13),(7,14)),((7,37),(7,38))] parsed--changeLayoutIn4 :: Changer-changeLayoutIn4 ans parsed = return (ans,rename "io" [((7,8),(7,13)),((7,28),(7,33))] parsed)--changeLayoutIn1 :: Changer-changeLayoutIn1 ans parsed = return (ans,rename "square" [((7,17),(7,19)),((7,24),(7,26))] parsed)--changeRename1 :: Changer-changeRename1 ans parsed = return (ans,rename "bar2" [((3,1),(3,4))] parsed)--changeRename2 :: Changer-changeRename2 ans parsed = return (ans,rename "joe" [((2,1),(2,5))] parsed)--changeLayoutLet3 :: Changer-changeLayoutLet3 ans parsed = return (ans,rename "xxxlonger" [((7,5),(7,8)),((9,14),(9,17))] parsed)--changeLayoutLet5 :: Changer-changeLayoutLet5 ans parsed = return (ans,rename "x" [((7,5),(7,8)),((9,14),(9,17))] parsed)---- AZ:TODO: the GHC 8 version only needs to consider Located RdrName-rename :: (SYB.Data a) => String -> [(Pos, Pos)] -> a -> a-rename newNameStr spans a- = SYB.everywhere ( SYB.mkT replaceRdr- `SYB.extT` replaceHsVar- `SYB.extT` replacePat- ) a- where- newName = GHC.mkRdrUnqual (GHC.mkVarOcc newNameStr)-- cond :: GHC.SrcSpan -> Bool- cond ln = ss2range ln `elem` spans-- replaceRdr :: GHC.Located GHC.RdrName -> GHC.Located GHC.RdrName- replaceRdr (GHC.L ln _)- | cond ln = GHC.L ln newName- replaceRdr x = x-- replaceHsVar :: GHC.LHsExpr GhcPs -> GHC.LHsExpr GhcPs- replaceHsVar (GHC.L ln (GHC.HsVar{}))-#if __GLASGOW_HASKELL__ <= 710- | cond ln = GHC.L ln (GHC.HsVar newName)-#elif __GLASGOW_HASKELL__ <= 804- | cond ln = GHC.L ln (GHC.HsVar (GHC.L ln newName))-#else- | cond ln = GHC.L ln (GHC.HsVar noExt (GHC.L ln newName))-#endif- replaceHsVar x = x----#if (__GLASGOW_HASKELL__ > 806) && (__GLASGOW_HASKELL__ < 900)- replacePat :: GHC.LPat GhcPs -> GHC.LPat GhcPs- replacePat (GHC.dL->GHC.L ln (GHC.VarPat {}))- | cond ln = GHC.cL ln (GHC.VarPat noExt (GHC.cL ln newName))-#elif __GLASGOW_HASKELL__ > 804- replacePat :: GHC.LPat GhcPs -> GHC.LPat GhcPs- replacePat (GHC.L ln (GHC.VarPat {}))- | cond ln = GHC.L ln (GHC.VarPat noExt (GHC.L ln newName))-#elif __GLASGOW_HASKELL__ > 802- replacePat :: GHC.LPat GhcPs -> GHC.LPat GhcPs- replacePat (GHC.L ln (GHC.VarPat {}))- | cond ln = GHC.L ln (GHC.VarPat (GHC.L ln newName))-#elif __GLASGOW_HASKELL__ >= 800- replacePat (GHC.L ln (GHC.VarPat {}))- | cond ln = GHC.L ln (GHC.VarPat (GHC.L ln newName))-#else- replacePat (GHC.L ln (GHC.VarPat {}))- | cond ln = GHC.L ln (GHC.VarPat newName)-#endif- replacePat x = x------ #if __GLASGOW_HASKELL__ > 802--- replacePat :: GHC.LPat GhcPs -> GHC.LPat GhcPs--- #endif--- replacePat (GHC.L ln (GHC.VarPat {}))--- #if __GLASGOW_HASKELL__ <= 710--- | cond ln = GHC.L ln (GHC.VarPat newName)--- #elif __GLASGOW_HASKELL__ <= 804--- | cond ln = GHC.L ln (GHC.VarPat (GHC.L ln newName))--- #else--- | cond ln = GHC.L ln (GHC.VarPat noExt (GHC.L ln newName))--- #endif--- replacePat x = x------ -----------------------------------------------------------------------changeWhereIn4 :: Changer-changeWhereIn4 ans parsed- = return (ans,SYB.everywhere (SYB.mkT replace) parsed)- where- replace :: GHC.Located GHC.RdrName -> GHC.Located GHC.RdrName- replace (GHC.L ln _n)- | ss2range ln == ((12,16),(12,17)) = GHC.L ln (GHC.mkRdrUnqual (GHC.mkVarOcc "p_2"))- replace x = x---- -----------------------------------------------------------------------changeLetIn1 :: Changer-changeLetIn1 ans parsed- = return (ans,SYB.everywhere (SYB.mkT replace) parsed)- where- replace :: GHC.HsExpr GhcPs -> GHC.HsExpr GhcPs-#if __GLASGOW_HASKELL__ <= 710- replace (GHC.HsLet localDecls expr@(GHC.L _ _))-#elif __GLASGOW_HASKELL__ <= 804- replace (GHC.HsLet (GHC.L lb localDecls) expr@(GHC.L _ _))-#else- replace (GHC.HsLet _ (GHC.L lb localDecls) expr@(GHC.L _ _))-#endif- =-#if __GLASGOW_HASKELL__ > 804- let (GHC.HsValBinds x (GHC.ValBinds xv bagDecls sigs)) = localDecls- bagDecls' = GHC.listToBag $ init $ GHC.bagToList bagDecls-#else- let (GHC.HsValBinds (GHC.ValBindsIn bagDecls sigs)) = localDecls- bagDecls' = GHC.listToBag $ init $ GHC.bagToList bagDecls-#endif-#if __GLASGOW_HASKELL__ <= 710- in (GHC.HsLet (GHC.HsValBinds (GHC.ValBindsIn bagDecls' sigs)) expr)-#elif __GLASGOW_HASKELL__ <= 802- in (GHC.HsLet (GHC.L lb (GHC.HsValBinds (GHC.ValBindsIn bagDecls' sigs))) expr)-#elif __GLASGOW_HASKELL__ <= 804- in (GHC.HsLet (GHC.L lb (GHC.HsValBinds (GHC.ValBindsIn bagDecls' sigs))) expr)-#else- in (GHC.HsLet noExt (GHC.L lb (GHC.HsValBinds x (GHC.ValBinds xv bagDecls' sigs))) expr)-#endif-- replace x = x---- -----------------------------------------------------------------------transformHighLevelTests :: [Test]-transformHighLevelTests =- [- mkTestModChange addLocaLDecl1 "AddLocalDecl1.hs"- , mkTestModChange addLocaLDecl2 "AddLocalDecl2.hs"- , mkTestModChange addLocaLDecl3 "AddLocalDecl3.hs"- , mkTestModChange addLocaLDecl4 "AddLocalDecl4.hs"- , mkTestModChange addLocaLDecl5 "AddLocalDecl5.hs"- , mkTestModChange addLocaLDecl6 "AddLocalDecl6.hs"-- , mkTestModChange rmDecl1 "RmDecl1.hs"- , mkTestModChange rmDecl2 "RmDecl2.hs"- , mkTestModChange rmDecl3 "RmDecl3.hs"- , mkTestModChange rmDecl4 "RmDecl4.hs"- , mkTestModChange rmDecl5 "RmDecl5.hs"- , mkTestModChange rmDecl6 "RmDecl6.hs"- , mkTestModChange rmDecl7 "RmDecl7.hs"-- , mkTestModChange rmTypeSig1 "RmTypeSig1.hs"- , mkTestModChange rmTypeSig2 "RmTypeSig2.hs"-- , mkTestModChange addHiding1 "AddHiding1.hs"- , mkTestModChange addHiding2 "AddHiding2.hs"-- , mkTestModChange cloneDecl1 "CloneDecl1.hs"- ]---- -----------------------------------------------------------------------addLocaLDecl1 :: Changer-addLocaLDecl1 ans lp = do- Right (declAnns, newDecl) <- withDynFlags (\df -> parseDecl df "decl" "nn = 2")- let declAnns' = setPrecedingLines newDecl 1 4 declAnns- doAddLocal = do- (d1:d2:_) <- hsDecls lp- balanceComments d1 d2- (d1',_) <- modifyValD (GHC.getLoc d1) d1 $ \_m d -> do- return ((newDecl : d),Nothing)- replaceDecls lp [d1', d2]-- (lp',(ans',_),_w) <- runTransformT (mergeAnns ans declAnns') doAddLocal- -- putStrLn $ "log:\n" ++ intercalate "\n" _w- return (ans',lp')---- -----------------------------------------------------------------------addLocaLDecl2 :: Changer-addLocaLDecl2 ans lp = do- Right (declAnns, newDecl) <- withDynFlags (\df -> parseDecl df "decl" "nn = 2")- let- doAddLocal = do- tlDecs <- hsDecls lp- let parent = head tlDecs- balanceComments parent (head $ tail tlDecs)-- (parent',_) <- modifyValD (GHC.getLoc parent) parent $ \_m decls -> do- transferEntryDPT (head decls) newDecl- setEntryDPT (head decls) (DP (1, 0))- return ((newDecl:decls),Nothing)-- replaceDecls lp (parent':tail tlDecs)-- let (lp',(ans',_),_w) = runTransform (mergeAnns ans declAnns) doAddLocal- -- putStrLn $ "log:\n" ++ intercalate "\n" _w- return (ans',lp')---- -----------------------------------------------------------------------addLocaLDecl3 :: Changer-addLocaLDecl3 ans lp = do- Right (declAnns, newDecl) <- withDynFlags (\df -> parseDecl df "decl" "nn = 2")- let- doAddLocal = do- -- logDataWithAnnsTr "parsed:" lp- logDataWithAnnsTr "newDecl:" newDecl- tlDecs <- hsDecls lp- let parent = head tlDecs- balanceComments parent (head $ tail tlDecs)-- (parent',_) <- modifyValD (GHC.getLoc parent) parent $ \m decls -> do- setPrecedingLinesT newDecl 1 0- moveTrailingComments m (last decls)- return ((decls++[newDecl]),Nothing)-- replaceDecls lp (parent':tail tlDecs)-- let (lp',(ans',_),_w) = runTransform (mergeAnns ans declAnns) doAddLocal- -- putStrLn $ "log\n" ++ intercalate "\n" _w- return (ans',lp')---- -----------------------------------------------------------------------addLocaLDecl4 :: Changer-addLocaLDecl4 ans lp = do- Right (declAnns, newDecl) <- withDynFlags (\df -> parseDecl df "decl" "nn = 2")- Right (sigAnns, newSig) <- withDynFlags (\df -> parseDecl df "sig" "nn :: Int")- -- putStrLn $ "addLocaLDecl4:lp=" ++ showGhc lp- let- doAddLocal = do- tlDecs <- hsDecls lp- let parent = head tlDecs-- setPrecedingLinesT newSig 1 0- setPrecedingLinesT newDecl 1 0-- (parent',_) <- modifyValD (GHC.getLoc parent) parent $ \_m decls -> do- return ((decls++[newSig,newDecl]),Nothing)-- replaceDecls lp (parent':tail tlDecs)-- let (lp',(ans',_),_w) = runTransform (mergeAnnList [ans,declAnns,sigAnns]) doAddLocal- -- putStrLn $ "log\n" ++ intercalate "\n" _w- return (ans',lp')---- -----------------------------------------------------------------------addLocaLDecl5 :: Changer-addLocaLDecl5 ans lp = do- let- doAddLocal = do- [s1,d1,d2,d3] <- hsDecls lp-- transferEntryDPT d2 d3-- (d1',_) <- modifyValD (GHC.getLoc d1) d1 $ \_m _decls -> do- return ([d2],Nothing)- replaceDecls lp [s1,d1',d3]-- (lp',(ans',_),_w) <- runTransformT ans doAddLocal- -- putStrLn $ "log\n" ++ intercalate "\n" _w- return (ans',lp')---- -----------------------------------------------------------------------addLocaLDecl6 :: Changer-addLocaLDecl6 ans lp = do- Right (declAnns, newDecl) <- withDynFlags (\df -> parseDecl df "decl" "x = 3")- let declAnns' = setPrecedingLines newDecl 1 4 declAnns- doAddLocal = do- [d1,d2] <- hsDecls lp- balanceComments d1 d2--#if __GLASGOW_HASKELL__ >= 900- let GHC.L _ (GHC.ValD _ (GHC.FunBind _ _ (GHC.MG _ (GHC.L _ [m1,m2]) _) _)) = d1-#elif __GLASGOW_HASKELL__ > 808- let GHC.L _ (GHC.ValD _ (GHC.FunBind _ _ (GHC.MG _ (GHC.L _ [m1,m2]) _) _ _)) = d1-#elif __GLASGOW_HASKELL__ > 804- let GHC.L _ (GHC.ValD _ (GHC.FunBind _ _ (GHC.MG _ (GHC.L _ [m1,m2]) _) _ _)) = d1-#elif __GLASGOW_HASKELL__ > 710- let GHC.L _ (GHC.ValD (GHC.FunBind _ (GHC.MG (GHC.L _ [m1,m2]) _ _ _) _ _ _)) = d1-#else- let GHC.L _ (GHC.ValD (GHC.FunBind _ _ (GHC.MG [m1,m2] _ _ _) _ _ _)) = d1-#endif- balanceComments m1 m2-- (d1',_) <- modifyValD (GHC.getLoc m1) d1 $ \_m decls -> do- return ((newDecl : decls),Nothing)- replaceDecls lp [d1', d2]-- (lp',(ans',_),_w) <- runTransformT (mergeAnns ans declAnns') doAddLocal- -- putStrLn $ "log:\n" ++ intercalate "\n" _w- return (ans',lp')--- -----------------------------------------------------------------------rmDecl1 :: Changer-rmDecl1 ans lp = do- let doRmDecl = do- tlDecs <- hsDecls lp- let (d1:s1:d2:ds) = tlDecs-- -- First delete the decl (d2) only- balanceComments s1 d2 -- ++AZ++- balanceComments d2 (head ds)- lp1 <- replaceDecls lp (d1:s1:ds)- -- return lp1-- -- Then delete the sig separately- tlDecs1 <- hsDecls lp1- let (d1':s1':ds') = tlDecs1- -- transferEntryDPT s1' (head ds') -- required in HaRe.- balanceComments d1' s1'- balanceComments s1' (head ds')- transferEntryDPT s1' (head ds') -- required in HaRe.- replaceDecls lp (d1':ds')-- (lp',(ans',_),_w) <- runTransformT ans doRmDecl- return (ans',lp')---- -----------------------------------------------------------------------rmDecl2 :: Changer-rmDecl2 ans lp = do- let- doRmDecl = do- let- go :: GHC.LHsExpr GhcPs -> Transform (GHC.LHsExpr GhcPs)- go e@(GHC.L _ (GHC.HsLet{})) = do- decs <- hsDecls e- e' <- replaceDecls e (init decs)- return e'- go x = return x-- SYB.everywhereM (SYB.mkM go) lp-- let (lp',(ans',_),_w) = runTransform ans doRmDecl- -- putStrLn $ "log:\n" ++ intercalate "\n" _w- return (ans',lp')---- -----------------------------------------------------------------------rmDecl3 :: Changer-rmDecl3 ans lp = do- let- doRmDecl = do- [d1,d2] <- hsDecls lp-- (d1',Just sd1) <- modifyValD (GHC.getLoc d1) d1 $ \_m [sd1] -> do- setPrecedingLinesDeclT sd1 2 0- return ([],Just sd1)-- replaceDecls lp [d1',sd1,d2]-- (lp',(ans',_),_w) <- runTransformT ans doRmDecl- -- putStrLn $ "log:\n" ++ intercalate "\n" _w- return (ans',lp')---- -----------------------------------------------------------------------rmDecl4 :: Changer-rmDecl4 ans lp = do- let- doRmDecl = do- [d1] <- hsDecls lp-- (d1',Just sd1) <- modifyValD (GHC.getLoc d1) d1 $ \_m [sd1,sd2] -> do- -- [sd1,sd2] <- hsDecls d1- transferEntryDPT sd1 sd2-- setPrecedingLinesDeclT sd1 2 0- -- d1' <- replaceDecls d1 [sd2]- return ([sd2],Just sd1)-- replaceDecls lp [d1',sd1]-- (lp',(ans',_),_w) <- runTransformT ans doRmDecl- return (ans',lp')---- -----------------------------------------------------------------------rmDecl5 :: Changer-rmDecl5 ans lp = do- let- doRmDecl = do- let- go :: GHC.HsExpr GhcPs -> Transform (GHC.HsExpr GhcPs)-#if __GLASGOW_HASKELL__ <= 710- go (GHC.HsLet lb expr) = do-#elif __GLASGOW_HASKELL__ <= 804- go (GHC.HsLet (GHC.L l lb) expr) = do-#else- go (GHC.HsLet _ (GHC.L l lb) expr) = do-#endif- decs <- hsDeclsValBinds lb- let dec = last decs- transferEntryDPT (head decs) dec- lb' <- replaceDeclsValbinds lb [dec]-#if __GLASGOW_HASKELL__ <= 710- return (GHC.HsLet lb' expr)-#elif __GLASGOW_HASKELL__ <= 804- return (GHC.HsLet (GHC.L l lb') expr)-#else- return (GHC.HsLet noExt (GHC.L l lb') expr)-#endif- go x = return x-- SYB.everywhereM (SYB.mkM go) lp-- let (lp',(ans',_),_w) = runTransform ans doRmDecl- -- putStrLn $ "log:" ++ intercalate "\n" _w- return (ans',lp')---- -----------------------------------------------------------------------rmDecl6 :: Changer-rmDecl6 ans lp = do- let- doRmDecl = do- [d1] <- hsDecls lp-- (d1',_) <- modifyValD (GHC.getLoc d1) d1 $ \_m subDecs -> do- let (ss1:_sd1:sd2:sds) = subDecs- transferEntryDPT ss1 sd2-- return (sd2:sds,Nothing)-- replaceDecls lp [d1']-- (lp',(ans',_),_w) <- runTransformT ans doRmDecl- -- putStrLn $ "log:" ++ intercalate "\n" _w- return (ans',lp')---- -----------------------------------------------------------------------rmDecl7 :: Changer-rmDecl7 ans lp = do- let- doRmDecl = do- tlDecs <- hsDecls lp- let [s1,d1,d2,d3] = tlDecs-- balanceComments d1 d2- balanceComments d2 d3-- transferEntryDPT d2 d3-- replaceDecls lp [s1,d1,d3]-- let (lp',(ans',_),_w) = runTransform ans doRmDecl- -- putStrLn $ "log:" ++ intercalate "\n" _w- return (ans',lp')---- -----------------------------------------------------------------------rmTypeSig1 :: Changer-rmTypeSig1 ans lp = do- let doRmDecl = do- tlDecs <- hsDecls lp- let (s1:d1:d2) = tlDecs-#if __GLASGOW_HASKELL__ <= 710- (GHC.L l (GHC.SigD (GHC.TypeSig names typ p))) = s1- s1' = (GHC.L l (GHC.SigD (GHC.TypeSig (tail names) typ p)))-#elif __GLASGOW_HASKELL__ <= 804- (GHC.L l (GHC.SigD (GHC.TypeSig names typ))) = s1- s1' = (GHC.L l (GHC.SigD (GHC.TypeSig (tail names) typ)))-#else- (GHC.L l (GHC.SigD x1 (GHC.TypeSig x2 names typ))) = s1- s1' = (GHC.L l (GHC.SigD x1 (GHC.TypeSig x2 (tail names) typ)))-#endif- replaceDecls lp (s1':d1:d2)-- let (lp',(ans',_),_w) = runTransform ans doRmDecl- return (ans',lp')---- -----------------------------------------------------------------------rmTypeSig2 :: Changer-rmTypeSig2 ans lp = do- let doRmDecl = do- tlDecs <- hsDecls lp- let [d1] = tlDecs-- (d1',_) <- modifyValD (GHC.getLoc d1) d1 $ \_m [s,d] -> do- transferEntryDPT s d- return ([d],Nothing)- replaceDecls lp [d1']-- let (lp',(ans',_),_w) = runTransform ans doRmDecl- -- putStrLn $ "log:" ++ intercalate "\n" _w- return (ans',lp')---- -----------------------------------------------------------------------addHiding1 :: Changer-addHiding1 ans (GHC.L l p) = do- let doTransform = do- l0 <- uniqueSrcSpanT- l1 <- uniqueSrcSpanT- l2 <- uniqueSrcSpanT- let- [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__ > 804- v1 = GHC.L l1 (GHC.IEVar noExt (GHC.L l1 (GHC.IEName n1)))- v2 = GHC.L l2 (GHC.IEVar noExt (GHC.L l2 (GHC.IEName n2)))-#elif __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]}- addSimpleAnnT impHiding (DP (0,1)) [((G GHC.AnnHiding),DP (0,0)),((G GHC.AnnOpenP),DP (0,1)),((G GHC.AnnCloseP),DP (0,0))]- addSimpleAnnT n1 (DP (0,0)) [((G GHC.AnnVal),DP (0,0))]- addSimpleAnnT v1 (DP (0,0)) [((G GHC.AnnComma),DP (0,0))]- addSimpleAnnT n2 (DP (0,0)) [((G GHC.AnnVal),DP (0,0))]- return (GHC.L l p')-- let (lp',(ans',_),_w) = runTransform ans doTransform- return (ans',lp')---- -----------------------------------------------------------------------addHiding2 :: Changer-addHiding2 ans (GHC.L l p) = do- let doTransform = do- l1 <- uniqueSrcSpanT- l2 <- uniqueSrcSpanT- let- [GHC.L li imp1] = GHC.hsmodImports p- 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__ > 804- v1 = GHC.L l1 (GHC.IEVar noExt (GHC.L l1 (GHC.IEName n1)))- v2 = GHC.L l2 (GHC.IEVar noExt (GHC.L l2 (GHC.IEName n2)))-#elif __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))]- addSimpleAnnT v1 (DP (0,0)) [((G GHC.AnnComma),DP (0,0))]- addSimpleAnnT n2 (DP (0,0)) [((G GHC.AnnVal),DP (0,0))]- addTrailingCommaT (last ns)- return (GHC.L l p')-- let (lp',(ans',_),_w) = runTransform ans doTransform- return (ans',lp')---- -----------------------------------------------------------------------cloneDecl1 :: Changer-cloneDecl1 ans lp = do- let doChange = do- tlDecs <- hsDecls lp- let (d1:d2:ds) = tlDecs- d2' <- fst <$> cloneT d2- replaceDecls lp (d1:d2:d2':ds)-- let (lp',(ans',_),_w) = runTransform ans doChange- return (ans',lp')+{-# LANGUAGE TupleSections #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE ViewPatterns #-}+module Test.Transform where++import Language.Haskell.GHC.ExactPrint+import Language.Haskell.GHC.ExactPrint.Types+import Language.Haskell.GHC.ExactPrint.Parsers+import Language.Haskell.GHC.ExactPrint.Utils++import GHC as GHC+import GHC.Data.Bag as GHC+import GHC.Data.FastString as GHC+import GHC.Types.Name.Occurrence as GHC+import GHC.Types.Name.Reader as GHC++import Data.Generics as SYB++import System.FilePath+import Data.List++import Test.Common++import Test.HUnit++transformTestsTT :: LibDir -> Test+transformTestsTT libdir = TestLabel "transformTestsTT" $ TestList+ [+ mkTestModChange libdir addLocaLDecl5 "AddLocalDecl5.hs"+ ]++transformTests :: LibDir -> Test+transformTests libdir = TestLabel "transformation tests" $ TestList+ [+ TestLabel "Low level transformations"+ (TestList (transformLowLevelTests libdir))+ , TestLabel "High level transformations"+ (TestList (transformHighLevelTests libdir))+ ]++transformLowLevelTests :: LibDir -> [Test]+transformLowLevelTests libdir = [+ mkTestModChange libdir changeRenameCase1 "RenameCase1.hs"+ , mkTestModChange libdir changeLayoutLet2 "LayoutLet2.hs"+ , mkTestModChange libdir changeLayoutLet3 "LayoutLet3.hs"+ , mkTestModChange libdir changeLayoutLet3 "LayoutLet4.hs"+ , mkTestModChange libdir changeRename1 "Rename1.hs"+ , mkTestModChange libdir changeRename2 "Rename2.hs"+ , mkTestModChange libdir changeLayoutIn1 "LayoutIn1.hs"+ , mkTestModChange libdir changeLayoutIn3 "LayoutIn3.hs"+ , mkTestModChange libdir changeLayoutIn3 "LayoutIn3a.hs"+ , mkTestModChange libdir changeLayoutIn3 "LayoutIn3b.hs"+ , mkTestModChange libdir changeLayoutIn4 "LayoutIn4.hs"+ , mkTestModChange libdir changeLocToName "LocToName.hs"+ , mkTestModChange libdir changeLetIn1 "LetIn1.hs"+ , mkTestModChange libdir changeWhereIn4 "WhereIn4.hs"+ , mkTestModChange libdir changeAddDecl "AddDecl.hs"+ , mkTestModChange libdir changeLocalDecls "LocalDecls.hs"+ , mkTestModChange libdir changeLocalDecls2 "LocalDecls2.hs"+ , mkTestModChange libdir changeWhereIn3a "WhereIn3a.hs"+-- , mkTestModChange changeCifToCase "C.hs" "C"+ ]++mkTestModChange :: LibDir -> Changer -> FilePath -> Test+mkTestModChange libdir f file = mkTestMod libdir "expected" "transform" f file++mkTestModBad :: LibDir -> FilePath -> Test+mkTestModBad libdir file+ = mkTestMod libdir "bad" "failing" noChange file+++mkTestMod :: LibDir -> String -> FilePath -> Changer -> FilePath -> Test+mkTestMod libdir suffix dir f fp =+ let basename = testPrefix </> dir </> fp+ expected = basename <.> suffix+ writeFailure = writeFile (basename <.> "out")+ in+ TestCase (do r <- either (\(ParseFailure s) -> error (s ++ basename)) id+ <$> genTest libdir f basename expected+ writeFailure (debugTxt r)+ assertBool fp (status r == Success))+++-- ---------------------------------------------------------------------++-- changeWhereIn3a :: Changer+-- changeWhereIn3a ans (GHC.L l p) = do+-- let decls = GHC.hsmodDecls p+-- -- (GHC.L _ (GHC.SigD sig)) = head $ drop 1 decls+-- d1 = head $ drop 2 decls+-- d2 = head $ drop 3 decls+-- let (_p1,(ans',_),_w) = runTransform ans (balanceComments d1 d2)+-- let p2 = p { GHC.hsmodDecls = d2:d1:decls}+-- return (ans',GHC.L l p2)++-- | Check that balanceCommentsList is idempotent+changeWhereIn3a :: Changer+changeWhereIn3a _libdir (L l p) = do+ let decls0 = hsmodDecls p+ (decls,(_,_),w) = runTransform mempty (balanceCommentsList decls0)+ (_de0:_:de1:_d2:_) = decls+ debugM $ unlines w+ debugM $ "changeWhereIn3a:de1:" ++ showAst de1+ let p2 = p { hsmodDecls = decls}+ return (L l p2)++-- ---------------------------------------------------------------------++changeWhereIn3b :: Changer+changeWhereIn3b _libdir (L l p) = do+ let decls0 = hsmodDecls p+ (decls,(_,_),w) = runTransform mempty (balanceCommentsList decls0)+ (de0:_:de1:d2:_) = decls+ de0' = setEntryDP' de0 (DifferentLine 2 0)+ de1' = setEntryDP' de1 (DifferentLine 2 0)+ d2' = setEntryDP' d2 (DifferentLine 2 0)+ decls' = d2':de1':de0':(tail decls)+ debugM $ unlines w+ debugM $ "changeWhereIn3b:de1':" ++ showAst de1'+ let p2 = p { hsmodDecls = decls'}+ return (L l p2)++-- ---------------------------------------------------------------------++-- -- | Add a local declaration with signature to LocalDecl, where there was no+-- -- prior local decl. So it adds a "where" annotation.+-- changeLocalDecls2 :: Changer+-- changeLocalDecls2 ans (GHC.L l p) = do+-- Right (declAnns, d@(GHC.L ld (GHC.ValD _ decl))) <- withDynFlags (\df -> parseDecl df "decl" "nn = 2")+-- Right (sigAnns, s@(GHC.L ls (GHC.SigD _ sig))) <- withDynFlags (\df -> parseDecl df "sig" "nn :: Int")+-- let declAnns' = setPrecedingLines (GHC.L ld decl) 1 0 declAnns+-- let sigAnns' = setPrecedingLines (GHC.L ls sig) 1 4 sigAnns+-- -- putStrLn $ "changeLocalDecls:sigAnns=" ++ show sigAnns+-- -- putStrLn $ "changeLocalDecls:declAnns=" ++ show declAnns+-- -- putStrLn $ "\nchangeLocalDecls:sigAnns'=" ++ show sigAnns'+-- let (p',(ans',_),_w) = runTransform ans doAddLocal+-- doAddLocal = SYB.everywhereM (SYB.mkM replaceLocalBinds) p+-- replaceLocalBinds :: GHC.LMatch GHC.GhcPs (GHC.LHsExpr GHC.GhcPs)+-- -> Transform (GHC.LMatch GHC.GhcPs (GHC.LHsExpr GHC.GhcPs))+-- replaceLocalBinds m@(GHC.L lm (GHC.Match _ mln pats (GHC.GRHSs _ rhs (GHC.L _ GHC.EmptyLocalBinds{})))) = do+-- newSpan <- uniqueSrcSpanT+-- let+-- newAnnKey = AnnKey (rs newSpan) (CN "HsValBinds")+-- addWhere mkds =+-- case Map.lookup (mkAnnKey m) mkds of+-- Nothing -> error "wtf"+-- Just ann -> Map.insert newAnnKey ann2 mkds2+-- where+-- ann1 = ann { annsDP = annsDP ann ++ [(G GHC.AnnWhere,DP (1,2))]+-- , annCapturedSpan = Just newAnnKey+-- , annSortKey = Just [rs ls, rs ld]+-- }+-- mkds2 = Map.insert (mkAnnKey m) ann1 mkds+-- ann2 = annNone+-- { annEntryDelta = DP (1,0) }+-- modifyAnnsT addWhere+-- let decls = [s,d]+-- -- logTr $ "(m,decls)=" ++ show (mkAnnKey m,map mkAnnKey decls)+-- modifyAnnsT (captureOrderAnnKey newAnnKey decls)+-- let binds = (GHC.HsValBinds noExt (GHC.ValBinds noExt (GHC.listToBag $ [GHC.L ld decl])+-- [GHC.L ls sig]))+-- bindSpan <- uniqueSrcSpanT+-- return (GHC.L lm (GHC.Match noExt mln pats (GHC.GRHSs noExt rhs (GHC.L bindSpan binds))))+-- replaceLocalBinds x = return x+-- -- putStrLn $ "log:" ++ intercalate "\n" w+-- return (mergeAnnList [declAnns',sigAnns',ans'],GHC.L l p')+++-- | Add a local declaration with signature to LocalDecl, where there was no+-- prior local decl. So it adds a "where" annotation.+changeLocalDecls2 :: Changer+changeLocalDecls2 libdir (L l p) = do+ Right d@(L ld (ValD _ decl)) <- withDynFlags libdir (\df -> parseDecl df "decl" "nn = 2")+ Right s@(L ls (SigD _ sig)) <- withDynFlags libdir (\df -> parseDecl df "sig" "nn :: Int")+ let decl' = setEntryDP' (L ld decl) (DifferentLine 1 0)+ let sig' = setEntryDP' (L ls sig) (SameLine 2)+ let (p',(_,_),_w) = runTransform mempty doAddLocal+ doAddLocal = everywhereM (mkM replaceLocalBinds) p+ replaceLocalBinds :: LMatch GhcPs (LHsExpr GhcPs)+ -> Transform (LMatch GhcPs (LHsExpr GhcPs))+ replaceLocalBinds (L lm (Match ma mln pats (GRHSs _ rhs EmptyLocalBinds{}))) = do+ newSpan <- uniqueSrcSpanT+ let anc = (Anchor (rs newSpan) (MovedAnchor (DifferentLine 1 3)))+ let anc2 = (Anchor (rs newSpan) (MovedAnchor (DifferentLine 1 5)))+ let an = EpAnn anc+ (AnnList (Just anc2) Nothing Nothing+ [(undeltaSpan (rs newSpan) AnnWhere (SameLine 0))] [])+ emptyComments+ let decls = [s,d]+ let sortKey = captureOrder decls+ let binds = (HsValBinds an (ValBinds sortKey (listToBag $ [decl'])+ [sig']))+ return (L lm (Match ma mln pats (GRHSs noExtField rhs binds)))+ replaceLocalBinds x = return x+ return (L l p')++-- ---------------------------------------------------------------------++-- -- | Add a local declaration with signature to LocalDecl+-- changeLocalDecls :: Changer+-- changeLocalDecls ans (GHC.L l p) = do+-- Right (declAnns, d@(GHC.L ld (GHC.ValD _ decl))) <- withDynFlags (\df -> parseDecl df "decl" "nn = 2")+-- Right (sigAnns, s@(GHC.L ls (GHC.SigD _ sig))) <- withDynFlags (\df -> parseDecl df "sig" "nn :: Int")+-- let declAnns' = setPrecedingLines (GHC.L ld decl) 1 0 declAnns+-- let sigAnns' = setPrecedingLines (GHC.L ls sig) 1 4 sigAnns+-- -- putStrLn $ "changeLocalDecls:sigAnns=" ++ show sigAnns+-- -- putStrLn $ "changeLocalDecls:declAnns=" ++ show declAnns+-- -- putStrLn $ "\nchangeLocalDecls:sigAnns'=" ++ show sigAnns'+-- let (p',(ans',_),_w) = runTransform ans doAddLocal+-- doAddLocal = SYB.everywhereM (SYB.mkM replaceLocalBinds) p+-- replaceLocalBinds :: GHC.LMatch GHC.GhcPs (GHC.LHsExpr GHC.GhcPs)+-- -> Transform (GHC.LMatch GHC.GhcPs (GHC.LHsExpr GHC.GhcPs))+-- replaceLocalBinds m@(GHC.L lm (GHC.Match _ mln pats (GHC.GRHSs _ rhs (GHC.L lb (GHC.HsValBinds _ (GHC.ValBinds _ binds sigs)))))) = do+-- a1 <- getAnnsT+-- a' <- case sigs of+-- [] -> return a1+-- (s1:_) -> do+-- let a2 = setPrecedingLines s1 2 0 a1+-- return a2+-- putAnnsT a'+-- let oldDecls = GHC.sortLocated $ map wrapDecl (GHC.bagToList binds) ++ map wrapSig sigs+-- let decls = s:d:oldDecls+-- -- logTr $ "(m,decls)=" ++ show (mkAnnKey m,map mkAnnKey decls)+-- modifyAnnsT (captureOrder m decls)+-- let binds' = (GHC.HsValBinds noExt+-- (GHC.ValBinds noExt (GHC.listToBag $ (GHC.L ld decl):GHC.bagToList binds)+-- (GHC.L ls sig:sigs)))+-- return (GHC.L lm (GHC.Match noExt mln pats (GHC.GRHSs noExt rhs (GHC.L lb binds'))))+-- replaceLocalBinds x = return x+-- -- putStrLn $ "log:" ++ intercalate "\n" w+-- return (mergeAnnList [declAnns',sigAnns',ans'],GHC.L l p')+++-- | Add a local declaration with signature to LocalDecl+changeLocalDecls :: Changer+changeLocalDecls libdir (L l p) = do+ Right s@(L ls (SigD _ sig)) <- withDynFlags libdir (\df -> parseDecl df "sig" "nn :: Int")+ Right d@(L ld (ValD _ decl)) <- withDynFlags libdir (\df -> parseDecl df "decl" "nn = 2")+ let decl' = setEntryDP' (L ld decl) (DifferentLine 1 0)+ let sig' = setEntryDP' (L ls sig) (SameLine 0)+ let (p',(_,_),_w) = runTransform mempty doAddLocal+ doAddLocal = everywhereM (mkM replaceLocalBinds) p+ replaceLocalBinds :: LMatch GhcPs (LHsExpr GhcPs)+ -> Transform (LMatch GhcPs (LHsExpr GhcPs))+ replaceLocalBinds (L lm (Match an mln pats (GRHSs _ rhs (HsValBinds van (ValBinds _ binds sigs))))) = do+ let oldDecls = sortLocatedA $ map wrapDecl (bagToList binds) ++ map wrapSig sigs+ let decls = s:d:oldDecls+ let oldDecls' = captureLineSpacing oldDecls+ let oldBinds = concatMap decl2Bind oldDecls'+ (os:oldSigs) = concatMap decl2Sig oldDecls'+ os' = setEntryDP' os (DifferentLine 2 0)+ let sortKey = captureOrder decls+ let (EpAnn anc (AnnList (Just (Anchor anc2 _)) a b c dd) cs) = van+ let van' = (EpAnn anc (AnnList (Just (Anchor anc2 (MovedAnchor (DifferentLine 1 5)))) a b c dd) cs)+ let binds' = (HsValBinds van'+ (ValBinds sortKey+ (listToBag $ decl':oldBinds)+ (sig':os':oldSigs)))+ return (L lm (Match an mln pats (GRHSs noExtField rhs binds')))+ replaceLocalBinds x = return x+ return (L l p')++-- ---------------------------------------------------------------------++-- | Add a declaration to AddDecl+-- changeAddDecl :: Changer+-- changeAddDecl ans top = do+-- Right (declAnns, decl) <- withDynFlags (\df -> parseDecl df "<interactive>" "nn = n2")+-- -- putStrLn $ "changeDecl:(declAnns,decl)=" ++ showGhc (declAnns,decl)+-- let declAnns' = setPrecedingLines decl 2 0 declAnns+-- -- putStrLn $ "changeDecl:(declAnns',decl)=" ++ showGhc (declAnns',decl)++-- let (p',(ans',_),_) = runTransform ans doAddDecl+-- doAddDecl = SYB.everywhereM (SYB.mkM replaceTopLevelDecls) top+-- replaceTopLevelDecls :: GHC.ParsedSource -> Transform (GHC.ParsedSource)+-- replaceTopLevelDecls m = insertAtStart m decl+-- return (mergeAnns declAnns' ans',p')++-- | Add a declaration to AddDecl+changeAddDecl :: Changer+changeAddDecl libdir top = do+ Right decl <- withDynFlags libdir (\df -> parseDecl df "<interactive>" "nn = n2")+ let decl' = setEntryDP' decl (DifferentLine 2 0)++ let (p',(_,_),_) = runTransform mempty doAddDecl+ doAddDecl = everywhereM (mkM replaceTopLevelDecls) top+ replaceTopLevelDecls :: ParsedSource -> Transform ParsedSource+ replaceTopLevelDecls m = insertAtStart m decl'+ return p'+-- ---------------------------------------------------------------------++-- -- |Remove a decl with a trailing comment, and remove the trailing comment too+-- changeWhereIn3 :: Int -> Changer+-- changeWhereIn3 declIndex ans p = return (ans',p')+-- where+-- (p',(ans',_),_) = runTransform ans doTransform+-- doTransform = doRmDecl p++-- doRmDecl (GHC.L l (GHC.HsModule lo mmn mexp imps decls mdepr haddock)) = do+-- let+-- -- declIndex = 2 -- zero based+-- decls1 = take declIndex decls+-- decls2 = drop (declIndex + 1) decls+-- decls' = decls1 ++ decls2+-- return (GHC.L l (GHC.HsModule lo mmn mexp imps decls' mdepr haddock))+-- -- error $ "doRmDecl:decls2=" ++ showGhc (length decls,decls1,decls2)++-- ---------------------------------------------------------------------++changeRenameCase1 :: Changer+changeRenameCase1 _libdir parsed = return (rename "bazLonger" [((3,15),(3,18))] parsed)++changeRenameCase2 :: Changer+changeRenameCase2 _libdir parsed = return (rename "fooLonger" [((3,1),(3,4))] parsed)++changeLayoutLet2 :: Changer+changeLayoutLet2 _libdir parsed = return (rename "xxxlonger" [((7,5),(7,8)),((8,24),(8,27))] parsed)++changeLocToName :: Changer+changeLocToName _libdir parsed = return (rename "LocToName.newPoint" [((20,1),(20,11)),((20,28),(20,38)),((24,1),(24,11))] parsed)++changeLayoutIn3 :: Changer+changeLayoutIn3 _libdir parsed = return (rename "anotherX" [((7,13),(7,14)),((7,37),(7,38)),((8,37),(8,38))] parsed)+-- changeLayoutIn3 parsed = rename "anotherX" [((7,13),(7,14)),((7,37),(7,38))] parsed++changeLayoutIn4 :: Changer+changeLayoutIn4 _libdir parsed = return (rename "io" [((7,8),(7,13)),((7,28),(7,33))] parsed)++changeLayoutIn1 :: Changer+changeLayoutIn1 _libdir parsed = return (rename "square" [((7,17),(7,19)),((7,24),(7,26))] parsed)++changeRename1 :: Changer+changeRename1 _libdir parsed = return (rename "bar2" [((3,1),(3,4))] parsed)++changeRename2 :: Changer+changeRename2 _libdir parsed = return (rename "joe" [((2,1),(2,5))] parsed)++changeLayoutLet3 :: Changer+changeLayoutLet3 _libdir parsed = return (rename "xxxlonger" [((7,5),(7,8)),((9,14),(9,17))] parsed)++changeLayoutLet5 :: Changer+changeLayoutLet5 _libdir parsed = return (rename "x" [((7,5),(7,8)),((9,14),(9,17))] parsed)+++rename :: (Data a) => String -> [(Pos, Pos)] -> a -> a+rename newNameStr spans' a+ = everywhere (mkT replaceRdr) a+ where+ newName = mkRdrUnqual (mkVarOcc newNameStr)++ cond :: SrcSpan -> Bool+ cond ln = ss2range ln `elem` spans'++ replaceRdr :: LocatedN RdrName -> LocatedN RdrName+ replaceRdr (L ln _)+ | cond (locA ln) = L ln newName+ replaceRdr x = x+++-- ---------------------------------------------------------------------++-- changeWhereIn4 :: Changer+-- changeWhereIn4 ans parsed+-- = return (ans,SYB.everywhere (SYB.mkT replace) parsed)+-- where+-- replace :: GHC.Located GHC.RdrName -> GHC.Located GHC.RdrName+-- replace (GHC.L ln _n)+-- | ss2range ln == ((12,16),(12,17)) = GHC.L ln (GHC.mkRdrUnqual (GHC.mkVarOcc "p_2"))+-- replace x = x++changeWhereIn4 :: Changer+changeWhereIn4 _libdir parsed+ = return (everywhere (mkT replace) parsed)+ where+ replace :: LocatedN RdrName -> LocatedN RdrName+ replace (L ln _n)+ | ss2range (locA ln) == ((12,16),(12,17)) = L ln (mkRdrUnqual (mkVarOcc "p_2"))+ replace x = x+-- ---------------------------------------------------------------------++-- changeLetIn1 :: Changer+-- changeLetIn1 ans parsed+-- = return (ans,SYB.everywhere (SYB.mkT replace) parsed)+-- where+-- replace :: GHC.HsExpr GHC.GhcPs -> GHC.HsExpr GHC.GhcPs+-- replace (GHC.HsLet _ (GHC.L lb localDecls) expr@(GHC.L _ _))+-- =+-- let (GHC.HsValBinds x (GHC.ValBinds xv bagDecls sigs)) = localDecls+-- bagDecls' = GHC.listToBag $ init $ GHC.bagToList bagDecls+-- in (GHC.HsLet noExt (GHC.L lb (GHC.HsValBinds x (GHC.ValBinds xv bagDecls' sigs))) expr)++-- replace x = x++changeLetIn1 :: Changer+changeLetIn1 _libdir parsed+ = return (everywhere (mkT replace) parsed)+ where+ replace :: HsExpr GhcPs -> HsExpr GhcPs+ replace (HsLet (EpAnn anc (AnnsLet l _i) cs) localDecls expr)+ =+ let (HsValBinds x (ValBinds xv bagDecls sigs)) = localDecls+ [l2,_l1] = map wrapDecl $ bagToList bagDecls+ bagDecls' = listToBag $ concatMap decl2Bind [l2]+ (L (SrcSpanAnn _ le) e) = expr+ a = (SrcSpanAnn (EpAnn (Anchor (realSrcSpan le) (MovedAnchor (SameLine 1))) mempty emptyComments) le)+ expr' = L a e+ in (HsLet (EpAnn anc (AnnsLet l (EpaDelta (DifferentLine 1 0))) cs)+ (HsValBinds x (ValBinds xv bagDecls' sigs)) expr')++ replace x = x++-- ---------------------------------------------------------------------++transformHighLevelTests :: LibDir -> [Test]+transformHighLevelTests libdir =+ [+ mkTestModChange libdir addLocaLDecl1 "AddLocalDecl1.hs"+ , mkTestModChange libdir addLocaLDecl2 "AddLocalDecl2.hs"+ , mkTestModChange libdir addLocaLDecl3 "AddLocalDecl3.hs"+ , mkTestModChange libdir addLocaLDecl4 "AddLocalDecl4.hs"+ , mkTestModChange libdir addLocaLDecl5 "AddLocalDecl5.hs"+ , mkTestModChange libdir addLocaLDecl6 "AddLocalDecl6.hs"++ , mkTestModChange libdir rmDecl1 "RmDecl1.hs"+ , mkTestModChange libdir rmDecl2 "RmDecl2.hs"+ , mkTestModChange libdir rmDecl3 "RmDecl3.hs"+ , mkTestModChange libdir rmDecl4 "RmDecl4.hs"+ , mkTestModChange libdir rmDecl5 "RmDecl5.hs"+ , mkTestModChange libdir rmDecl6 "RmDecl6.hs"+ , mkTestModChange libdir rmDecl7 "RmDecl7.hs"++ , mkTestModChange libdir rmTypeSig1 "RmTypeSig1.hs"+ , mkTestModChange libdir rmTypeSig2 "RmTypeSig2.hs"++ , mkTestModChange libdir addHiding1 "AddHiding1.hs"+ , mkTestModChange libdir addHiding2 "AddHiding2.hs"++ , mkTestModChange libdir cloneDecl1 "CloneDecl1.hs"+ ]++-- ---------------------------------------------------------------------++-- addLocaLDecl1 :: Changer+-- addLocaLDecl1 ans lp = do+-- Right (declAnns, newDecl) <- withDynFlags (\df -> parseDecl df "decl" "nn = 2")+-- let declAnns' = setPrecedingLines newDecl 1 4 declAnns+-- doAddLocal = do+-- (d1:d2:_) <- hsDecls lp+-- balanceComments d1 d2+-- (d1',_) <- modifyValD (GHC.getLoc d1) d1 $ \_m d -> do+-- return ((newDecl : d),Nothing)+-- replaceDecls lp [d1', d2]++-- (lp',(ans',_),_w) <- runTransformT (mergeAnns ans declAnns') doAddLocal+-- -- putStrLn $ "log:\n" ++ intercalate "\n" _w+-- return (ans',lp')++addLocaLDecl1 :: Changer+addLocaLDecl1 libdir lp = do+ Right (L ld (ValD _ decl)) <- withDynFlags libdir (\df -> parseDecl df "decl" "nn = 2")+ let decl' = setEntryDP' (L ld decl) (DifferentLine 1 5)+ doAddLocal = do+ (de1:d2:d3:_) <- hsDecls lp+ (de1'',d2') <- balanceComments de1 d2+ (de1',_) <- modifyValD (getLocA de1'') de1'' $ \_m d -> do+ return ((wrapDecl decl' : d),Nothing)+ replaceDecls lp [de1', d2', d3]++ (lp',(_,_),w) <- runTransformT mempty doAddLocal+ debugM $ "addLocaLDecl1:" ++ intercalate "\n" w+ return lp'+-- ---------------------------------------------------------------------++-- addLocaLDecl2 :: Changer+-- addLocaLDecl2 ans lp = do+-- Right (declAnns, newDecl) <- withDynFlags (\df -> parseDecl df "decl" "nn = 2")+-- let+-- doAddLocal = do+-- tlDecs <- hsDecls lp+-- let parent = head tlDecs+-- balanceComments parent (head $ tail tlDecs)++-- (parent',_) <- modifyValD (GHC.getLoc parent) parent $ \_m decls -> do+-- transferEntryDPT (head decls) newDecl+-- setEntryDPT (head decls) (DP (1, 0))+-- return ((newDecl:decls),Nothing)++-- replaceDecls lp (parent':tail tlDecs)++-- let (lp',(ans',_),_w) = runTransform (mergeAnns ans declAnns) doAddLocal+-- -- putStrLn $ "log:\n" ++ intercalate "\n" _w+-- return (ans',lp')++addLocaLDecl2 :: Changer+addLocaLDecl2 libdir lp = do+ Right newDecl <- withDynFlags libdir (\df -> parseDecl df "decl" "nn = 2")+ let+ doAddLocal = do+ (de1:d2:_) <- hsDecls lp+ (de1'',d2') <- balanceComments de1 d2++ (parent',_) <- modifyValD (getLocA de1) de1'' $ \_m (d:ds) -> do+ newDecl' <- transferEntryDP' d newDecl+ let d' = setEntryDP' d (DifferentLine 1 0)+ return ((newDecl':d':ds),Nothing)++ replaceDecls lp [parent',d2']++ (lp',(_,_),_w) <- runTransformT mempty doAddLocal+ debugM $ "log:[\n" ++ intercalate "\n" _w ++ "]log end\n"+ return lp'++-- ---------------------------------------------------------------------++-- addLocaLDecl3 :: Changer+-- addLocaLDecl3 ans lp = do+-- Right (declAnns, newDecl) <- withDynFlags (\df -> parseDecl df "decl" "nn = 2")+-- let+-- doAddLocal = do+-- -- logDataWithAnnsTr "parsed:" lp+-- logDataWithAnnsTr "newDecl:" newDecl+-- tlDecs <- hsDecls lp+-- let parent = head tlDecs+-- balanceComments parent (head $ tail tlDecs)++-- (parent',_) <- modifyValD (GHC.getLoc parent) parent $ \m decls -> do+-- setPrecedingLinesT newDecl 1 0+-- moveTrailingComments m (last decls)+-- return ((decls++[newDecl]),Nothing)++-- replaceDecls lp (parent':tail tlDecs)++-- let (lp',(ans',_),_w) = runTransform (mergeAnns ans declAnns) doAddLocal+-- -- putStrLn $ "log\n" ++ intercalate "\n" _w+-- return (ans',lp')++addLocaLDecl3 :: Changer+addLocaLDecl3 libdir lp = do+ Right newDecl <- withDynFlags libdir (\df -> parseDecl df "decl" "nn = 2")+ let+ doAddLocal = do+ (de1:d2:_) <- hsDecls lp+ (de1'',d2') <- balanceComments de1 d2++ (parent',_) <- modifyValD (getLocA de1) de1'' $ \_m (d:ds) -> do+ let newDecl' = setEntryDP' newDecl (DifferentLine 1 0)+ return (((d:ds) ++ [newDecl']),Nothing)++ replaceDecls (anchorEof lp) [parent',d2']++ (lp',(_,_),_w) <- runTransformT mempty doAddLocal+ debugM $ "log:[\n" ++ intercalate "\n" _w ++ "]log end\n"+ return lp'++-- ---------------------------------------------------------------------++-- addLocaLDecl4 :: Changer+-- addLocaLDecl4 ans lp = do+-- Right (declAnns, newDecl) <- withDynFlags (\df -> parseDecl df "decl" "nn = 2")+-- Right (sigAnns, newSig) <- withDynFlags (\df -> parseDecl df "sig" "nn :: Int")+-- -- putStrLn $ "addLocaLDecl4:lp=" ++ showGhc lp+-- let+-- doAddLocal = do+-- tlDecs <- hsDecls lp+-- let parent = head tlDecs++-- setPrecedingLinesT newSig 1 0+-- setPrecedingLinesT newDecl 1 0++-- (parent',_) <- modifyValD (GHC.getLoc parent) parent $ \_m decls -> do+-- return ((decls++[newSig,newDecl]),Nothing)++-- replaceDecls lp (parent':tail tlDecs)++-- let (lp',(ans',_),_w) = runTransform (mergeAnnList [ans,declAnns,sigAnns]) doAddLocal+-- -- putStrLn $ "log\n" ++ intercalate "\n" _w+-- return (ans',lp')+++addLocaLDecl4 :: Changer+addLocaLDecl4 libdir lp = do+ Right newDecl <- withDynFlags libdir (\df -> parseDecl df "decl" "nn = 2")+ Right newSig <- withDynFlags libdir (\df -> parseDecl df "sig" "nn :: Int")+ let+ doAddLocal = do+ (parent:ds) <- hsDecls lp++ let newDecl' = setEntryDP' newDecl (DifferentLine 1 0)+ let newSig' = setEntryDP' newSig (DifferentLine 1 5)++ (parent',_) <- modifyValD (getLocA parent) parent $ \_m decls -> do+ return ((decls++[newSig',newDecl']),Nothing)++ replaceDecls (anchorEof lp) (parent':ds)++ (lp',(_,_),_w) <- runTransformT mempty doAddLocal+ debugM $ "log:[\n" ++ intercalate "\n" _w ++ "]log end\n"+ return lp'++-- ---------------------------------------------------------------------++-- addLocaLDecl5 :: Changer+-- addLocaLDecl5 ans lp = do+-- let+-- doAddLocal = do+-- [s1,d1,d2,d3] <- hsDecls lp++-- transferEntryDPT d2 d3++-- (d1',_) <- modifyValD (GHC.getLoc d1) d1 $ \_m _decls -> do+-- return ([d2],Nothing)+-- replaceDecls lp [s1,d1',d3]++-- (lp',(ans',_),_w) <- runTransformT ans doAddLocal+-- -- putStrLn $ "log\n" ++ intercalate "\n" _w+-- return (ans',lp')++addLocaLDecl5 :: Changer+addLocaLDecl5 _libdir lp = do+ let+ doAddLocal = do+ decls <- hsDecls lp+ [s1,de1,d2,d3] <- balanceCommentsList decls++ let d3' = setEntryDP' d3 (DifferentLine 2 0)++ (de1',_) <- modifyValD (getLocA de1) de1 $ \_m _decls -> do+ let d2' = setEntryDP' d2 (DifferentLine 1 0)+ return ([d2'],Nothing)+ replaceDecls lp [s1,de1',d3']++ (lp',(_,_),_w) <- runTransformT mempty doAddLocal+ debugM $ "log:[\n" ++ intercalate "\n" _w ++ "]log end\n"+ return lp'++-- ---------------------------------------------------------------------++-- addLocaLDecl6 :: Changer+-- addLocaLDecl6 ans lp = do+-- Right (declAnns, newDecl) <- withDynFlags (\df -> parseDecl df "decl" "x = 3")+-- let declAnns' = setPrecedingLines newDecl 1 4 declAnns+-- doAddLocal = do+-- [d1,d2] <- hsDecls lp+-- balanceComments d1 d2++-- let GHC.L _ (GHC.ValD _ (GHC.FunBind _ _ (GHC.MG _ (GHC.L _ [m1,m2]) _) _)) = d1+-- balanceComments m1 m2++-- (d1',_) <- modifyValD (GHC.getLoc m1) d1 $ \_m decls -> do+-- return ((newDecl : decls),Nothing)+-- replaceDecls lp [d1', d2]++-- (lp',(ans',_),_w) <- runTransformT (mergeAnns ans declAnns') doAddLocal+-- -- putStrLn $ "log:\n" ++ intercalate "\n" _w+-- return (ans',lp')+++addLocaLDecl6 :: Changer+addLocaLDecl6 libdir lp = do+ Right newDecl <- withDynFlags libdir (\df -> parseDecl df "decl" "x = 3")+ let+ newDecl' = setEntryDP' newDecl (DifferentLine 1 5)+ doAddLocal = do+ decls0 <- hsDecls lp+ [de1'',d2] <- balanceCommentsList decls0++ let de1 = captureMatchLineSpacing de1''+ let L _ (ValD _ (FunBind _ _ (MG _ (L _ ms) _) _)) = de1+ let [ma1,_ma2] = ms++ (de1',_) <- modifyValD (getLocA ma1) de1 $ \_m decls -> do+ return ((newDecl' : decls),Nothing)+ replaceDecls lp [de1', d2]++ (lp',(_,_),_w) <- runTransformT mempty doAddLocal+ debugM $ "log:[\n" ++ intercalate "\n" _w ++ "]log end\n"+ return lp'+-- ---------------------------------------------------------------------++-- rmDecl1 :: Changer+-- rmDecl1 ans lp = do+-- let doRmDecl = do+-- tlDecs <- hsDecls lp+-- let (d1:s1:d2:ds) = tlDecs++-- -- First delete the decl (d2) only+-- balanceComments s1 d2 -- ++AZ+++-- balanceComments d2 (head ds)+-- lp1 <- replaceDecls lp (d1:s1:ds)+-- -- return lp1++-- -- Then delete the sig separately+-- tlDecs1 <- hsDecls lp1+-- let (d1':s1':ds') = tlDecs1+-- -- transferEntryDPT s1' (head ds') -- required in HaRe.+-- balanceComments d1' s1'+-- balanceComments s1' (head ds')+-- transferEntryDPT s1' (head ds') -- required in HaRe.+-- replaceDecls lp (d1':ds')++-- (lp',(ans',_),_w) <- runTransformT ans doRmDecl+-- return (ans',lp')++rmDecl1 :: Changer+rmDecl1 _libdir lp = do+ let doRmDecl = do+ tlDecs0 <- hsDecls lp+ tlDecs <- balanceCommentsList $ captureLineSpacing tlDecs0+ let (de1:_s1:_d2:ds) = tlDecs++ replaceDecls lp (de1:ds)++ (lp',(_,_),_w) <- runTransformT mempty doRmDecl+ debugM $ "log:[\n" ++ intercalate "\n" _w ++ "]log end\n"+ return lp'++-- ---------------------------------------------------------------------++-- rmDecl2 :: Changer+-- rmDecl2 ans lp = do+-- let+-- doRmDecl = do+-- let+-- go :: GHC.LHsExpr GHC.GhcPs -> Transform (GHC.LHsExpr GHC.GhcPs)+-- go e@(GHC.L _ (GHC.HsLet{})) = do+-- decs <- hsDecls e+-- e' <- replaceDecls e (init decs)+-- return e'+-- go x = return x++-- SYB.everywhereM (SYB.mkM go) lp++-- let (lp',(ans',_),_w) = runTransform ans doRmDecl+-- -- putStrLn $ "log:\n" ++ intercalate "\n" _w+-- return (ans',lp')++rmDecl2 :: Changer+rmDecl2 _libdir lp = do+ let+ doRmDecl = do+ let+ go :: GHC.LHsExpr GhcPs -> Transform (GHC.LHsExpr GhcPs)+ go e@(GHC.L _ (GHC.HsLet{})) = do+ decs0 <- hsDecls e+ decs <- balanceCommentsList $ captureLineSpacing decs0+ e' <- replaceDecls e (init decs)+ return e'+ go x = return x++ everywhereM (mkM go) lp++ let (lp',(_,_),_w) = runTransform mempty doRmDecl+ debugM $ "log:[\n" ++ intercalate "\n" _w ++ "]log end\n"+ return lp'+-- ---------------------------------------------------------------------++-- rmDecl3 :: Changer+-- rmDecl3 ans lp = do+-- let+-- doRmDecl = do+-- [d1,d2] <- hsDecls lp++-- (d1',Just sd1) <- modifyValD (GHC.getLoc d1) d1 $ \_m [sd1] -> do+-- setPrecedingLinesDeclT sd1 2 0+-- return ([],Just sd1)++-- replaceDecls lp [d1',sd1,d2]++-- (lp',(ans',_),_w) <- runTransformT ans doRmDecl+-- -- putStrLn $ "log:\n" ++ intercalate "\n" _w+-- return (ans',lp')++rmDecl3 :: Changer+rmDecl3 _libdir lp = do+ let+ doRmDecl = do+ [de1,d2] <- hsDecls lp++ (de1',Just sd1) <- modifyValD (getLocA de1) de1 $ \_m [sd1] -> do+ let sd1' = setEntryDP' sd1 (DifferentLine 2 0)+ return ([],Just sd1')++ replaceDecls lp [de1',sd1,d2]++ (lp',(_,_),_w) <- runTransformT mempty doRmDecl+ debugM $ "log:[\n" ++ intercalate "\n" _w ++ "]log end\n"+ return lp'+-- ---------------------------------------------------------------------++-- rmDecl4 :: Changer+-- rmDecl4 ans lp = do+-- let+-- doRmDecl = do+-- [d1] <- hsDecls lp++-- (d1',Just sd1) <- modifyValD (GHC.getLoc d1) d1 $ \_m [sd1,sd2] -> do+-- -- [sd1,sd2] <- hsDecls d1+-- transferEntryDPT sd1 sd2++-- setPrecedingLinesDeclT sd1 2 0+-- -- d1' <- replaceDecls d1 [sd2]+-- return ([sd2],Just sd1)++-- replaceDecls lp [d1',sd1]++-- (lp',(ans',_),_w) <- runTransformT ans doRmDecl+-- return (ans',lp')++rmDecl4 :: Changer+rmDecl4 _libdir lp = do+ let+ doRmDecl = do+ [de1] <- hsDecls lp++ (de1',Just sd1) <- modifyValD (getLocA de1) de1 $ \_m [sd1,sd2] -> do+ sd2' <- transferEntryDP' sd1 sd2++ let sd1' = setEntryDP' sd1 (DifferentLine 2 0)+ return ([sd2'],Just sd1')++ replaceDecls (anchorEof lp) [de1',sd1]++ (lp',(_,_),_w) <- runTransformT mempty doRmDecl+ debugM $ "log:[\n" ++ intercalate "\n" _w ++ "]log end\n"+ return lp'+-- ---------------------------------------------------------------------++-- rmDecl5 :: Changer+-- rmDecl5 ans lp = do+-- let+-- doRmDecl = do+-- let+-- go :: GHC.HsExpr GHC.GhcPs -> Transform (GHC.HsExpr GHC.GhcPs)+-- go (GHC.HsLet _ (GHC.L l lb) expr) = do+-- decs <- hsDeclsValBinds lb+-- let dec = last decs+-- transferEntryDPT (head decs) dec+-- lb' <- replaceDeclsValbinds lb [dec]+-- return (GHC.HsLet noExt (GHC.L l lb') expr)+-- go x = return x++-- SYB.everywhereM (SYB.mkM go) lp++-- let (lp',(ans',_),_w) = runTransform ans doRmDecl+-- -- putStrLn $ "log:" ++ intercalate "\n" _w+-- return (ans',lp')++rmDecl5 :: Changer+rmDecl5 _libdir lp = do+ let+ doRmDecl = do+ let+ go :: HsExpr GhcPs -> Transform (HsExpr GhcPs)+ go (HsLet a lb expr) = do+ decs <- hsDeclsValBinds lb+ let dec = last decs+ _ <- transferEntryDPT (head decs) dec+ lb' <- replaceDeclsValbinds WithoutWhere lb [dec]+ return (HsLet a lb' expr)+ go x = return x++ everywhereM (mkM go) lp++ let (lp',(_,_),_w) = runTransform mempty doRmDecl+ debugM $ "log:[\n" ++ intercalate "\n" _w ++ "]log end\n"+ return lp'++-- ---------------------------------------------------------------------++-- rmDecl6 :: Changer+-- rmDecl6 ans lp = do+-- let+-- doRmDecl = do+-- [d1] <- hsDecls lp++-- (d1',_) <- modifyValD (GHC.getLoc d1) d1 $ \_m subDecs -> do+-- let (ss1:_sd1:sd2:sds) = subDecs+-- transferEntryDPT ss1 sd2++-- return (sd2:sds,Nothing)++-- replaceDecls lp [d1']++-- (lp',(ans',_),_w) <- runTransformT ans doRmDecl+-- -- putStrLn $ "log:" ++ intercalate "\n" _w+-- return (ans',lp')++rmDecl6 :: Changer+rmDecl6 _libdir lp = do+ let+ doRmDecl = do+ [de1] <- hsDecls lp++ (de1',_) <- modifyValD (getLocA de1) de1 $ \_m subDecs -> do+ let (ss1:_sd1:sd2:sds) = subDecs+ sd2' <- transferEntryDP' ss1 sd2++ return (sd2':sds,Nothing)++ replaceDecls lp [de1']++ (lp',(_,_),_w) <- runTransformT mempty doRmDecl+ debugM $ "log:[\n" ++ intercalate "\n" _w ++ "]log end\n"+ return lp'+-- ---------------------------------------------------------------------++-- rmDecl7 :: Changer+-- rmDecl7 ans lp = do+-- let+-- doRmDecl = do+-- tlDecs <- hsDecls lp+-- let [s1,d1,d2,d3] = tlDecs++-- balanceComments d1 d2+-- balanceComments d2 d3++-- transferEntryDPT d2 d3++-- replaceDecls lp [s1,d1,d3]++-- let (lp',(ans',_),_w) = runTransform ans doRmDecl+-- -- putStrLn $ "log:" ++ intercalate "\n" _w+-- return (ans',lp')++rmDecl7 :: Changer+rmDecl7 _libdir lp = do+ let+ doRmDecl = do+ tlDecs <- hsDecls lp+ [s1,de1,d2,d3] <- balanceCommentsList tlDecs++ d3' <- transferEntryDP' d2 d3++ replaceDecls lp [s1,de1,d3']++ (lp',(_,_),_w) <- runTransformT mempty doRmDecl+ debugM $ "log:[\n" ++ intercalate "\n" _w ++ "]log end\n"+ return lp'+-- ---------------------------------------------------------------------++-- rmTypeSig1 :: Changer+-- rmTypeSig1 ans lp = do+-- let doRmDecl = do+-- tlDecs <- hsDecls lp+-- let (s1:d1:d2) = tlDecs+-- (GHC.L l (GHC.SigD x1 (GHC.TypeSig x2 names typ))) = s1+-- s1' = (GHC.L l (GHC.SigD x1 (GHC.TypeSig x2 (tail names) typ)))+-- replaceDecls lp (s1':d1:d2)++-- let (lp',(ans',_),_w) = runTransform ans doRmDecl+-- return (ans',lp')+rmTypeSig1 :: Changer+rmTypeSig1 _libdir lp = do+ let doRmDecl = do+ tlDecs <- hsDecls lp+ let (s0:de1:d2) = tlDecs+ s1 = captureTypeSigSpacing s0+ (L l (SigD x1 (TypeSig x2 [n1,n2] typ))) = s1+ n2' <- transferEntryDP n1 n2+ let s1' = (L l (SigD x1 (TypeSig x2 [n2'] typ)))+ replaceDecls lp (s1':de1:d2)++ let (lp',(_,_),_w) = runTransform mempty doRmDecl+ debugM $ "log:[\n" ++ intercalate "\n" _w ++ "]log end\n"+ return lp'++-- ---------------------------------------------------------------------++-- rmTypeSig2 :: Changer+-- rmTypeSig2 ans lp = do+-- let doRmDecl = do+-- tlDecs <- hsDecls lp+-- let [d1] = tlDecs++-- (d1',_) <- modifyValD (GHC.getLoc d1) d1 $ \_m [s,d] -> do+-- transferEntryDPT s d+-- return ([d],Nothing)+-- replaceDecls lp [d1']++-- let (lp',(ans',_),_w) = runTransform ans doRmDecl+-- -- putStrLn $ "log:" ++ intercalate "\n" _w+-- return (ans',lp')++rmTypeSig2 :: Changer+rmTypeSig2 _libdir lp = do+ let doRmDecl = do+ tlDecs <- hsDecls lp+ let [de1] = tlDecs++ (de1',_) <- modifyValD (getLocA de1) de1 $ \_m [s,d] -> do+ d' <- transferEntryDPT s d+ return ([d'],Nothing)+ replaceDecls lp [de1']++ let (lp',(_,_),_w) = runTransform mempty doRmDecl+ debugM $ "log:[\n" ++ intercalate "\n" _w ++ "]log end\n"+ return lp'++-- ---------------------------------------------------------------------++-- addHiding1 :: Changer+-- addHiding1 ans (GHC.L l p) = do+-- let doTransform = do+-- l0 <- uniqueSrcSpanT+-- l1 <- uniqueSrcSpanT+-- l2 <- uniqueSrcSpanT+-- let+-- [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"))+-- v1 = GHC.L l1 (GHC.IEVar noExt (GHC.L l1 (GHC.IEName n1)))+-- v2 = GHC.L l2 (GHC.IEVar noExt (GHC.L l2 (GHC.IEName n2)))+-- impHiding = GHC.L l0 [v1,v2]+-- imp1' = imp1 { GHC.ideclHiding = Just (True,impHiding)}+-- p' = p { GHC.hsmodImports = [GHC.L li imp1',imp2]}+-- addSimpleAnnT impHiding (DP (0,1)) [((G GHC.AnnHiding),DP (0,0)),((G GHC.AnnOpenP),DP (0,1)),((G GHC.AnnCloseP),DP (0,0))]+-- addSimpleAnnT n1 (DP (0,0)) [((G GHC.AnnVal),DP (0,0))]+-- addSimpleAnnT v1 (DP (0,0)) [((G GHC.AnnComma),DP (0,0))]+-- addSimpleAnnT n2 (DP (0,0)) [((G GHC.AnnVal),DP (0,0))]+-- return (GHC.L l p')++-- let (lp',(ans',_),_w) = runTransform ans doTransform+-- return (ans',lp')++addHiding1 :: Changer+addHiding1 _libdir (L l p) = do+ let doTransform = do+ l0 <- uniqueSrcSpanT+ l1 <- uniqueSrcSpanT+ l2 <- uniqueSrcSpanT+ let+ [L li imp1,imp2] = hsmodImports p+ n1 = L (noAnnSrcSpanDP0 l1) (mkVarUnqual (mkFastString "n1"))+ n2 = L (noAnnSrcSpanDP0 l2) (mkVarUnqual (mkFastString "n2"))+ v1 = L (addComma $ noAnnSrcSpanDP0 l1) (IEVar noExtField (L (noAnnSrcSpanDP0 l1) (IEName n1)))+ v2 = L ( noAnnSrcSpanDP0 l2) (IEVar noExtField (L (noAnnSrcSpanDP0 l2) (IEName n2)))+ impHiding = L (SrcSpanAnn (EpAnn (Anchor (realSrcSpan l0) m0)+ (AnnList Nothing+ (Just (AddEpAnn AnnOpenP d1))+ (Just (AddEpAnn AnnCloseP d0))+ [(AddEpAnn AnnHiding d1)]+ [])+ emptyComments) l0) [v1,v2]+ imp1' = imp1 { ideclHiding = Just (True,impHiding)}+ p' = p { hsmodImports = [L li imp1',imp2]}+ return (L l p')++ let (lp',(_ans',_),_w) = runTransform mempty doTransform+ debugM $ "log:[\n" ++ intercalate "\n" _w ++ "]log end\n"+ return lp'+-- ---------------------------------------------------------------------++-- addHiding2 :: Changer+-- addHiding2 ans (GHC.L l p) = do+-- let doTransform = do+-- l1 <- uniqueSrcSpanT+-- l2 <- uniqueSrcSpanT+-- let+-- [GHC.L li imp1] = GHC.hsmodImports p+-- 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"))+-- v1 = GHC.L l1 (GHC.IEVar noExt (GHC.L l1 (GHC.IEName n1)))+-- v2 = GHC.L l2 (GHC.IEVar noExt (GHC.L l2 (GHC.IEName n2)))+-- imp1' = imp1 { GHC.ideclHiding = Just (True,GHC.L lh (ns ++ [v1,v2]))}+-- p' = p { GHC.hsmodImports = [GHC.L li imp1']}+-- addSimpleAnnT n1 (DP (0,0)) [((G GHC.AnnVal),DP (0,0))]+-- addSimpleAnnT v1 (DP (0,0)) [((G GHC.AnnComma),DP (0,0))]+-- addSimpleAnnT n2 (DP (0,0)) [((G GHC.AnnVal),DP (0,0))]+-- addTrailingCommaT (last ns)+-- return (GHC.L l p')++-- let (lp',(ans',_),_w) = runTransform ans doTransform+-- return (ans',lp')++addHiding2 :: Changer+addHiding2 _libdir (L l p) = do+ let doTransform = do+ l1 <- uniqueSrcSpanT+ l2 <- uniqueSrcSpanT+ let+ [L li imp1] = hsmodImports p+ Just (_,L lh ns) = ideclHiding imp1+ lh' = (SrcSpanAnn (EpAnn (Anchor (realSrcSpan (locA lh)) m0)+ (AnnList Nothing+ (Just (AddEpAnn AnnOpenP d1))+ (Just (AddEpAnn AnnCloseP d0))+ [(AddEpAnn AnnHiding d1)]+ [])+ emptyComments) (locA lh))+ n1 = L (noAnnSrcSpanDP0 l1) (mkVarUnqual (mkFastString "n1"))+ n2 = L (noAnnSrcSpanDP0 l2) (mkVarUnqual (mkFastString "n2"))+ v1 = L (addComma $ noAnnSrcSpanDP0 l1) (IEVar noExtField (L (noAnnSrcSpanDP0 l1) (IEName n1)))+ v2 = L ( noAnnSrcSpanDP0 l2) (IEVar noExtField (L (noAnnSrcSpanDP0 l2) (IEName n2)))+ L ln n = last ns+ n' = L (addComma ln) n+ imp1' = imp1 { ideclHiding = Just (True,L lh' (init ns ++ [n',v1,v2]))}+ p' = p { hsmodImports = [L li imp1']}+ return (L l p')++ let (lp',(_ans',_),_w) = runTransform mempty doTransform+ debugM $ "log:[\n" ++ intercalate "\n" _w ++ "]log end\n"+ return lp'+-- ---------------------------------------------------------------------++cloneDecl1 :: Changer+cloneDecl1 _libdir lp = do+ let doChange = do+ tlDecs <- hsDecls lp+ let (d1':d2:ds) = tlDecs+ d2' <- fst <$> cloneT d2+ let d2'' = setEntryDP' d2' (DifferentLine 2 0)+ replaceDecls lp (d1':d2:d2'':ds)++ let (lp',(_ans',_),_w) = runTransform mempty doChange+ return lp' -- ---------------------------------------------------------------------
− tests/examples/failing/InfixOperator.hs
@@ -1,26 +0,0 @@-{-# LANGUAGE BangPatterns, CPP, OverloadedStrings #-}--#define BACKSLASH 92-#define CLOSE_CURLY 125-#define CLOSE_SQUARE 93-#define COMMA 44-#define DOUBLE_QUOTE 34-#define OPEN_CURLY 123-#define OPEN_SQUARE 91-#define C_0 48-#define C_9 57-#define C_A 65-#define C_F 70-#define C_a 97-#define C_f 102-#define C_n 110-#define C_t 116--json_ :: Parser Value -> Parser Value -> Parser Value-json_ obj ary = do- w <- skipSpace *> A.satisfy (\w -> w == OPEN_CURLY || w == OPEN_SQUARE)- if w == OPEN_CURLY- then obj- else ary-{-# INLINE json_ #-}-
− tests/examples/failing/InfixOperator.hs.bad
@@ -1,25 +0,0 @@-{-# LANGUAGE BangPatterns, CPP, OverloadedStrings #-}--#define BACKSLASH 92-#define CLOSE_CURLY 125-#define CLOSE_SQUARE 93-#define COMMA 44-#define DOUBLE_QUOTE 34-#define OPEN_CURLY 123-#define OPEN_SQUARE 91-#define C_0 48-#define C_9 57-#define C_A 65-#define C_F 70-#define C_a 97-#define C_f 102-#define C_n 110-#define C_t 116--json_ :: Parser Value -> Parser Value -> Parser Value-json_ obj ary = do- w <- skipSpace *> A.satisfy (\w -> w == 123OPEN_CURLY w ==||) == OPEN_SQUARE)- if w == 123OPEN_CURLY- then obj- else ary-{-# INLINE json_ #-}
− tests/examples/failing/List2.hs
@@ -1,40 +0,0 @@-{-# LANGUAGE TypeFamilyDependencies #-}-{-# LANGUAGE PatternSynonyms #-}-{-# LANGUAGE ConstraintKinds #-}-{-# LANGUAGE RankNTypes #-}-{-# LANGUAGE StandaloneDeriving #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE FunctionalDependencies #-}-{-# LANGUAGE UndecidableInstances #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE LambdaCase #-}-{-# LANGUAGE TypeOperators #-}-{-# LANGUAGE KindSignatures #-}-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE PolyKinds #-}-{-# LANGUAGE GADTs #-}--------------------------------------------------------------------------------- |--- Module : Type.Family.List--- Copyright : Copyright (C) 2015 Kyle Carter--- License : BSD3------ Maintainer : Kyle Carter <kylcarte@indiana.edu>--- Stability : experimental--- Portability : RankNTypes------ Convenient aliases and type families for working with--- type-level lists.-------------------------------------------------------------------------------module Type.Family.List where--import Type.Family.Constraint-import Type.Family.Monoid-import Type.Family.Tuple hiding (type (<$>),type (<*>),type (<&>))-import Type.Class.Witness--type Ø = '[]-type (:<) = '(:)-infixr 5 :<-
− tests/examples/failing/List2.hs.bad
@@ -1,40 +0,0 @@-{-# LANGUAGE TypeFamilyDependencies #-}-{-# LANGUAGE PatternSynonyms #-}-{-# LANGUAGE ConstraintKinds #-}-{-# LANGUAGE RankNTypes #-}-{-# LANGUAGE StandaloneDeriving #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE FunctionalDependencies #-}-{-# LANGUAGE UndecidableInstances #-}-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE LambdaCase #-}-{-# LANGUAGE TypeOperators #-}-{-# LANGUAGE KindSignatures #-}-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE PolyKinds #-}-{-# LANGUAGE GADTs #-}--------------------------------------------------------------------------------- |--- Module : Type.Family.List--- Copyright : Copyright (C) 2015 Kyle Carter--- License : BSD3------ Maintainer : Kyle Carter <kylcarte@indiana.edu>--- Stability : experimental--- Portability : RankNTypes------ Convenient aliases and type families for working with--- type-level lists.-------------------------------------------------------------------------------module Type.Family.List where--import Type.Family.Constraint-import Type.Family.Monoid-import Type.Family.Tuple hiding (type (<$>),type (<*>),type (<&>))-import Type.Class.Witness--type Ø = '[]-type (:<) = (:)-infixr 5 :<-
− tests/examples/failing/MultiLineWarningPragma.hs
@@ -1,18 +0,0 @@--{-# WARNING Logic- , mkSolver- , mkSimpleSolver- , mkSolverForLogic- , solverSetParams- , solverPush- , solverPop- , solverReset- , solverGetNumScopes- , solverAssertCnstr- , solverAssertAndTrack- , solverCheck- , solverCheckAndGetModel- , solverGetReasonUnknown- "New Z3 API support is still incomplete and fragile: \- \you may experience segmentation faults!"- #-}
− tests/examples/failing/MultiLineWarningPragma.hs.bad
@@ -1,17 +0,0 @@--{-# WARNING Logic- , mkSolver- , mkSimpleSolver- , mkSolverForLogic- , solverSetParams- , solverPush- , solverPop- , solverReset- , solverGetNumScopes- , solverAssertCnstr- , solverAssertAndTrack- , solverCheck- , solverCheckAndGetModel- , solverGetReasonUnknown- "New Z3 API support is still incomplete and fragile: you may experience segmentation faults!"- #-}
− tests/examples/failing/OverloadedLabelsRun04_A.hs
@@ -1,8 +0,0 @@-{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, TemplateHaskell #-}-module OverloadedLabelsRun04_A where--import GHC.OverloadedLabels-import Language.Haskell.TH--instance IsLabel x (Q [Dec]) where- fromLabel _ = [d| main = putStrLn "Ok" |]
+ tests/examples/failing/T10970a.hs view
@@ -0,0 +1,8 @@+{-# LANGUAGE CPP #-}+main = do+#ifndef VERSION_containers+ putStrLn "OK"+#endif+#ifndef MIN_VERSION_base+ putStrLn "OK"+#endif
+ tests/examples/failing/T10970a.hs.bad view
@@ -0,0 +1,7 @@+{-# LANGUAGE CPP #-}+main = do+#ifndef VERSION_containers+ putStrLn "OK"+#endif+#ifndef MIN_VERSION_base+ putStrLn "OK"
− tests/examples/failing/T17544_kw.hs
@@ -1,25 +0,0 @@-{-# LANGUAGE GADTs #-}-{-# OPTIONS -haddock -ddump-parsed-ast #-}---- Haddock comments in this test case should all be rejected, but they are not.------ This is a known issue. Users should avoid writing comments in such--- positions, as a future fix will disallow them.------ See Note [Register keyword location] in GHC.Parser.PostProcess.Haddock--module- -- | Bad comment for the module- T17544_kw where--data Foo -- | Bad comment for MkFoo- where MkFoo :: Foo--newtype Bar -- | Bad comment for MkBar- where MkBar :: () -> Bar--class Cls a- -- | Bad comment for clsmethod- where- clsmethod :: a-
− tests/examples/failing/TensorTests.hs
@@ -1,41 +0,0 @@-{-# LANGUAGE ConstraintKinds, FlexibleContexts, DataKinds, NoImplicitPrelude,- RebindableSyntax, ScopedTypeVariables, TypeFamilies, TypeOperators,- UndecidableInstances #-}--module TensorTests (tensorTests) where--import Apply.Cyc-import Tests-import Utils--import TestTypes--import Crypto.Lol-import Crypto.Lol.CRTrans-import Crypto.Lol.Cyclotomic.Tensor-import Crypto.Lol.Types--import Control.Applicative--import Data.Maybe--import Data.Singletons-import Data.Promotion.Prelude.Eq-import Data.Singletons.TypeRepStar ()--import qualified Test.Framework as TF--type TMRParams = ( '(,) <$> Tensors) <*> MRCombos-tmrParams :: Proxy TMRParams-tmrParams = Proxy----type ExtParams = ( '(,) <$> Tensors) <*> MRExtCombos-type TrEmParams = ( '(,) <$> Tensors) <*> MM'RCombos-tremParams :: Proxy TrEmParams-tremParams = Proxy--type NormParams = ( '(,) <$> '[RT]) <*> (Filter Liftable MRCombos)--data Liftable :: TyFun (Factored, *) Bool -> *-type instance Apply Liftable '(m,zq) = Int64 :== (LiftOf zq)-
− tests/examples/failing/TensorTests.hs.bad
@@ -1,41 +0,0 @@-{-# LANGUAGE ConstraintKinds, FlexibleContexts, DataKinds, NoImplicitPrelude,- RebindableSyntax, ScopedTypeVariables, TypeFamilies, TypeOperators,- UndecidableInstances #-}--module TensorTests (tensorTests) where--import Apply.Cyc-import Tests-import Utils--import TestTypes--import Crypto.Lol-import Crypto.Lol.CRTrans-import Crypto.Lol.Cyclotomic.Tensor-import Crypto.Lol.Types--import Control.Applicative--import Data.Maybe--import Data.Singletons-import Data.Promotion.Prelude.Eq-import Data.Singletons.TypeRepStar ()--import qualified Test.Framework as TF--type TMRParams = ( (,) <$> Tensors) <*> MRCombos-tmrParams :: Proxy TMRParams-tmrParams = Proxy----type ExtParams = ( '(,) <$> Tensors) <*> MRExtCombos-type TrEmParams = ( (,) <$> Tensors) <*> MM'RCombos-tremParams :: Proxy TrEmParams-tremParams = Proxy--type NormParams = ( (,) <$> '[RT]) <*> (Filter Liftable MRCombos)--data Liftable :: TyFun (Factored, *) Bool -> *-type instance Apply Liftable '(m,zq) = Int64 :== (LiftOf zq)-
+ tests/examples/failing/TopLevelSemis.hs view
@@ -0,0 +1,80 @@+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE StandaloneKindSignatures #-}+{-# LANGUAGE TemplateHaskell #-}+module Network.MoHWS.HTTP.Header where++x = 1++-- Comment+;++data Foo = Foo++-- After TyClD+;++instance Monoid CIRB where+ mempty = CIRB mempty mempty mempty mempty++-- After InstD+;++deriving instance Eq (GenTickish 'TickishPassCore)++-- After DerivD+;++transferCodingStr DeflateTransferCoding = "deflate"++-- After ValD+;++getContentType :: Int++-- After SigD+;++type MyMaybe :: Type -> Type++-- After KindSigD+;++default (Integer)++-- After DefD+;++foreign import ccall unsafe "isDoubleFinite" isDoubleFinite :: Double -> Int++-- After ForD+;++{-# DEPRECATED foo2 [] #-}++-- After WarningD+;++{-# ANN module FromA #-}++-- After AnnD+;++{-# RULES "myrule2" id f = f #-}++-- After RuleD+;++$foo++-- After SpliceD+;++type role Representational representational++-- After RoleAnnotD+;++getContentType = 1++-- Note: skipping DocD, only generated in haddock mode+
+ tests/examples/failing/TopLevelSemis.hs.bad view
@@ -0,0 +1,94 @@+{-# LANGUAGE StandaloneDeriving #-}+{-# LANGUAGE StandaloneKindSignatures #-}+{-# LANGUAGE TemplateHaskell #-}+module Network.MoHWS.HTTP.Header where++x = 1+++;+++data Foo = Foo+++;+++instance Monoid CIRB where+ mempty = CIRB mempty mempty mempty mempty+++;+++deriving instance Eq (GenTickish 'TickishPassCore)+++;+++transferCodingStr DeflateTransferCoding = "deflate"+++;+++getContentType :: Int+++;+++type MyMaybe :: Type -> Type+++;+++default (Integer)+++;+++foreign import ccall unsafe "isDoubleFinite" isDoubleFinite :: Double -> Int+++;+++{-# DEPRECATED foo2 [] #-}+++;+++{-# ANN module FromA #-}+++;+++{-# RULES "myrule2" id f = f #-}+++;+++$foo+++;+++type role Representational representational+++;+++getContentType = 1++-- Note: skipping DocD, only generated in haddock mode+
− tests/examples/failing/UnicodeRules.hs
@@ -1,16 +0,0 @@-{-# LANGUAGE- BangPatterns- , FlexibleContexts- , FlexibleInstances- , ScopedTypeVariables- , UnboxedTuples- , UndecidableInstances- , UnicodeSyntax- #-}--strictHead ∷ G.Bitstream (Packet d) ⇒ Bitstream d → Bool-{-# RULES "head → strictHead" [1]- ∀(v ∷ G.Bitstream (Packet d) ⇒ Bitstream d).- head v = strictHead v #-}-{-# INLINE strictHead #-}-strictHead (Bitstream _ v) = head (SV.head v)
− tests/examples/failing/UnicodeRules.hs.bad
@@ -1,16 +0,0 @@-{-# LANGUAGE- BangPatterns- , FlexibleContexts- , FlexibleInstances- , ScopedTypeVariables- , UnboxedTuples- , UndecidableInstances- , UnicodeSyntax- #-}--strictHead ∷ G.Bitstream (Packet d) ⇒ Bitstream d → Bool-{-# RULES "head \8594 strictHead" [1]- ∀(v ∷ G.Bitstream (Packet d) ⇒ Bitstream d).- head v = strictHead v #-}-{-# INLINE strictHead #-}-strictHead (Bitstream _ v) = head (SV.head v)
− tests/examples/failing/UnicodeSyntax.hs
@@ -1,236 +0,0 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE GADTs #-}-{-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE LambdaCase #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE UnicodeSyntax #-}-{-# LANGUAGE ViewPatterns #-}-{-# LANGUAGE Arrows #-}--module Tutorial where---- import Abt.Class--- import Abt.Types--- import Abt.Concrete.LocallyNameless--import Control.Applicative-import Control.Monad.Trans.State.Strict-import Control.Monad.Trans.Maybe-import Control.Monad.Trans.Except--- import Data.Vinyl-import Prelude hiding (pi)---- | We'll start off with a monad in which to manipulate ABTs; we'll need some--- state for fresh variable generation.----newtype M α- = M- { _M ∷ State Int α- } deriving (Functor, Applicative, Monad)---- | We'll run an ABT computation by starting the variable counter at @0@.----runM ∷ M α → α-runM (M m) = evalState m 0---- | Check out the source to see fresh variable generation.----instance MonadVar Var M where- fresh = M $ do- n ← get- let n' = n + 1- put n'- return $ Var Nothing n'-- named a = do- v ← fresh- return $ v { _varName = Just a }---- | Next, we'll define the operators for a tiny lambda calculus as a datatype--- indexed by arities.----data Lang ns where- LAM ∷ Lang '[S Z]- APP ∷ Lang '[Z, Z]- PI ∷ Lang '[Z, S Z]- UNIT ∷ Lang '[]- AX ∷ Lang '[]--instance Show1 Lang where- show1 = \case- LAM → "lam"- APP → "ap"- PI → "pi"- UNIT → "unit"- AX → "<>"--instance HEq1 Lang where- heq1 LAM LAM = Just Refl- heq1 APP APP = Just Refl- heq1 PI PI = Just Refl- heq1 UNIT UNIT = Just Refl- heq1 AX AX = Just Refl- heq1 _ _ = Nothing--lam ∷ Tm Lang (S Z) → Tm0 Lang-lam e = LAM $$ e :& RNil--app ∷ Tm0 Lang → Tm0 Lang → Tm0 Lang-app m n = APP $$ m :& n :& RNil--ax ∷ Tm0 Lang-ax = AX $$ RNil--unit ∷ Tm0 Lang-unit = UNIT $$ RNil--pi ∷ Tm0 Lang → Tm Lang (S Z) → Tm0 Lang-pi α xβ = PI $$ α :& xβ :& RNil---- | A monad transformer for small step operational semantics.----newtype StepT m α- = StepT- { runStepT ∷ MaybeT m α- } deriving (Monad, Functor, Applicative, Alternative)---- | To indicate that a term is in normal form.----stepsExhausted- ∷ Applicative m- ⇒ StepT m α-stepsExhausted = StepT . MaybeT $ pure Nothing--instance MonadVar Var m ⇒ MonadVar Var (StepT m) where- fresh = StepT . MaybeT $ Just <$> fresh- named str = StepT . MaybeT $ Just <$> named str---- | A single evaluation step.----step- ∷ Tm0 Lang- → StepT M (Tm0 Lang)-step tm =- out tm >>= \case- APP :$ m :& n :& RNil →- out m >>= \case- LAM :$ xe :& RNil → xe // n- _ → app <$> step m <*> pure n <|> app <$> pure m <*> step n- PI :$ α :& xβ :& RNil → pi <$> step α <*> pure xβ- _ → stepsExhausted---- | The reflexive-transitive closure of a small-step operational semantics.----star- ∷ Monad m- ⇒ (α → StepT m α)- → (α → m α)-star f a =- runMaybeT (runStepT $ f a) >>=- return a `maybe` star f---- | Evaluate a term to normal form----eval ∷ Tm0 Lang → Tm0 Lang-eval = runM . star step--newtype JudgeT m α- = JudgeT- { runJudgeT ∷ ExceptT String m α- } deriving (Monad, Functor, Applicative, Alternative)--instance MonadVar Var m ⇒ MonadVar Var (JudgeT m) where- fresh = JudgeT . ExceptT $ Right <$> fresh- named str = JudgeT . ExceptT $ Right <$> named str--type Ctx = [(Var, Tm0 Lang)]--raise ∷ Monad m ⇒ String → JudgeT m α-raise = JudgeT . ExceptT . return . Left--checkTy- ∷ Ctx- → Tm0 Lang- → Tm0 Lang- → JudgeT M ()-checkTy g tm ty = do- let ntm = eval tm- nty = eval ty- (,) <$> out ntm <*> out nty >>= \case- (LAM :$ xe :& RNil, PI :$ α :& yβ :& RNil) → do- z ← fresh- ez ← xe // var z- βz ← yβ // var z- checkTy ((z,α):g) ez βz- (AX :$ RNil, UNIT :$ RNil) → return ()- _ → do- ty' ← inferTy g tm- if ty' === nty- then return ()- else raise "Type error"--inferTy- ∷ Ctx- → Tm0 Lang- → JudgeT M (Tm0 Lang)-inferTy g tm = do- out (eval tm) >>= \case- V v | Just (eval → ty) ← lookup v g → return ty- | otherwise → raise "Ill-scoped variable"- APP :$ m :& n :& RNil → do- inferTy g m >>= out >>= \case- PI :$ α :& xβ :& RNil → do- checkTy g n α- eval <$> xβ // n- _ → raise "Expected pi type for lambda abstraction"- _ → raise "Only infer neutral terms"---- | @λx.x@----identityTm ∷ M (Tm0 Lang)-identityTm = do- x ← fresh- return $ lam (x \\ var x)---- | @(λx.x)(λx.x)@----appTm ∷ M (Tm0 Lang)-appTm = do- tm ← identityTm- return $ app tm tm---- | A demonstration of evaluating (and pretty-printing). Output:------ @--- ap[lam[\@2.\@2];lam[\@3.\@3]] ~>* lam[\@4.\@4]--- @----main ∷ IO ()-main = do- -- Try out the type checker- either fail print . runM . runExceptT . runJudgeT $ do- x ← fresh- checkTy [] (lam (x \\ var x)) (pi unit (x \\ unit))-- print . runM $ do- mm ← appTm- mmStr ← toString mm- mmStr' ← toString $ eval mm- return $ mmStr ++ " ~>* " ++ mmStr'--doMap ∷ FilePath → IOSArrow XmlTree TiledMap-doMap mapPath = proc m → do- mapWidth ← getAttrR "width" ⤙ m- returnA -< baz---- ^ An opaque ESD handle for recording data from the soundcard via ESD.-data Recorder fr ch (r ∷ ★ → ★)- = Recorder {- reRate ∷ !Int- , reHandle ∷ !Handle- , reCloseH ∷ !(FinalizerHandle r)- }-
− tests/examples/failing/UnicodeSyntax.hs.bad
@@ -1,236 +0,0 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE GADTs #-}-{-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE LambdaCase #-}-{-# LANGUAGE MultiParamTypeClasses #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE UnicodeSyntax #-}-{-# LANGUAGE ViewPatterns #-}-{-# LANGUAGE Arrows #-}--module Tutorial where---- import Abt.Class--- import Abt.Types--- import Abt.Concrete.LocallyNameless--import Control.Applicative-import Control.Monad.Trans.State.Strict-import Control.Monad.Trans.Maybe-import Control.Monad.Trans.Except--- import Data.Vinyl-import Prelude hiding (pi)---- | We'll start off with a monad in which to manipulate ABTs; we'll need some--- state for fresh variable generation.----newtype M α- = M- { _M ∷ State Int α- } deriving (Functor, Applicative, Monad)---- | We'll run an ABT computation by starting the variable counter at @0@.----runM ∷ M α → α-runM (M m) = evalState m 0---- | Check out the source to see fresh variable generation.----instance MonadVar Var M where- fresh = M $ do- n ← get- let n' = n + 1- put n'- return $ Var Nothing n'-- named a = do- v ← fresh- return $ v { _varName = Just a }---- | Next, we'll define the operators for a tiny lambda calculus as a datatype--- indexed by arities.----data Lang ns where- LAM ∷ Lang '[S Z]- APP ∷ Lang '[Z, Z]- PI ∷ Lang '[Z, S Z]- UNIT ∷ Lang '[]- AX ∷ Lang '[]--instance Show1 Lang where- show1 = \case- LAM → "lam"- APP → "ap"- PI → "pi"- UNIT → "unit"- AX → "<>"--instance HEq1 Lang where- heq1 LAM LAM = Just Refl- heq1 APP APP = Just Refl- heq1 PI PI = Just Refl- heq1 UNIT UNIT = Just Refl- heq1 AX AX = Just Refl- heq1 _ _ = Nothing--lam ∷ Tm Lang (S Z) → Tm0 Lang-lam e = LAM $$ e :& RNil--app ∷ Tm0 Lang → Tm0 Lang → Tm0 Lang-app m n = APP $$ m :& n :& RNil--ax ∷ Tm0 Lang-ax = AX $$ RNil--unit ∷ Tm0 Lang-unit = UNIT $$ RNil--pi ∷ Tm0 Lang → Tm Lang (S Z) → Tm0 Lang-pi α xβ = PI $$ α :& xβ :& RNil---- | A monad transformer for small step operational semantics.----newtype StepT m α- = StepT- { runStepT ∷ MaybeT m α- } deriving (Monad, Functor, Applicative, Alternative)---- | To indicate that a term is in normal form.----stepsExhausted- ∷ Applicative m- ⇒ StepT m α-stepsExhausted = StepT . MaybeT $ pure Nothing--instance MonadVar Var m ⇒ MonadVar Var (StepT m) where- fresh = StepT . MaybeT $ Just <$> fresh- named str = StepT . MaybeT $ Just <$> named str---- | A single evaluation step.----step- ∷ Tm0 Lang- → StepT M (Tm0 Lang)-step tm =- out tm >>= \case- APP :$ m :& n :& RNil →- out m >>= \case- LAM :$ xe :& RNil → xe // n- _ → app <$> step m <*> pure n <|> app <$> pure m <*> step n- PI :$ α :& xβ :& RNil → pi <$> step α <*> pure xβ- _ → stepsExhausted---- | The reflexive-transitive closure of a small-step operational semantics.----star- ∷ Monad m- ⇒ (α → StepT m α)- → (α → m α)-star f a =- runMaybeT (runStepT $ f a) >>=- return a `maybe` star f---- | Evaluate a term to normal form----eval ∷ Tm0 Lang → Tm0 Lang-eval = runM . star step--newtype JudgeT m α- = JudgeT- { runJudgeT ∷ ExceptT String m α- } deriving (Monad, Functor, Applicative, Alternative)--instance MonadVar Var m ⇒ MonadVar Var (JudgeT m) where- fresh = JudgeT . ExceptT $ Right <$> fresh- named str = JudgeT . ExceptT $ Right <$> named str--type Ctx = [(Var, Tm0 Lang)]--raise ∷ Monad m ⇒ String → JudgeT m α-raise = JudgeT . ExceptT . return . Left--checkTy- ∷ Ctx- → Tm0 Lang- → Tm0 Lang- → JudgeT M ()-checkTy g tm ty = do- let ntm = eval tm- nty = eval ty- (,) <$> out ntm <*> out nty >>= \case- (LAM :$ xe :& RNil, PI :$ α :& yβ :& RNil) → do- z ← fresh- ez ← xe // var z- βz ← yβ // var z- checkTy ((z,α):g) ez βz- (AX :$ RNil, UNIT :$ RNil) → return ()- _ → do- ty' ← inferTy g tm- if ty' === nty- then return ()- else raise "Type error"--inferTy- ∷ Ctx- → Tm0 Lang- → JudgeT M (Tm0 Lang)-inferTy g tm = do- out (eval tm) >>= \case- V v | Just (eval → ty) ← lookup v g → return ty- | otherwise → raise "Ill-scoped variable"- APP :$ m :& n :& RNil → do- inferTy g m >>= out >>= \case- PI :$ α :& xβ :& RNil → do- checkTy g n α- eval <$> xβ // n- _ → raise "Expected pi type for lambda abstraction"- _ → raise "Only infer neutral terms"---- | @λx.x@----identityTm ∷ M (Tm0 Lang)-identityTm = do- x ← fresh- return $ lam (x \\ var x)---- | @(λx.x)(λx.x)@----appTm ∷ M (Tm0 Lang)-appTm = do- tm ← identityTm- return $ app tm tm---- | A demonstration of evaluating (and pretty-printing). Output:------ @--- ap[lam[\@2.\@2];lam[\@3.\@3]] ~>* lam[\@4.\@4]--- @----main ∷ IO ()-main = do- -- Try out the type checker- either fail print . runM . runExceptT . runJudgeT $ do- x ← fresh- checkTy [] (lam (x \\ var x)) (pi unit (x \\ unit))-- print . runM $ do- mm ← appTm- mmStr ← toString mm- mmStr' ← toString $ eval mm- return $ mmStr ++ " ~>* " ++ mmStr'--doMap ∷ FilePath → IOSArrow XmlTree TiledMap-doMap mapPath = proc m → do- mapWidth ← getAttrR "width" ⤙ m- returnA -< baz---- ^ An opaque ESD handle for recording data from the soundcard via ESD.-data Recorder fr ch (r ∷ * → *)- = Recorder {- reRate ∷ !Int- , reHandle ∷ !Handle- , reCloseH ∷ !(FinalizerHandle r)- }-
− tests/examples/failing/dsrun010.hs
@@ -1,25 +0,0 @@--- Check that pattern match failure in do-notation--- is reflected by calling the monadic 'fail', not by a--- runtime exception--{-# LANGUAGE NoMonadFailDesugaring #-}-{-# OPTIONS -Wno-missing-monadfail-instances #-}--import Control.Monad-import Data.Maybe--test :: (MonadPlus m) => [a] -> m Bool-test xs- = do- (_:_) <- return xs- -- Should fail here- return True- `mplus`- -- Failure in LH arg should trigger RH arg- do- return False--main :: IO ()-main- = do let x = fromJust (test [])- putStrLn (show x)
+ tests/examples/failing/n-plus-k-patterns.hs view
@@ -0,0 +1,11 @@+{-# LANGUAGE NPlusKPatterns #-}+singleline :: Int+singleline (n + 1) = n++multiline :: Int+multiline(n+ + 1) = n++n :: Int+(n + 1) = 3+
+ tests/examples/failing/n-plus-k-patterns.hs.bad view
@@ -0,0 +1,11 @@+{-# LANGUAGE NPlusKPatterns #-}+singleline :: Int+singleline (n 1) = n++multiline :: Int+multiline(n+ 1) = n++n :: Int+(n 1) = 3+
− tests/examples/failing/overloadedlabelsrun04.hs
@@ -1,13 +0,0 @@-{-# LANGUAGE OverloadedLabels, TemplateHaskell #-}--import OverloadedLabelsRun04_A---- Who knew that there were so many ways that a line could start with--- a # sign in Haskell? None of these are overloaded labels:-#line 7 "overloadedlabelsrun04.hs"-# 8 "overloadedlabelsrun04.hs"-#!notashellscript-#pragma foo---- But this one is:-#foo
− tests/examples/failing/overloadedlabelsrun04.hs.bad
@@ -1,12 +0,0 @@-{-# LANGUAGE OverloadedLabels, TemplateHaskell #-}--import OverloadedLabelsRun04_A---- Who knew that there were so many ways that a line could start with--- a # sign in Haskell? None of these are overloaded labels:---#!notashellscript---- But this one is:-#foo
tests/examples/ghc710/EmptyMostly.hs view
@@ -11,3 +11,4 @@ -- foo = a where {;;;;;;;;;;;;;;;;;;;;;;;a=1;;;;;;;;} -- ;; }+-- really trailing
tests/examples/ghc710/TypeBrackets2.hs view
@@ -16,8 +16,8 @@ baz :: (Eq a) => forall v . ( Eq v, Show v ) => !v -> a -> MaybeDefault v instance Dsp (S n) where- data (ASig (S n)) = S_A CVar- data (KSig (S n)) = S_K CVar- data (INum (S n)) = S_I CVar+ data (ASig (S n)) = S_A CVar+ data ((KSig (S n))) = S_K CVar+ data (((INum (S n)))) = S_I CVar getSr = fst <$> ask getKsmps = snd <$> ask
tests/examples/ghc710/TypeSynParens.hs view
@@ -13,7 +13,7 @@ type CompileResult InterpreterStmt = [Hask.Stmt] instance Compilable ModuleSpan where- type CompileResult ModuleSpan = Hask.Module+ type ((CompileResult ModuleSpan)) = Hask.Module instance Compilable StatementSpan where type (CompileResult StatementSpan) = [Stmt]
tests/examples/ghc80/MonadFailErrors.hs view
@@ -1,7 +1,7 @@ -- Test purpose: -- Break properly if MonadFail is live -{-# LANGUAGE MonadFailDesugaring #-}+{- # LANGUAGE MonadFailDesugaring # -} module MonadFailWarnings where
− tests/examples/ghc80/T10970a.hs
@@ -1,8 +0,0 @@-{-# LANGUAGE CPP #-}-main = do-#ifndef VERSION_containers- putStrLn "OK"-#endif-#ifndef MIN_VERSION_base- putStrLn "OK"-#endif
+ tests/examples/ghc92/Binary.hs view
@@ -0,0 +1,259 @@+{-# OPTIONS -fno-warn-orphans #-}++module Data.Curve.Binary+ ( module Data.Curve+ , Point(..)+ -- * Binary curves+ , BCurve(..)+ , BPoint+ -- ** Binary affine curves+ , BACurve(..)+ , BAPoint+ -- ** Binary projective curves+ , BPCurve(..)+ , BPPoint+ ) where++import Protolude++import Data.Field.Galois as F (GaloisField, PrimeField, frob, quad)+import GHC.Natural (Natural)+import Text.PrettyPrint.Leijen.Text (Pretty(..))++import Data.Curve++-------------------------------------------------------------------------------+-- Binary form+-------------------------------------------------------------------------------++-- | Binary points.+type BPoint = Point 'Binary++-- | Binary curves.+class (GaloisField q, PrimeField r, Curve 'Binary c e q r) => BCurve c e q r where+ {-# MINIMAL a_, b_, h_, p_, r_ #-}+ a_ :: BPoint c e q r -> q -- ^ Coefficient @A@.+ b_ :: BPoint c e q r -> q -- ^ Coefficient @B@.+ h_ :: BPoint c e q r -> Natural -- ^ Curve cofactor.+ p_ :: BPoint c e q r -> Natural -- ^ Curve polynomial.+ r_ :: BPoint c e q r -> Natural -- ^ Curve order.++-------------------------------------------------------------------------------+-- Affine coordinates+-------------------------------------------------------------------------------++-- | Binary affine points.+type BAPoint = BPoint 'Affine++-- | Binary affine curves @y^2 + xy = x^3 + Ax^2 + B@.+class BCurve 'Affine e q r => BACurve e q r where+ {-# MINIMAL gA_ #-}+ gA_ :: BAPoint e q r -- ^ Curve generator.++-- Binary affine curves are elliptic curves.+instance BACurve e q r => Curve 'Binary 'Affine e q r where++ data instance Point 'Binary 'Affine e q r = A q q -- ^ Affine point.+ | O -- ^ Infinite point.+ deriving (Eq, Generic, NFData, Read, Show)++ add p O = p+ add O q = q+ add (A x1 y1) (A x2 y2)+ | xx == 0 = O+ | otherwise = A x3 y3+ where+ a = a_ (witness :: BAPoint e q r)+ xx = x1 + x2+ yy = y1 + y2+ l = yy / xx+ x3 = l * (l + 1) + xx + a+ y3 = l * (x1 + x3) + x3 + y1+ {-# INLINABLE add #-}++ char = const 2+ {-# INLINABLE char #-}++ cof = h_+ {-# INLINABLE cof #-}++ dbl O = O+ dbl (A x y)+ | x == 0 = O+ | otherwise = A x' y'+ where+ a = a_ (witness :: BAPoint e q r)+ l = x + y / x+ l' = l + 1+ x' = l * l' + a+ y' = x * x + l' * x'+ {-# INLINABLE dbl #-}++ def O = True+ def (A x y) = ((x + a) * x + y) * x + b + y * y == 0+ where+ a = a_ (witness :: BAPoint e q r)+ b = b_ (witness :: BAPoint e q r)+ {-# INLINABLE def #-}++ disc _ = b_ (witness :: BAPoint e q r)+ {-# INLINABLE disc #-}++ frob O = O+ frob (A x y) = A (F.frob x) (F.frob y)+ {-# INLINABLE frob #-}++ fromA = identity+ {-# INLINABLE fromA #-}++ gen = gA_+ {-# INLINABLE gen #-}++ id = O+ {-# INLINABLE id #-}++ inv O = O+ inv (A x y) = A x (x + y)+ {-# INLINABLE inv #-}++ order = r_+ {-# INLINABLE order #-}++ point x y = let p = A x y in if def p then Just p else Nothing+ {-# INLINABLE point #-}++ pointX x = A x <$> yX (witness :: BAPoint e q r) x+ {-# INLINABLE pointX #-}++ toA = identity+ {-# INLINABLE toA #-}++ yX _ x = quad 1 x ((x + a) * x * x + b)+ where+ a = a_ (witness :: BAPoint e q r)+ b = b_ (witness :: BAPoint e q r)+ {-# INLINABLE yX #-}++-- Binary affine points are pretty.+instance BACurve e q r => Pretty (BAPoint e q r) where++ pretty (A x y) = pretty (x, y)+ pretty O = "O"++-------------------------------------------------------------------------------+-- Projective coordinates+-------------------------------------------------------------------------------++-- | Binary projective points.+type BPPoint = BPoint 'Projective++-- | Binary projective curves @y^2z + xyz = x^3 + Ax^2z + Bz@.+class BCurve 'Projective e q r => BPCurve e q r where+ {-# MINIMAL gP_ #-}+ gP_ :: BPPoint e q r -- ^ Curve generator.++-- Binary projective curves are elliptic curves.+instance BPCurve e q r => Curve 'Binary 'Projective e q r where++ data instance Point 'Binary 'Projective e q r = P q q q -- ^ Projective point.+ deriving (Generic, NFData, Read, Show)++ -- Addition formula add-2008-bl+ add p (P _ _ 0) = p+ add (P _ _ 0) q = q+ add (P x1 y1 z1) (P x2 y2 z2) = P x3 y3 z3+ where+ a' = a_ (witness :: BPPoint e q r)+ y1z2 = y1 * z2+ x1z2 = x1 * z2+ a = y1z2 + z1 * y2+ b = x1z2 + z1 * x2+ ab = a + b+ c = b * b+ d = z1 * z2+ e = b * c+ f = (a * ab + a' * c) * d + e+ x3 = b * f+ y3 = c * (a * x1z2 + b * y1z2) + ab * f+ z3 = e * d+ {-# INLINABLE add #-}++ char = const 2+ {-# INLINABLE char #-}++ cof = h_+ {-# INLINABLE cof #-}++ -- Doubling formula dbl-2008-bl+ dbl (P _ _ 0) = P 0 1 0+ dbl (P x1 y1 z1) = P x3 y3 z3+ where+ a' = a_ (witness :: BPPoint e q r)+ a = x1 * x1+ b = a + y1 * z1+ c = x1 * z1+ bc = b + c+ d = c * c+ e = b * bc + a' * d+ x3 = c * e+ y3 = bc * e + a * a * c+ z3 = c * d+ {-# INLINABLE dbl #-}++ def (P x y z) = ((x + a * z) * x + yz) * x + y * yz + b * z * z * z == 0+ where+ a = a_ (witness :: BPPoint e q r)+ b = b_ (witness :: BPPoint e q r)+ yz = y * z+ {-# INLINABLE def #-}++ disc _ = b_ (witness :: BPPoint e q r)+ {-# INLINABLE disc #-}++ frob (P x y z) = P (F.frob x) (F.frob y) (F.frob z)+ {-# INLINABLE frob #-}++ fromA (A x y) = P x y 1+ fromA _ = P 0 1 0+ {-# INLINABLE fromA #-}++ gen = gP_+ {-# INLINABLE gen #-}++ id = P 0 1 0+ {-# INLINABLE id #-}++ inv (P x y z) = P x (x + y) z+ {-# INLINABLE inv #-}++ order = r_+ {-# INLINABLE order #-}++ point x y = let p = P x y 1 in if def p then Just p else Nothing+ {-# INLINABLE point #-}++ pointX x = flip (P x) 1 <$> yX (witness :: BPPoint e q r) x+ {-# INLINABLE pointX #-}++ toA (P _ _ 0) = O+ toA (P x y z) = A (x / z) (y / z)+ {-# INLINABLE toA #-}++ yX _ x = quad 1 x ((x + a) * x * x + b)+ where+ a = a_ (witness :: BPPoint e q r)+ b = b_ (witness :: BPPoint e q r)+ {-# INLINABLE yX #-}++-- Binary projective points are equatable.+instance BPCurve e q r => Eq (BPPoint e q r) where++ P x1 y1 z1 == P x2 y2 z2 = z1 == 0 && z2 == 0+ || x1 * z2 == x2 * z1 && y1 * z2 == y2 * z1+ {-# INLINABLE (==) #-}++-- Binary projective points are pretty.+instance BPCurve e q r => Pretty (BPPoint e q r) where++ pretty (P x y z) = pretty (x, y, z)+
+ tests/examples/ghc92/BlockComment.hs view
@@ -0,0 +1,7 @@+module BlockComment where++foo x = do+ blah+ where+ {- a comment -}+ blah = 3
+ tests/examples/ghc92/Character.hs view
@@ -0,0 +1,79 @@+{-# LANGUAGE QuasiQuotes #-}+module Atomo.Kernel.Character where++import Data.Char++import Atomo+++load :: VM ()+load = do+ [p|(c: Character) control?|] =: liftM Boolean (onCharacter isControl)+ [p|(c: Character) space?|] =: liftM Boolean (onCharacter isSpace)+ [p|(c: Character) lower?|] =: liftM Boolean (onCharacter isLower)+ [p|(c: Character) upper?|] =: liftM Boolean (onCharacter isUpper)+ [p|(c: Character) alpha?|] =: liftM Boolean (onCharacter isAlpha)+ [p|(c: Character) alphanum?|] =: liftM Boolean (onCharacter isAlphaNum)+ [p|(c: Character) print?|] =: liftM Boolean (onCharacter isPrint)+ [p|(c: Character) digit?|] =: liftM Boolean (onCharacter isDigit)+ [p|(c: Character) oct-digit?|] =: liftM Boolean (onCharacter isOctDigit)+ [p|(c: Character) hex-digit?|] =: liftM Boolean (onCharacter isHexDigit)+ [p|(c: Character) letter?|] =: liftM Boolean (onCharacter isLetter)+ [p|(c: Character) mark?|] =: liftM Boolean (onCharacter isMark)+ [p|(c: Character) number?|] =: liftM Boolean (onCharacter isNumber)+ [p|(c: Character) punctuation?|] =: liftM Boolean (onCharacter isPunctuation)+ [p|(c: Character) symbol?|] =: liftM Boolean (onCharacter isSymbol)+ [p|(c: Character) separator?|] =: liftM Boolean (onCharacter isSeparator)+ [p|(c: Character) ascii?|] =: liftM Boolean (onCharacter isAscii)+ [p|(c: Character) latin1?|] =: liftM Boolean (onCharacter isLatin1)+ [p|(c: Character) ascii-upper?|] =: liftM Boolean (onCharacter isAsciiLower)+ [p|(c: Character) ascii-lower?|] =: liftM Boolean (onCharacter isAsciiUpper)++ [p|(c: Character) uppercase|] =: liftM Character (onCharacter toUpper)+ [p|(c: Character) lowercase|] =: liftM Character (onCharacter toLower)+ [p|(c: Character) titlecase|] =: liftM Character (onCharacter toTitle)++ [p|(c: Character) from-digit|] =: liftM (Integer . fromIntegral) (onCharacter digitToInt)+ [p|(i: Integer) to-digit|] =: liftM Character (onInteger (intToDigit . fromIntegral))++ [p|(c: Character) ord|] =: liftM (Integer . fromIntegral) (onCharacter ord)+ [p|(i: Integer) chr|] =: liftM Character (onInteger (chr . fromIntegral))++ [p|(c: Character) category|] =: liftM c (onCharacter generalCategory)+ where+ onCharacter :: (Char -> a) -> VM a+ onCharacter f = here "c" >>= liftM (f . fromCharacter) . findCharacter++ onInteger :: (Integer -> a) -> VM a+ onInteger f = here "i" >>= liftM (f . Atomo.fromInteger) . findInteger++ c UppercaseLetter = keyParticleN ["letter"] [particle "uppercase"]+ c LowercaseLetter = keyParticleN ["letter"] [particle "lowercase"]+ c TitlecaseLetter = keyParticleN ["letter"] [particle "titlecase"]+ c ModifierLetter = keyParticleN ["letter"] [particle "modified"]+ c OtherLetter = keyParticleN ["letter"] [particle "other"]+ c NonSpacingMark = keyParticleN ["mark"] [particle "non-spacing"]+ c SpacingCombiningMark = keyParticleN ["mark"] [particle "space-combining"]+ c EnclosingMark = keyParticleN ["mark"] [particle "enclosing"]+ c DecimalNumber = keyParticleN ["number"] [particle "decimal"]+ c LetterNumber = keyParticleN ["number"] [particle "letter"]+ c OtherNumber = keyParticleN ["number"] [particle "other"]+ c ConnectorPunctuation = keyParticleN ["punctuation"] [particle "connector"]+ c DashPunctuation = keyParticleN ["punctuation"] [particle "dash"]+ c OpenPunctuation = keyParticleN ["punctuation"] [particle "open"]+ c ClosePunctuation = keyParticleN ["punctuation"] [particle "close"]+ c InitialQuote = keyParticleN ["quote"] [particle "initial"]+ c FinalQuote = keyParticleN ["quote"] [particle "final"]+ c OtherPunctuation = keyParticleN ["punctuation"] [particle "other"]+ c MathSymbol = keyParticleN ["symbol"] [particle "math"]+ c CurrencySymbol = keyParticleN ["symbol"] [particle "currency"]+ c ModifierSymbol = keyParticleN ["symbol"] [particle "modifier"]+ c OtherSymbol = keyParticleN ["symbol"] [particle "other"]+ c Space = particle "space"+ c LineSeparator = keyParticleN ["separator"] [particle "line"]+ c ParagraphSeparator = keyParticleN ["separator"] [particle "paragraph"]+ c Control = particle "control"+ c Format = particle "format"+ c Surrogate = particle "surrogate"+ c PrivateUse = particle "private-use"+ c NotAssigned = particle "not-assigned"
+ tests/examples/ghc92/Checkpoint.hs view
@@ -0,0 +1,45 @@+-- | Checkpoints in the blockchain (every 1000th blocks)++{-# LANGUAGE CPP #-}+module Bitcoin.BlockChain.Checkpoint where++--6-----------------------------------------------------------------------------++import Bitcoin.Protocol.Hash++--10----------------------------------------------------------------------------++#ifndef WITH_TESTNET++--14----------------------------------------------------------------------------+-- * the real network++theGenesisBlock :: Hash256+theGenesisBlock = hash256FromTextBE "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f"++theCheckpoints :: [(Int,Hash256)]+theCheckpoints =+ [ (0 , hash256FromTextBE "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f" )+ , (248000 , hash256FromTextBE "000000000000004d945017c14b75a3a58a2aa6772cacbfcaf907b3bee6d7f344" )+ ]++--273---------------------------------------------------------------------------++#else++--277---------------------------------------------------------------------------+-- * testnet3++theGenesisBlock :: Hash256+theGenesisBlock = hash256FromTextBE "000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943"++theCheckpoints :: [(Int,Hash256)]+theCheckpoints =+ [ (0 , hash256FromTextBE "000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943" )+ , (97000 , hash256FromTextBE "0000000000096581c7c0fe4d15ea0212f1087fc79f3735a892ee262c384b3741" )+ ]++#endif++--387---------------------------------------------------------------------------+
+ tests/examples/ghc92/CommentPlacement.hs view
@@ -0,0 +1,17 @@+module CommentPlacement where++liftToTopLevel' modName pn@(L _ n) = do+ liftToMod+ --step0: comment+ liftToMod+ where+ --step1: comment+ liftToMod = return ()++c04 r@Resource{..} = do+ let result = do+ acceptStr <- lookup HTTP.hAccept reqHeaders+ where+ -- this is so that in addition to getting back the resource+ provided' = map dupContentType provided+ dupContentType (a, b) = (a, (a, b))
+ tests/examples/ghc92/CommentPlacement2.hs view
@@ -0,0 +1,8 @@+module CommentPlacement2 where++c04 = do+ let result = do+ acceptStr <- y+ where+ --COMMENT+ aa = bb
+ tests/examples/ghc92/CommonUI.hs view
@@ -0,0 +1,11 @@+module CommonUI where++-- | Prints a document in a none XMl format++createRuleItem frame state g n e =+ do+ when (isJust maybeRes) $+ do{+ ;let ;palette = getPalette doc+ }+
+ tests/examples/ghc92/ExperimIOP.hs view
@@ -0,0 +1,24 @@+--+-- (C) Susumu Katayama+--+-- (Typed)IOPairs¾å¤Ç¥Ç¡¼¥¿¤ò¤È¤ë¡¥ghci¾å¤Ç :cmd ¤ò»È¤¤¤Þ¤¯¤ë´¶¤¸¡¥+{-# LANGUAGE RankNTypes, CPP, TemplateHaskell #-}+module ExperimIOP(module ExperimIOP, module MagicHaskeller.RunAnalytical) where++import MagicHaskeller.Analytical+#ifdef DEBUG+ hiding (rev)+#endif+import MagicHaskeller.Classification(Filtrable)+import MagicHaskeller.RunAnalytical+#ifdef DEBUG+ hiding (main)+#endif+import MagicHaskeller.GetTime(batchWrite)++main = do iop <- runQ andL+ let e = getOne iop []+ putStrLn $ pprint e++emptyBK = [d| {} |]+
+ tests/examples/ghc92/FOL.hs view
@@ -0,0 +1,13 @@+{-# LANGUAGE DeriveDataTypeable, FlexibleContexts, FlexibleInstances, MultiParamTypeClasses, RankNTypes, ScopedTypeVariables,+ TypeFamilies, TypeSynonymInstances #-}+{-# OPTIONS_GHC -Wall -fno-warn-orphans #-}+module Data.Logic.Types.Harrison.FOL+ ( TermType(..)+ , FOL(..)+ , Function(..)+ ) where++-- Baz+import qualified Data.Logic.Types.Common ({- instance Variable String -})+-- Bar+
+ tests/examples/ghc92/Field.hs view
@@ -0,0 +1,48 @@+{-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE PartialTypeSignatures #-}+{-# OPTIONS_GHC -Wno-orphans #-}+{-# OPTIONS_GHC -Wno-partial-type-signatures #-}+{-|+ Module : AERN2.MP.Ball.Field+ Description : Field operations on arbitrary precision dyadic balls+ Copyright : (c) Michal Konecny+ License : BSD3++ Maintainer : mikkonecny@gmail.com+ Stability : experimental+ Portability : portable++ Field operations on arbitrary precision dyadic balls+-}+module AERN2.MP.Ball.Field+(mulBalls, mulByEndpoints)+where++import MixedTypesNumPrelude+-- import qualified Prelude as P++import qualified Numeric.CollectErrors as CN++import AERN2.Normalize+++mulByEndpoints :: MPBall -> MPBall -> MPBall+mulByEndpoints b1 b2 =+ fromEndpoints l r+ where+ (l,r)+ | 0 <= l1 && 0 <= l2 = (l1*.l2, r1*^r2) -- 0 <= l1 <= r1, 0 <= l2 <= r2+ | r1 <= 0 && r2 <= 0 = (r1*.r2, l1*^l2) -- l1 <= r1 <= 0, l2 <= r2 <= 0+ | 0 <= l1 && r2 <= 0 = (r1*.l2, l1*^r2) -- l2 <= r2 <= 0 <= l1 <= r1+ | r1 <= 0 && 0 <= l2 = (l1*.r2, r1*^l2) -- l1 <= r1 <= 0 <= l2 <= r2+ | l1 < 0 && 0 < r1 && 0 <= l2 = (l1*.r2, r1*^r2) -- l1 < 0 < r1, 0 <= l2 <= r2+ | l1 < 0 && 0 < r1 && r2 <= 0 = (r1*.l2, l1*^l2) -- l1 < 0 < r1, l2 <= r2 <= 0+ | l2 < 0 && 0 < r2 && 0 <= l1 = (l2*.r1, r2*^r1) -- l2 < 0 < r2, 0 <= l1 <= r1+ | l2 < 0 && 0 < r2 && r1 <= 0 = (r2*.l1, l2*^l1) -- l2 < 0 < r2, l1 <= r1 <= 0+ | otherwise = -- l1 < 0 < r1, l2 < 0 < r2+ ((l1 *. r2) `min` (r1 *. l2)+ ,(l1 *^ l2) `max` (r1 *^ r2))+ (l1,r1) = endpoints b1+ (l2,r2) = endpoints b2++
+ tests/examples/ghc92/Group.hs view
@@ -0,0 +1,247 @@+{-# LANGUAGE RebindableSyntax,QuasiQuotes #-}++-- | This module contains most of the math types not directly related to linear algebra+--+-- FIXME: there is probably a better name for this+module SubHask.Algebra.Group+ where++import Control.Monad+import qualified Prelude as P++import SubHask.Algebra+import SubHask.Category+import SubHask.Mutable+import SubHask.SubType+import SubHask.Internal.Prelude+import SubHask.TemplateHaskell.Deriving++-------------------------------------------------------------------------------+-- non-negative objects++newtype NonNegative t = NonNegative { unNonNegative :: t }++deriveHierarchy ''NonNegative [ ''Enum, ''Boolean, ''Rig, ''Metric ]++instance (Ord t, Group t) => Cancellative (NonNegative t) where+ (NonNegative t1)-(NonNegative t2) = if diff>zero+ then NonNegative diff+ else NonNegative zero+ where+ diff=t1-t2++-------------------++{-+newtype a +> b = HomHask { unHomHask :: a -> b }+infixr +>++unsafeHomHask2 :: (a -> b -> c) -> (a +> b +> c)+unsafeHomHask2 f = HomHask (\a -> HomHask $ \b -> f a b)++instance Category (+>) where+ type ValidCategory (+>) a = ()+ id = HomHask id+ (HomHask a).(HomHask b) = HomHask $ a.b++instance Sup (+>) (->) (->)+instance Sup (->) (+>) (->)+instance (+>) <: (->) where+ embedType_ = Embed2 unHomHask++instance Monoidal (+>) where+ type Tensor (+>) = (,)+ tensor = unsafeHomHask2 $ \a b -> (a,b)++instance Braided (+>) where+ braid = HomHask $ \(a,b) -> (b,a)+ unbraid = braid++instance Closed (+>) where+ curry (HomHask f) = HomHask $ \ a -> HomHask $ \b -> f (a,b)+ uncurry (HomHask f) = HomHask $ \ (a,b) -> unHomHask (f a) b++mkSubtype [t|Int|] [t|Integer|] 'toInteger++[subhask|+poop :: (Semigroup' g, Ring g) => g +> g+poop = (+:1)+|]++class Semigroup' a where+ (+:) :: a +> a +> a++instance Semigroup' Int where (+:) = unsafeHomHask2 (+)++instance Semigroup' [a] where (+:) = unsafeHomHask2 (+)++f :: Integer +> Integer+f = HomHask $ \i -> i+1++n1 = NonNegative 5 :: NonNegative Int+n2 = NonNegative 3 :: NonNegative Int+i1 = 5 :: Int+i2 = 3 :: Int+j1 = 5 :: Integer+j2 = 3 :: Integer+-}++-------------------------------------------------------------------------------+-- integers modulo n++-- | Maps members of an equivalence class into the "canonical" element.+class Quotient a (b::k) where+ mkQuotient :: a -> a/b++-- | The type of equivalence classes created by a mod b.+newtype (/) (a :: *) (b :: k) = Mod a++-- mkDefaultMutable [t| forall a b. a/b |]++-- newtype instance Mutable m (a/b) = Mutable_Mod (Mutable m a)++instance (Quotient a b, Arbitrary a) => Arbitrary (a/b) where+ arbitrary = liftM mkQuotient arbitrary++deriveHierarchyFiltered ''(/) [ ''Eq_, ''P.Ord ] [''Arbitrary]++instance (Semigroup a, Quotient a b) => Semigroup (a/b) where+ (Mod z1) + (Mod z2) = mkQuotient $ z1 + z2++instance (Abelian a, Quotient a b) => Abelian (a/b)++instance (Monoid a, Quotient a b) => Monoid (a/b)+ where zero = Mod zero++instance (Cancellative a, Quotient a b) => Cancellative (a/b) where+ (Mod i1)-(Mod i2) = mkQuotient $ i1-i2++instance (Group a, Quotient a b) => Group (a/b) where+ negate (Mod i) = mkQuotient $ negate i++instance (Rg a, Quotient a b) => Rg (a/b) where+ (Mod z1)*(Mod z2) = mkQuotient $ z1 * z2++instance (Rig a, Quotient a b) => Rig (a/b) where+ one = Mod one++instance (Ring a, Quotient a b) => Ring (a/b) where+ fromInteger i = mkQuotient $ fromInteger i++type instance ((a/b)><c) = (a><c)/b++instance (Module a, Quotient a b) => Module (a/b) where+ (Mod a) .* r = mkQuotient $ a .* r++-- | The type of integers modulo n+type Z (n::Nat) = Integer/n++instance KnownNat n => Quotient Int n+ where+ mkQuotient i = Mod $ i `P.mod` (fromIntegral $ natVal (Proxy::Proxy n))++instance KnownNat n => Quotient Integer n+ where+ mkQuotient i = Mod $ i `P.mod` (natVal (Proxy::Proxy n))++-- | Extended Euclid's algorithm is used to calculate inverses in modular arithmetic+extendedEuclid :: (Eq t, Integral t) => t -> t -> (t,t,t,t,t,t)+extendedEuclid a b = go zero one one zero b a+ where+ go s1 s0 t1 t0 r1 r0 = if r1==zero+ then (s1,s0,t1,t0,undefined,r0)+ else go s1' s0' t1' t0' r1' r0'+ where+ q = r0 `div` r1+ (r0', r1') = (r1,r0-q*r1)+ (s0', s1') = (s1,s0-q*s1)+ (t0', t1') = (t1,t0-q*t1)++-------------------------------------------------------------------------------+-- example: Galois field++-- | @Galois p k@ is the type of integers modulo p^k, where p is prime.+-- All finite fields have this form.+--+-- See wikipedia <https://en.wikipedia.org/wiki/Finite_field> for more details.+--+-- FIXME: Many arithmetic operations over Galois Fields can be implemented more efficiently than the standard operations.+-- See <http://en.wikipedia.org/wiki/Finite_field_arithmetic>.+newtype Galois (p::Nat) (k::Nat) = Galois (Z (p^k))++type instance Galois p k >< Integer = Galois p k++deriveHierarchy ''Galois [''Eq_,''Ring]++instance KnownNat (p^k) => Module (Galois p k) where+ z .* i = Galois (Mod i) * z++instance (Prime p, KnownNat (p^k)) => Field (Galois p k) where+ reciprocal (Galois (Mod i)) = Galois $ mkQuotient $ t+ where+ (_,_,_,t,_,_) = extendedEuclid n i+ n = natVal (Proxy::Proxy (p^k))++-------------------++class Prime (n::Nat)+instance Prime 1+instance Prime 2+instance Prime 3+instance Prime 5+instance Prime 7+instance Prime 11+instance Prime 13+instance Prime 17+instance Prime 19+instance Prime 23++-------------------------------------------------------------------------------+-- the symmetric group++-- | The symmetric group is one of the simplest and best studied finite groups.+-- It is efficiently implemented as a "BijectiveT SparseFunction (Z n) (Z n)".+-- See <https://en.wikipedia.org/wiki/Symmetric_group>++-- newtype Sym (n::Nat) = Sym (BijectiveT SparseFunction (Z n) (Z n))+--+-- instance KnownNat n => Monoid (Sym n) where+-- zero = Sym id+-- (Sym s1)+(Sym s2) = Sym $ s1.s2+--+-- instance KnownNat n => Group (Sym n) where+-- negate (Sym s) = Sym $ inverse s++-------------------------------------------------------------------------------+-- | The GrothendieckGroup is a general way to construct groups from cancellative semigroups.+--+-- FIXME: How should this be related to the Ratio type?+--+-- See <http://en.wikipedia.org/wiki/Grothendieck_group wikipedia> for more details.+data GrothendieckGroup g where+ GrotheindieckGroup :: Cancellative g => g -> GrothendieckGroup g++-------------------------------------------------------------------------------+-- the vedic square++-- | The Vedic Square always forms a monoid,+-- and sometimes forms a group depending on the value of "n".+-- (The type system isn't powerful enough to encode these special cases.)+--+-- See <https://en.wikipedia.org/wiki/Vedic_square wikipedia> for more detail.+newtype VedicSquare (n::Nat) = VedicSquare (Z n)++deriveHierarchy ''VedicSquare [''Eq_]++instance KnownNat n => Semigroup (VedicSquare n) where+ (VedicSquare v1)+(VedicSquare v2) = VedicSquare $ v1*v2++instance KnownNat n => Monoid (VedicSquare n) where+ zero = VedicSquare one++------------------------------------------------------------------------------+-- Minkowski addition++-- | TODO: implement+-- More details available at <https://en.wikipedia.org/wiki/Minkowski_addition wikipedia>.+
+ tests/examples/ghc92/LinearArrow.hs view
@@ -0,0 +1,26 @@+{-# LANGUAGE LinearTypes, DataKinds, UnicodeSyntax #-}++module LinearArrow where++import GHC.Types (Multiplicity(One, Many))++n1 :: a %1 -> b+n1 = undefined++u1 :: a %1 → b+u1 = undefined++n2 :: a %(Many) -> b+n2 = undefined++u2 :: a %(Many) → b+u2 = undefined++m3 :: a ⊸ b+m3 = undefined++n4 :: a %p -> b+n4 = undefined++u4 :: a %p → b+u4 = undefined
+ tests/examples/ghc92/MatchSemis.hs view
@@ -0,0 +1,5 @@+module MatchSemis where+{+a 0 = 1;+a _ = 2;+}
+ tests/examples/ghc92/Observer.hs view
@@ -0,0 +1,325 @@+-- | Observer Effects+--+-- This module supports the implementation of observerRegistry and observables. Expected use+-- case is event propagation.+--+-- The observable event sources and the observers are usually server processes for a+-- protocol that embeds the 'ObserverRegistry' and 'Observer' 'Pdu's respectively.+--+-- A generic FIFO queue based observer can be found in "Control.Eff.Concurrent.Protocol.Observer.Queue".+--+-- @since 0.16.0+module Control.Eff.Concurrent.Protocol.Observer+ ( Observer (..),+ ObservationSink (),+ IsObservable,+ CanObserve,+ Pdu (RegisterObserver, ForgetObserver, Observed),+ registerObserver,+ forgetObserver,+ forgetObserverUnsafe,+ ObserverRegistry (..),+ ObserverRegistryState,+ observerRegistryNotify,+ evalObserverRegistryState,+ emptyObserverRegistry,+ observerRegistryHandlePdu,+ observerRegistryRemoveProcess,+ )+where++import Control.DeepSeq (NFData (rnf))+import Control.Eff+import Control.Eff.Concurrent.Process+import Control.Eff.Concurrent.Protocol+import Control.Eff.Concurrent.Protocol.Client+import Control.Eff.Concurrent.Protocol.Wrapper (Request (Cast))+import Control.Eff.Log+import Control.Eff.State.Strict+import Control.Lens+import Control.Monad+import Data.Dynamic+import Data.Kind+import Data.Map (Map)+import qualified Data.Map as Map+import Data.Proxy+import Data.Semigroup+import GHC.Generics+import GHC.Stack++-- * Observers++-- ** Observables++-- | A /protocol/ to communicate 'Observed' events from a sources to many sinks.+--+-- A sink is any process that serves a protocol with a 'Pdu' instance that embeds+-- the 'Observer' Pdu via an 'HasPduPrism' instance.+--+-- This type has /dual use/, for one it serves as type-index for 'Pdu', i.e.+-- 'HasPdu' respectively, and secondly it contains an 'ObservationSink' and+-- a 'MonitorReference'.+--+-- The 'ObservationSink' is used to serialize and send the 'Observed' events,+-- while the 'ProcessId' serves as key for internal maps.+--+-- @since 0.28.0+newtype Observer event+ = MkObserver (Arg ProcessId (ObservationSink event))+ deriving (Eq, Ord, Typeable)++instance ToTypeLogMsg event => ToLogMsg (Observer event) where+ toLogMsg (MkObserver (Arg t _)) = toTypeLogMsg (Proxy @(Observer event)) <> toLogMsg t++instance ToTypeLogMsg event => ToTypeLogMsg (Observer event) where+ toTypeLogMsg _ = toTypeLogMsg (Proxy @event) <> packLogMsg "_observer"++instance NFData (Observer event) where+ rnf (MkObserver (Arg x y)) = rnf x `seq` rnf y++instance (Tangible event) => HasPdu (Observer event) where+ data Pdu (Observer event) r where+ Observed :: event -> Pdu (Observer event) 'Asynchronous+ deriving (Typeable)++instance NFData event => NFData (Pdu (Observer event) r) where+ rnf (Observed event) = rnf event++instance ToLogMsg event => ToLogMsg (Pdu (Observer event) r) where+ toLogMsg (Observed event) =+ packLogMsg "observed: " <> toLogMsg event++-- | The Information necessary to wrap an 'Observed' event to a process specific+-- message, e.g. the embedded 'Observer' 'Pdu' instance, and the 'MonitorReference' of+-- the destination process.+--+-- @since 0.28.0+data ObservationSink event = MkObservationSink+ { _observerSerializer :: Serializer (Pdu (Observer event) 'Asynchronous),+ _observerMonitorReference :: MonitorReference+ }+ deriving (Generic, Typeable)++instance NFData (ObservationSink event) where+ rnf (MkObservationSink s p) = s `seq` rnf p++-- | Convenience type alias.+--+-- @since 0.28.0+type IsObservable eventSource event =+ ( Tangible event,+ Embeds eventSource (ObserverRegistry event),+ HasPdu eventSource,+ ToTypeLogMsg event,+ ToLogMsg event+ )++-- | Convenience type alias.+--+-- @since 0.28.0+type CanObserve eventSink event =+ ( Tangible event,+ Embeds eventSink (Observer event),+ HasPdu eventSink+ )++-- | And an 'Observer' to the set of recipients for all observations reported by 'observerRegistryNotify'.+-- Note that the observerRegistry are keyed by the observing process, i.e. a previous entry for the process+-- contained in the 'Observer' is overwritten. If you want multiple entries for a single process, just+-- combine several filter functions.+--+-- @since 0.16.0+registerObserver ::+ forall event eventSink eventSource r q.+ ( HasProcesses r q,+ TangiblePdu eventSource 'Asynchronous,+ IsObservable eventSource event,+ TangiblePdu eventSink 'Asynchronous,+ CanObserve eventSink event+ ) =>+ Endpoint eventSource ->+ Endpoint eventSink ->+ Eff r ()+registerObserver eventSource eventSink =+ cast eventSource (RegisterObserver serializer (eventSink ^. fromEndpoint))+ where+ serializer =+ MkSerializer+ ( toMessage+ . Cast+ . embedPdu @eventSink @(Observer event) @('Asynchronous)+ )++-- | Send the 'ForgetObserver' message+--+-- @since 0.16.0+forgetObserver ::+ forall event eventSink eventSource r q.+ ( HasProcesses r q,+ TangiblePdu eventSource 'Asynchronous,+ IsObservable eventSource event+ ) =>+ Endpoint eventSource ->+ Endpoint eventSink ->+ Eff r ()+forgetObserver eventSource eventSink =+ forgetObserverUnsafe @event @eventSource eventSource (eventSink ^. fromEndpoint)++-- | Send the 'ForgetObserver' message, use a raw 'ProcessId' as parameter.+--+-- @since 0.28.0+forgetObserverUnsafe ::+ forall event eventSource r q.+ ( HasProcesses r q,+ TangiblePdu eventSource 'Asynchronous,+ IsObservable eventSource event+ ) =>+ Endpoint eventSource ->+ ProcessId ->+ Eff r ()+forgetObserverUnsafe eventSource eventSink =+ cast eventSource (ForgetObserver @event eventSink)++-- ** Observer Support Functions++-- * Managing Observers++-- | A protocol for managing 'Observer's, encompassing registration and de-registration of+-- 'Observer's.+--+-- @since 0.28.0+data ObserverRegistry (event :: Type) = MkObserverRegistry+ {_observerRegistry :: Map ProcessId (ObservationSink event)}+ deriving (Typeable)++instance ToTypeLogMsg event => ToTypeLogMsg (ObserverRegistry event) where+ toTypeLogMsg _ = toTypeLogMsg (Proxy @event) <> packLogMsg "_observer_registry_event"++instance (Tangible event) => HasPdu (ObserverRegistry event) where+ data Pdu (ObserverRegistry event) r where+ -- | This message denotes that the given 'Observer' should receive observations until 'ForgetObserver' is+ -- received.+ --+ -- @since 0.28.0+ RegisterObserver :: Serializer (Pdu (Observer event) 'Asynchronous) -> ProcessId -> Pdu (ObserverRegistry event) 'Asynchronous+ -- | This message denotes that the given 'Observer' should not receive observations anymore.+ --+ -- @since 0.16.1+ ForgetObserver :: ProcessId -> Pdu (ObserverRegistry event) 'Asynchronous+ -- -- | This message denotes that a monitored process died+ -- --+ -- -- @since 0.28.0+ -- ObserverMightBeDown :: MonitorReference -> Pdu (ObserverRegistry event) ( 'Synchronous Bool)+ deriving (Typeable)++instance NFData (Pdu (ObserverRegistry event) r) where+ rnf (RegisterObserver ser pid) = rnf ser `seq` rnf pid+ rnf (ForgetObserver pid) = rnf pid++instance ToTypeLogMsg event => ToLogMsg (Pdu (ObserverRegistry event) r) where+ toLogMsg (RegisterObserver _ser pid) = packLogMsg "register " <> toTypeLogMsg (Proxy @event) <> packLogMsg " observer " <> toLogMsg pid+ toLogMsg (ForgetObserver pid) = packLogMsg "forget " <> toTypeLogMsg (Proxy @event) <> packLogMsg " observer " <> toLogMsg pid++-- ** Protocol for integrating 'ObserverRegistry' into processes.++-- | Provide the implementation for the 'ObserverRegistry' Protocol, this handled 'RegisterObserver' and 'ForgetObserver'+-- messages. It also adds the 'ObserverRegistryState' constraint to the effect list.+--+-- @since 0.28.0+observerRegistryHandlePdu ::+ forall event q r.+ ( HasCallStack,+ ToTypeLogMsg event,+ HasProcesses r q,+ Member (ObserverRegistryState event) r,+ Member Logs r+ ) =>+ Pdu (ObserverRegistry event) 'Asynchronous ->+ Eff r ()+observerRegistryHandlePdu = \case+ RegisterObserver ser pid -> do+ monRef <- monitor pid+ let sink = MkObservationSink ser monRef+ observer = MkObserver (Arg pid sink)+ modify @(ObserverRegistry event) (over observerRegistry (Map.insert pid sink))+ os <- get @(ObserverRegistry event)+ logDebug+ (LABEL "registered" observer)+ ( LABEL+ "current number of observers" -- TODO put this info into the process details+ (Map.size (view observerRegistry os))+ )+ ForgetObserver ob -> do+ wasRemoved <- observerRegistryRemoveProcess @event ob+ unless wasRemoved $+ logDebug (LABEL "unknown observer " ob)++-- | Remove the entry in the 'ObserverRegistry' for the 'ProcessId'+-- and return 'True' if there was an entry, 'False' otherwise.+--+-- @since 0.28.0+observerRegistryRemoveProcess ::+ forall event q r.+ ( HasCallStack,+ ToTypeLogMsg event,+ HasProcesses r q,+ Member (ObserverRegistryState event) r,+ Member Logs r+ ) =>+ ProcessId ->+ Eff r Bool+observerRegistryRemoveProcess ob = do+ mSink <- view (observerRegistry . at ob) <$> get @(ObserverRegistry event)+ modify @(ObserverRegistry event) (observerRegistry . at ob .~ Nothing)+ os <- get @(ObserverRegistry event)+ maybe+ (pure False)+ (foundIt os)+ mSink+ where+ foundIt os sink@(MkObservationSink _ monRef) = do+ demonitor monRef+ logDebug+ (LABEL "removed" (MkObserver $ Arg ob sink))+ (LABEL "current number of observers" (Map.size (view observerRegistry os)))+ pure True++-- | Keep track of registered 'Observer's.+--+-- Handle the 'ObserverRegistryState' effect, i.e. run 'evalState' on an 'emptyObserverRegistry'.+--+-- @since 0.28.0+evalObserverRegistryState :: Eff (ObserverRegistryState event ': r) a -> Eff r a+evalObserverRegistryState = evalState emptyObserverRegistry++-- | The empty 'ObserverRegistryState'+--+-- @since 0.28.0+emptyObserverRegistry :: ObserverRegistry event+emptyObserverRegistry = MkObserverRegistry Map.empty++-- | Alias for the effect that contains the observers managed by 'evalObserverRegistryState'+type ObserverRegistryState event = State (ObserverRegistry event)++-- | An 'Iso' for the 'Map' used internally.+observerRegistry :: Iso' (ObserverRegistry event) (Map ProcessId (ObservationSink event))+observerRegistry = iso _observerRegistry MkObserverRegistry++-- | Report an observation to all observers.+-- The process needs to 'evalObserverRegistryState' and to 'observerRegistryHandlePdu'.+--+-- @since 0.28.0+observerRegistryNotify ::+ forall event r q.+ ( HasProcesses r q,+ Member (ObserverRegistryState event) r+ ) =>+ event ->+ Eff r ()+observerRegistryNotify observation = do+ os <- view observerRegistry <$> get+ mapM_ notifySomeObserver (Map.assocs os)+ where+ notifySomeObserver (destination, (MkObservationSink serializer _)) =+ sendAnyMessage destination (runSerializer serializer (Observed observation))+
+ tests/examples/ghc92/Parse.hs view
@@ -0,0 +1,5 @@++module Language.Python.Internal.Parse where++compoundStatement pIndent indentBefore =+ do; a <- doAsync; fundef
+ tests/examples/ghc92/PostgreSQL.hs view
@@ -0,0 +1,194 @@+{-# LANGUAGE EmptyDataDecls #-}+{-# LANGUAGE GeneralizedNewtypeDeriving #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE QuasiQuotes #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeFamilies #-}+module Drifter.PostgreSQL+ ( PGMigration+ , Method(..)+ , DBConnection(..)+ , ChangeHistory(..)+ , runMigrations+ , getChangeHistory+ , getChangeNameHistory+ ) where++-------------------------------------------------------------------------------+import Control.Applicative as A+import Control.Exception+import Control.Monad+import Control.Monad.Trans+import Control.Monad.Trans.Except+import Data.Set (Set)+import qualified Data.Set as Set+import Data.Time+import Database.PostgreSQL.Simple+import Database.PostgreSQL.Simple.FromField+import Database.PostgreSQL.Simple.FromRow+import Database.PostgreSQL.Simple.SqlQQ+import Drifter+-------------------------------------------------------------------------------+++data PGMigration+++data instance Method PGMigration = MigrationQuery Query+ -- ^ Run a query against the database+ | MigrationCode (Connection -> IO (Either String ()))+ -- ^ Run any arbitrary IO code+++data instance DBConnection PGMigration = DBConnection PGMigrationConnection+++data PGMigrationConnection = PGMigrationConnection (Set ChangeName) Connection+++instance Drifter PGMigration where+ migrateSingle (DBConnection migrationConn) change = do+ runExceptT $ migrateChange migrationConn change+++-------------------------------------------------------------------------------+-- Change History Tracking+-------------------------------------------------------------------------------+newtype ChangeId = ChangeId Int deriving (Eq, Ord, Show, FromField)+++data ChangeHistory = ChangeHistory {+ histId :: ChangeId+ , histName :: ChangeName+ , histDescription :: Maybe Description+ , histTime :: UTCTime+ } deriving (Show)+++instance Eq ChangeHistory where+ a == b = (histName a) == (histName b)+++instance Ord ChangeHistory where+ compare a b = compare (histId a) (histId b)+++instance FromRow ChangeHistory where+ fromRow = ChangeHistory <$> field+ <*> (ChangeName <$> field)+ <*> field+ <*> field+++-------------------------------------------------------------------------------+-- Queries+-------------------------------------------------------------------------------+bootstrapQ :: Query+bootstrapQ = [sql|+CREATE TABLE IF NOT EXISTS schema_migrations (+ id serial NOT NULL,+ name text NOT NULL,+ description text,+ time timestamptz NOT NULL DEFAULT now(),++ PRIMARY KEY (id),+ UNIQUE (name)+);+|]+++-------------------------------------------------------------------------------+changeHistoryQ :: Query+changeHistoryQ =+ "SELECT id, name, description, time FROM schema_migrations ORDER BY id;"+++-------------------------------------------------------------------------------+changeNameHistoryQ :: Query+changeNameHistoryQ =+ "SELECT name FROM schema_migrations ORDER BY id;"+++-------------------------------------------------------------------------------+insertLogQ :: Query+insertLogQ =+ "INSERT INTO schema_migrations (name, description, time) VALUES (?, ?, ?);"+++-------------------------------------------------------------------------------+migrateChange :: PGMigrationConnection -> Change PGMigration -> ExceptT String IO ()+migrateChange (PGMigrationConnection hist c) ch@Change{..} = do+ if Set.member changeName hist+ then lift $ putStrLn $ "Skipping: " ++ show (changeNameText changeName)+ else do+ runMethod c changeMethod+ logChange c ch+ lift $ putStrLn $ "Committed: " ++ show changeName+++-------------------------------------------------------------------------------+runMethod :: Connection -> Method PGMigration -> ExceptT String IO ()+runMethod c (MigrationQuery q) =+ void $ ExceptT $ (Right <$> execute_ c q) `catches` errorHandlers+runMethod c (MigrationCode f) =+ ExceptT $ f c `catches` errorHandlers+++ -------------------------------------------------------------------------------+logChange :: Connection -> Change PGMigration -> ExceptT String IO ()+logChange c Change{..} = do+ now <- lift getCurrentTime+ void $ ExceptT $ (Right <$> go now) `catches` errorHandlers+ where+ go now = execute c insertLogQ (changeNameText changeName, changeDescription, now)+++-------------------------------------------------------------------------------+errorHandlers :: [Handler (Either String b)]+errorHandlers = [ Handler (\(ex::SqlError) -> return $ Left $ show ex)+ , Handler (\(ex::FormatError) -> return $ Left $ show ex)+ , Handler (\(ex::ResultError) -> return $ Left $ show ex)+ , Handler (\(ex::QueryError) -> return $ Left $ show ex)+ ]+++-------------------------------------------------------------------------------+-- | Takes a connection and builds the state to thread throughout the migration.+-- This includes bootstrapping the migration tables and collecting all the+-- migrations that have already been committed.+makePGMigrationConnection :: Connection -> IO PGMigrationConnection+makePGMigrationConnection conn = do+ void $ execute_ conn bootstrapQ+ hist <- getChangeNameHistory conn+ return $ PGMigrationConnection (Set.fromList hist) conn+++-------------------------------------------------------------------------------+-- | Takes the list of all migrations, removes the ones that have+-- already run and runs them. Use this instead of 'migrate'.+runMigrations :: Connection -> [Change PGMigration] -> IO (Either String ())+runMigrations conn changes = do+ begin conn+ migrationConn <- makePGMigrationConnection conn+ res <- migrate (DBConnection migrationConn) changes `onException` rollback conn+ case res of+ Right _ -> commit conn+ Left _ -> rollback conn+ return res+++-------------------------------------------------------------------------------+-- | Get all changes from schema_migrations table for all the migrations that+-- have previously run.+getChangeHistory :: Connection -> IO [ChangeHistory]+getChangeHistory conn = query_ conn changeHistoryQ+++-------------------------------------------------------------------------------+-- | Get just the names of all changes from schema_migrations for migrations+-- that have previously run.+getChangeNameHistory :: Connection -> IO [ChangeName]+getChangeNameHistory conn = fmap (\(Only nm) -> ChangeName nm)+ A.<$> query_ conn changeNameHistoryQ+
+ tests/examples/ghc92/RList.hs view
@@ -0,0 +1,233 @@+{-# LANGUAGE TypeOperators, EmptyDataDecls, RankNTypes #-}+{-# LANGUAGE TypeFamilies, DataKinds, PolyKinds, KindSignatures #-}+{-# LANGUAGE GADTs, TypeInType, PatternGuards #-}++-- |+-- Module : Data.Type.RList+-- Copyright : (c) 2016 Edwin Westbrook+--+-- License : BSD3+--+-- Maintainer : westbrook@galois.com+-- Stability : experimental+-- Portability : GHC+--+-- A /right list/, or 'RList', is a list where cons adds to the end, or the+-- right-hand side, of a list. This is useful conceptually for contexts of+-- name-bindings, where the most recent name-binding is intuitively at the end+-- of the context.++module Data.Type.RList where++import Prelude hiding (map, foldr)+import Data.Kind+import Data.Type.Equality+import Data.Proxy (Proxy(..))+import Data.Functor.Constant+import Data.Typeable++-------------------------------------------------------------------------------+-- * Right-lists as a datatype+-------------------------------------------------------------------------------++-- | A form of lists where elements are added to the right instead of the left+data RList a+ = RNil+ | (RList a) :> a++-- | Append two 'RList's at the type level+type family ((r1 :: RList k) :++: (r2 :: RList k)) :: RList k+infixr 5 :++:+type instance (r :++: 'RNil) = r+type instance (r1 :++: (r2 ':> a)) = (r1 :++: r2) ':> a++-------------------------------------------------------------------------------+-- * Proofs of membership in a type-level list+-------------------------------------------------------------------------------++{-|+ A @Member ctx a@ is a \"proof\" that the type @a@ is in the type+ list @ctx@, meaning that @ctx@ equals++> t0 ':>' a ':>' t1 ':>' ... ':>' tn++ for some types @t0,t1,...,tn@.+-}+data Member (ctx :: RList k1) (a :: k2) where+ Member_Base :: Member (ctx :> a) a+ Member_Step :: Member ctx a -> Member (ctx :> b) a+ deriving Typeable++instance Show (Member r a) where+ showsPrec p = showsPrecMember (p > 10) where+ showsPrecMember :: Bool -> Member ctx a -> ShowS+ showsPrecMember _ Member_Base = showString "Member_Base"+ showsPrecMember p (Member_Step prf) = showParen p $+ showString "Member_Step" . showsPrec 10 prf++instance TestEquality (Member ctx) where+ testEquality Member_Base Member_Base = Just Refl+ testEquality (Member_Step memb1) (Member_Step memb2)+ | Just Refl <- testEquality memb1 memb2+ = Just Refl+ testEquality _ _ = Nothing++instance Eq (Member ctx a) where+ Member_Base == Member_Base = True+ (Member_Step memb1) == (Member_Step memb2) = memb1 == memb2+ _ == _ = False++--toEq :: Member (Nil :> a) b -> b :~: a+--toEq Member_Base = Refl+--toEq _ = error "Should not happen! (toEq)"++-- | Weaken a 'Member' proof by prepending another context to the context it+-- proves membership in+weakenMemberL :: Proxy r1 -> Member r2 a -> Member (r1 :++: r2) a+weakenMemberL _ Member_Base = Member_Base+weakenMemberL tag (Member_Step mem) = Member_Step (weakenMemberL tag mem)+++------------------------------------------------------------+-- * Proofs that one list equals the append of two others+------------------------------------------------------------++{-|+ An @Append ctx1 ctx2 ctx@ is a \"proof\" that @ctx = ctx1 ':++:' ctx2@.+-}+data Append ctx1 ctx2 ctx where+ Append_Base :: Append ctx RNil ctx+ Append_Step :: Append ctx1 ctx2 ctx -> Append ctx1 (ctx2 :> a) (ctx :> a)++-- | Make an 'Append' proof from any 'RAssign' vector for the second+-- argument of the append.+mkAppend :: RAssign f c2 -> Append c1 c2 (c1 :++: c2)+mkAppend MNil = Append_Base+mkAppend (c :>: _) = Append_Step (mkAppend c)++-- | A version of 'mkAppend' that takes in a 'Proxy' argument.+mkMonoAppend :: Proxy c1 -> RAssign f c2 -> Append c1 c2 (c1 :++: c2)+mkMonoAppend _ = mkAppend++-- | The inverse of 'mkAppend', that builds an 'RAssign' from an 'Append'+proxiesFromAppend :: Append c1 c2 c -> RAssign Proxy c2+proxiesFromAppend Append_Base = MNil+proxiesFromAppend (Append_Step a) = proxiesFromAppend a :>: Proxy+++-------------------------------------------------------------------------------+-- * Contexts+-------------------------------------------------------------------------------++{-|+ An @RAssign f r@ an assignment of an @f a@ for each @a@ in the 'RList' @r@+-}+data RAssign (f :: k -> *) (c :: RList k) where+ MNil :: RAssign f RNil+ (:>:) :: RAssign f c -> f a -> RAssign f (c :> a)++-- | Create an empty 'RAssign' vector.+empty :: RAssign f RNil+empty = MNil++-- | Create a singleton 'RAssign' vector.+singleton :: f a -> RAssign f (RNil :> a)+singleton x = MNil :>: x++-- | Look up an element of an 'RAssign' vector using a 'Member' proof+get :: Member c a -> RAssign f c -> f a+get Member_Base (_ :>: x) = x+get (Member_Step mem') (mc :>: _) = get mem' mc++-- | Heterogeneous type application, including a proof that the input kind of+-- the function equals the kind of the type argument+data HApply (f :: k1 -> Type) (a :: k2) where+ HApply :: forall k (f :: k -> Type) (a :: k). f a -> HApply f a++-- | Look up an element of an 'RAssign' vector using a 'Member' proof at what+-- GHC thinks might be a different kind, i.e., heterogeneously+hget :: forall k1 k2 (f :: k1 -> Type) (c :: RList k1) (a :: k2).+ Member c a -> RAssign f c -> HApply f a+hget Member_Base (_ :>: x) = HApply x+hget (Member_Step mem') (mc :>: _) = hget mem' mc++-- | Modify an element of an 'RAssign' vector using a 'Member' proof.+modify :: Member c a -> (f a -> f a) -> RAssign f c -> RAssign f c+modify Member_Base f (xs :>: x) = xs :>: f x+modify (Member_Step mem') f (xs :>: x) = modify mem' f xs :>: x++-- | Set an element of an 'RAssign' vector using a 'Member' proof.+set :: Member c a -> f a -> RAssign f c -> RAssign f c+set memb x = modify memb (const x)++-- | Test if an object is in an 'RAssign', returning a 'Member' proof if it is+memberElem :: TestEquality f => f a -> RAssign f ctx -> Maybe (Member ctx a)+memberElem _ MNil = Nothing+memberElem x (_ :>: y) | Just Refl <- testEquality x y = Just Member_Base+memberElem x (xs :>: _) = fmap Member_Step $ memberElem x xs++-- | Map a function on all elements of an 'RAssign' vector.+map :: (forall x. f x -> g x) -> RAssign f c -> RAssign g c+map _ MNil = MNil+map f (mc :>: x) = map f mc :>: f x++-- | An alternate name for 'map' that does not clash with the prelude+mapRAssign :: (forall x. f x -> g x) -> RAssign f c -> RAssign g c+mapRAssign = map++-- | Map a binary function on all pairs of elements of two 'RAssign' vectors.+map2 :: (forall x. f x -> g x -> h x) ->+ RAssign f c -> RAssign g c -> RAssign h c+map2 _ MNil MNil = MNil+map2 f (xs :>: x) (ys :>: y) = map2 f xs ys :>: f x y++-- | Take the tail of an 'RAssign'+tail :: RAssign f (ctx :> a) -> RAssign f ctx+tail (xs :>: _) = xs++-- | Convert a monomorphic 'RAssign' to a list+toList :: RAssign (Constant a) c -> [a]+toList = mapToList getConstant++-- | Map a function with monomorphic output type across an 'RAssign' to create a+-- standard list:+--+-- > mapToList f = toList . map (Constant . f)+mapToList :: (forall a. f a -> b) -> RAssign f ctx -> [b]+mapToList _ MNil = []+mapToList f (xs :>: x) = mapToList f xs ++ [f x]++-- | Append two 'RAssign' vectors.+append :: RAssign f c1 -> RAssign f c2 -> RAssign f (c1 :++: c2)+append mc MNil = mc+append mc1 (mc2 :>: x) = append mc1 mc2 :>: x++-- | Perform a right fold across an 'RAssign'+foldr :: (forall a. f a -> r -> r) -> r -> RAssign f ctx -> r+foldr _ r MNil = r+foldr f r (xs :>: x) = f x $ foldr f r xs++-- | Split an 'RAssign' vector into two pieces. The first argument is a+-- phantom argument that gives the form of the first list piece.+split :: (c ~ (c1 :++: c2)) => prx c1 ->+ RAssign any c2 -> RAssign f c -> (RAssign f c1, RAssign f c2)+split _ MNil mc = (mc, MNil)+split _ (any :>: _) (mc :>: x) = (mc1, mc2 :>: x)+ where (mc1, mc2) = split Proxy any mc++-- | Create a vector of proofs that each type in @c@ is a 'Member' of @c@.+members :: RAssign f c -> RAssign (Member c) c+members MNil = MNil+members (c :>: _) = map Member_Step (members c) :>: Member_Base++-- | A type-class which ensures that ctx is a valid context, i.e., has+-- | the form (RNil :> t1 :> ... :> tn) for some types t1 through tn+class TypeCtx ctx where+ typeCtxProxies :: RAssign Proxy ctx++instance TypeCtx RNil where+ typeCtxProxies = MNil++instance TypeCtx ctx => TypeCtx (ctx :> a) where+ typeCtxProxies = typeCtxProxies :>: Proxy+
+ tests/examples/ghc92/ScopesBug.hs view
@@ -0,0 +1,15 @@+{-# LANGUAGE PatternSynonyms, ViewPatterns #-}+{-# LANGUAGE ImplicitParams #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE TypeApplications #-}++module ScopesBug where++data Proxy (a :: k) = Proxy+data Con k (a :: k) = Con (Proxy a)++tyApp :: Con k a -> Proxy a+tyApp (Con @kx @ax (x :: Proxy ax)) = x :: Proxy (ax :: kx)+
+ tests/examples/ghc92/StringRef.hs view
@@ -0,0 +1,129 @@+{-# LANGUAGE FlexibleInstances, UndecidableInstances, TypeSynonymInstances #-}+{-# LANGUAGE LambdaCase #-}++module Data.Binary.StringRef+ ( ListOfStringable(..)+ , StringReferencingBinary(..)+ , IntLen(..)+ , ls_encode+ , ls_decode+ ) where++import Data.Binary+import Data.Binary.Put+import Data.Binary.Get+import Control.Monad+import Control.Applicative ((<$>))+import Data.List+import Data.ByteString.Lazy (ByteString)+import qualified Data.MyText as T+import Data.MyText (Text, decodeUtf8, encodeUtf8)+import Debug.Trace++class StringReferencingBinary a => ListOfStringable a where+ listOfStrings :: a -> [Text]++-- | An extended version of Binary that passes the list of strings of the+-- previous sample+class StringReferencingBinary a where+ ls_put :: [Text] -> a -> Put+ ls_get :: [Text] -> Get a++------------------------------------------------------------------------+-- Instances for the first few tuples++instance (StringReferencingBinary a, StringReferencingBinary b) => StringReferencingBinary (a,b) where+ ls_put strs (a,b) = ls_put strs a >> ls_put strs b+ ls_get strs = liftM2 (,) (ls_get strs) (ls_get strs)++instance (StringReferencingBinary a, StringReferencingBinary b, StringReferencingBinary c) => StringReferencingBinary (a,b,c) where+ ls_put strs (a,b,c) = ls_put strs a >> ls_put strs b >> ls_put strs c+ ls_get strs = liftM3 (,,) (ls_get strs) (ls_get strs) (ls_get strs)++instance (StringReferencingBinary a, StringReferencingBinary b, StringReferencingBinary c, StringReferencingBinary d) => StringReferencingBinary (a,b,c,d) where+ ls_put strs (a,b,c,d) = ls_put strs a >> ls_put strs b >> ls_put strs c >> ls_put strs d+ ls_get strs = liftM4 (,,,) (ls_get strs) (ls_get strs) (ls_get strs) (ls_get strs)++instance (StringReferencingBinary a, StringReferencingBinary b, StringReferencingBinary c, StringReferencingBinary d, StringReferencingBinary e) => StringReferencingBinary (a,b,c,d,e) where+ ls_put strs (a,b,c,d,e) = ls_put strs a >> ls_put strs b >> ls_put strs c >> ls_put strs d >> ls_put strs e+ ls_get strs = liftM5 (,,,,) (ls_get strs) (ls_get strs) (ls_get strs) (ls_get strs) (ls_get strs)+++newtype CompactNum a = CompactNum { fromCompactNum :: a }++instance (Integral a, Num a, Binary a) => StringReferencingBinary (CompactNum a) where+ ls_put _ (CompactNum i)+ | 0 <= i && i < 255 = putWord8 (fromIntegral i)+ | otherwise = putWord8 255 >> put i+ ls_get _ = fmap CompactNum $ getWord8 >>= \case+ i | 0 <= i && i < 255 -> return (fromIntegral i)+ | otherwise -> get++instance StringReferencingBinary a => StringReferencingBinary [a] where+ ls_put strs l = ls_put strs (CompactNum (length l)) >> mapM_ (ls_put strs) l+ ls_get strs = ls_getMany strs . fromCompactNum =<< ls_get strs++instance StringReferencingBinary Text where+ ls_put strs s = case elemIndex s strs of+ Just i | 0 <= i && i < 255 ->+ putWord8 (fromIntegral (succ i))+ _ -> putWord8 0 >> ls_put strs (T.unpack s)+ ls_get strs = getWord8 >>= \case+ 0 -> T.pack <$> ls_get strs+ i -> return $! strs !! fromIntegral (pred i)++-- | 'ls_get strsMany n' ls_get strs 'n' elements in order, without blowing the stack.+ls_getMany :: StringReferencingBinary a => [Text] -> Int -> Get [a]+ls_getMany strs n = go [] n+ where+ go xs 0 = return $! reverse xs+ go xs i = do x <- ls_get strs+ -- we must seq x to avoid stack overflows due to laziness in+ -- (>>=)+ x `seq` go (x:xs) (i-1)+{-# INLINE ls_getMany #-}+++-- compat newtype for deserialization of v2-v4 CaptureData+newtype IntLen a = IntLen { fromIntLen :: a }++-- compat instance for deserialization of v1 CaptureData+instance Binary a => Binary (IntLen a) where+ put = put . fromIntLen+ get = IntLen <$> get++-- compat instance for deserialization of v2-v4 CaptureData+instance StringReferencingBinary a => StringReferencingBinary (IntLen [a]) where+ ls_put strs (IntLen l) = ls_put strs (length l) >> mapM_ (ls_put strs) l+ ls_get strs = fmap IntLen $ ls_getMany strs =<< ls_get strs++-- compat instance for deserialization of v2-v4 CaptureData+instance StringReferencingBinary (IntLen Text) where+ ls_put strs (IntLen s) = case elemIndex s strs of+ Just i | 0 <= i && i < 255 ->+ putWord8 (fromIntegral (succ i))+ _ -> putWord8 0 >> ls_put strs (IntLen (T.unpack s))+ ls_get strs = fmap IntLen $ getWord8 >>= \case+ 0 -> T.pack . fromIntLen <$> ls_get strs+ i -> return $! strs !! fromIntegral (pred i)++{-+instance Binary a => StringReferencingBinary a where+ ls_put _ = put+ ls_get _ = get+-}++instance StringReferencingBinary Char where { ls_put _ = put; ls_get _ = get }+instance StringReferencingBinary Int where { ls_put _ = put; ls_get _ = get }+instance StringReferencingBinary Integer where { ls_put _ = put; ls_get _ = get }+instance StringReferencingBinary Bool where { ls_put _ = put; ls_get _ = get }++ls_encode :: StringReferencingBinary a => [Text] -> a -> ByteString+ls_encode strs = runPut . ls_put strs+{-# INLINE ls_encode #-}++-- | Decode a value from a lazy ByteString, reconstructing the original structure.+--+ls_decode :: StringReferencingBinary a => [Text] -> ByteString -> a+ls_decode strs = runGet (ls_get strs)+
+ tests/examples/ghc92/T17544_kw.hs view
@@ -0,0 +1,24 @@+{-# LANGUAGE GADTs #-}++-- Haddock comments in this test case should all be rejected, but they are not.+--+-- This is a known issue. Users should avoid writing comments in such+-- positions, as a future fix will disallow them.+--+-- See Note [Register keyword location] in GHC.Parser.PostProcess.Haddock++module+ -- | Bad comment for the module+ T17544_kw where++data Foo -- | Bad comment for MkFoo+ where MkFoo :: Foo++newtype Bar -- | Bad comment for MkBar+ where MkBar :: () -> Bar++class Cls a+ -- | Bad comment for clsmethod+ where+ clsmethod :: a+
+ tests/examples/ghc92/TH.hs view
@@ -0,0 +1,279 @@+{-|+Module : Language.Grammars.AspectAG.TH+Description : Boilerplate generation+Copyright : (c) Juan García Garland+License : GPL+Maintainer : jpgarcia@fing.edu.uy+Stability : experimental+Portability : POSIX+-}++{-# LANGUAGE PolyKinds #-}+{-# LANGUAGE KindSignatures #-}+{-# LANGUAGE DataKinds #-}+{-# LANGUAGE ConstraintKinds #-}+{-# LANGUAGE RankNTypes #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE FlexibleInstances #-}+{-# LANGUAGE FlexibleContexts #-}+{-# LANGUAGE GADTs #-}+{-# LANGUAGE UndecidableInstances #-}+{-# LANGUAGE MultiParamTypeClasses #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE NoMonomorphismRestriction #-}+{-# LANGUAGE ScopedTypeVariables #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE TypeApplications #-}+{-# LANGUAGE FunctionalDependencies #-}+{-# LANGUAGE TemplateHaskell #-}++module Language.Grammars.AspectAG.TH where++import Language.Haskell.TH+import Language.Haskell.TH.Syntax (showName)+import Data.Proxy+import Data.Either+import GHC.TypeLits+import Data.List+import Data.Set (Set)+import qualified Data.Set as S++import Control.Monad++import Data.GenRec.Label+import Data.GenRec+import Language.Grammars.AspectAG+import Language.Grammars.AspectAG.RecordInstances+import qualified Data.Kind as DK+++-- * Attribute labels++-- | makes a type level lit (Symbol) from a String+str2Sym s = litT$ strTyLit s -- th provides nametoSymbol, btw+++-- | TH function to define a typed attribute label given a name+-- and a quoted type+attLabel :: String -> Name -> DecsQ+attLabel s t+ = [d| $(varP (mkName s)) = Label :: Label ( 'Att $(str2Sym s)+ $(conT t)) |]++-- | for completness, to have a name as the next one+attMono = attLabel++-- | TH function to define a polymorphic attribute+attPoly :: String -> DecsQ+attPoly s+ = [d| $(varP (mkName s)) = Label :: forall a . Label ( 'Att $(str2Sym s) a) |]++-- | multiple monomorphic attributes at once+attLabels :: [(String,Name)] -> Q [Dec]+attLabels xs = liftM concat . sequence $ [attLabel att ty | (att,ty) <- xs ]++-- * Non terminals++-- | add a non terminal symbol+addNont :: String -> Q [Dec]+addNont s+ = liftM concat . sequence $ [addNTLabel s, addNTType s]++addNTLabel :: String -> Q [Dec]+addNTLabel s+ = [d| $(varP (mkName ("nt_" ++ s))) = Label :: Label ('NT $(str2Sym s)) |]++addNTType :: String -> Q [Dec]+addNTType s+ = return [TySynD (mkName ("Nt_"++ s)) [] (AppT (PromotedT 'NT) (LitT (StrTyLit s)))]+++-- * Productions+--data Symbol = N String | Te Name+type family Terminal s :: Either NT T where+ Terminal s = 'Right ('T s)++type family NonTerminal s where+ NonTerminal s = 'Left s+++data SymTH = Ter Name | NonTer Name | Poly+++addChi :: String -- chi name+ -> Name -- prd+ -> SymTH -- symbol type+ -> Q [Dec]+addChi chi prd (Ter typ)+ = [d| $(varP (mkName ("ch_" ++chi)))+ = Label :: Label ( 'Chi $(str2Sym chi)+ $(conT prd)+ (Terminal $(conT typ)))|]+addChi chi prd (NonTer typ)+ = [d| $(varP (mkName ("ch_" ++chi)))+ = Label :: Label ( 'Chi $(str2Sym chi)+ $(conT prd)+ (NonTerminal $(conT typ)))|]+addChi chi prd poly+ = [d| $(varP (mkName ("ch_" ++chi)))+ = Label :: forall a . Label ( 'Chi $(str2Sym chi)+ $(conT prd)+ ('Right ('T a)))|]++-- | only prod symbol+addPrd :: String --name+ -> Name --nonterm+ -> Q [Dec]+addPrd prd nt = liftM concat . sequence+ $ [addPrdType prd nt, addPrdLabel prd nt]++addPrdLabel prd nt+ = [d| $(varP (mkName ("p_" ++ prd)))+ = Label :: Label ('Prd $(str2Sym prd) $(conT nt))|]++addPrdType prd nt+ = return [TySynD (mkName ("P_"++ prd)) []+ (AppT (AppT (PromotedT 'Prd) (LitT (StrTyLit prd))) (ConT nt))]+++-- | Productions+addProd :: String -- name+ -> Name -- nt+ -> [(String, SymTH)] -- chiLst+ -> Q [Dec]+addProd prd nt xs+ = liftM concat . sequence $+ addPrd prd nt+ : addInstance nt prd (map preProc xs)+ : [addChi chi (mkName ("P_" ++ prd)) sym | (chi, sym) <- xs]+ where preProc (n, Ter a) = (mkName n, a)+ preProc (n, NonTer a) = (mkName n, a)+ preProc (n, Poly) = (mkName n, mkName "a")++-- | class+class Prods (lhs :: NT) (name :: Symbol) (rhs :: [(Symbol, Symbol)]) where {}++-- get a list of instances+getInstances :: Q [InstanceDec]+getInstances = do+ ClassI _ instances <- reify ''Prods+ return instances++-- convert the list of instances into an Exp so they can be displayed in GHCi+showInstances :: Q Exp+showInstances = do+ ins <- getInstances+ return . LitE . stringL $ show $ head ins++addInstance :: Name -> String -> [(Name, Name)] -> Q [Dec]+addInstance nt name rhs+ = [d| instance Prods $(conT nt) $(str2Sym name) $(typeList rhs) where {} |]++typeList :: [(Name, Name)] -> Q Type+typeList = foldr f promotedNilT+ -- where f = \x xs -> appT (appT promotedConsT (nameToSymbolBase x)) xs+ where f = \(n,t) xs+ -> appT (appT promotedConsT (appT (appT (promotedTupleT 2)+ (nameToSymbol n))+ (nameToSymbolBase t))) xs++nameToSymbol = litT . strTyLit . show+nameToSymbolBase = litT . strTyLit . nameBase++isNTName :: Name -> Bool+isNTName n+ = "Nt_" `isPrefixOf` nameBase n++closeNT :: Name -> Q [Dec]+closeNT nt+ = do decs <- getInstances+ let consts = map mkCon $ filter (isInstanceOf nt) decs+ return [ DataD []+ (mkName $ drop 3 $ nameBase nt) [] Nothing+ consts [DerivClause Nothing [ConT ''Show, ConT ''Eq, ConT ''Read]]]++isInstanceOf nt (InstanceD _ _ (AppT (AppT (AppT (ConT prods) (ConT nt')) _ ) _) _)+ = nameBase nt == nameBase nt'+isInstanceOf _ _ = False++mkCon :: InstanceDec -> Con+mkCon i+ = case i of+ InstanceD _ [] (AppT (AppT (AppT (ConT _prods) (ConT nt)) (LitT (StrTyLit prdname))) tlist) _+ -> RecC (mkName prdname) (map mkBangPR $ getTList tlist)++mkBangP (_, a) = (Bang NoSourceUnpackedness NoSourceStrictness, ConT a)+mkBangPR (n, a) = (n, Bang NoSourceUnpackedness NoSourceStrictness, ConT a)++getTList :: Type -> [(Name, Name)]+getTList (SigT _ _) = []+getTList (AppT (AppT (PromotedConsT)+ (AppT (AppT (PromotedTupleT 2)+ (LitT (StrTyLit n)))+ (LitT (StrTyLit pos))))+ ts)+ = (mkName n,+ if "Nt_" `isPrefixOf` pos then mkName $ drop 3 pos else mkName pos)+ : getTList ts+getTList _ = []++-- | keeps nt info+getTListNT :: Type -> [(Name, Name)]+getTListNT (SigT _ _) = []+getTListNT (AppT (AppT (PromotedConsT)+ (AppT (AppT (PromotedTupleT 2)+ (LitT (StrTyLit n)))+ (LitT (StrTyLit pos))))+ ts)+ = (mkName n, mkName pos) : getTListNT ts+getTListNT _ = []++-- | like |mkCon| in semantic functions, builds a case+mkClause :: InstanceDec -> Clause+mkClause i+ = case i of+ InstanceD _ [] (AppT (AppT (AppT (ConT _prods)+ (ConT nt))+ (LitT (StrTyLit prdname)))+ tlist) _+ -> Clause [VarP (mkName "asp"),+ ConP (mkName $ prdname) [ VarP a | a <- map fst (getTList tlist)]]+ (NormalB ((AppE (AppE (AppE (VarE $ mkName "knitAspect")+ (VarE $ mkName $ "p_"++ prdname))+ (VarE $ mkName "asp"))+ (toSemRec (getTListNT tlist)))))+ []++toSemRec :: [(Name, Name)] -> Exp+toSemRec+ = foldr mkChSem (VarE (mkName "emptyGenRec"))+ where mkChSem (n,pos) xs+ | "Nt_" `isPrefixOf` nameBase pos =+ (AppE (AppE (VarE $ mkName ".*.")+ (AppE (AppE (VarE $ mkName ".=.")+ (VarE $ mkName $ "ch_" ++ nameBase n))+ (AppE (AppE (VarE $ mkName $ "sem_" ++ (drop 3 $ nameBase pos))+ (VarE $ mkName "asp"))+ (VarE $ n))))+ xs)+ | otherwise =+ (AppE (AppE (VarE $ mkName ".*.")+ (AppE (AppE (VarE $ mkName ".=.")+ (VarE $ mkName $ "ch_" ++ nameBase n))+ (AppE (VarE $ mkName "sem_Lit")+ (VarE $ n))))+ xs)+closeNTs :: [Name] -> Q [Dec]+closeNTs = liftM concat . sequence . map (closeNT)++mkSemFunc :: Name -- nonterm+ -> Q [Dec]+mkSemFunc nt =+ do decs <- getInstances+ let clauses = map mkClause $ filter (isInstanceOf nt) decs+ return [FunD (mkName $ "sem_" ++ drop 3 (nameBase nt)) clauses ]++mkSemFuncs :: [Name] -> Q [Dec]+mkSemFuncs+ = liftM concat . sequence . map (mkSemFunc)+
+ tests/examples/ghc92/proc-do-complex-four-out.hs view
@@ -0,0 +1,63 @@+{-# LANGUAGE Arrows #-}++foo+ f+ g+ h+ ma =+ proc+ ( (a, b)+ , (c, d)+ , (e, f)+ )+ -> do+ -- Begin do+ (x, y) <- -- GHC parser fails if layed out over multiple lines+ f -- Call into f+ ( a+ , c -- Tuple together arguments+ )+ ( b+ , d+ )+ -<+ ( b + 1 -- Funnel into arrow+ , d * b+ )+ if x `mod` y == 0 -- Basic condition+ then case e of -- Only left case is relevant+ Left+ ( z+ , w+ ) -> \u -> -- Procs can have lambdas+ let v =+ u -- Actually never used+ ^ 2+ in ( returnA+ -<+ -- Just do the calculation+ (x + y * z)+ )+ else do+ let u = x -- Let bindings bind expressions, not commands+ -- Could pattern match directly on x+ i <- case u of+ 0 -> (g . h -< u)+ n ->+ ( ( h . g+ -<+ y -- First actual use of y+ )+ )+ returnA -< ()+ -- Sometimes execute effects+ if i > 0+ then ma -< ()+ else returnA -< ()+ returnA+ -<+ ( i+ + x+ * y -- Just do the calculation+ )+
+ tests/examples/ghc92/proc-do-complex-out.hs view
@@ -0,0 +1,63 @@+{-# LANGUAGE Arrows #-}++foo+ f+ g+ h+ ma =+ proc+ ( (a, b),+ (c, d),+ (e, f)+ )+ -> do+ -- Begin do+ (x, y) <- -- GHC parser fails if layed out over multiple lines+ f -- Call into f+ ( a,+ c -- Tuple together arguments+ )+ ( b,+ d+ )+ -<+ ( b + 1, -- Funnel into arrow+ d * b+ )+ if x `mod` y == 0 -- Basic condition+ then case e of -- Only left case is relevant+ Left+ ( z,+ w+ ) -> \u -> -- Procs can have lambdas+ let v =+ u -- Actually never used+ ^ 2+ in ( returnA+ -<+ -- Just do the calculation+ (x + y * z)+ )+ else do+ let u = x -- Let bindings bind expressions, not commands+ -- Could pattern match directly on x+ i <- case u of+ 0 -> (g . h -< u)+ n ->+ ( ( h . g+ -<+ y -- First actual use of y+ )+ )+ returnA -< ()+ -- Sometimes execute effects+ if i > 0+ then ma -< ()+ else returnA -< ()+ returnA+ -<+ ( i+ + x+ * y -- Just do the calculation+ )+
+ tests/examples/ghc92/proc-do-complex.hs view
@@ -0,0 +1,50 @@+{-# LANGUAGE Arrows #-}+foo+ f+ g+ h+ ma = proc (+ (a, b),+ (c, d),+ (e, f)+ ) ->+ do -- Begin do+ (x,y) -- GHC parser fails if layed out over multiple lines+ <- f -- Call into f+ (a,+ c) -- Tuple together arguments+ (b,+ d)+ -< (b + 1, -- Funnel into arrow+ d * b)+ if+ x `mod` y == 0 -- Basic condition+ then case e -- Only left case is relevant+ of Left (z,+ w) -> \u -> -- Procs can have lambdas+ let+ v+ = u -- Actually never used+ ^ 2+ in+ (returnA+ -< -- Just do the calculation+ (x + y * z))+ else do+ let u = x -- Let bindings bind expressions, not commands+ -- Could pattern match directly on x+ i <- case u of+ 0 -> (g . h -< u)+ n -> (+ (h . g+ -< y) -- First actual use of y+ )+ returnA -< ()+ -- Sometimes execute effects+ if i > 0+ then ma -< ()+ else returnA -< ()+ returnA -< (i ++ x *+ y) -- Just do the calculation+
+ tests/examples/ghc92/proc-lets-out.hs view
@@ -0,0 +1,13 @@+{-# LANGUAGE Arrows #-}++foo f = proc a -> let b = a in f -< b++bar f g = proc a ->+ let h =+ f+ . g a+ j =+ g+ . h+ in id -< (h, j)+
+ tests/examples/ghc92/proc-lets.hs view
@@ -0,0 +1,15 @@+{-# LANGUAGE Arrows #-}++foo f = proc a -> let b = a in f -< b++bar f g = proc a ->+ let+ h+ = f+ . g a+ j = g+ .+ h+ in+ id -< (h, j)+
tests/examples/transform/AddLocalDecl1.hs view
@@ -2,8 +2,12 @@ -- |This is a function foo = x -- comment1+-- trailing 1 -- |Another fun x = a -- comment2 where a = 3+-- trailing 2++y = 3
tests/examples/transform/AddLocalDecl1.hs.expected view
@@ -4,8 +4,12 @@ foo = x -- comment1 where nn = 2+-- trailing 1 -- |Another fun x = a -- comment2 where a = 3+-- trailing 2++y = 3
tests/examples/transform/LocalDecls2.hs.expected view
@@ -4,3 +4,5 @@ where nn :: Int nn = 2++
tests/examples/transform/WhereIn3a.hs.expected view
@@ -1,11 +1,5 @@ module WhereIn3a where --- A leading comment-anotherFun 0 y = sq y- where sq x = x^2-sq pow 0 = 0 -- prior comment-sq pow z = z^pow --there is a comment- --A definition can be demoted to the local 'where' binding of a friend declaration, --if it is only used by this friend declaration.