X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Ftypecheck%2FTcMonoType.lhs;h=bd27cbdf4daa2645289b3bdee11d4a8286f2c3ec;hb=f9120c200bcf613b58d742802172fb4c08171f0d;hp=91b1677a3b13d5bf059ded12bb48f07102f7bfe3;hpb=0596517a9b4b2b32e5d375a986351102ac4540fc;p=ghc-hetmet.git diff --git a/ghc/compiler/typecheck/TcMonoType.lhs b/ghc/compiler/typecheck/TcMonoType.lhs index 91b1677..bd27cbd 100644 --- a/ghc/compiler/typecheck/TcMonoType.lhs +++ b/ghc/compiler/typecheck/TcMonoType.lhs @@ -12,7 +12,7 @@ import Ubiq{-uitous-} import HsSyn ( PolyType(..), MonoType(..), Fake ) import RnHsSyn ( RenamedPolyType(..), RenamedMonoType(..), - RenamedContext(..) + RenamedContext(..), RnName(..) ) @@ -24,9 +24,8 @@ import TcKind ( TcKind, mkTcTypeKind, mkBoxedTypeKind, mkTcArrowKind, unifyKind, newKindVar, kindToTcKind ) -import ErrUtils ( arityErr ) import Type ( GenType, Type(..), ThetaType(..), - mkTyVarTy, mkTyConTy, mkFunTy, mkAppTy, + mkTyVarTy, mkTyConTy, mkFunTy, mkAppTy, mkSynTy, mkSigmaTy ) import TyVar ( GenTyVar, TyVar(..), mkTyVar ) @@ -35,9 +34,11 @@ import Type ( mkDictTy ) import Class ( cCallishClassKeys ) import TyCon ( TyCon, Arity(..) ) import Unique ( Unique ) -import Name ( Name(..), getNameShortName, isTyConName, getSynNameArity ) import PprStyle import Pretty +import RnHsSyn ( isRnLocal, isRnClass, isRnTyCon, + RnName{-instance NamedThing-} + ) import Util ( zipWithEqual, panic ) \end{code} @@ -80,25 +81,17 @@ tcMonoTypeKind (MonoFunTy ty1 ty2) returnTc (mkTcTypeKind, mkFunTy tau_ty1 tau_ty2) tcMonoTypeKind (MonoTyApp name tys) - = mapAndUnzipTc tcMonoTypeKind tys `thenTc` \ (arg_kinds, arg_tys) -> - - tc_mono_name name `thenNF_Tc` \ (fun_kind, maybe_arity, fun_ty) -> - - newKindVar `thenNF_Tc` \ result_kind -> - unifyKind fun_kind (foldr mkTcArrowKind result_kind arg_kinds) `thenTc_` - - -- Check for saturated application in the special case of - -- type synoyms. - (case maybe_arity of - Just arity | arity /= n_args -> failTc (err arity) - other -> returnTc () - ) `thenTc_` - - returnTc (result_kind, foldl mkAppTy fun_ty arg_tys) - where - err arity = arityErr "Type synonym constructor" name arity n_args - n_args = length tys + | isRnLocal name -- Must be a type variable + = tcLookupTyVar name `thenNF_Tc` \ (kind,tyvar) -> + tcMonoTyApp kind (mkTyVarTy tyvar) tys +tcMonoTypeKind (MonoTyApp name tys) + | isRnTyCon name -- Must be a type constructor + = tcLookupTyCon name `thenNF_Tc` \ (kind,maybe_arity,tycon) -> + case maybe_arity of + Just arity -> tcSynApp name kind arity tycon tys -- synonum + Nothing -> tcMonoTyApp kind (mkTyConTy tycon) tys -- newtype or data + -- for unfoldings only: tcMonoTypeKind (MonoForAllTy tyvars_w_kinds ty) = tcTyVarScopeGivenKinds names tc_kinds (\ tyvars -> @@ -107,8 +100,10 @@ tcMonoTypeKind (MonoForAllTy tyvars_w_kinds ty) returnTc (mkTcTypeKind, ty') ) where - (names, kinds) = unzip tyvars_w_kinds + (rn_names, kinds) = unzip tyvars_w_kinds + names = map de_rn rn_names tc_kinds = map kindToTcKind kinds + de_rn (RnName n) = n -- for unfoldings only: tcMonoTypeKind (MonoDictTy class_name ty) @@ -116,19 +111,28 @@ tcMonoTypeKind (MonoDictTy class_name ty) tcLookupClass class_name `thenNF_Tc` \ (class_kind, clas) -> unifyKind class_kind arg_kind `thenTc_` returnTc (mkTcTypeKind, mkDictTy clas arg_ty) +\end{code} +Help functions for type applications +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +\begin{code} +tcMonoTyApp fun_kind fun_ty tys + = mapAndUnzipTc tcMonoTypeKind tys `thenTc` \ (arg_kinds, arg_tys) -> + newKindVar `thenNF_Tc` \ result_kind -> + unifyKind fun_kind (foldr mkTcArrowKind result_kind arg_kinds) `thenTc_` + returnTc (result_kind, foldl mkAppTy fun_ty arg_tys) -tc_mono_name :: Name -> NF_TcM s (TcKind s, Maybe Arity, Type) -tc_mono_name name@(Short _ _) -- Must be a type variable - = tcLookupTyVar name `thenNF_Tc` \ (kind,tyvar) -> - returnNF_Tc (kind, Nothing, mkTyVarTy tyvar) +tcSynApp name syn_kind arity tycon tys + = mapAndUnzipTc tcMonoTypeKind tys `thenTc` \ (arg_kinds, arg_tys) -> + newKindVar `thenNF_Tc` \ result_kind -> + unifyKind syn_kind (foldr mkTcArrowKind result_kind arg_kinds) `thenTc_` -tc_mono_name name | isTyConName name -- Must be a type constructor - = tcLookupTyCon name `thenNF_Tc` \ (kind,maybe_arity,tycon) -> - returnNF_Tc (kind, maybe_arity, mkTyConTy tycon) - -tc_mono_name name -- Renamer should have got it right - = panic ("tc_mono_name:" ++ ppShow 1000 (ppr PprDebug name)) + -- Check that it's applied to the right number of arguments + checkTc (arity == n_args) (err arity) `thenTc_` + returnTc (result_kind, mkSynTy tycon arg_tys) + where + err arity = arityErr "Type synonym constructor" name arity n_args + n_args = length tys \end{code} @@ -161,22 +165,24 @@ Doing this utterly wrecks the whole point of introducing these classes so we specifically check that this isn't being done. \begin{code} -canBeUsedInContext :: Name -> Bool -canBeUsedInContext (ClassName uniq _ _) = not (uniq `elem` cCallishClassKeys) -canBeUsedInContext other = True +canBeUsedInContext :: RnName -> Bool +canBeUsedInContext n + = isRnClass n && not (uniqueOf n `elem` cCallishClassKeys) \end{code} - Polytypes ~~~~~~~~~ \begin{code} tcPolyType :: RenamedPolyType -> TcM s Type tcPolyType (HsForAllTy tyvar_names context ty) - = tcTyVarScope tyvar_names (\ tyvars -> + = tcTyVarScope names (\ tyvars -> tcContext context `thenTc` \ theta -> tcMonoType ty `thenTc` \ tau -> returnTc (mkSigmaTy tyvars theta tau) ) + where + names = map de_rn tyvar_names + de_rn (RnName n) = n \end{code} Errors and contexts