[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