From: <cod...@go...> - 2008-10-01 22:54:29
|
Author: wol...@gm... Date: Wed Oct 1 15:53:54 2008 New Revision: 327 Added: trunk/hoc/InterfaceGenerator2/SrcPos.hs Modified: trunk/hoc/InterfaceGenerator2/BuildEntities.hs trunk/hoc/InterfaceGenerator2/Entities.hs trunk/hoc/InterfaceGenerator2/HackEnumNames.hs trunk/hoc/InterfaceGenerator2/Headers.hs trunk/hoc/InterfaceGenerator2/Parser.hs trunk/hoc/InterfaceGenerator2/ParserBase.hs trunk/hoc/InterfaceGenerator2/ResolveAndZap.hs trunk/hoc/InterfaceGenerator2/ShuffleInstances.hs trunk/hoc/InterfaceGenerator2/SyntaxTree.hs Log: Add source location information to parse tree and entity pile. Use it when reporting skipped entities. Modified: trunk/hoc/InterfaceGenerator2/BuildEntities.hs ============================================================================== --- trunk/hoc/InterfaceGenerator2/BuildEntities.hs (original) +++ trunk/hoc/InterfaceGenerator2/BuildEntities.hs Wed Oct 1 15:53:54 2008 @@ -8,6 +8,7 @@ import Traversals import BindingScript import SyntaxTree +import SrcPos import CTypeToHaskell import Headers @@ -17,7 +18,7 @@ import Control.Monad.State import Data.Char ( isUpper, isLower, isAlphaNum, toUpper ) import Data.List ( groupBy, isPrefixOf ) -import Data.Maybe ( fromMaybe, catMaybes ) +import Data.Maybe ( fromMaybe ) import System.Directory ( doesFileExist ) import qualified Data.ByteString.Char8 as BS @@ -60,7 +61,8 @@ eHaskellName = assertHaskellTypeName $ BS.pack typeName, eAlternateHaskellNames = [], eInfo = AdditionalTypeEntity, - eModule = LocalModule $ BS.pack moduleName + eModule = LocalModule $ BS.pack moduleName, + eSrcPos = AutoGeneratedPos } | (typeName, moduleName) <- bsAdditionalTypes bindingScript, BS.pack moduleName `Set.member` modNames @@ -87,7 +89,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 pos factory modName _clsID clsName sel = if hidden then return [] else do @@ -96,7 +98,8 @@ eHaskellName = BS.pack mangled, eAlternateHaskellNames = moreMangled, eInfo = SelectorEntity (UnconvertedType (kind, sel')), - eModule = LocalModule modName + eModule = LocalModule modName, + eSrcPos = pos } return $ [(entity, factory)] where @@ -129,16 +132,16 @@ && (not $ isLower (b !! length a)) | otherwise = a == b - makeEntitiesForSelectorListItem modName clsID clsName (InstanceMethod sel) - = makeSelectorEntity False modName clsID clsName sel - makeEntitiesForSelectorListItem modName clsID clsName (ClassMethod sel) - = makeSelectorEntity True modName clsID clsName sel - makeEntitiesForSelectorListItem modName _clsID _clsName (LocalDecl decl) - = makeEntity modName decl >> return [] - makeEntitiesForSelectorListItem modName clsID clsName (PropertyDecl typ name attr) + makeEntitiesForSelectorListItem modName clsID clsName (pos, InstanceMethod sel) + = makeSelectorEntity pos False modName clsID clsName sel + makeEntitiesForSelectorListItem modName clsID clsName (pos, ClassMethod sel) + = makeSelectorEntity pos True modName clsID clsName sel + makeEntitiesForSelectorListItem modName _clsID _clsName (pos, LocalDecl decl) + = makeEntity modName (pos, decl) >> return [] + makeEntitiesForSelectorListItem modName clsID clsName (pos, PropertyDecl typ name attr) = do - getter <- makeSelectorEntity False modName clsID clsName getterSel - setter <- makeSelectorEntity False modName clsID clsName setterSel + getter <- makeSelectorEntity pos False modName clsID clsName getterSel + setter <- makeSelectorEntity pos False modName clsID clsName setterSel return (getter ++ setter) where getterName = head $ [ n | Getter n <- attr ] ++ [ name ] @@ -147,23 +150,24 @@ getterSel = Selector getterName typ [] False setterSel = Selector setterName (CTSimple "void") [typ] False - makeEntitiesForSelectorListItem _modName _clsID _clsName (Required _) + makeEntitiesForSelectorListItem _modName _clsID _clsName (pos, Required _) = return [] makeSelectorEntities modName clsID clsName items = fmap concat $ mapM (makeEntitiesForSelectorListItem modName clsID clsName) items - makeSelectorInstance modName classEntity (selectorEntity, factory) + makeSelectorInstance pos modName classEntity (selectorEntity, factory) = newEntity $ Entity { eName = SelectorInstanceName classEntity selectorEntity factory, eHaskellName = BS.empty, eAlternateHaskellNames = [], eInfo = MethodEntity, - eModule = LocalModule modName + eModule = LocalModule modName, + eSrcPos = pos } - makeEntity modName (SelectorList (Interface clsName mbSuper protocols) contents) + makeEntity modName (pos, SelectorList (Interface clsName mbSuper protocols) contents) | notHidden clsName = do classEntity <- newEntity $ Entity { @@ -171,7 +175,8 @@ eHaskellName = getName clsName (nameToUppercase clsName), eAlternateHaskellNames = [], eInfo = ClassEntity (fmap (DelayedClassLookup . BS.pack) mbSuper), - eModule = LocalModule modName + eModule = LocalModule modName, + eSrcPos = pos } flip mapM_ protocols $ \protocol -> newEntity $ Entity { @@ -180,12 +185,13 @@ eHaskellName = BS.empty, eAlternateHaskellNames = [], eInfo = ProtocolAdoptionEntity, - eModule = LocalModule modName + eModule = LocalModule modName, + eSrcPos = pos } selectors <- makeSelectorEntities modName classEntity clsName contents - mapM (makeSelectorInstance modName classEntity) selectors + mapM (makeSelectorInstance pos modName classEntity) selectors return () - makeEntity modName (SelectorList (Category clsName _catName protocols) contents) + makeEntity modName (pos, SelectorList (Category clsName _catName protocols) contents) = do let classEntity = DelayedClassLookup $ BS.pack clsName flip mapM_ protocols $ \protocol -> @@ -195,12 +201,13 @@ eHaskellName = BS.empty, eAlternateHaskellNames = [], eInfo = ProtocolAdoptionEntity, - eModule = LocalModule modName + eModule = LocalModule modName, + eSrcPos = pos } selectors <- makeSelectorEntities modName classEntity clsName contents - mapM (makeSelectorInstance modName classEntity) selectors + mapM (makeSelectorInstance pos modName classEntity) selectors return () - makeEntity modName (SelectorList (Protocol protoName protocols) contents) + makeEntity modName (pos, SelectorList (Protocol protoName protocols) contents) | notHidden protoName = mfix (\protocolEntity -> do selectors <- fmap (map fst) $ makeSelectorEntities modName @@ -211,22 +218,22 @@ eAlternateHaskellNames = [], eInfo = ProtocolEntity (map (DelayedProtocolLookup . BS.pack) protocols) selectors, - eModule = LocalModule modName + eModule = LocalModule modName, + eSrcPos = pos } ) >> return () - makeEntity _modName (Typedef (CTStruct _n2 _fields) _name) + makeEntity _modName (pos, Typedef (CTStruct _n2 _fields) _name) = return () - makeEntity _modName (Typedef (CTUnion _n2 _fields) _name) + makeEntity _modName (pos, Typedef (CTUnion _n2 _fields) _name) = return () - makeEntity modName (Typedef (CTEnum _n2 vals) name) + makeEntity modName (pos, Typedef (CTEnum _n2 vals) name) | notHidden name - = makeEnum name modName vals - -- makeAnonymousEnum modName vals -- ### HACK for 10.5: ignore enum names - makeEntity modName (CTypeDecl (CTEnum name vals)) + = makeEnum name pos modName vals + makeEntity modName (pos, CTypeDecl (CTEnum name vals)) | null name || notHidden name - = (if null name {- || True {- ### see above -}-} then makeAnonymousEnum else makeEnum name) modName vals + = (if null name then makeAnonymousEnum else makeEnum name) pos modName vals - makeEntity modName (Typedef ct name) + makeEntity modName (pos, Typedef ct name) | notHidden name = do newEntity $ Entity { @@ -234,10 +241,11 @@ eHaskellName = getName name (nameToUppercase name), eAlternateHaskellNames = [], eInfo = TypeSynonymEntity (UnconvertedType ct), - eModule = LocalModule modName + eModule = LocalModule modName, + eSrcPos = pos } return () - makeEntity modName (ExternVar ct name) + makeEntity modName (pos, ExternVar ct name) | notHidden name = do newEntity $ Entity { @@ -245,10 +253,11 @@ eHaskellName = getName name (nameToLowercase name), eAlternateHaskellNames = [], eInfo = ExternVarEntity (UnconvertedType ct), - eModule = LocalModule modName + eModule = LocalModule modName, + eSrcPos = pos } return () - makeEntity modName (ExternFun sel) + makeEntity modName (pos, ExternFun sel) | notHidden name = do newEntity $ Entity { @@ -256,7 +265,8 @@ eHaskellName = getName name (nameToLowercase name), eAlternateHaskellNames = [], eInfo = ExternFunEntity (UnconvertedType (PlainSelector, sel)), - eModule = LocalModule modName + eModule = LocalModule modName, + eSrcPos = pos } return () where name = selName sel @@ -278,7 +288,7 @@ = convert Nothing xs convert _ [] = [] - makeEnum name modName values + makeEnum name pos modName values = case convertEnumEntities values of (True, values') -> do newEntity $ Entity { @@ -286,7 +296,8 @@ eHaskellName = getName name (nameToUppercase name), eAlternateHaskellNames = [], eInfo = EnumEntity True values', - eModule = LocalModule modName + eModule = LocalModule modName, + eSrcPos = pos } return () (False, values') -> do @@ -295,17 +306,19 @@ eHaskellName = BS.empty, eAlternateHaskellNames = [], eInfo = EnumEntity False values', - eModule = LocalModule modName + eModule = LocalModule modName, + eSrcPos = pos } newEntity $ Entity { eName = CName $ BS.pack name, eHaskellName = getName name (nameToUppercase name), eAlternateHaskellNames = [], eInfo = TypeSynonymEntity (UnconvertedType cTypeInt), - eModule = LocalModule modName + eModule = LocalModule modName, + eSrcPos = pos } return () - makeAnonymousEnum modName values + makeAnonymousEnum pos modName values = do let (complete, values') = convertEnumEntities values newEntity $ Entity { @@ -313,7 +326,8 @@ eHaskellName = BS.empty, eAlternateHaskellNames = [], eInfo = EnumEntity complete values', - eModule = LocalModule modName + eModule = LocalModule modName, + eSrcPos = pos } return () @@ -357,7 +371,8 @@ exports imports2 above, - eModule = LocalModule $ BS.pack modName + eModule = LocalModule $ BS.pack modName, + eSrcPos = AutoGeneratedPos } newEntity $ Entity { eName = Anonymous, @@ -368,7 +383,8 @@ [] imports1 below, - eModule = LocalModule $ BS.pack modName + eModule = LocalModule $ BS.pack modName, + eSrcPos = AutoGeneratedPos } return () where Modified: trunk/hoc/InterfaceGenerator2/Entities.hs ============================================================================== --- trunk/hoc/InterfaceGenerator2/Entities.hs (original) +++ trunk/hoc/InterfaceGenerator2/Entities.hs Wed Oct 1 15:53:54 2008 @@ -1,4 +1,4 @@ -{-# OPTIONS -fglasgow-exts #-} +{-# LANGUAGE DeriveDataTypeable, FlexibleContexts #-} module Entities where import Control.Monad.State @@ -10,6 +10,7 @@ import CTypeToHaskell import SyntaxTree ( CType, Selector ) import Progress +import SrcPos( SrcPos ) import Data.ByteString.Char8(ByteString) import qualified Data.ByteString.Char8 as BS @@ -77,7 +78,8 @@ eHaskellName :: ByteString, eAlternateHaskellNames :: [ByteString], eInfo :: EntityInfo, - eModule :: Module + eModule :: Module, + eSrcPos :: SrcPos } deriving ( Read, Show, Typeable, Data ) Modified: trunk/hoc/InterfaceGenerator2/HackEnumNames.hs ============================================================================== --- trunk/hoc/InterfaceGenerator2/HackEnumNames.hs (original) +++ trunk/hoc/InterfaceGenerator2/HackEnumNames.hs Wed Oct 1 15:53:54 2008 @@ -9,22 +9,23 @@ hackEnumNames (HeaderInfo name imports decls) = HeaderInfo name imports (hackEnums1 Just id decls) where - hackEnums1 :: (a -> Maybe Declaration) -> (Declaration -> a) -> [a] -> [a] + hackEnums1 :: (a -> Maybe DeclarationAndPos) -> (DeclarationAndPos -> a) -> [a] -> [a] hackEnums1 unwrap wrap (x : y : xs) - | Just (CTypeDecl (CTEnum name1 vals)) <- unwrap x, - Just (Typedef baseType name2) <- unwrap y, + | Just (pos, CTypeDecl (CTEnum name1 vals)) <- unwrap x, + Just (_, Typedef baseType name2) <- unwrap y, null name1 || name1 == name2 || name1 == '_' : name2, acceptableEnumBaseType baseType - = wrap (Typedef (CTEnum name1 vals) name2) + = wrap (pos, Typedef (CTEnum name1 vals) name2) : hackEnums1 unwrap wrap xs hackEnums1 unwrap wrap (x : xs) - | Just (SelectorList header items) <- unwrap x - = wrap (SelectorList header (hackEnums1 decl LocalDecl items)) + | Just (pos, SelectorList header items) <- unwrap x + = wrap (pos, SelectorList header (hackEnums1 undecl decl items)) : hackEnums1 unwrap wrap xs | otherwise = x : hackEnums1 unwrap wrap xs - where decl (LocalDecl d) = Just d - decl other = Nothing + where undecl (pos, LocalDecl d) = Just (pos, d) + undecl other = Nothing + decl (pos, d) = (pos, LocalDecl d) hackEnums1 unwrap wrap [] = [] acceptableEnumBaseType (CTSimple name) Modified: trunk/hoc/InterfaceGenerator2/Headers.hs ============================================================================== --- trunk/hoc/InterfaceGenerator2/Headers.hs (original) +++ trunk/hoc/InterfaceGenerator2/Headers.hs Wed Oct 1 15:53:54 2008 @@ -6,12 +6,12 @@ import Parser(header) import ParserBase(emptyParseEnvironment) -import SyntaxTree(Declaration) +import SyntaxTree(ParsedHeader) import Control.Exception(evaluate) import Control.Monad(when) import Data.Char(isAlphaNum, toUpper) -import Data.List(isPrefixOf,isSuffixOf,partition) +import Data.List(isPrefixOf,isSuffixOf) import Data.Maybe(mapMaybe) import System.Directory(getDirectoryContents) import System.Info(os) @@ -27,7 +27,7 @@ import qualified Data.Map as Map type ModuleName = ByteString -data HeaderInfo = HeaderInfo ModuleName [ModuleName] [Declaration] +data HeaderInfo = HeaderInfo ModuleName [ModuleName] ParsedHeader deriving(Show) findImports = mapMaybe checkImport . lines Modified: trunk/hoc/InterfaceGenerator2/Parser.hs ============================================================================== --- trunk/hoc/InterfaceGenerator2/Parser.hs (original) +++ trunk/hoc/InterfaceGenerator2/Parser.hs Wed Oct 1 15:53:54 2008 @@ -1,23 +1,21 @@ {-# LANGUAGE TypeSynonymInstances #-} module Parser( Parser, header, selector ) where -import Data.Maybe(catMaybes, isJust, fromJust) -import Data.Char(ord, isUpper, isDigit) -import Data.Bits(shiftL, (.|.)) -import Control.Monad(guard) +import Data.Maybe ( isJust, fromJust ) +import Data.Char ( ord, isUpper, isDigit ) +import Data.Bits ( shiftL, (.|.) ) +import Control.Monad ( guard ) import Text.Parsec import Text.Parsec.Token -import Text.Parsec.Language(emptyDef) import Text.Parsec.Expr import SyntaxTree - -import qualified Data.Map as Map - +import SrcPos import ParserBase + objcDef = LanguageDef { commentStart = "/*" , commentEnd = "*/" @@ -40,15 +38,16 @@ singleton x = [x] -header :: Parser [Declaration] +header :: Parser ParsedHeader header = do optional (whiteSpace objc) things <- fmap concat $ many $ do + pos <- getPosition -- thing <- try interestingThing <|> uninterestingThing -- lenient parsing - thing <- interestingThing -- strict parsing + things <- interestingThing -- strict parsing optional (whiteSpace objc) - return thing + return $ map (\thing -> (parsecPosToSrcPos pos, thing)) things eof return things @@ -397,7 +396,10 @@ return $ Interface class_name super protos ) instance_variables - selectors <- fmap concat $ many selectorListItem + selectors <- fmap concat $ many $ do + pos <- getPosition + items <- selectorListItem + return $ map (\item -> (parsecPosToSrcPos pos, item)) items reserved objc "@end" return [SelectorList what selectors] where Modified: trunk/hoc/InterfaceGenerator2/ParserBase.hs ============================================================================== --- trunk/hoc/InterfaceGenerator2/ParserBase.hs (original) +++ trunk/hoc/InterfaceGenerator2/ParserBase.hs Wed Oct 1 15:53:54 2008 @@ -6,7 +6,7 @@ import Control.Monad.Trans( lift ) import Messages import qualified Text.PrettyPrint.HughesPJ as PP - +import SrcPos type ParseEnvironment = Map.Map String Integer @@ -30,5 +30,6 @@ parseWarning msg = do pos <- getPosition - lift (message $ PP.text (show pos ++ ": " ++ msg)) + lift (message $ pprSourcePos (parsecPosToSrcPos pos) + PP.<> PP.text (": " ++ msg)) Modified: trunk/hoc/InterfaceGenerator2/ResolveAndZap.hs ============================================================================== --- trunk/hoc/InterfaceGenerator2/ResolveAndZap.hs (original) +++ trunk/hoc/InterfaceGenerator2/ResolveAndZap.hs Wed Oct 1 15:53:54 2008 @@ -4,6 +4,7 @@ import Traversals import CTypeToHaskell import Messages +import SrcPos import Progress import Control.Monad.State @@ -92,7 +93,8 @@ -> return $ Just x (_, messages) -> do - message (text "Skipping" + message (pprSourcePos (eSrcPos entity) + <> text ": Skipping" <+> (text.show) entityID <+> parens (text $ show $ eName entity) $+$ nest 4 (vcat messages)) Modified: trunk/hoc/InterfaceGenerator2/ShuffleInstances.hs ============================================================================== --- trunk/hoc/InterfaceGenerator2/ShuffleInstances.hs (original) +++ trunk/hoc/InterfaceGenerator2/ShuffleInstances.hs Wed Oct 1 15:53:54 2008 @@ -39,7 +39,8 @@ eHaskellName = BS.empty, eAlternateHaskellNames = [], eInfo = MethodEntity, - eModule = eModule entity + eModule = eModule entity, + eSrcPos = eSrcPos entity } addProto proto @@ -48,7 +49,8 @@ eHaskellName = BS.empty, eAlternateHaskellNames = [], eInfo = ProtocolAdoptionEntity, - eModule = eModule entity + eModule = eModule entity, + eSrcPos = eSrcPos entity } _ -> return () Added: trunk/hoc/InterfaceGenerator2/SrcPos.hs ============================================================================== --- (empty file) +++ trunk/hoc/InterfaceGenerator2/SrcPos.hs Wed Oct 1 15:53:54 2008 @@ -0,0 +1,17 @@ +{-# LANGUAGE DeriveDataTypeable #-} +module SrcPos where + +import Data.Generics +import Text.PrettyPrint.HughesPJ +import Text.Parsec( sourceName, sourceLine, sourceColumn ) + +data SrcPos = SrcPos String Int Int + | AutoGeneratedPos + deriving ( Read, Show, Eq, Ord, Typeable, Data ) + +pprSourcePos (SrcPos file line col) + = text file <> char ':' <> int line <> char ':' <> int col +pprSourcePos AutoGeneratedPos + = text "<generated>" + +parsecPosToSrcPos s = SrcPos (sourceName s) (sourceLine s) (sourceColumn s) Modified: trunk/hoc/InterfaceGenerator2/SyntaxTree.hs ============================================================================== --- trunk/hoc/InterfaceGenerator2/SyntaxTree.hs (original) +++ trunk/hoc/InterfaceGenerator2/SyntaxTree.hs Wed Oct 1 15:53:54 2008 @@ -1,17 +1,22 @@ -{-# OPTIONS -fglasgow-exts #-} +{-# LANGUAGE DeriveDataTypeable #-} module SyntaxTree where import Data.Generics +import SrcPos + +type ParsedHeader = [ DeclarationAndPos ] data Declaration = ForwardClass [String] | ForwardProtocol [String] - | SelectorList SelectorListHeader [SelectorListItem] + | SelectorList SelectorListHeader [(SrcPos, SelectorListItem)] | Typedef CType String | CTypeDecl CType | ExternVar CType String | ExternFun Selector deriving (Show,Eq,Ord) + +type DeclarationAndPos = (SrcPos, Declaration) data SelectorListHeader = Interface String (Maybe String) [String] |