X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2FdeSugar%2FCoverage.lhs;h=d894523de3cfaebf0f7530b7ccde95b2f6166c48;hp=dce7962fcf99295aedf5f68144823d2054b64cc3;hb=4e0c994eb1613c62e94069642d7acdb2e69b773b;hpb=1e50fd4185479a62e02d987bdfcb1c62712859ca diff --git a/compiler/deSugar/Coverage.lhs b/compiler/deSugar/Coverage.lhs index dce7962..d894523 100644 --- a/compiler/deSugar/Coverage.lhs +++ b/compiler/deSugar/Coverage.lhs @@ -23,7 +23,7 @@ import FastString import HscTypes import StaticFlags import TyCon -import FiniteMap +import MonadUtils import Maybes import Data.Array @@ -34,6 +34,8 @@ import Trace.Hpc.Util import BreakArray import Data.HashTable ( hashString ) +import Data.Map (Map) +import qualified Data.Map as Map \end{code} @@ -52,12 +54,10 @@ addCoverageTicksToBinds -> LHsBinds Id -> IO (LHsBinds Id, HpcInfo, ModBreaks) -addCoverageTicksToBinds dflags mod mod_loc tyCons binds = do - - let orig_file = - case ml_hs_file mod_loc of - Just file -> file - Nothing -> panic "can not find the original file during hpc trans" +addCoverageTicksToBinds dflags mod mod_loc tyCons binds = + case ml_hs_file mod_loc of + Nothing -> return (binds, emptyHpcInfo False, emptyModBreaks) + Just orig_file -> do if "boot" `isSuffixOf` orig_file then return (binds, emptyHpcInfo False, emptyModBreaks) else do @@ -77,8 +77,8 @@ addCoverageTicksToBinds dflags mod mod_loc tyCons binds = do { fileName = mkFastString orig_file2 , declPath = [] , inScope = emptyVarSet - , blackList = listToFM [ (getSrcSpan (tyConName tyCon),()) - | tyCon <- tyCons ] + , blackList = Map.fromList [ (getSrcSpan (tyConName tyCon),()) + | tyCon <- tyCons ] }) (TT { tickBoxCount = 0 @@ -139,9 +139,9 @@ addTickLHsBinds :: LHsBinds Id -> TM (LHsBinds Id) addTickLHsBinds binds = mapBagM addTickLHsBind binds addTickLHsBind :: LHsBind Id -> TM (LHsBind Id) -addTickLHsBind (L pos (AbsBinds abs_tvs abs_dicts abs_exports abs_binds)) = do - abs_binds' <- addTickLHsBinds abs_binds - return $ L pos $ AbsBinds abs_tvs abs_dicts abs_exports abs_binds' +addTickLHsBind (L pos bind@(AbsBinds { abs_binds = binds })) = do + binds' <- addTickLHsBinds binds + return $ L pos $ bind { abs_binds = binds' } addTickLHsBind (L pos (funBind@(FunBind { fun_id = (L _ id) }))) = do let name = getOccString id decl_path <- getPathEntry @@ -286,13 +286,13 @@ addTickHsExpr (HsCase e mgs) = liftM2 HsCase (addTickLHsExpr e) (addTickMatchGroup mgs) -addTickHsExpr (HsIf e1 e2 e3) = - liftM3 HsIf +addTickHsExpr (HsIf cnd e1 e2 e3) = + liftM3 (HsIf cnd) (addBinTickLHsExpr (BinBox CondBinBox) e1) (addTickLHsExprOptAlt True e2) (addTickLHsExprOptAlt True e3) addTickHsExpr (HsLet binds e) = - bindLocals (map unLoc $ collectLocalBinders binds) $ + bindLocals (collectLocalBinders binds) $ liftM2 HsLet (addTickHsLocalBinds binds) -- to think about: !patterns. (addTickLHsExprNeverOrAlways e) @@ -400,7 +400,7 @@ addTickGRHSs isOneOfMany (GRHSs guarded local_binds) = do guarded' <- mapM (liftL (addTickGRHS isOneOfMany)) guarded return $ GRHSs guarded' local_binds' where - binders = map unLoc (collectLocalBinders local_binds) + binders = collectLocalBinders local_binds addTickGRHS :: Bool -> GRHS Id -> TM (GRHS Id) addTickGRHS isOneOfMany (GRHS stmts expr) = do @@ -422,7 +422,7 @@ addTickLStmts' isGuard lstmts res a <- res return (lstmts', a) where - binders = map unLoc (collectLStmtsBinders lstmts) + binders = collectLStmtsBinders lstmts addTickStmt :: (Maybe (Bool -> BoxLabel)) -> Stmt Id -> TM (Stmt Id) addTickStmt _isGuard (BindStmt pat e bind fail) = do @@ -442,32 +442,30 @@ addTickStmt _isGuard (LetStmt binds) = do addTickStmt isGuard (ParStmt pairs) = do liftM ParStmt (mapM (addTickStmtAndBinders isGuard) pairs) -addTickStmt isGuard (TransformStmt (stmts, ids) usingExpr maybeByExpr) = do - liftM3 TransformStmt - (addTickStmtAndBinders isGuard (stmts, ids)) + +addTickStmt isGuard (TransformStmt stmts ids usingExpr maybeByExpr) = do + liftM4 TransformStmt + (addTickLStmts isGuard stmts) + (return ids) (addTickLHsExprAlways usingExpr) (addTickMaybeByLHsExpr maybeByExpr) -addTickStmt isGuard (GroupStmt (stmts, binderMap) groupByClause) = do - liftM2 GroupStmt - (addTickStmtAndBinders isGuard (stmts, binderMap)) - (case groupByClause of - GroupByNothing usingExpr -> addTickLHsExprAlways usingExpr >>= (return . GroupByNothing) - GroupBySomething eitherUsingExpr byExpr -> do - eitherUsingExpr' <- mapEitherM addTickLHsExprAlways (addTickSyntaxExpr hpcSrcSpan) eitherUsingExpr - byExpr' <- addTickLHsExprAlways byExpr - return $ GroupBySomething eitherUsingExpr' byExpr') - where - mapEitherM f g x = do - case x of - Left a -> f a >>= (return . Left) - Right b -> g b >>= (return . Right) -addTickStmt isGuard (RecStmt stmts ids1 ids2 tys dictbinds) = do - liftM5 RecStmt - (addTickLStmts isGuard stmts) - (return ids1) - (return ids2) - (return tys) - (addTickDictBinds dictbinds) + +addTickStmt isGuard (GroupStmt stmts binderMap by using) = do + liftM4 GroupStmt + (addTickLStmts isGuard stmts) + (return binderMap) + (fmapMaybeM addTickLHsExprAlways by) + (fmapEitherM addTickLHsExprAlways (addTickSyntaxExpr hpcSrcSpan) using) + +addTickStmt isGuard stmt@(RecStmt {}) + = do { stmts' <- addTickLStmts isGuard (recS_stmts stmt) + ; ret' <- addTickSyntaxExpr hpcSrcSpan (recS_ret_fn stmt) + ; mfix' <- addTickSyntaxExpr hpcSrcSpan (recS_mfix_fn stmt) + ; bind' <- addTickSyntaxExpr hpcSrcSpan (recS_bind_fn stmt) + ; dicts' <- addTickEvBinds (recS_dicts stmt) + ; return (stmt { recS_stmts = stmts', recS_ret_fn = ret' + , recS_mfix_fn = mfix', recS_bind_fn = bind' + , recS_dicts = dicts' }) } addTick :: Maybe (Bool -> BoxLabel) -> LHsExpr Id -> TM (LHsExpr Id) addTick isGuard e | Just fn <- isGuard = addBinTickLHsExpr fn e @@ -510,7 +508,7 @@ addTickHsIPBinds :: HsIPBinds Id -> TM (HsIPBinds Id) addTickHsIPBinds (IPBinds ipbinds dictbinds) = liftM2 IPBinds (mapM (liftL (addTickIPBind)) ipbinds) - (addTickDictBinds dictbinds) + (return dictbinds) addTickIPBind :: IPBind Id -> TM (IPBind Id) addTickIPBind (IPBind nm e) = @@ -538,8 +536,8 @@ addTickHsCmdTop (HsCmdTop cmd tys ty syntaxtable) = addTickLHsCmd :: LHsCmd Id -> TM (LHsCmd Id) addTickLHsCmd x = addTickLHsExpr x -addTickDictBinds :: DictBinds Id -> TM (DictBinds Id) -addTickDictBinds x = addTickLHsBinds x +addTickEvBinds :: TcEvBinds -> TM TcEvBinds +addTickEvBinds x = return x -- No coverage testing for dictionary binding addTickHsRecordBinds :: HsRecordBinds Id -> TM (HsRecordBinds Id) addTickHsRecordBinds (HsRecFields fields dd) @@ -577,7 +575,7 @@ data TickTransState = TT { tickBoxCount:: Int data TickTransEnv = TTE { fileName :: FastString , declPath :: [String] , inScope :: VarSet - , blackList :: FiniteMap SrcSpan () + , blackList :: Map SrcSpan () } -- deriving Show @@ -661,7 +659,7 @@ bindLocals new_ids (TM m) isBlackListed :: SrcSpan -> TM Bool isBlackListed pos = TM $ \ env st -> - case lookupFM (blackList env) pos of + case Map.lookup pos (blackList env) of Nothing -> (False,noFVs,st) Just () -> (True,noFVs,st) @@ -740,9 +738,9 @@ mkHpcPos pos start = srcSpanStart pos end = srcSpanEnd pos hpcPos = toHpcPos ( srcLocLine start - , srcLocCol start + 1 + , srcLocCol start , srcLocLine end - , srcLocCol end + , srcLocCol end - 1 ) hpcSrcSpan :: SrcSpan