Avoid mangled/derived names in GHCi autocomplete (fixes #11328)
authorAdam Gundry <adam@well-typed.com>
Mon, 1 Feb 2016 15:41:03 +0000 (16:41 +0100)
committerBen Gamari <ben@smart-cactus.org>
Mon, 1 Feb 2016 21:12:52 +0000 (22:12 +0100)
This changes `getRdrNamesInScope` to use field labels rather than
selector names for fields from modules with `DuplicateRecordFields`
enabled. Moreover, it filters out derived names (e.g. type
representation bindings) that shouldn't show up in autocomplete.

Test Plan: New test ghci/should_run/T11328

Reviewers: kolmodin, austin, bgamari, simonpj

Reviewed By: bgamari, simonpj

Subscribers: simonpj, thomie

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

GHC Trac Issues: #11328

compiler/basicTypes/RdrName.hs
compiler/main/InteractiveEval.hs
testsuite/tests/ghci/should_run/T11328.script [new file with mode: 0644]
testsuite/tests/ghci/should_run/T11328.stdout [new file with mode: 0644]
testsuite/tests/ghci/should_run/all.T

index 6e0350d..62771e9 100644 (file)
@@ -629,10 +629,10 @@ greUsedRdrName gre@GRE{ gre_name = name, gre_lcl = lcl, gre_imp = iss }
     occ = greOccName gre
 
 greRdrNames :: GlobalRdrElt -> [RdrName]
-greRdrNames GRE{ gre_name = name, gre_lcl = lcl, gre_imp = iss }
+greRdrNames gre@GRE{ gre_lcl = lcl, gre_imp = iss }
   = (if lcl then [unqual] else []) ++ concatMap do_spec (map is_decl iss)
   where
-    occ    = nameOccName name
+    occ    = greOccName gre
     unqual = Unqual occ
     do_spec decl_spec
         | is_qual decl_spec = [qual]
index b66a4f8..ac4c60e 100644 (file)
@@ -800,13 +800,16 @@ getNamesInScope :: GhcMonad m => m [Name]
 getNamesInScope = withSession $ \hsc_env -> do
   return (map gre_name (globalRdrEnvElts (ic_rn_gbl_env (hsc_IC hsc_env))))
 
+-- | Returns all 'RdrName's in scope in the current interactive
+-- context, excluding any that are internally-generated.
 getRdrNamesInScope :: GhcMonad m => m [RdrName]
 getRdrNamesInScope = withSession $ \hsc_env -> do
   let
       ic = hsc_IC hsc_env
       gbl_rdrenv = ic_rn_gbl_env ic
       gbl_names = concatMap greRdrNames $ globalRdrEnvElts gbl_rdrenv
-  return gbl_names
+  -- Exclude internally generated names; see e.g. Trac #11328
+  return (filter (not . isDerivedOccName . rdrNameOcc) gbl_names)
 
 
 -- | Parses a string as an identifier, and returns the list of 'Name's that
diff --git a/testsuite/tests/ghci/should_run/T11328.script b/testsuite/tests/ghci/should_run/T11328.script
new file mode 100644 (file)
index 0000000..410e4b7
--- /dev/null
@@ -0,0 +1,4 @@
+:seti -XDuplicateRecordFields
+data T = MkT { foo :: Int }
+:complete repl "foo"
+:complete repl "$"
diff --git a/testsuite/tests/ghci/should_run/T11328.stdout b/testsuite/tests/ghci/should_run/T11328.stdout
new file mode 100644 (file)
index 0000000..272da79
--- /dev/null
@@ -0,0 +1,5 @@
+1 1 ""
+"foo"
+2 2 ""
+"$"
+"$!"
index 68c7407..930f14b 100644 (file)
@@ -22,3 +22,4 @@ test('T9914',      just_ghci, ghci_script, ['T9914.script'])
 test('T9915',      just_ghci, ghci_script, ['T9915.script'])
 test('T10145',     just_ghci, ghci_script, ['T10145.script'])
 test('T7253',      just_ghci, ghci_script, ['T7253.script'])
+test('T11328',     just_ghci, ghci_script, ['T11328.script'])