TYB-0.2.0: util/makeVarSet.hs
{-# LANGUAGE TemplateHaskell #-}
import Data.Generics.TH
import Data.String.Utils
import Language.Haskell.TH
import System.Exit
import qualified Data.Set as Set
-- This program generates the Data.Generics.TH.VarSet module
-- when this module compiles. It is not intended to be run.
-- The reason is that Template Haskell can't "reify" under the IO
-- monad. Thus we need to be running under GHC's typechecker monad.
-- That happens only at compile time.
accVarRef :: Exp -> Set.Set Name -> Set.Set Name
accVarRef = undefined
$(do e <- [d|varSet e = $(everythingForL 'accVarRef [t| Exp |]) e Set.empty|]
let fileName = "Data/Generics/TH/VarSet.hs"
runIO $ writeFile fileName $
"-- Do not edit. This file is generated by \"util/makeVarSet.hs\".\n" ++
"{-# OPTIONS_GHC -W -Wall #-}\n" ++
"module Data.Generics.TH.VarSet (varSet) where\n" ++
"import Language.Haskell.TH.Syntax\n" ++
"import GHC.Base\n" ++
"import qualified Data.Set as Set\n" ++
"import qualified Data.Maybe\n" ++
"accVarRef :: Exp -> Set.Set Name -> Set.Set Name\n" ++
"accVarRef (VarE n) set = Set.insert n set\n" ++
"accVarRef _ set = set\n" ++
"varSet :: Exp -> Set.Set Name\n" ++
(replace "GHC.Tuple." "" $
replace "GHC.Types." "" $
replace "Main." "" $
replace "Data.Set." "Set." $
(pprint e)) ++
"\n"
runIO $ putStrLn $ "Generated " ++ fileName
return [] {- Return an empty set of declarations. -})
main = putStrLn "Error: this program is intended to be compiled but not run" >> exitFailure