From: <cod...@go...> - 2008-09-25 23:36:24
|
Author: wol...@gm... Date: Thu Sep 25 16:35:43 2008 New Revision: 312 Modified: trunk/hoc/InterfaceGenerator2/BindingScript.hs trunk/hoc/InterfaceGenerator2/BuildEntities.hs trunk/hoc/InterfaceGenerator2/DependenceGraphs.hs trunk/hoc/InterfaceGenerator2/DuplicateEntities.hs trunk/hoc/InterfaceGenerator2/Entities.hs trunk/hoc/InterfaceGenerator2/Files.hs trunk/hoc/InterfaceGenerator2/HackEnumNames.hs trunk/hoc/InterfaceGenerator2/Main.hs trunk/hoc/InterfaceGenerator2/Messages.hs trunk/hoc/InterfaceGenerator2/Output.hs trunk/hoc/InterfaceGenerator2/Preprocessor.hs trunk/hoc/InterfaceGenerator2/ResolveAndZap.hs Log: Some general cleanup. Modified: trunk/hoc/InterfaceGenerator2/BindingScript.hs ============================================================================== --- trunk/hoc/InterfaceGenerator2/BindingScript.hs (original) +++ trunk/hoc/InterfaceGenerator2/BindingScript.hs Thu Sep 25 16:35:43 2008 @@ -38,7 +38,8 @@ soHiddenSelectors :: Set String, soChangedSelectors :: Map.Map String Selector } - + +emptyBindingScript :: BindingScript emptyBindingScript = BindingScript { bsHiddenFromPrelude = Set.empty, @@ -52,7 +53,8 @@ bsAdditionalTypes = [], bsClassSpecificOptions = Map.empty } - + +defaultNameMappings :: Map.Map String String defaultNameMappings = Map.fromList [ ("data", "data'"), ("type", "type'"), @@ -78,8 +80,10 @@ where top = bsTopLevelOptions bindingScript +tokenParser :: TokenParser () tokenParser = makeTokenParser $ haskellStyle { identStart = letter <|> char '_' } +selector, qualified :: TokenParser () -> Parser String selector tp = lexeme tp $ do c <- letter <|> char '_' s <- many (alphaNum <|> oneOf "_:") @@ -163,6 +167,7 @@ eof let wrongThings = [ () | ReplaceSelector _ <- statements ] + when (not $ null wrongThings) $ fail "illegal thing at top level" return $ BindingScript { bsHiddenFromPrelude = Set.fromList [ ident | HidePrelude ident <- statements ], Modified: trunk/hoc/InterfaceGenerator2/BuildEntities.hs ============================================================================== --- trunk/hoc/InterfaceGenerator2/BuildEntities.hs (original) +++ trunk/hoc/InterfaceGenerator2/BuildEntities.hs Thu Sep 25 16:35:43 2008 @@ -43,6 +43,7 @@ makeEntities :: BindingScript -> [HeaderInfo] -> EntityPile -> EntityPile +assertHaskellTypeName :: BS.ByteString -> BS.ByteString assertHaskellTypeName xs | not (BS.null xs) && isUpper x && BS.all (\c -> isAlphaNum c || c `elem` "_'") xs @@ -86,7 +87,7 @@ -- Workaround: If there is both an instance method and a class method of the -- same name, don't use covariant. - makeSelectorEntity factory modName clsID clsName sel + makeSelectorEntity factory modName _clsID clsName sel = if hidden then return Nothing else do @@ -132,11 +133,11 @@ = makeSelectorEntity False modName clsID clsName sel makeEntitiesForSelectorListItem modName clsID clsName (ClassMethod sel) = makeSelectorEntity True modName clsID clsName sel - makeEntitiesForSelectorListItem modName clsID clsName (LocalDecl decl) + makeEntitiesForSelectorListItem modName _clsID _clsName (LocalDecl decl) = makeEntity modName decl >> return Nothing - makeEntitiesForSelectorListItem modName clsID clsName PropertyDecl + makeEntitiesForSelectorListItem _modName _clsID _clsName PropertyDecl = return Nothing - makeEntitiesForSelectorListItem modName clsID clsName (Required _) + makeEntitiesForSelectorListItem _modName _clsID _clsName (Required _) = return Nothing makeSelectorEntities modName clsID clsName items @@ -203,11 +204,11 @@ eModule = LocalModule modName } ) >> return () - makeEntity modName (Typedef (CTStruct n2 fields) name) + makeEntity _modName (Typedef (CTStruct _n2 _fields) _name) = return () - makeEntity modName (Typedef (CTUnion n2 fields) name) + makeEntity _modName (Typedef (CTUnion _n2 _fields) _name) = return () - makeEntity modName (Typedef (CTEnum n2 vals) name) + makeEntity modName (Typedef (CTEnum _n2 vals) name) | notHidden name = makeEnum name modName vals -- makeAnonymousEnum modName vals -- ### HACK for 10.5: ignore enum names @@ -250,7 +251,7 @@ return () where name = selName sel - makeEntity modName _ = return () + makeEntity _modName _ = return () convertEnumEntities :: [(String, EnumValue)] -> (Bool, [(BS.ByteString, Integer)]) Modified: trunk/hoc/InterfaceGenerator2/DependenceGraphs.hs ============================================================================== --- trunk/hoc/InterfaceGenerator2/DependenceGraphs.hs (original) +++ trunk/hoc/InterfaceGenerator2/DependenceGraphs.hs Thu Sep 25 16:35:43 2008 @@ -1,9 +1,10 @@ module DependenceGraphs( - entitiesRequiredByEntity, RGr, - makeEntityGraph, + -- used by DuplicateEntities: + makeModuleDAG, + -- used by Output & Main: + entitiesRequiredByEntity, makeModuleGraph, - makeModuleDAG, topsortEntities, minimizeSourceImports, isSourceImport @@ -25,28 +26,6 @@ = mentionedEntityIDs e type RGr a b = (Gr a b, Map.Map a Node) - -makeEntityGraph :: EntityPile -> RGr EntityID Bool -makeEntityGraph entityPile - = (gr, entityToNode) - where - entities = localEntities entityPile - entityToNode = Map.fromList $ zip (Map.keys entities) [1..] - gr = mkGraph (zip [1..] (Map.keys entities)) $ - do {- list -} - (fromEntityID, e) <- Map.toList entities - let from = entityToNode Map.! fromEntityID - weak = case eInfo e of - ProtocolEntity _ _ -> True - _ -> False - toEntityID <- entitiesRequiredByEntity e - - case toEntityID of - LocalEntity _ -> - return (from, entityToNode Map.! toEntityID, - weak) - FrameworkEntity _ _ -> - [] makeModuleGraph :: EntityPile -> RGr Module Bool makeModuleGraph entityPile Modified: trunk/hoc/InterfaceGenerator2/DuplicateEntities.hs ============================================================================== --- trunk/hoc/InterfaceGenerator2/DuplicateEntities.hs (original) +++ trunk/hoc/InterfaceGenerator2/DuplicateEntities.hs Thu Sep 25 16:35:43 2008 @@ -61,6 +61,7 @@ redirect eid = fromMaybe eid $ Map.lookup eid remappings +combineDulicateEntities :: EntityPile -> EntityPile combineDulicateEntities entityPile = resolve entityPile where Modified: trunk/hoc/InterfaceGenerator2/Entities.hs ============================================================================== --- trunk/hoc/InterfaceGenerator2/Entities.hs (original) +++ trunk/hoc/InterfaceGenerator2/Entities.hs Thu Sep 25 16:35:43 2008 @@ -95,7 +95,7 @@ addImportedEntities :: ModuleName -> EntityMap -> EntityPile -> EntityPile -addImportedEntities mod entities pile +addImportedEntities _mod entities pile = pile { epFrameworkEntities = entities `Map.union` epFrameworkEntities pile } newEntity :: MonadState EntityPile m => Entity -> m EntityID @@ -147,33 +147,15 @@ transformLocalEntities :: (EntityMap -> EntityMap) -> EntityPile -> EntityPile -{-transformLocalEntities f (EntityPile entities nextID) - = EntityPile (fwEntities `Map.union` localEntities') nextID - where - (fwEntities, localEntities) - = Map.partitionWithKey isFramework entities - localEntities' = f localEntities - - isFramework (FrameworkEntity _ _) _ = True - isFramework _ _ = False-} transformLocalEntities f pile = pile { epEntities = f (epEntities pile) } --- transformLocalEntities f = f -localEntities :: EntityPile -> EntityMap -{- -localEntities = Map.filterWithKey notFramework . epEntities - where - notFramework (FrameworkEntity _ _) _ = False - notFramework _ _ = True --} +localEntities, frameworkEntities :: EntityPile -> EntityMap localEntities = epEntities frameworkEntities = epFrameworkEntities replaceLocalEntities :: EntityMap -> EntityPile -> EntityPile replaceLocalEntities locals = transformLocalEntities (const locals) --- localEntityPile :: EntityPile -> EntityPile --- localEntityPile pile = EntityPile (localEntities pile) (epNextID pile) - +reportProgressForPile :: ProgressReporter -> EntityPile -> EntityPile reportProgressForPile pr = transformLocalEntities (reportProgressForMap pr) Modified: trunk/hoc/InterfaceGenerator2/Files.hs ============================================================================== --- trunk/hoc/InterfaceGenerator2/Files.hs (original) +++ trunk/hoc/InterfaceGenerator2/Files.hs Thu Sep 25 16:35:43 2008 @@ -1,10 +1,6 @@ module Files( - additionalCodePath, - outputPath, writeFileIfChanged, - readFileOrEmpty, createDirectoryIfNecessary, - createOutputDirectories, createParentDirectoriesIfNecessary ) where @@ -14,11 +10,7 @@ doesFileExist, createDirectory) -outputDir = "ifgen-output" -outputPath f = outputDir ++ "/" ++ f - -additionalCodePath f = "AdditionalCode/" ++ f - +writeFileIfChanged :: FilePath -> String -> IO () writeFileIfChanged fn text = do exists <- doesFileExist fn if exists @@ -29,10 +21,12 @@ writeFile fn text else writeFile fn text +createDirectoryIfNecessary :: FilePath -> IO () createDirectoryIfNecessary dir = do exists <- doesDirectoryExist dir unless exists $ createDirectory dir +createParentDirectoriesIfNecessary :: FilePath -> IO () createParentDirectoriesIfNecessary f = work (dropWhile (/= '/') $ reverse f) where @@ -41,16 +35,3 @@ work fr = do work $ dropWhile (/='/') fr createDirectoryIfNecessary (reverse fr) - -createOutputDirectories frameworks = do - createDirectoryIfNecessary outputDir - mapM_ createDirectoryIfNecessary (map outputPath frameworks) - -readFileOrEmpty fn = do - exists <- doesFileExist fn - if exists - then do - contents <- readFile fn - return $ Just contents - else do - return Nothing Modified: trunk/hoc/InterfaceGenerator2/HackEnumNames.hs ============================================================================== --- trunk/hoc/InterfaceGenerator2/HackEnumNames.hs (original) +++ trunk/hoc/InterfaceGenerator2/HackEnumNames.hs Thu Sep 25 16:35:43 2008 @@ -4,6 +4,8 @@ import SyntaxTree import Headers +hackEnumNames :: HeaderInfo -> HeaderInfo + hackEnumNames (HeaderInfo name imports decls) = HeaderInfo name imports (hackEnums1 Just id decls) where Modified: trunk/hoc/InterfaceGenerator2/Main.hs ============================================================================== --- trunk/hoc/InterfaceGenerator2/Main.hs (original) +++ trunk/hoc/InterfaceGenerator2/Main.hs Thu Sep 25 16:35:43 2008 @@ -1,27 +1,23 @@ {-# LANGUAGE CPP #-} module Main where -import Headers +import qualified Data.ByteString.Char8 as BS import qualified Data.Map as Map import qualified Data.Set as Set -import Control.Monad.Writer -import BindingScript -import Data.Char -import Data.Maybe --- import Data.Generics +import Data.Maybe ( fromMaybe ) +import Control.Monad ( when ) import System.IO +import System.Environment ( getArgs ) +import System.Console.GetOpt +import Control.Exception ( finally ) import Messages import Entities --- import Traversals +import BindingScript import Files import Progress -import qualified Data.ByteString.Char8 as BS -import System.Environment -import System.Console.GetOpt -import Control.Exception #ifdef BINARY_INTERFACES import Data.Binary ( encodeFile, decode ) @@ -29,26 +25,23 @@ import qualified Data.ByteString.Lazy as LBS #endif -import HackEnumNames -import BuildEntities + +import Headers -- (on disk) -> [HeaderInfo] +import HackEnumNames -- HeaderInfo -> HeaderInfo +import BuildEntities -- [HeaderInfo] -> EntityPile + + -- EntityPile -> EntityPile passes import ResolveAndZap -import DependenceGraphs import ShuffleInstances import DuplicateEntities -import Output - -textInterfaces = False -- Overall 3 times faster with binary - -{-deepEvaluatePile = mapM_ deepEvaluateEntity . Map.elems . localEntities -evalWithProgress str pile - = runShowingProgress str $ - \progress -> deepEvaluatePile $ reportProgressForPile progress $ pile --} +import DependenceGraphs +import Output instance Monitorable EntityPile where monitor pr = transformLocalEntities (monitor pr) +writeFrameworkModules :: ProgressReporter -> EntityPile -> FilePath -> IO () writeFrameworkModules progress entityPile path = do let byModule = makeEntityPileLocalMultiIndex eModule $ @@ -62,8 +55,8 @@ modGraph = minimizeSourceImports $ makeModuleGraph entityPile - flip mapM_ (zip [0..] $ Map.toList byModule) $ - \(index, (mod, entityID)) -> do + flip mapM_ (Map.toList byModule) $ + \(mod, entityID) -> do case mod of FrameworkModule _ _ -> return () LocalModule modName -> do @@ -76,6 +69,7 @@ show $ pprHsModule entityPile modGraph modName entities reportProgress progress nModules +readFileWithProgress :: ProgressReporter -> FilePath -> IO String readFileWithProgress progress fn = do bs <- BS.readFile fn @@ -83,6 +77,7 @@ return $ monitorList progress n $ BS.unpack bs #ifdef BINARY_INTERFACES +decodeFileWithProgress :: ProgressReporter -> FilePath -> IO EntityMap decodeFileWithProgress progress fn = do bs <- fmap LBS.toChunks $ LBS.readFile fn @@ -90,6 +85,7 @@ return $ decode $ LBS.fromChunks $ monitorList progress n $ bs #endif +readInterfaceFileWithProgress :: ProgressReporter -> FilePath -> IO EntityMap readInterfaceFileWithProgress progress fn #ifdef BINARY_INTERFACES = decodeFileWithProgress progress fn @@ -97,6 +93,7 @@ = fmap read $ readFileWithProgress progress fn #endif +writeInterfaceFileWithProgress :: ProgressReporter -> FilePath -> EntityPile -> IO () writeInterfaceFileWithProgress progress fn entities #ifdef BINARY_INTERFACES = encodeFile fn $ @@ -122,6 +119,7 @@ oQuiet :: Bool } +processFramework :: Options -> IO () processFramework options -- bs frameworkName requiredFrameworks = do bs <- maybe (return emptyBindingScript) readBindingScript $ @@ -232,12 +230,14 @@ putStrLn $ "done." - +addRequiredFramework :: String -> Options -> Options addRequiredFramework fw o = o { oRequiredFrameworks = fw : oRequiredFrameworks o } +addHeaderDirectory :: HeaderDirectory -> Options -> Options addHeaderDirectory hd o = o { oHeaderDirectories = hd : oHeaderDirectories o } - + +optionDescs :: [OptDescr (Options -> Options)] optionDescs = [ Option ['d'] ["depend"] (ReqArg addRequiredFramework @@ -279,6 +279,8 @@ (NoArg (\o -> o { oQuiet = True })) "don't report progress" ] + +main :: IO () main = do args <- getArgs case getOpt Permute optionDescs args of Modified: trunk/hoc/InterfaceGenerator2/Messages.hs ============================================================================== --- trunk/hoc/InterfaceGenerator2/Messages.hs (original) +++ trunk/hoc/InterfaceGenerator2/Messages.hs Thu Sep 25 16:35:43 2008 @@ -18,9 +18,6 @@ helper (UnitBag x) xs = x : xs helper (BagOfTwo a b) xs = helper a $ helper b xs -nullBag EmptyBag = True -nullBag _ = False - instance Monoid (Bag a) where mempty = EmptyBag mappend EmptyBag b = b Modified: trunk/hoc/InterfaceGenerator2/Output.hs ============================================================================== --- trunk/hoc/InterfaceGenerator2/Output.hs (original) +++ trunk/hoc/InterfaceGenerator2/Output.hs Thu Sep 25 16:35:43 2008 @@ -204,14 +204,14 @@ pprEntity e@(Entity { eInfo = EnumEntity complete constants }) = char '$' <> parens ( declare <+> brackets ( - hcat $ punctuate comma $ map pprAssoc constants - ) + hcat $ punctuate comma $ map pprAssoc constants + ) ) - where + where declare = case eName e of CName cname -> text "declareCEnum" <+> doubleQuotes (textBS cname) Anonymous -> text "declareAnonymousCEnum" - pprAssoc (n, v) + pprAssoc (n, v) = parens (doubleQuotes (textBS n) <> comma <+> integer v) pprEntity e@(Entity { eInfo = AdditionalCodeEntity _ _ _ txt }) Modified: trunk/hoc/InterfaceGenerator2/Preprocessor.hs ============================================================================== --- trunk/hoc/InterfaceGenerator2/Preprocessor.hs (original) +++ trunk/hoc/InterfaceGenerator2/Preprocessor.hs Thu Sep 25 16:35:43 2008 @@ -107,10 +107,6 @@ execute filename xs = unlines $ evalState (exec xs []) macros where exec (If e : xs) state@( (_, False) : _ ) = output "//#if" $ exec xs ((PPSIf False, False) : state) --- exec (Elif e : xs) state@( (PPSIf False, False) : (_, False) : _ ) --- = output "//#elif" $ exec xs state --- exec (Else : xs) state@( (_, False) : _ ) --- = output "//#else" $ exec xs ((PPSElse, False) : state) exec (Text t : xs) state@( (_, False) : _ ) = output ("//T " ++ t) $ exec xs state exec (Endif : xs) (_ : state) @@ -139,16 +135,6 @@ return (t : moreText) -test = putStrLn $ execute "test" $ parseDirectives - "#include <foo>\n\ - \blah\n\ - \foo bar\n\ - \#if 1\n\ - \baz\n\ - \#else\n\ - \quux\n\ - \#endif\n" - unblockComments ('/' : '*' : xs) = "/*" ++ handleComment xs where handleComment ('*' : '/' : xs) = "*/" ++ unblockComments xs handleComment ('\n' : xs) = "*/\n/*" ++ handleComment xs @@ -159,7 +145,20 @@ parseDirectives = map (\l -> case parse line "" l of Left e -> Text $ l ++ "// " ++ show (show e) - Right x -> x) . lines . unblockComments + Right x -> x) . lines . unblockComments + +preprocess fn f = execute fn $ parseDirectives f + +{- +test = putStrLn $ execute "test" $ parseDirectives + "#include <foo>\n\ + \blah\n\ + \foo bar\n\ + \#if 1\n\ + \baz\n\ + \#else\n\ + \quux\n\ + \#endif\n" test2 fn = do -- f <- readFile $ "/System/Library/Frameworks/Foundation.framework/Versions/C/Headers/" ++ fn @@ -172,7 +171,4 @@ -- putStrLn $ putStrLn fn print $ length $ execute fn $ parseDirectives f - - -preprocess fn f = execute fn $ parseDirectives f - +-} \ No newline at end of file Modified: trunk/hoc/InterfaceGenerator2/ResolveAndZap.hs ============================================================================== --- trunk/hoc/InterfaceGenerator2/ResolveAndZap.hs (original) +++ trunk/hoc/InterfaceGenerator2/ResolveAndZap.hs Thu Sep 25 16:35:43 2008 @@ -103,15 +103,7 @@ _ -> zapAndReportBrokenReferences progress pile' where - {- -zapAndReportFailedTypes :: ProgressReporter -> EntityPile -> Messages EntityPile - -zapAndReportFailedTypes progress entityPile - = return entityPile - where - - -} - +zapAndReportFailedTypes :: ProgressReporter -> EntityPile -> Messages EntityPile zapAndReportFailedTypes progress entityPile = zapAndReportWith worker progress entityPile where @@ -120,7 +112,7 @@ >> return x reportUnconvertedType t@(UnconvertedType ctype) - = message $ text "Coudn't convert type" -- <+> text (show ctype) + = message $ text "Coudn't convert type" <+> text (show ctype) reportUnconvertedType t = return () |