Refactor default methods (Trac #11105)
authorSimon Peyton Jones <simonpj@microsoft.com>
Wed, 25 Nov 2015 16:26:23 +0000 (16:26 +0000)
committerSimon Peyton Jones <simonpj@microsoft.com>
Wed, 25 Nov 2015 16:30:49 +0000 (16:30 +0000)
commit924f851700ca9ba7e0e7483b7ca4de62a4a74e15
treebcacf0da46fea79b1809bbde1a72f21d57c84a27
parent9032d0565f6a6f1e63e6d0ba79ee2371b9d823fc
Refactor default methods (Trac #11105)

This patch does some signficant refactoring to the treatment
of default methods in class declarations, and more generally
to the type checking of type/class decls.

Highlights:

* When the class has a generic-default method, such as
     class C a where
       op :: a -> a -> Bool
       default op :: Ord a => a -> a -> a
  the ClassOpItem records the type of the generic-default,
  in this case the type (Ord a => a -> a -> a)

* I killed off Class.DefMeth in favour of the very-similar
  BasicTypes.DefMethSpec.  However it turned out to be better
  to use a Maybe, thus
      Maybe (DefMethSpec Type)
  with Nothing meaning "no default method".

* In TcTyClsDecls.tcTyClGroup, we used to accumulate a [TyThing],
  but I found a way to make it much simpler, accumulating only
  a [TyCon].  Much less wrapping and unwrapping.

* On the way I also fixed Trac #10896 in a better way. Instead
  of killing off all ambiguity checks whenever there are any type
  errors (the fix in commit 8e8b9ed), I instead recover in
  TcTyClsDecls.checkValidTyCl.

There was a lot of associated simplification all round
25 files changed:
compiler/basicTypes/BasicTypes.hs
compiler/hsSyn/HsDecls.hs
compiler/iface/BuildTyCl.hs
compiler/iface/IfaceSyn.hs
compiler/iface/IfaceType.hs
compiler/iface/MkIface.hs
compiler/iface/TcIface.hs
compiler/main/HscTypes.hs
compiler/typecheck/TcClassDcl.hs
compiler/typecheck/TcDeriv.hs
compiler/typecheck/TcEnv.hs
compiler/typecheck/TcInstDcls.hs
compiler/typecheck/TcRnDriver.hs
compiler/typecheck/TcSplice.hs
compiler/typecheck/TcTyClsDecls.hs
compiler/typecheck/TcTyDecls.hs
compiler/typecheck/TcTypeable.hs
compiler/typecheck/TcValidity.hs
compiler/types/Class.hs
compiler/types/TyCon.hs
compiler/utils/Binary.hs
compiler/vectorise/Vectorise/Type/TyConDecl.hs
testsuite/tests/th/T9064.stderr
testsuite/tests/typecheck/should_fail/T5300.stderr
testsuite/tests/typecheck/should_fail/T8030.stderr