Refactor TcDeriv and TcGenDeriv
authorRyan Scott <ryan.gl.scott@gmail.com>
Thu, 6 Oct 2016 13:14:49 +0000 (09:14 -0400)
committerRyan Scott <ryan.gl.scott@gmail.com>
Thu, 6 Oct 2016 13:14:49 +0000 (09:14 -0400)
commit4a03012aeb4cb6685221b30aea2b1a78145d902b
tree43c9c13c18d31fa5b421211155355011b0d1403f
parent58ecdf83ff8790b49bdfcba628d189229f81d2a0
Refactor TcDeriv and TcGenDeriv

Summary:
Keeping a promise I made to Simon to clean up these modules.

This change splits up the massive `TcDeriv` and `TcGenDeriv` modules into
somewhat more manageable pieces. The new modules are:

* `TcGenFunctor`: This contains the deriving machinery for `Functor`,
  `Foldable`, and `Traversable` (which all use the same underlying algorithm).
* `TcDerivInfer`: This is the new home for `inferConstraints`,
  `simplifyInstanceContexts`, and related functions, whose role is to come up
  with the derived instance context and subsequently simplify it.
* `TcDerivUtils`: This is a grab-bag module that contains several
  error-checking utilities originally in `TcDeriv`, as well as some functions
  that `TcDeriv` and `TcDerivInfer` both need.

The end result is that `TcDeriv` is now less than 1,600 SLOC (originally 2,686
SLOC), and `TcGenDeriv` is now about 2,000 SLOC (originally 2,964).

In addition, this also implements a couple of tiny refactorings:

* I transformed `type Condition = (DynFlags, TyCon) -> Validity` into
  `type Condition = DynFlags -> TyCon -> Validity`
* I killed the `DerivSpecGeneric` constructor for `DerivSpecMechanism`, and
  merged its functionality into `DerivSpecStock`. In addition,
  `hasStockDeriving` now contains key-value pairs for `Generic` and `Generic1`,
  so they're no longer treated as an awkward special case in `TcDeriv`.

Test Plan: ./validate

Reviewers: simonpj, austin, bgamari

Reviewed By: simonpj

Subscribers: thomie, mpickering

Differential Revision: https://phabricator.haskell.org/D2568
compiler/ghc.cabal.in
compiler/typecheck/TcDeriv.hs
compiler/typecheck/TcDerivInfer.hs [new file with mode: 0644]
compiler/typecheck/TcDerivUtils.hs [new file with mode: 0644]
compiler/typecheck/TcGenDeriv.hs
compiler/typecheck/TcGenFunctor.hs [new file with mode: 0644]
compiler/typecheck/TcGenGenerics.hs