Re-factor TcCanonical (again), fixes Trac #8603
authorSimon Peyton Jones <simonpj@microsoft.com>
Sat, 28 Dec 2013 12:28:52 +0000 (12:28 +0000)
committerSimon Peyton Jones <simonpj@microsoft.com>
Sat, 28 Dec 2013 12:51:58 +0000 (12:51 +0000)
commit8721743e88f4c8c385eb0ceb0ca6804b2143a8fa
treec1f1aef47c9732168b6359a5c4c377f6996959aa
parenta6f6169a9939525c859b274955e8606d6080100f
Re-factor TcCanonical (again), fixes Trac #8603

This is a substantial refactoring of the canonicaliser. The proximate
cause was that we were sometimes failing to correctly orient a
tyvar/tyvar equality (x ~ y), because the kind of x or y was not fully
zonked at the moment we compared them.  That in turn led me to look
closely at the way that canEvNC (which decomposes equalities) worked.

* The big change is that the 'reOrient' and 'classify' functions are gone,
  along with classify's 'TypeClassifier' return type.  Instead the
  re-orientation is built into canEqNC.  When we find a type variable
  we divert into canEqTyVar, and so on, very much as in TcUnify.

* TcCanonical.canEqTyVar, canEqLeafFun, etc now carry a SwapFlag (to
  reduce duplication), just as in TcUnify; now SwapFlag itself is
  defined in BasicTypes

* I renamed TcSMonad.rewriteCtFlavor to rewriteEvidence,

* I added a new specialised version of rewriteEvidence, called
  TcSMonad.rewriteEqEvidence.  It is easier to use, and removes
  the crafty but brain-mangling higher order casts that we were
  using before.

The result is not exactly simpler, but it's pretty clear and, I think,
significantly more efficient.  And it fixes Trac #8603!
compiler/basicTypes/BasicTypes.lhs
compiler/typecheck/TcCanonical.lhs
compiler/typecheck/TcSMonad.lhs