Add type "holes", enabled by -XTypeHoles, Trac #5910
authorSimon Peyton Jones <simonpj@microsoft.com>
Mon, 17 Sep 2012 12:31:14 +0000 (13:31 +0100)
committerSimon Peyton Jones <simonpj@microsoft.com>
Mon, 17 Sep 2012 12:31:14 +0000 (13:31 +0100)
commit8a9a7a8c42da3adb603f319a74e304af5e1b2128
treec755e147069325e7aeabf93970a611fcccb5d756
parentb0db9308017fc14b600b3a85d9c55a037f12ee9e
Add type "holes", enabled by -XTypeHoles, Trac #5910

This single commit combines a lot of work done by
Thijs Alkemade <thijsalkemade@gmail.com>, plus a slew
of subsequent refactoring by Simon PJ.

The basic idea is
* Add a new expression form "_", a hole, standing for a not-yet-written expression
* Give a useful error message that
   (a) gives the type of the hole
   (b) gives the types of some enclosing value bindings that
       mention the hole

Driven by this goal I did a LOT of refactoring in TcErrors, which in turn
allows us to report enclosing value bindings for other errors, not just
holes.  (Thijs rightly did not attempt this!)

The major data type change is a new form of constraint
  data Ct = ...
       | CHoleCan {
           cc_ev       :: CtEvidence,
           cc_hole_ty  :: TcTauType,
           cc_depth    :: SubGoalDepth }

I'm still in two minds about whether this is the best plan. Another
possibility would be to have a predicate type for holes, somthing like
   class Hole a where
     holeValue :: a

It works the way it is, but there are some annoying special cases for
CHoleCan (just grep for "CHoleCan").
20 files changed:
compiler/deSugar/Coverage.lhs
compiler/deSugar/DsExpr.lhs
compiler/hsSyn/HsExpr.lhs
compiler/main/DynFlags.hs
compiler/rename/RnExpr.lhs
compiler/typecheck/Inst.lhs
compiler/typecheck/TcBinds.lhs
compiler/typecheck/TcCanonical.lhs
compiler/typecheck/TcEnv.lhs
compiler/typecheck/TcErrors.lhs
compiler/typecheck/TcExpr.lhs
compiler/typecheck/TcHsSyn.lhs
compiler/typecheck/TcMType.lhs
compiler/typecheck/TcRnMonad.lhs
compiler/typecheck/TcRnTypes.lhs
compiler/typecheck/TcRules.lhs
compiler/typecheck/TcSMonad.lhs
compiler/typecheck/TcSimplify.lhs
compiler/typecheck/TcUnify.lhs
compiler/types/Type.lhs