summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorandy@galois.com <unknown>2007-07-12 17:16:46 +0000
committerandy@galois.com <unknown>2007-07-12 17:16:46 +0000
commit41ac7eb30ff99535c24c39efd33e2b65ea458707 (patch)
tree081d6e0e333524d3e0906030eea54fc6249098b2
parent8bb7c665517a62163cf4b5a5d48b0d39c5a855c7 (diff)
downloadhaskell-41ac7eb30ff99535c24c39efd33e2b65ea458707.tar.gz
Fixing Hpc SrcSpan usage; rejecting SrcSpans that are not in the source file
Now, if you #include a file, you do not get any hpc-info from the included file. Previously, you got wrong information. Thanks to Neil Mitchell for pointing out the problem.
-rw-r--r--compiler/basicTypes/SrcLoc.lhs7
-rw-r--r--compiler/deSugar/Coverage.lhs23
2 files changed, 26 insertions, 4 deletions
diff --git a/compiler/basicTypes/SrcLoc.lhs b/compiler/basicTypes/SrcLoc.lhs
index c1b49e97e4..ea32651645 100644
--- a/compiler/basicTypes/SrcLoc.lhs
+++ b/compiler/basicTypes/SrcLoc.lhs
@@ -28,6 +28,7 @@ module SrcLoc (
mkSrcSpan, srcLocSpan,
combineSrcSpans,
srcSpanStart, srcSpanEnd,
+ optSrcSpanFileName,
-- These are dubious exports, because they crash on some inputs,
-- used only in Lexer.x where we are sure what the Span looks like
@@ -218,6 +219,12 @@ isGoodSrcSpan SrcSpanMultiLine{} = True
isGoodSrcSpan SrcSpanPoint{} = True
isGoodSrcSpan _ = False
+optSrcSpanFileName :: SrcSpan -> Maybe FastString
+optSrcSpanFileName (SrcSpanOneLine { srcSpanFile = nm }) = Just nm
+optSrcSpanFileName (SrcSpanMultiLine { srcSpanFile = nm }) = Just nm
+optSrcSpanFileName (SrcSpanPoint { srcSpanFile = nm}) = Just nm
+optSrcSpanFileName _ = Nothing
+
isOneLineSpan :: SrcSpan -> Bool
-- True if the span is known to straddle more than one line
-- By default, it returns False
diff --git a/compiler/deSugar/Coverage.lhs b/compiler/deSugar/Coverage.lhs
index 87c1e6f8ea..2d2cb2ae50 100644
--- a/compiler/deSugar/Coverage.lhs
+++ b/compiler/deSugar/Coverage.lhs
@@ -76,7 +76,7 @@ addCoverageTicksToBinds dflags mod mod_loc tyCons binds = do
let (binds1,_,st)
= unTM (addTickLHsBinds binds)
(TTE
- { modName = mod_name
+ { fileName = mkFastString orig_file
, declPath = []
, inScope = emptyVarSet
, blackList = listToFM [ (getSrcSpan (tyConName tyCon),())
@@ -549,7 +549,7 @@ data TickTransState = TT { tickBoxCount:: Int
, mixEntries :: [MixEntry_]
}
-data TickTransEnv = TTE { modName :: String
+data TickTransEnv = TTE { fileName :: FastString
, declPath :: [String]
, inScope :: VarSet
, blackList :: FiniteMap SrcSpan ()
@@ -615,6 +615,17 @@ addPathEntry nm = withEnv (\ env -> env { declPath = declPath env ++ [nm] })
getPathEntry :: TM [String]
getPathEntry = declPath `liftM` getEnv
+getFileName :: TM FastString
+getFileName = fileName `liftM` getEnv
+
+sameFileName :: SrcSpan -> TM a -> TM a -> TM a
+sameFileName pos out_of_scope in_scope = do
+ file_name <- getFileName
+ case optSrcSpanFileName pos of
+ Just file_name2
+ | file_name == file_name2 -> in_scope
+ _ -> out_of_scope
+
bindLocals :: [Id] -> TM a -> TM a
bindLocals new_ids (TM m)
= TM $ \ env st ->
@@ -631,7 +642,9 @@ isBlackListed pos = TM $ \ env st ->
-- the tick application inherits the source position of its
-- expression argument to support nested box allocations
allocTickBox :: BoxLabel -> SrcSpan -> TM (HsExpr Id) -> TM (LHsExpr Id)
-allocTickBox boxLabel pos m | isGoodSrcSpan' pos = do
+allocTickBox boxLabel pos m | isGoodSrcSpan' pos =
+ sameFileName pos
+ (do e <- m; return (L pos e)) $ do
(fvs, e) <- getFreeVars m
TM $ \ env st ->
let c = tickBoxCount st
@@ -648,7 +661,9 @@ allocTickBox boxLabel pos m = do e <- m; return (L pos e)
-- the tick application inherits the source position of its
-- expression argument to support nested box allocations
allocATickBox :: BoxLabel -> SrcSpan -> FreeVars -> TM (Maybe (Int,[Id]))
-allocATickBox boxLabel pos fvs | isGoodSrcSpan' pos = TM $ \ env st ->
+allocATickBox boxLabel pos fvs | isGoodSrcSpan' pos =
+ sameFileName pos
+ (return Nothing) $ TM $ \ env st ->
let me = (pos, map (nameOccName.idName) ids, boxLabel)
c = tickBoxCount st
mes = mixEntries st