PR is an explicit record, not a class
[ghc-hetmet.git] / compiler / main / InteractiveEval.hs
index 901dd63..3530d78 100644 (file)
@@ -13,8 +13,10 @@ module InteractiveEval (
         resume,
         abandon, abandonAll,
         getResumeContext,
+        getHistoryTick,
         getHistorySpan,
         getHistoryModule,
+        findEnclosingDeclSpanByTick,
         back, forward,
        setContext, getContext, 
         nameSetToGlobalRdrEnv,
@@ -132,7 +134,7 @@ data History
         historyApStack   :: HValue,
         historyBreakInfo :: BreakInfo,
         historyEnclosingDecl :: Name
-         -- ^^ A cache of the enclosing declaration, for convenience
+         -- ^^ A cache of the enclosing top level declaration, for convenience
    }
 
 mkHistory :: HscEnv -> HValue -> BreakInfo -> History
@@ -142,6 +144,9 @@ mkHistory hsc_env hval bi = let
                                      (getHistorySpan hsc_env h)
     in h
 
+getHistoryTick :: History -> BreakIndex
+getHistoryTick = breakInfo_number . historyBreakInfo 
+
 getHistoryModule :: History -> Module
 getHistoryModule = breakInfo_module . historyBreakInfo
 
@@ -153,9 +158,10 @@ getHistorySpan hsc_env hist =
        Just hmi -> modBreaks_locs (md_modBreaks (hm_details hmi)) ! num
        _ -> panic "getHistorySpan"
 
+-- | Finds the enclosing top level function name 
 findEnclosingDecl :: HscEnv -> Module -> SrcSpan -> Name
 findEnclosingDecl hsc_env mod span =
-       case lookupUFM (hsc_HPT hsc_env) (moduleName mod) of
+   case lookupUFM (hsc_HPT hsc_env) (moduleName mod) of
          Nothing -> panic "findEnclosingDecl"
          Just hmi -> let
                 globals   = typeEnvIds (md_types (hm_details hmi))
@@ -164,6 +170,16 @@ findEnclosingDecl hsc_env mod span =
                               --   ^^ assumes md_types is sorted
               in decl
 
+-- | Finds the span of the (smallest) function containing this BreakIndex
+findEnclosingDeclSpanByTick :: HscEnv -> Module -> BreakIndex -> SrcSpan
+findEnclosingDeclSpanByTick hsc_env mod tick = 
+   case lookupUFM (hsc_HPT hsc_env) (moduleName mod) of
+         Nothing -> panic "findEnclosingDecl"
+         Just hmi -> let
+             modbreaks = md_modBreaks (hm_details hmi)
+          in ASSERT (inRange (bounds (modBreaks_decls modbreaks)) tick)
+             modBreaks_decls modbreaks ! tick
+
 -- | Find the Module corresponding to a FilePath
 findModuleFromFile :: HscEnv -> FilePath -> Maybe Module
 findModuleFromFile hsc_env fp =