
That sounds great! I never got around to working on this myself, feel free
:)
On Sun, Mar 18, 2018, 00:45 GHC
#13776: -ddump-splices produces unnecessarily qualified names for tuple and list types -------------------------------------+------------------------------------- Reporter: RyanGlScott | Owner: mrkgnao Type: bug | Status: new Priority: normal | Milestone: Component: Template Haskell | Version: 8.0.1 Resolution: | Keywords: newcomer Operating System: Unknown/Multiple | Architecture: | Unknown/Multiple Type of failure: None/Unknown | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Rev(s): Wiki Page: | -------------------------------------+-------------------------------------
Comment (by ckoparkar):
I'd like to work on this, if that's OK with @mrkgnao.
I have a patch on my local machine that does the right thing for the examples posted in the description (and some tests: `th/T3319`, `th/T5700`, `th/TH_foreignInterruptible`). While I work on submitting that on Phabricator, I wanted to post a summary here and get some early feedback.
(1) It seems that `showName` doesn't play a role in pretty-printing the splices with `-ddump-splices`. Instead, the `Outputable` instances in GHC do most of the work. Specifically, `Outputable RdrName` is responsible for printing out the fully qualified names in question.
(2) When the Renamer typechecks & runs a splice (`RnSplice.runRnSplice`), it converts the splice to `HsSyn RdrName` (hence the `Outputable RdrName`). `TcSplice.lookupThName` is involved in the process, which converts a `TH.Name` to `Name` via `Convert.thRdrNameGuesses`.
(3) For primitives like `[]`, `(:)` etc. `TH.dataToQa` generates a fully qualified global name, i.e `NameG NameSpace PkgName ModName`. And the corresponding `RdrName` generated by `thRdrNameGuesses` is also fully qualified (`Orig Module OccName`). But this is not what we want for built- in syntax.
(4) So the "patch" is a simple change to modify this behavior. If `thOrigRdrName` is dealing with built-in syntax, it returns an `Exact Name` instead.
{{{#!haskell
thOrigRdrName :: String -> TH.NameSpace -> PkgName -> ModName -> RdrName thOrigRdrName occ th_ns pkg mod = let occ' = mk_occ (mk_ghc_ns th_ns) occ in case isBuiltInOcc_maybe occ' of Just name -> nameRdrName name Nothing -> (mkOrig $! (mkModule (mk_pkg pkg) (mk_mod mod))) $! occ'
}}}
I ran the testsuite, and apart from some `perf` tests, almost everything else worked.
These tests fail:
{{{ ghci/linking/ghcilink003.run ghcilink003 [bad exit code] (normal)
ghci/linking/ghcilink006.run ghcilink006 [bad exit code] (normal)
th/T13366.run -- (gcc: error trying to exec 'cc1plus': execvp: -- No such file or directory) }}}
but there's a good chance that this is unrelated to the patch.
Does the overall approach seem reasonable ? I'll submit a patch soon.
-- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/13776#comment:5 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler