packages feed

wxdirect-0.91.0.0: src/CompileClassTypes.hs

-----------------------------------------------------------------------------------------
{-| Module      :  CompileClassTypes
    Copyright   :  (c) Daan Leijen 2003, 2004
    License     :  BSD-style

    Maintainer  :  wxhaskell-devel@lists.sourceforge.net
    Stability   :  provisional
    Portability :  portable

    Module that compiles classes to class type definitions to Haskell.
-}
-----------------------------------------------------------------------------------------
module CompileClassTypes( compileClassTypes ) where

import qualified Data.Map as Map

-- import Data.Time( getCurrentTime)
-- import Types
import HaskellNames
import Classes( {-isClassName,-} haskellClassDefs )
import DeriveTypes( ClassName )
import IOExtra

{-----------------------------------------------------------------------------------------
  Compile
-----------------------------------------------------------------------------------------}
compileClassTypes :: Bool -> String -> String -> FilePath -> [FilePath] -> IO ()
compileClassTypes _showIgnore moduleRoot moduleName outputFile inputFiles
  = do -- time    <- getCurrentTime
       let (exportsClass,classDecls) = haskellClassDefs
           exportsClassClasses       = exportDefs exportsClass 

           classCount   = length exportsClass
           
           export   = concat  [ ["module " ++ moduleRoot ++ moduleName
                                , "    ( -- * Classes" ]
                              , exportsClassClasses
                              , [ "    ) where"
                                , ""
                                , "import " ++ moduleRoot ++ "WxcObject"
                                , "" ]
                              ]

           prologue = getPrologue moduleName "class"
                                   (show classCount ++ " class definitions.")
                                   inputFiles
           output = unlines (prologue ++ export ++ classDecls)

       putStrLn ("generating: " ++ outputFile)
       writeFileLazy outputFile output
       putStrLn ("generated " ++ show classCount ++ " class definitions.")
       putStrLn ("ok.")


{-----------------------------------------------------------------------------------------
   Create export definitions
-----------------------------------------------------------------------------------------}
exportDefs :: [(ClassName,[String])] -> [String]
exportDefs classExports 
  = let classMap = Map.fromListWith (++) classExports         
    in  concatMap exportDef $ zip [(0 :: Int)..] (Map.toAscList classMap)
  where
    exportDef (n, (className,exports))
      = [heading 2 className] ++ (commaSep n) exports

    commaSep n xs
      = zipWith (exportComma n) [(0 :: Int)..] xs

    heading i name
      = exportSpaces ++ "-- " ++ replicate i '*' ++ " " ++ name

    exportComma n m str = exportSpaces ++ (if n == 0 && m == 0 then " " else ",") ++ str
    exportSpaces = "     "