Fix #12525: Remove derived bindings from the TyThings from getBindings
authorRoland Senn <rsx@bluewin.ch>
Sat, 17 Nov 2018 11:22:23 +0000 (12:22 +0100)
committerKrzysztof Gogolewski <krz.gogolewski@gmail.com>
Sat, 17 Nov 2018 12:51:58 +0000 (13:51 +0100)
Summary:
Remove derived OccNames from the list of TyThings returned by the function GHC.getBindings.
Therefore the output of the `:show bindings `command will not contain names generated by GHC.

Test Plan: make test TEST=T12525

Reviewers: austin, hvr, alanz, angerman, thomie, bgamari, osa1

Reviewed By: osa1

Subscribers: simonpj, osa1, rwbarton, carter

GHC Trac Issues: #12525

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

ghc/GHCi/UI.hs
testsuite/tests/ghci/should_run/T12525.script [new file with mode: 0644]
testsuite/tests/ghci/should_run/T12525.stdout [new file with mode: 0644]
testsuite/tests/ghci/should_run/all.T

index bfcaabf..3de49b4 100644 (file)
@@ -2927,10 +2927,12 @@ showBindings :: GHCi ()
 showBindings = do
     bindings <- GHC.getBindings
     (insts, finsts) <- GHC.getInsts
-    docs     <- mapM makeDoc (reverse bindings)
-                  -- reverse so the new ones come last
     let idocs  = map GHC.pprInstanceHdr insts
         fidocs = map GHC.pprFamInst finsts
+        binds = filter (not . isDerivedOccName . getOccName) bindings -- #12525
+        -- See Note [Filter bindings]
+    docs <- mapM makeDoc (reverse binds)
+                  -- reverse so the new ones come last
     mapM_ printForUserPartWay (docs ++ idocs ++ fidocs)
   where
     makeDoc (AnId i) = pprTypeAndContents i
@@ -2951,6 +2953,29 @@ showBindings = do
 printTyThing :: TyThing -> GHCi ()
 printTyThing tyth = printForUser (pprTyThing showToHeader tyth)
 
+{-
+Note [Filter bindings]
+~~~~~~~~~~~~~~~~~~~~~~
+
+If we don't filter the bindings returned by the function GHC.getBindings,
+then the :show bindings command will also show unwanted bound names,
+internally generated by GHC, eg:
+    $tcFoo :: GHC.Types.TyCon = _
+    $trModule :: GHC.Types.Module = _ .
+
+The filter was introduced as a fix for Trac #12525 [1]. Comment:1 [2] to this
+ticket contains an analysis of the situation and suggests the solution
+implemented above.
+
+The same filter was also implemented to fix Trac #11051 [3]. See the
+Note [What to show to users] in compiler/main/InteractiveEval.hs
+
+[1] https://ghc.haskell.org/trac/ghc/ticket/12525
+[2] https://ghc.haskell.org/trac/ghc/ticket/12525#comment:1
+[3] https://ghc.haskell.org/trac/ghc/ticket/11051
+-}
+
+
 showBkptTable :: GHCi ()
 showBkptTable = do
   st <- getGHCiState
diff --git a/testsuite/tests/ghci/should_run/T12525.script b/testsuite/tests/ghci/should_run/T12525.script
new file mode 100644 (file)
index 0000000..db0dec0
--- /dev/null
@@ -0,0 +1,4 @@
+x = ()
+let y = ()
+class Foo a
+:show bindings
diff --git a/testsuite/tests/ghci/should_run/T12525.stdout b/testsuite/tests/ghci/should_run/T12525.stdout
new file mode 100644 (file)
index 0000000..31049e1
--- /dev/null
@@ -0,0 +1,3 @@
+x :: () = _
+y :: () = ()
+class Foo a
index 855b603..3dfea76 100644 (file)
@@ -27,6 +27,7 @@ test('T11328',     just_ghci, ghci_script, ['T11328.script'])
 test('T11825',     just_ghci, ghci_script, ['T11825.script'])
 test('T12128',     just_ghci, ghci_script, ['T12128.script'])
 test('T12456',     just_ghci, ghci_script, ['T12456.script'])
+test('T12525',     just_ghci, ghci_script, ['T12525.script'])
 test('T12549',     just_ghci, ghci_script, ['T12549.script'])
 test('BinaryArray', normal, compile_and_run, [''])
 test('T14125a',    just_ghci, ghci_script, ['T14125a.script'])