Fix CodingStyle#Warnings URLs
[ghc-hetmet.git] / compiler / typecheck / TcHsSyn.lhs
index 9fa0d6b..4c76b42 100644 (file)
@@ -1,18 +1,28 @@
 %
+% (c) The University of Glasgow 2006
 % (c) The AQUA Project, Glasgow University, 1996-1998
 %
-\section[TcHsSyn]{Specialisations of the @HsSyn@ syntax for the typechecker}
+
+TcHsSyn: Specialisations of the @HsSyn@ syntax for the typechecker
 
 This module is an extension of @HsSyn@ syntax, for use in the type
 checker.
 
 \begin{code}
+{-# OPTIONS -w #-}
+-- The above warning supression flag is a temporary kludge.
+-- While working on this module you are encouraged to remove it and fix
+-- any warnings in the module. See
+--     http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
+-- for details
+
 module TcHsSyn (
        mkHsConApp, mkHsDictLet, mkHsApp,
        hsLitType, hsLPatType, hsPatType, 
        mkHsAppTy, mkSimpleHsAlt,
        nlHsIntLit, mkVanillaTuplePat,
        
+       mkArbitraryType,        -- Put this elsewhere?
 
        -- re-exported from TcMonad
        TcId, TcIdSet, TcDictBinds,
@@ -27,30 +37,24 @@ module TcHsSyn (
 import HsSyn   -- oodles of it
 
 -- others:
-import Id      ( idType, setIdType, Id )
+import Id
 
 import TcRnMonad
-import Type      ( Type, isLiftedTypeKind, liftedTypeKind, isSubKind, eqKind  )
-import TcType    ( TcType, TcTyVar, mkTyVarTy, mkTyConApp, isImmutableTyVar )
-import qualified  Type
-import TcMType   ( zonkQuantifiedTyVar, zonkType, zonkTcType, writeMetaTyVar )
-import TysPrim   ( charPrimTy, intPrimTy, floatPrimTy,
-                   doublePrimTy, addrPrimTy
-                 )
-import TysWiredIn ( charTy, stringTy, intTy, 
-                   mkListTy, mkPArrTy, mkTupleTy, unitTy,
-                   voidTy, listTyCon, tupleTyCon )
-import TyCon     ( mkPrimTyCon, tyConKind, PrimRep(..) )
-import {- Kind parts of -} Type          ( splitKindFunTys )
-import Name      ( Name, getOccName, mkInternalName, mkDerivedTyConOcc )
-import Var       ( Var, isId, isLocalVar, tyVarKind )
+import Type
+import TcType
+import TcMType
+import TysPrim
+import TysWiredIn
+import TyCon
+import Name
+import Var
 import VarSet
 import VarEnv
-import BasicTypes ( Boxity(..), IPName(..), ipNameName, mapIPName )
-import Maybes    ( orElse )
-import Unique    ( Uniquable(..) )
-import SrcLoc    ( noSrcLoc, noLoc, Located(..), unLoc )
-import Util      ( mapSnd )
+import BasicTypes
+import Maybes
+import Unique
+import SrcLoc
+import Util
 import Bag
 import Outputable
 \end{code}
@@ -89,11 +93,6 @@ hsPatType (SigPatOut pat ty)     = ty
 hsPatType (NPat lit _ _ ty)        = ty
 hsPatType (NPlusKPat id _ _ _)      = idType (unLoc id)
 hsPatType (CoPat _ _ ty)           = ty
-hsPatType (DictPat ds ms)           = case (ds ++ ms) of
-                                      []  -> unitTy
-                                      [d] -> idType d
-                                      ds  -> mkTupleTy Boxed (length ds) (map idType ds)
-
 
 hsLitType :: HsLit -> TcType
 hsLitType (HsChar c)       = charTy
@@ -120,7 +119,7 @@ hsLitType (HsDoublePrim d) = doublePrimTy
 zonkId :: TcId -> TcM TcId
 zonkId id
   = zonkTcType (idType id) `thenM` \ ty' ->
-    returnM (setIdType id ty')
+    returnM (Id.setIdType id ty')
 \end{code}
 
 The rest of the zonking is done *after* typechecking.
@@ -189,7 +188,7 @@ zonkIdOccs env ids = map (zonkIdOcc env) ids
 zonkIdBndr :: ZonkEnv -> TcId -> TcM Id
 zonkIdBndr env id
   = zonkTcTypeToType env (idType id)   `thenM` \ ty' ->
-    returnM (setIdType id ty')
+    returnM (Id.setIdType id ty')
 
 zonkIdBndrs :: ZonkEnv -> [TcId] -> TcM [Id]
 zonkIdBndrs env ids = mappM (zonkIdBndr env) ids
@@ -305,11 +304,12 @@ zonk_bind env (AbsBinds { abs_tvs = tyvars, abs_dicts = dicts,
        = zonkIdBndr env global                 `thenM` \ new_global ->
          mapM zonk_prag prags                  `thenM` \ new_prags -> 
          returnM (tyvars, new_global, zonkIdOcc env local, new_prags)
-    zonk_prag prag@(InlinePrag {})  = return prag
-    zonk_prag (SpecPrag expr ty ds inl) = do { expr' <- zonkExpr env expr 
-                                            ; ty'   <- zonkTcTypeToType env ty
-                                            ; let ds' = zonkIdOccs env ds
-                                            ; return (SpecPrag expr' ty' ds' inl) }
+    zonk_prag prag@(L _ (InlinePrag {}))  = return prag
+    zonk_prag (L loc (SpecPrag expr ty ds inl))
+       = do { expr' <- zonkExpr env expr 
+            ; ty'   <- zonkTcTypeToType env ty
+            ; let ds' = zonkIdOccs env ds
+            ; return (L loc (SpecPrag expr' ty' ds' inl)) }
 \end{code}
 
 %************************************************************************
@@ -459,16 +459,16 @@ zonkExpr env (ExplicitTuple exprs boxed)
     returnM (ExplicitTuple new_exprs boxed)
 
 zonkExpr env (RecordCon data_con con_expr rbinds)
-  = zonkExpr env con_expr      `thenM` \ new_con_expr ->
-    zonkRbinds env rbinds      `thenM` \ new_rbinds ->
-    returnM (RecordCon data_con new_con_expr new_rbinds)
+  = do { new_con_expr <- zonkExpr env con_expr
+       ; new_rbinds   <- zonkRecFields env rbinds
+       ; return (RecordCon data_con new_con_expr new_rbinds) }
 
-zonkExpr env (RecordUpd expr rbinds in_ty out_ty)
-  = zonkLExpr env expr         `thenM` \ new_expr ->
-    zonkTcTypeToType env in_ty `thenM` \ new_in_ty ->
-    zonkTcTypeToType env out_ty        `thenM` \ new_out_ty ->
-    zonkRbinds env rbinds      `thenM` \ new_rbinds ->
-    returnM (RecordUpd new_expr new_rbinds new_in_ty new_out_ty)
+zonkExpr env (RecordUpd expr rbinds cons in_tys out_tys)
+  = do { new_expr    <- zonkLExpr env expr
+       ; new_in_tys  <- mapM (zonkTcTypeToType env) in_tys
+       ; new_out_tys <- mapM (zonkTcTypeToType env) out_tys
+       ; new_rbinds  <- zonkRecFields env rbinds
+       ; return (RecordUpd new_expr new_rbinds cons new_in_tys new_out_tys) }
 
 zonkExpr env (ExprWithTySigOut e ty) 
   = do { e' <- zonkLExpr env e
@@ -490,6 +490,10 @@ zonkExpr env (HsSCC lbl expr)
   = zonkLExpr env expr `thenM` \ new_expr ->
     returnM (HsSCC lbl new_expr)
 
+zonkExpr env (HsTickPragma info expr)
+  = zonkLExpr env expr `thenM` \ new_expr ->
+    returnM (HsTickPragma info new_expr)
+
 -- hdaume: core annotations
 zonkExpr env (HsCoreAnn lbl expr)
   = zonkLExpr env expr   `thenM` \ new_expr ->
@@ -561,6 +565,8 @@ zonkOverLit env (HsIntegral i e)
   = do { e' <- zonkExpr env e; return (HsIntegral i e') }
 zonkOverLit env (HsFractional r e)
   = do { e' <- zonkExpr env e; return (HsFractional r e') }
+zonkOverLit env (HsIsString s e)
+  = do { e' <- zonkExpr env e; return (HsIsString s e') }
 
 -------------------------------------------------------------------------
 zonkArithSeq :: ZonkEnv -> ArithSeqInfo TcId -> TcM (ArithSeqInfo Id)
@@ -640,19 +646,19 @@ zonkStmt env (BindStmt pat expr bind_op fail_op)
 
 
 -------------------------------------------------------------------------
-zonkRbinds :: ZonkEnv -> HsRecordBinds TcId -> TcM (HsRecordBinds Id)
-
-zonkRbinds env rbinds
-  = mappM zonk_rbind rbinds
+zonkRecFields :: ZonkEnv -> HsRecordBinds TcId -> TcM (HsRecordBinds TcId)
+zonkRecFields env (HsRecFields flds dd)
+  = do { flds' <- mappM zonk_rbind flds
+       ; return (HsRecFields flds' dd) }
   where
-    zonk_rbind (field, expr)
-      = zonkLExpr env expr     `thenM` \ new_expr ->
-       returnM (fmap (zonkIdOcc env) field, new_expr)
+    zonk_rbind fld
+      = do { new_expr <- zonkLExpr env (hsRecFieldArg fld)
+          ; return (fld { hsRecFieldArg = new_expr }) }
+       -- Field selectors have declared types; hence no zonking
 
 -------------------------------------------------------------------------
 mapIPNameTc :: (a -> TcM b) -> IPName a -> TcM (IPName b)
-mapIPNameTc f (Dupable n) = f n  `thenM` \ r -> returnM (Dupable r)
-mapIPNameTc f (Linear  n) = f n  `thenM` \ r -> returnM (Linear r)
+mapIPNameTc f (IPName n) = f n  `thenM` \ r -> returnM (IPName r)
 \end{code}
 
 
@@ -748,11 +754,6 @@ zonk_pat env (NPlusKPat (L loc n) lit e1 e2)
        ; e2' <- zonkExpr env e2
        ; return (extendZonkEnv1 env n', NPlusKPat (L loc n') lit' e1' e2') }
 
-zonk_pat env (DictPat ds ms)
-  = do { ds' <- zonkIdBndrs env ds
-       ; ms' <- zonkIdBndrs env ms
-       ; return (extendZonkEnv env (ds' ++ ms'), DictPat ds' ms') }
-
 zonk_pat env (CoPat co_fn pat ty) 
   = do { (env', co_fn') <- zonkCoFn env co_fn
        ; (env'', pat') <- zonkPat env' (noLoc pat)
@@ -771,17 +772,17 @@ zonkConStuff env (InfixCon p1 p2)
        ; (env', p2') <- zonkPat env1 p2
        ; return (env', InfixCon p1' p2') }
 
-zonkConStuff env (RecCon rpats)
-  = do { (env', pats') <- zonkPats env pats
-       ; returnM (env', RecCon (fields `zip` pats')) }
-  where
-    (fields, pats) = unzip rpats
+zonkConStuff env (RecCon (HsRecFields rpats dd))
+  = do { (env', pats') <- zonkPats env (map hsRecFieldArg rpats)
+       ; let rpats' = zipWith (\rp p' -> rp { hsRecFieldArg = p' }) rpats pats'
+       ; returnM (env', RecCon (HsRecFields rpats' dd)) }
+       -- Field selectors have declared types; hence no zonking
 
 ---------------------------
 zonkPats env []                = return (env, [])
 zonkPats env (pat:pats) = do { (env1, pat') <- zonkPat env pat
-                            ; (env', pats') <- zonkPats env1 pats
-                            ; return (env', pat':pats') }
+                    ; (env', pats') <- zonkPats env1 pats
+                    ; return (env', pat':pats') }
 \end{code}
 
 %************************************************************************
@@ -923,24 +924,22 @@ mkArbitraryType :: TcTyVar -> Type
 -- Make up an arbitrary type whose kind is the same as the tyvar.
 -- We'll use this to instantiate the (unbound) tyvar.
 mkArbitraryType tv 
-  | liftedTypeKind `isSubKind` kind = voidTy           -- The vastly common case
+  | liftedTypeKind `isSubKind` kind = anyPrimTy                -- The vastly common case
   | otherwise                      = mkTyConApp tycon []
   where
     kind       = tyVarKind tv
     (args,res) = splitKindFunTys kind
 
-    tycon | eqKind kind (tyConKind listTyCon)  --  *->*
-         = listTyCon                           -- No tuples this size
+    tycon | eqKind kind (tyConKind anyPrimTyCon1)      --  *->*
+         = anyPrimTyCon1                               -- No tuples this size
 
          | all isLiftedTypeKind args && isLiftedTypeKind res
          = tupleTyCon Boxed (length args)      --  *-> ... ->*->*
+               -- Horrible hack to make less use of mkAnyPrimTyCon
 
          | otherwise
-         = pprTrace "Urk! Inventing strangely-kinded void TyCon:" (ppr tc_name $$ ppr kind) $
-           mkPrimTyCon tc_name kind 0 VoidRep
+         = mkAnyPrimTyCon (getUnique tv) kind
                -- Same name as the tyvar, apart from making it start with a colon (sigh)
                -- I dread to think what will happen if this gets out into an 
                -- interface file.  Catastrophe likely.  Major sigh.
-
-    tc_name = mkInternalName (getUnique tv) (mkDerivedTyConOcc (getOccName tv)) noSrcLoc
 \end{code}