From 4fb581f40772acec211852c22bf0d13af1ced5f1 Mon Sep 17 00:00:00 2001 From: simonpj Date: Wed, 15 Dec 2004 12:15:16 +0000 Subject: [PATCH] [project @ 2004-12-15 12:15:16 by simonpj] Tidy the type of an interactively-bound Id before adding it to the environment. Generally speaking, top level environments are assumed to be in tidied form, so we don't tidy the types before printing. --- ghc/compiler/typecheck/TcRnDriver.lhs | 36 ++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/ghc/compiler/typecheck/TcRnDriver.lhs b/ghc/compiler/typecheck/TcRnDriver.lhs index dbe7d33..3fb0dd3 100644 --- a/ghc/compiler/typecheck/TcRnDriver.lhs +++ b/ghc/compiler/typecheck/TcRnDriver.lhs @@ -1,4 +1,4 @@ -% +s% % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998 % \section[TcModule]{Typechecking a whole module} @@ -75,7 +75,7 @@ import HscTypes ( ModGuts(..), HscEnv(..), ExternalPackageState(..), #ifdef GHCI import HsSyn ( HsStmtContext(..), Stmt(..), HsExpr(..), HsBindGroup(..), LStmt, LHsExpr, LHsType, mkMatchGroup, - collectStmtsBinders, mkSimpleMatch, placeHolderType, + collectStmtsBinders, mkSimpleMatch, nlLetStmt, nlExprStmt, nlBindStmt, nlResultStmt, nlVarPat ) import RdrName ( GlobalRdrEnv, mkGlobalRdrEnv, GlobalRdrElt(..), Provenance(..), ImportSpec(..), @@ -103,7 +103,7 @@ import IfaceSyn ( IfaceDecl(..), IfaceClassOp(..), IfaceConDecl(..), tyThingToIfaceDecl, dfunToIfaceInst ) import IfaceEnv ( lookupOrig ) import RnEnv ( lookupOccRn, dataTcOccs, lookupFixityRn ) -import Id ( Id, isImplicitId, globalIdDetails ) +import Id ( Id, isImplicitId, setIdType, globalIdDetails ) import MkId ( unsafeCoerceId ) import DataCon ( dataConTyCon ) import TyCon ( tyConName ) @@ -116,9 +116,8 @@ import Name ( nameOccName, nameModule ) import NameEnv ( delListFromNameEnv ) import PrelNames ( iNTERACTIVE, ioTyConName, printName, monadNames, itName, returnIOName ) import Module ( Module, lookupModuleEnv ) -import HscTypes ( InteractiveContext(..), ExternalPackageState( eps_PTE ), - HomeModInfo(..), typeEnvElts, typeEnvClasses, - availNames, availName, icPrintUnqual, ModIface(..), +import HscTypes ( InteractiveContext(..), HomeModInfo(..), typeEnvElts, typeEnvClasses, + availNames, availName, ModIface(..), ModDetails(..), Dependencies(..) ) import BasicTypes ( RecFlag(..), Fixity ) import Bag ( unitBag ) @@ -127,7 +126,6 @@ import Panic ( ghcError, GhcException(..) ) import SrcLoc ( SrcLoc ) #endif -import FastString ( mkFastString ) import Util ( sortLe ) import Bag ( unionBags, snocBag ) @@ -735,12 +733,16 @@ tcRnStmt hsc_env ictxt rdr_stmt (bound_ids, tc_expr) <- tcUserStmt rn_stmt ; traceTc (text "tcs 1") ; - let { -- Make all the bound ids "global" ids, now that - -- they're notionally top-level bindings. This is - -- important: otherwise when we come to compile an expression - -- using these ids later, the byte code generator will consider - -- the occurrences to be free rather than global. - global_ids = map (globaliseId VanillaGlobal) bound_ids ; + let { -- (a) Make all the bound ids "global" ids, now that + -- they're notionally top-level bindings. This is + -- important: otherwise when we come to compile an expression + -- using these ids later, the byte code generator will consider + -- the occurrences to be free rather than global. + -- + -- (b) Tidy their types; this is important, because :info may + -- ask to look at them, and :info expects the things it looks + -- up to have tidy types + global_ids = map globaliseAndTidy bound_ids ; -- Update the interactive context rn_env = ic_rn_local_env ictxt ; @@ -769,8 +771,14 @@ tcRnStmt hsc_env ictxt rdr_stmt returnM (new_ic, bound_names, tc_expr) } -\end{code} +globaliseAndTidy :: Id -> Id +globaliseAndTidy id +-- Give the Id a Global Name, and tidy its type + = setIdType (globaliseId VanillaGlobal id) tidy_type + where + tidy_type = tidyTopType (idType id) +\end{code} Here is the grand plan, implemented in tcUserStmt -- 1.7.10.4