[project @ 1996-07-25 20:43:49 by partain]
[ghc-hetmet.git] / ghc / compiler / typecheck / TcModule.lhs
index 006777a..113c82e 100644 (file)
@@ -8,23 +8,22 @@
 
 module TcModule (
        typecheckModule,
-       TcResults(..),
-       TcResultBinds(..),
-       TcIfaceInfo(..),
-       TcLocalTyConsAndClasses(..),
-       TcSpecialiseRequests(..),
-       TcDDumpDeriv(..)
+       SYN_IE(TcResults),
+       SYN_IE(TcResultBinds),
+       SYN_IE(TcIfaceInfo),
+       SYN_IE(TcSpecialiseRequests),
+       SYN_IE(TcDDumpDeriv)
     ) where
 
-import Ubiq{-uitous-}
+IMP_Ubiq(){-uitous-}
 
 import HsSyn           ( HsModule(..), HsBinds(..), Bind, HsExpr,
                          TyDecl, SpecDataSig, ClassDecl, InstDecl,
                          SpecInstSig, DefaultDecl, Sig, Fake, InPat,
                          FixityDecl, IE, ImportDecl
                        )
-import RnHsSyn         ( RenamedHsModule(..), RenamedFixityDecl(..) )
-import TcHsSyn         ( TypecheckedHsBinds(..), TypecheckedHsExpr(..),
+import RnHsSyn         ( SYN_IE(RenamedHsModule), RenamedFixityDecl(..) )
+import TcHsSyn         ( SYN_IE(TypecheckedHsBinds), SYN_IE(TypecheckedHsExpr),
                          TcIdOcc(..), zonkBinds, zonkDictBinds )
 
 import TcMonad         hiding ( rnMtoTcM )
@@ -35,6 +34,7 @@ import TcDefaults     ( tcDefaults )
 import TcEnv           ( tcExtendGlobalValEnv, getEnv_LocalIds,
                          getEnv_TyCons, getEnv_Classes,
                          tcLookupLocalValueByKey, tcLookupTyConByKey )
+import SpecEnv         ( SpecEnv )
 import TcIfaceSig      ( tcInterfaceSigs )
 import TcInstDcls      ( tcInstDecls1, tcInstDecls2 )
 import TcInstUtil      ( buildInstanceEnvs, InstInfo )
@@ -44,23 +44,23 @@ import TcTyDecls    ( mkDataBinds )
 
 import Bag             ( listToBag )
 import Class           ( GenClass, classSelIds )
-import ErrUtils                ( Warning(..), Error(..) )
-import Id              ( GenId, isDataCon, isMethodSelId, idType, IdEnv(..), nullIdEnv )
+import ErrUtils                ( SYN_IE(Warning), SYN_IE(Error) )
+import Id              ( idType, isMethodSelId, isTopLevId, GenId, SYN_IE(IdEnv), nullIdEnv )
 import Maybes          ( catMaybes )
-import Name            ( isExported, isLocallyDefined )
+import Name            ( isLocallyDefined )
 import Pretty
-import RnUtils         ( RnEnv(..) )
-import TyCon           ( isDataTyCon, TyCon )
-import Type            ( mkSynTy )
+import RnUtils         ( SYN_IE(RnEnv) )
+import TyCon           ( TyCon )
+import Type            ( applyTyCon )
 import TysWiredIn      ( unitTy, mkPrimIoTy )
-import TyVar           ( TyVarEnv(..), nullTyVarEnv )
+import TyVar           ( SYN_IE(TyVarEnv), nullTyVarEnv )
 import Unify           ( unifyTauTy )
 import UniqFM          ( lookupUFM_Directly, lookupWithDefaultUFM_Directly,
                          filterUFM, eltsUFM )
-import Unique          ( iOTyConKey, mainIdKey, mainPrimIOIdKey )
+import Unique          ( iOTyConKey )
 import Util
 
-import FiniteMap       ( emptyFM )
+import FiniteMap       ( emptyFM, FiniteMap )
 tycon_specs = emptyFM
 \end{code}
 
@@ -70,7 +70,6 @@ Outside-world interface:
 type TcResults
   = (TcResultBinds,
      TcIfaceInfo,
-     TcLocalTyConsAndClasses,
      TcSpecialiseRequests,
      TcDDumpDeriv)
 
@@ -87,10 +86,6 @@ type TcResultBinds
 type TcIfaceInfo -- things for the interface generator
   = ([Id], [TyCon], [Class], Bag InstInfo)
 
-type TcLocalTyConsAndClasses -- things defined in this module
-  = ([TyCon], [Class])
-    -- not sure the classes are used at all (ToDo)
-
 type TcSpecialiseRequests
   = FiniteMap TyCon [(Bool, [Maybe Type])]
     -- source tycon specialisation requests
@@ -133,7 +128,11 @@ tcModule rn_env
        -- pragmas, which is done lazily [ie failure just drops the pragma
        -- without having any global-failure effect].
 
+    -- trace "tc1" $
+
     fixTc (\ ~(_, _, _, _, _, _, sig_ids) ->
+
+       -- trace "tc2" $
        tcExtendGlobalValEnv sig_ids (
 
        -- The knot for instance information.  This isn't used at all
@@ -145,6 +144,7 @@ tcModule rn_env
            tcTyAndClassDecls1 rec_inst_mapper ty_decls_bag cls_decls_bag
                                        `thenTc` \ env ->
 
+           --trace "tc3" $
                -- Typecheck the instance decls, includes deriving
            tcSetEnv env (
            --trace "tcInstDecls:"      $
@@ -152,11 +152,14 @@ tcModule rn_env
                         mod_name rn_env fixities 
            )                           `thenTc` \ (inst_info, deriv_binds, ddump_deriv) ->
 
+           --trace "tc4" $
            buildInstanceEnvs inst_info `thenTc` \ inst_mapper ->
 
            returnTc (inst_mapper, env, inst_info, deriv_binds, ddump_deriv)
 
        ) `thenTc` \ (_, env, inst_info, deriv_binds, ddump_deriv) ->
+
+       --trace "tc5" $
        tcSetEnv env (
 
            -- Default declarations
@@ -186,11 +189,13 @@ tcModule rn_env
            --   we silently discard the pragma
        tcInterfaceSigs sigs            `thenTc` \ sig_ids ->
        tcGetEnv                        `thenNF_Tc` \ env ->
+       --trace "tc6" $
 
        returnTc (env, inst_info, data_binds, deriv_binds, ddump_deriv, defaulting_tys, sig_ids)
 
     )))) `thenTc` \ (env, inst_info, data_binds, deriv_binds, ddump_deriv, defaulting_tys, _) ->
 
+    --trace "tc7" $
     tcSetEnv env (                             -- to the end...
     tcSetDefaultTys defaulting_tys (           -- ditto
 
@@ -202,6 +207,7 @@ tcModule rn_env
        (val_decls `ThenBinds` deriv_binds)
        (       -- Second pass over instance declarations,
                -- to compile the bindings themselves.
+           --trace "tc8" $
            tcInstDecls2  inst_info     `thenNF_Tc` \ (lie_instdecls, inst_binds) ->
            tcClassDecls2 cls_decls_bag `thenNF_Tc` \ (lie_clasdecls, cls_binds) ->
            tcGetEnv                    `thenNF_Tc` \ env ->
@@ -211,14 +217,13 @@ tcModule rn_env
 
        `thenTc` \ ((val_binds, (inst_binds, cls_binds, final_env)), lie_alldecls, _) ->
 
-    checkTopLevelIds mod_name final_env        `thenTc_`
-
        -- Deal with constant or ambiguous InstIds.  How could
        -- there be ambiguous ones?  They can only arise if a
        -- top-level decl falls under the monomorphism
        -- restriction, and no subsequent decl instantiates its
        -- type.  (Usually, ambiguous type variables are resolved
        -- during the generalisation step.)
+    --trace "tc9" $
     tcSimplifyTop lie_alldecls                 `thenTc` \ const_insts ->
 
        -- Backsubstitution.  Monomorphic top-level decls may have
@@ -242,22 +247,20 @@ tcModule rn_env
 
     let
         localids = getEnv_LocalIds final_env
-       tycons   = getEnv_TyCons final_env
-       classes  = getEnv_Classes final_env
+       tycons   = getEnv_TyCons   final_env
+       classes  = getEnv_Classes  final_env
 
-       local_tycons  = [ tc | tc <- tycons, isLocallyDefined tc && isDataTyCon tc ]
+       local_tycons  = filter isLocallyDefined tycons
        local_classes = filter isLocallyDefined classes
-       exported_ids' = filter isExported (eltsUFM ve2)
-    in    
-
+       local_vals    = [ v | v <- eltsUFM ve2, isLocallyDefined v && isTopLevId v ]
+                       -- the isTopLevId is doubtful...
+    in
        -- FINISHED AT LAST
     returnTc (
        (data_binds', cls_binds', inst_binds', val_binds', const_insts'),
 
             -- the next collection is just for mkInterface
-       (exported_ids', tycons, classes, inst_info),
-
-       (local_tycons, local_classes),
+       (local_vals, local_tycons, local_classes, inst_info),
 
        tycon_specs,
 
@@ -267,53 +270,4 @@ tcModule rn_env
     ty_decls_bag   = listToBag ty_decls
     cls_decls_bag  = listToBag cls_decls
     inst_decls_bag = listToBag inst_decls
-
-\end{code}
-
-
-%************************************************************************
-%*                                                                     *
-\subsection{Error checking code}
-%*                                                                     *
-%************************************************************************
-
-
-checkTopLevelIds checks that Main.main or Main.mainPrimIO has correct type.
-
-\begin{code}
-checkTopLevelIds :: FAST_STRING -> TcEnv s -> TcM s ()
-checkTopLevelIds mod final_env
-  | mod /= SLIT("Main")
-  = returnTc ()
-
-  | otherwise
-  = tcSetEnv final_env (
-       tcLookupLocalValueByKey mainIdKey       `thenNF_Tc` \ maybe_main ->
-       tcLookupLocalValueByKey mainPrimIOIdKey `thenNF_Tc` \ maybe_prim ->
-       tcLookupTyConByKey iOTyConKey           `thenNF_Tc` \ io_tc ->
-       
-       case (maybe_main, maybe_prim) of
-         (Just main, Nothing) -> tcAddErrCtxt mainCtxt $
-                                 unifyTauTy (mkSynTy io_tc [unitTy])
-                                            (idType main)
-
-         (Nothing, Just prim) -> tcAddErrCtxt primCtxt $
-                                 unifyTauTy (mkPrimIoTy unitTy)
-                                            (idType prim)
-
-         (Just _ , Just _ )   -> failTc mainBothIdErr
-         (Nothing, Nothing)   -> failTc mainNoneIdErr
-    )
-
-mainCtxt sty
-  = ppStr "main should have type IO ()"
-
-primCtxt sty
-  = ppStr "mainPrimIO should have type PrimIO ()"
-
-mainBothIdErr sty
-  = ppStr "module Main contains definitions for both main and mainPrimIO"
-
-mainNoneIdErr sty
-  = ppStr "module Main does not contain a definition for main (or mainPrimIO)"
 \end{code}