Allowed the different instances for the Polyplate classes to be written out to separate files (to help GHC's memory usage down a bit)

This commit is contained in:
Neil Brown 2008-12-14 15:37:05 +00:00
parent cd9b8462b4
commit 263dfd6fd3
3 changed files with 45 additions and 14 deletions

View File

@ -111,7 +111,10 @@ config/Paths.hs: config/Paths.hs.in
| sed -e 's,@@tocklibdir@@,$(TOCKLIBDIR),g' >config/Paths.hs
data/NavAST.hs: GenNavAST$(EXEEXT)
./GenNavAST$(EXEEXT) > data/NavAST.hs
./GenNavAST$(EXEEXT) data/NavAST.hs data/NavASTSpine.hs
data/NavASTSpine.hs: GenNavAST$(EXEEXT)
./GenNavAST$(EXEEXT) data/NavAST.hs data/NavASTSpine.hs
data/OrdAST.hs: GenOrdAST$(EXEEXT)
./GenOrdAST$(EXEEXT) > data/OrdAST.hs
@ -124,6 +127,7 @@ config_sources += config/Paths.hs
config_sources += config/TypeSizes.hs
BUILT_SOURCES = data/NavAST.hs
BUILT_SOURCES += data/NavASTSpine.hs
BUILT_SOURCES += data/OrdAST.hs
BUILT_SOURCES += data/TagAST.hs
BUILT_SOURCES += frontends/LexOccam.hs

View File

@ -19,7 +19,7 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
module Data.Generics.Polyplate.GenInstances
(GenOverlappedOption(..), GenClassOption(..),
GenInstance, genInstance, genMapInstance, genSetInstance, genInstances,
writeInstances, writeInstancesTo) where
writeInstances, writeInstancesTo, writeInstancesToSep) where
import Control.Monad.State
import Data.Char
@ -597,28 +597,40 @@ spineInstancesFrom genOverlapped genClass boxes w
-- | Generates all the given instances (eliminating any duplicates)
-- with the given options.
genInstances :: GenOverlappedOption -> GenClassOption -> [GenInstance] -> IO [String]
genInstances :: GenOverlappedOption -> GenClassOption -> [GenInstance] ->
IO ([String], [String])
genInstances op1 op2 insts
= do typeMap <- flip execStateT Map.empty (sequence [g | GenInstance g <- insts])
liftM concat $ sequence [liftM2 (++)
(instancesFrom op1 op2 (justBoxes typeMap) w)
(spineInstancesFrom op1 op2 (justBoxes typeMap) w)
let (inst, spineInst) = unzip [
(instancesFrom op1 op2 (justBoxes typeMap) w
,spineInstancesFrom op1 op2 (justBoxes typeMap) w)
| DataBox w <- map witness $ justBoxes typeMap]
inst' <- sequence inst
spineInst' <- sequence spineInst
return (concat inst', concat spineInst')
-- | Generates the instances according to the options and writes it to stdout with
-- the given header.
writeInstances :: GenOverlappedOption -> GenClassOption -> [GenInstance] -> [String] -> IO ()
writeInstances op1 op2 inst header
= do instLines <- genInstances op1 op2 inst
putStr (unlines (header ++ instLines))
= do (instLines, spineInstLines) <- genInstances op1 op2 inst
putStr (unlines (header ++ instLines ++ spineInstLines))
-- | Generates the instances according to the options and writes it to stdout with
-- the given header.
writeInstancesToSep :: GenOverlappedOption -> GenClassOption -> [GenInstance] -> ([String],
[String]) -> (FilePath, FilePath) -> IO ()
writeInstancesToSep op1 op2 inst (header1, header2) (fileName1, fileName2)
= do (instLines, spineInstLines) <- genInstances op1 op2 inst
writeFile fileName1 (unlines (header1 ++ instLines))
writeFile fileName2 (unlines (header2 ++ spineInstLines))
-- | Generates the instances according to the options and writes it to a file with
-- the given header.
writeInstancesTo :: GenOverlappedOption -> GenClassOption -> [GenInstance] -> [String]
-> FilePath -> IO ()
writeInstancesTo op1 op2 inst header fileName
= do instLines <- genInstances op1 op2 inst
writeFile fileName (unlines (header ++ instLines))
= do (instLines, spineInstLines) <- genInstances op1 op2 inst
writeFile fileName (unlines (header ++ instLines ++ spineInstLines))
--{{{ Various SYB-based functions that we don't export, for discovering contained types:

View File

@ -19,6 +19,9 @@ with this program. If not, see <http://www.gnu.org/licenses/>.
-- | Utilities for metaprogramming.
module GenNavAST where
import Data.List
import System.Environment
import Data.Generics.Polyplate.GenInstances
import qualified AST
@ -148,8 +151,9 @@ instancesFrom w
= " transformM (_, rest) ops b v = transformM rest ops b v"
main :: IO ()
main
= writeInstances GenWithoutOverlapped GenClassPerType
main = do
[instFileName, spineInstFileName] <- getArgs
writeInstancesToSep GenWithoutOverlapped GenClassPerType
[ genInstance (undefined :: AST.AST)
, genInstance (undefined :: CompState.CompState)
-- All the maps that are in CompState:
@ -163,9 +167,19 @@ main
, genSetInstance (undefined :: String)
, genSetInstance (undefined :: AST.Name)
]
(header False (findModuleName instFileName), header True (findModuleName spineInstFileName))
(instFileName, spineInstFileName)
where
findModuleName moduleFileName
| not (".hs" `isSuffixOf` moduleFileName)
= error "file name does not end in .hs"
| otherwise
= (reverse . takeWhile (/= '/') . drop 3 . reverse) $ moduleFileName
header useTree moduleName =
["{-# OPTIONS_GHC -Werror -fwarn-overlapping-patterns -fwarn-unused-matches -fwarn-unused-binds -fwarn-incomplete-patterns #-}"
,"-- | This module is auto-generated by Polyplate. DO NOT EDIT."
,"module NavAST where"
,"module " ++ moduleName ++ " where"
,""
,"import Data.Generics.Polyplate"
,""
@ -173,6 +187,7 @@ main
,"import qualified Data.Map as Map"
,"import Data.Set (Set)"
,"import qualified Data.Set as Set"
,if useTree then "import Data.Tree" else ""
,""
,"import qualified AST"
,"import qualified CompState"