-]%
+%
% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
%
\section[HsTypes]{Abstract syntax: user-defined types}
mkHsForAllTy exp tvs ctxt ty = HsForAllTy exp tvs ctxt ty
-- mk_forall_ty makes a pure for-all type (no context)
-mk_forall_ty Explicit [] ty = unLoc ty -- Explicit for-all with no tyvars
-mk_forall_ty exp tvs (L _ (HsParTy ty)) = mk_forall_ty exp tvs ty
+mk_forall_ty exp tvs (L _ (HsParTy ty)) = mk_forall_ty exp tvs ty
mk_forall_ty exp1 tvs1 (L _ (HsForAllTy exp2 tvs2 ctxt ty)) = mkHsForAllTy (exp1 `plus` exp2) (tvs1 ++ tvs2) ctxt ty
-mk_forall_ty exp tvs ty = HsForAllTy exp tvs (L noSrcSpan []) ty
+mk_forall_ty exp tvs ty = HsForAllTy exp tvs (L noSrcSpan []) ty
+ -- Even if tvs is empty, we still make a HsForAll!
+ -- In the Implicit case, this signals the place to do implicit quantification
+ -- In the Explicit case, it prevents implicit quantification
+ -- (see the sigtype production in Parser.y.pp)
+ -- so that (forall. ty) isn't implicitly quantified
Implicit `plus` Implicit = Implicit
exp1 `plus` exp2 = Explicit
split_tau tvs cxt (HsParTy (L _ ty)) = split_tau tvs cxt ty
-- Splits HsType into the (init, last) parts
+-- Breaks up any parens in the result type:
+-- splitHsFunType (a -> (b -> c)) = ([a,b], c)
splitHsFunType :: LHsType name -> ([LHsType name], LHsType name)
splitHsFunType (L l (HsFunTy x y)) = (x:args, res)
where
(args, res) = splitHsFunType y
-splitHsFunType other = ([], other)
+splitHsFunType (L _ (HsParTy ty)) = splitHsFunType ty
+splitHsFunType other = ([], other)
\end{code}