implement #1468, :browse on its own uses the currently-loaded module
authorSimon Marlow <simonmar@microsoft.com>
Fri, 19 Oct 2007 11:57:51 +0000 (11:57 +0000)
committerSimon Marlow <simonmar@microsoft.com>
Fri, 19 Oct 2007 11:57:51 +0000 (11:57 +0000)
compiler/ghci/InteractiveUI.hs
docs/users_guide/ghci.xml

index 0ac7e1c..d524ff1 100644 (file)
@@ -164,7 +164,7 @@ helpText =
  "\n" ++
  "   <statement>                 evaluate/run <statement>\n" ++
  "   :add <filename> ...         add module(s) to the current target set\n" ++
- "   :browse [*]<module>         display the names defined by <module>\n" ++
+ "   :browse [[*]<module>]       display the names defined by <module>\n" ++
  "   :cd <dir>                   change directory to <dir>\n" ++
  "   :cmd <expr>                 run the commands returned by <expr>::IO String\n" ++
  "   :ctags [<file>]             create tags file for Vi (default: \"tags\")\n" ++
@@ -1025,16 +1025,27 @@ shellEscape str = io (system str >> return False)
 browseCmd :: String -> GHCi ()
 browseCmd m = 
   case words m of
-    ['*':m] | looksLikeModuleName m -> browseModule m False
-    [m]     | looksLikeModuleName m -> browseModule m True
+    ['*':s] | looksLikeModuleName s -> do 
+        m <-  wantInterpretedModule s
+        browseModule m False
+    [s] | looksLikeModuleName s -> do
+        m <- lookupModule s
+        browseModule m True
+    [] -> do
+        s <- getSession
+        (as,bs) <- io $ GHC.getContext s
+                -- Guess which module the user wants to browse.  Pick
+                -- modules that are interpreted first.  The most
+                -- recently-added module occurs last, it seems.
+        case (as,bs) of
+          (as@(_:_), _)   -> browseModule (last as) True
+          ([],  bs@(_:_)) -> browseModule (last bs) True
+          ([],  [])  -> throwDyn (CmdLineError ":browse: no current module")
     _ -> throwDyn (CmdLineError "syntax:  :browse <module>")
 
-browseModule :: String -> Bool -> GHCi ()
-browseModule m exports_only = do
+browseModule :: Module -> Bool -> GHCi ()
+browseModule modl exports_only = do
   s <- getSession
-  modl <- if exports_only then lookupModule m
-                          else wantInterpretedModule m
-
   -- Temporarily set the context to the module we're interested in,
   -- just so we can get an appropriate PrintUnqualified
   (as,bs) <- io (GHC.getContext s)
@@ -1046,7 +1057,8 @@ browseModule m exports_only = do
 
   mb_mod_info <- io $ GHC.getModuleInfo s modl
   case mb_mod_info of
-    Nothing -> throwDyn (CmdLineError ("unknown module: " ++ m))
+    Nothing -> throwDyn (CmdLineError ("unknown module: " ++
+                                GHC.moduleNameString (GHC.moduleName modl)))
     Just mod_info -> do
         let names
               | exports_only = GHC.modInfoExports mod_info
index 579cf23..e7bd8c2 100644 (file)
@@ -1680,17 +1680,20 @@ $ ghci -lm
 
       <varlistentry>
        <term>
-          <literal>:browse</literal> <optional><literal>*</literal></optional><replaceable>module</replaceable> ...
+          <literal>:browse</literal> <optional><optional><literal>*</literal></optional><replaceable>module</replaceable></optional> ...
           <indexterm><primary><literal>:browse</literal></primary></indexterm>
         </term>
        <listitem>
          <para>Displays the identifiers defined by the module
          <replaceable>module</replaceable>, which must be either
-         loaded into GHCi or be a member of a package.  If the
-         <literal>*</literal> symbol is placed before the module
-         name, then <emphasis>all</emphasis> the identifiers defined
-         in <replaceable>module</replaceable> are shown; otherwise
-         the list is limited to the exports of
+         loaded into GHCi or be a member of a package.  If
+         <replaceable>module</replaceable> is omitted, the most
+         recently-loaded module is used.</para>
+
+          <para>If the <literal>*</literal> symbol is placed before
+         the module name, then <emphasis>all</emphasis> the
+         identifiers in scope in <replaceable>module</replaceable> are
+         shown; otherwise the list is limited to the exports of
          <replaceable>module</replaceable>.  The
          <literal>*</literal>-form is only available for modules
          which are interpreted; for compiled modules (including