Safe Haskell | None |
---|
GHC.Syb.Utils provides common utilities for the Ghc Api, either based on Data/Typeable or for use with Data.Generics over Ghc Api types.
example output of showData
on parsedSource
, renamedSource
, and
typecheckedSource
for a trivial HelloWorld
module, compared with
ppr
output:
------------------------- pretty-printed parsedSource module HelloWorld where main = putStrLn Hello, World! ------------------------- pretty-printed renamedSource Just (HelloWorld.main = System.IO.putStrLn Hello, World!, [import Prelude], Nothing, Nothing, (HaddockModInfo (Nothing) (Nothing) (Nothing) (Nothing))) ------------------------- pretty-printed typecheckedSource Just <AbsBinds [] [] [HelloWorld.main <= [] main] HelloWorld.main :: GHC.IOBase.IO () [] { main = System.IO.putStrLn Hello, World! }> ------------------------- shown parsedSource (L {HelloWorld.hs:1:0} (HsModule (Just (L {HelloWorld.hs:1:7-16} {ModuleName: HelloWorld})) (Nothing) [] [ (L {HelloWorld.hs:2:0-30} (ValD (FunBind (L {HelloWorld.hs:2:0-3} (Unqual {OccName: main})) (False) (MatchGroup [ (L {HelloWorld.hs:2:0-30} (Match [] (Nothing) (GRHSs [ (L {HelloWorld.hs:2:7-30} (GRHS [] (L {HelloWorld.hs:2:7-30} (HsApp (L {HelloWorld.hs:2:7-14} (HsVar (Unqual {OccName: putStrLn}))) (L {HelloWorld.hs:2:16-30} (HsLit (HsString {FastString: Hello, World!})))))))] (EmptyLocalBinds))))] {!type placeholder here?!}) (WpHole) {!NameSet placeholder here!} (Nothing))))] (Nothing) (HaddockModInfo (Nothing) (Nothing) (Nothing) (Nothing)) (Nothing))) ------------------------- shown renamedSource ((,,,,) (HsGroup (ValBindsOut [ ((,) (NonRecursive) {Bag(Located (HsBind Name)): [ (L {HelloWorld.hs:2:0-30} (FunBind (L {HelloWorld.hs:2:0-3} {Name: HelloWorld.main}) (False) (MatchGroup [ (L {HelloWorld.hs:2:0-30} (Match [] (Nothing) (GRHSs [ (L {HelloWorld.hs:2:7-30} (GRHS [] (L {HelloWorld.hs:2:7-30} (HsApp (L {HelloWorld.hs:2:7-14} (HsVar {Name: System.IO.putStrLn})) (L {HelloWorld.hs:2:16-30} (HsLit (HsString {FastString: Hello, World!})))))))] (EmptyLocalBinds))))] {!type placeholder here?!}) (WpHole) {NameSet: [{Name: System.IO.putStrLn}]} (Nothing)))]})] []) [] [] [] [] [] [] [] [] []) [ (L {Implicit import declaration} (ImportDecl (L {Implicit import declaration} {ModuleName: Prelude}) (False) (False) (Nothing) (Nothing)))] (Nothing) (Nothing) (HaddockModInfo (Nothing) (Nothing) (Nothing) (Nothing))) ------------------------- shown typecheckedSource {Bag(Located (HsBind Var)): [ (L {HelloWorld.hs:2:0-30} (AbsBinds [] [] [ ((,,,) [] {Var: HelloWorld.main} {Var: main} [])] {Bag(Located (HsBind Var)): [ (L {HelloWorld.hs:2:0-30} (FunBind (L {HelloWorld.hs:2:0-3} {Var: main}) (False) (MatchGroup [ (L {HelloWorld.hs:2:0-30} (Match [] (Nothing) (GRHSs [ (L {HelloWorld.hs:2:7-30} (GRHS [] (L {HelloWorld.hs:2:7-30} (HsApp (L {HelloWorld.hs:2:7-14} (HsVar {Var: System.IO.putStrLn})) (L {HelloWorld.hs:2:16-30} (HsLit (HsString {FastString: Hello, World!})))))))] (EmptyLocalBinds))))] GHC.IOBase.IO ()) (WpHole) {!NameSet placeholder here!} (Nothing)))]}))]}
Documentation
Ghc Ast types tend to have undefined holes, to be filled by later compiler phases. We tag Asts with their source, so that we can avoid such holes based on who generated the Asts.
everythingStaged :: Stage -> (r -> r -> r) -> r -> GenericQ r -> GenericQ rSource
Like everything
, but avoid known potholes, based on the Stage
that
generated the Ast.