Fix ghci tab completion of duplicate identifiers.
authorShachaf Ben-Kiki <shachaf@gmail.com>
Sun, 13 Jul 2014 20:19:33 +0000 (15:19 -0500)
committerAustin Seipp <austin@well-typed.com>
Sun, 13 Jul 2014 20:19:33 +0000 (15:19 -0500)
Summary:
Currently, if the same identifier is imported via multiple modules, ghci
shows multiple completions for it. Use the nub of the completions
instead so that it only shows up once.

Signed-off-by: Shachaf Ben-Kiki <shachaf@gmail.com>
Test Plan: by hand

Reviewers: simonmar, austin, hvr

Reviewed By: austin, hvr

Subscribers: hvr, simonmar, relrod, carter

Differential Revision: https://phabricator.haskell.org/D58

compiler/utils/Util.lhs
ghc/InteractiveUI.hs

index 0274c59..2dcc73f 100644 (file)
@@ -47,7 +47,7 @@ module Util (
         nTimes,
 
         -- * Sorting
-        sortWith, minWith,
+        sortWith, minWith, nubSort,
 
         -- * Comparisons
         isEqual, eqListBy, eqMaybeBy,
@@ -126,6 +126,7 @@ import Data.Ord         ( comparing )
 import Data.Bits
 import Data.Word
 import qualified Data.IntMap as IM
+import qualified Data.Set as Set
 
 import Data.Time
 #if __GLASGOW_HASKELL__ < 705
@@ -490,6 +491,9 @@ sortWith get_key xs = sortBy (comparing get_key) xs
 minWith :: Ord b => (a -> b) -> [a] -> a
 minWith get_key xs = ASSERT( not (null xs) )
                      head (sortWith get_key xs)
+
+nubSort :: Ord a => [a] -> [a]
+nubSort = Set.toAscList . Set.fromList
 \end{code}
 
 %************************************************************************
index c3d9f25..ef48c34 100644 (file)
@@ -2536,14 +2536,14 @@ unionComplete f1 f2 line = do
 
 wrapCompleter :: String -> (String -> GHCi [String]) -> CompletionFunc GHCi
 wrapCompleter breakChars fun = completeWord Nothing breakChars
-    $ fmap (map simpleCompletion) . fmap sort . fun
+    $ fmap (map simpleCompletion . nubSort) . fun
 
 wrapIdentCompleter :: (String -> GHCi [String]) -> CompletionFunc GHCi
 wrapIdentCompleter = wrapCompleter word_break_chars
 
 wrapIdentCompleterWithModifier :: String -> (Maybe Char -> String -> GHCi [String]) -> CompletionFunc GHCi
 wrapIdentCompleterWithModifier modifChars fun = completeWordWithPrev Nothing word_break_chars
-    $ \rest -> fmap (map simpleCompletion) . fmap sort . fun (getModifier rest)
+    $ \rest -> fmap (map simpleCompletion . nubSort) . fun (getModifier rest)
  where
   getModifier = find (`elem` modifChars)