[GHC] #13776: -ddump-splices produces unnecessarily qualified names for tuple and list types
GHC
ghc-devs at haskell.org
Sat Mar 17 19:15:36 UTC 2018
#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
More information about the ghc-tickets
mailing list