Clean up interaction between name cache and built-in syntax
authorBen Gamari <bgamari.foss@gmail.com>
Wed, 20 Jul 2016 10:34:54 +0000 (12:34 +0200)
committerBen Gamari <ben@smart-cactus.org>
Wed, 20 Jul 2016 13:58:02 +0000 (15:58 +0200)
commit9513fe6bdeafd35ca1a04e17b5f94732516766aa
tree7a18f5beb24e31e1b0af71d2450f9228685e6ad5
parented4809813fa51524ae73a4475afe33018a67f87d
Clean up interaction between name cache and built-in syntax

This cleans up various aspects of the handling of built-in syntax in the
original name cache (hopefully resulting in a nice reduction in compiler
allocations),

  * Remove tuple types from original name cache: There is really no
    reason for these to be in the name cache since we already handle
    them specially in interface files to ensure that we can resolve them
    directly to Names, avoiding extraneous name cache lookups.

  * Sadly it's not possible to remove all traces of tuples from the
    name cache, however. Namely we need to keep the tuple type
    representations in since otherwise they would need to be wired-in

  * Remove the special cases for (:), [], and (##) in isBuiltInOcc_maybe
    and rename it to isTupleOcc_maybe

  * Split lookupOrigNameCache into two variants,

     * lookupOrigNameCache': Merely looks up an OccName in the original
       name cache, making no attempt to resolve tuples

     * lookupOrigNameCache: Like the above but handles tuples as well.
       This is given the un-primed name since it does the "obvious"
       thing from the perspective of an API user, who knows nothing of
       our special treatment of tuples.

Arriving at this design took a significant amount of iteration. The
trail of debris leading here can be found in #11357.

Thanks to ezyang and Simon for all of their help in coming to this
solution.

Test Plan: Validate

Reviewers: goldfire, simonpj, austin

Reviewed By: simonpj

Subscribers: thomie, ezyang

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

GHC Trac Issues: #11357
compiler/iface/BinIface.hs
compiler/iface/IfaceEnv.hs
compiler/prelude/PrelInfo.hs
compiler/prelude/PrelNames.hs
compiler/prelude/TysWiredIn.hs
compiler/typecheck/TcTypeable.hs