Sophie

Sophie

distrib > Fedora > 14 > x86_64 > by-pkgid > 8d1ef08c9e0d44c69764afc615a03d0d > files > 1749

ghc-ghc-devel-6.12.3-5.fc14.i686.rpm

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<!-- Generated by HsColour, http://www.cs.york.ac.uk/fp/darcs/hscolour/ -->
<title>main/HscTypes.lhs</title>
<link type='text/css' rel='stylesheet' href='hscolour.css' />
</head>
<body>
%
% (c) The University of Glasgow, 2006
%
\section[HscTypes]{Types for the per-module compiler}

\begin{code}
<pre><a name="line-1"></a><span class='hs-comment'>-- | Types for the per-module compiler</span>
<a name="line-2"></a><span class='hs-keyword'>module</span> <span class='hs-conid'>HscTypes</span> <span class='hs-layout'>(</span> 
<a name="line-3"></a>        <span class='hs-comment'>-- * 'Ghc' monad stuff</span>
<a name="line-4"></a>        <span class='hs-conid'>Ghc</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>GhcT</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>liftGhcT</span><span class='hs-layout'>,</span>
<a name="line-5"></a>        <span class='hs-conid'>GhcMonad</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>WarnLogMonad</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-6"></a>        <span class='hs-varid'>liftIO</span><span class='hs-layout'>,</span>
<a name="line-7"></a>        <span class='hs-varid'>ioMsgMaybe</span><span class='hs-layout'>,</span> <span class='hs-varid'>ioMsg</span><span class='hs-layout'>,</span>
<a name="line-8"></a>        <span class='hs-varid'>logWarnings</span><span class='hs-layout'>,</span> <span class='hs-varid'>clearWarnings</span><span class='hs-layout'>,</span> <span class='hs-varid'>hasWarnings</span><span class='hs-layout'>,</span>
<a name="line-9"></a>        <span class='hs-conid'>SourceError</span><span class='hs-layout'>,</span> <span class='hs-conid'>GhcApiError</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkSrcErr</span><span class='hs-layout'>,</span> <span class='hs-varid'>srcErrorMessages</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkApiErr</span><span class='hs-layout'>,</span>
<a name="line-10"></a>        <span class='hs-varid'>throwOneError</span><span class='hs-layout'>,</span> <span class='hs-varid'>handleSourceError</span><span class='hs-layout'>,</span>
<a name="line-11"></a>        <span class='hs-varid'>reflectGhc</span><span class='hs-layout'>,</span> <span class='hs-varid'>reifyGhc</span><span class='hs-layout'>,</span>
<a name="line-12"></a>        <span class='hs-varid'>handleFlagWarnings</span><span class='hs-layout'>,</span>
<a name="line-13"></a>
<a name="line-14"></a>	<span class='hs-comment'>-- * Sessions and compilation state</span>
<a name="line-15"></a>	<span class='hs-conid'>Session</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>withSession</span><span class='hs-layout'>,</span> <span class='hs-varid'>modifySession</span><span class='hs-layout'>,</span> <span class='hs-varid'>withTempSession</span><span class='hs-layout'>,</span>
<a name="line-16"></a>        <span class='hs-conid'>HscEnv</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>hscEPS</span><span class='hs-layout'>,</span>
<a name="line-17"></a>	<span class='hs-conid'>FinderCache</span><span class='hs-layout'>,</span> <span class='hs-conid'>FindResult</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>ModLocationCache</span><span class='hs-layout'>,</span>
<a name="line-18"></a>	<span class='hs-conid'>Target</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>TargetId</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprTarget</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprTargetId</span><span class='hs-layout'>,</span>
<a name="line-19"></a>	<span class='hs-conid'>ModuleGraph</span><span class='hs-layout'>,</span> <span class='hs-varid'>emptyMG</span><span class='hs-layout'>,</span>
<a name="line-20"></a>        <span class='hs-comment'>-- ** Callbacks</span>
<a name="line-21"></a>        <span class='hs-conid'>GhcApiCallbacks</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>withLocalCallbacks</span><span class='hs-layout'>,</span>
<a name="line-22"></a>
<a name="line-23"></a>        <span class='hs-comment'>-- * Information about modules</span>
<a name="line-24"></a>	<span class='hs-conid'>ModDetails</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>	<span class='hs-varid'>emptyModDetails</span><span class='hs-layout'>,</span>
<a name="line-25"></a>	<span class='hs-conid'>ModGuts</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>CoreModule</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>CgGuts</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>ForeignStubs</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-26"></a>        <span class='hs-conid'>ImportedMods</span><span class='hs-layout'>,</span>
<a name="line-27"></a>
<a name="line-28"></a>	<span class='hs-conid'>ModSummary</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>ms_mod_name</span><span class='hs-layout'>,</span> <span class='hs-varid'>showModMsg</span><span class='hs-layout'>,</span> <span class='hs-varid'>isBootSummary</span><span class='hs-layout'>,</span>
<a name="line-29"></a>	<span class='hs-varid'>msHsFilePath</span><span class='hs-layout'>,</span> <span class='hs-varid'>msHiFilePath</span><span class='hs-layout'>,</span> <span class='hs-varid'>msObjFilePath</span><span class='hs-layout'>,</span>
<a name="line-30"></a>
<a name="line-31"></a>        <span class='hs-comment'>-- * Information about the module being compiled</span>
<a name="line-32"></a>	<span class='hs-conid'>HscSource</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>isHsBoot</span><span class='hs-layout'>,</span> <span class='hs-varid'>hscSourceString</span><span class='hs-layout'>,</span>	<span class='hs-comment'>-- Re-exported from DriverPhases</span>
<a name="line-33"></a>	
<a name="line-34"></a>	<span class='hs-comment'>-- * State relating to modules in this package</span>
<a name="line-35"></a>	<span class='hs-conid'>HomePackageTable</span><span class='hs-layout'>,</span> <span class='hs-conid'>HomeModInfo</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>emptyHomePackageTable</span><span class='hs-layout'>,</span>
<a name="line-36"></a>	<span class='hs-varid'>hptInstances</span><span class='hs-layout'>,</span> <span class='hs-varid'>hptRules</span><span class='hs-layout'>,</span> <span class='hs-varid'>hptVectInfo</span><span class='hs-layout'>,</span>
<a name="line-37"></a>	
<a name="line-38"></a>	<span class='hs-comment'>-- * State relating to known packages</span>
<a name="line-39"></a>	<span class='hs-conid'>ExternalPackageState</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>EpsStats</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>addEpsInStats</span><span class='hs-layout'>,</span>
<a name="line-40"></a>	<span class='hs-conid'>PackageTypeEnv</span><span class='hs-layout'>,</span> <span class='hs-conid'>PackageIfaceTable</span><span class='hs-layout'>,</span> <span class='hs-varid'>emptyPackageIfaceTable</span><span class='hs-layout'>,</span>
<a name="line-41"></a>	<span class='hs-varid'>lookupIfaceByModule</span><span class='hs-layout'>,</span> <span class='hs-varid'>emptyModIface</span><span class='hs-layout'>,</span>
<a name="line-42"></a>	
<a name="line-43"></a>	<span class='hs-conid'>PackageInstEnv</span><span class='hs-layout'>,</span> <span class='hs-conid'>PackageRuleBase</span><span class='hs-layout'>,</span>
<a name="line-44"></a>
<a name="line-45"></a>
<a name="line-46"></a>        <span class='hs-comment'>-- * Annotations</span>
<a name="line-47"></a>        <span class='hs-varid'>prepareAnnotations</span><span class='hs-layout'>,</span>
<a name="line-48"></a>
<a name="line-49"></a>        <span class='hs-comment'>-- * Interactive context</span>
<a name="line-50"></a>	<span class='hs-conid'>InteractiveContext</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>emptyInteractiveContext</span><span class='hs-layout'>,</span> 
<a name="line-51"></a>	<span class='hs-varid'>icPrintUnqual</span><span class='hs-layout'>,</span> <span class='hs-varid'>extendInteractiveContext</span><span class='hs-layout'>,</span>
<a name="line-52"></a>        <span class='hs-varid'>substInteractiveContext</span><span class='hs-layout'>,</span>
<a name="line-53"></a>        <span class='hs-varid'>mkPrintUnqualified</span><span class='hs-layout'>,</span> <span class='hs-varid'>pprModulePrefix</span><span class='hs-layout'>,</span>
<a name="line-54"></a>
<a name="line-55"></a>	<span class='hs-comment'>-- * Interfaces</span>
<a name="line-56"></a>	<span class='hs-conid'>ModIface</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkIfaceWarnCache</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkIfaceHashCache</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkIfaceFixCache</span><span class='hs-layout'>,</span>
<a name="line-57"></a>	<span class='hs-varid'>emptyIfaceWarnCache</span><span class='hs-layout'>,</span>
<a name="line-58"></a>
<a name="line-59"></a>        <span class='hs-comment'>-- * Fixity</span>
<a name="line-60"></a>	<span class='hs-conid'>FixityEnv</span><span class='hs-layout'>,</span> <span class='hs-conid'>FixItem</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>lookupFixity</span><span class='hs-layout'>,</span> <span class='hs-varid'>emptyFixityEnv</span><span class='hs-layout'>,</span>
<a name="line-61"></a>
<a name="line-62"></a>        <span class='hs-comment'>-- * TyThings and type environments</span>
<a name="line-63"></a>	<span class='hs-conid'>TyThing</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-64"></a>	<span class='hs-varid'>tyThingClass</span><span class='hs-layout'>,</span> <span class='hs-varid'>tyThingTyCon</span><span class='hs-layout'>,</span> <span class='hs-varid'>tyThingDataCon</span><span class='hs-layout'>,</span> <span class='hs-varid'>tyThingId</span><span class='hs-layout'>,</span>
<a name="line-65"></a>	<span class='hs-varid'>implicitTyThings</span><span class='hs-layout'>,</span> <span class='hs-varid'>isImplicitTyThing</span><span class='hs-layout'>,</span>
<a name="line-66"></a>	
<a name="line-67"></a>	<span class='hs-conid'>TypeEnv</span><span class='hs-layout'>,</span> <span class='hs-varid'>lookupType</span><span class='hs-layout'>,</span> <span class='hs-varid'>lookupTypeHscEnv</span><span class='hs-layout'>,</span> <span class='hs-varid'>mkTypeEnv</span><span class='hs-layout'>,</span> <span class='hs-varid'>emptyTypeEnv</span><span class='hs-layout'>,</span>
<a name="line-68"></a>	<span class='hs-varid'>extendTypeEnv</span><span class='hs-layout'>,</span> <span class='hs-varid'>extendTypeEnvList</span><span class='hs-layout'>,</span> <span class='hs-varid'>extendTypeEnvWithIds</span><span class='hs-layout'>,</span> <span class='hs-varid'>lookupTypeEnv</span><span class='hs-layout'>,</span>
<a name="line-69"></a>	<span class='hs-varid'>typeEnvElts</span><span class='hs-layout'>,</span> <span class='hs-varid'>typeEnvClasses</span><span class='hs-layout'>,</span> <span class='hs-varid'>typeEnvTyCons</span><span class='hs-layout'>,</span> <span class='hs-varid'>typeEnvIds</span><span class='hs-layout'>,</span>
<a name="line-70"></a>	<span class='hs-varid'>typeEnvDataCons</span><span class='hs-layout'>,</span>
<a name="line-71"></a>
<a name="line-72"></a>        <span class='hs-comment'>-- * MonadThings</span>
<a name="line-73"></a>        <span class='hs-conid'>MonadThings</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-74"></a>
<a name="line-75"></a>        <span class='hs-comment'>-- * Information on imports and exports</span>
<a name="line-76"></a>	<span class='hs-conid'>WhetherHasOrphans</span><span class='hs-layout'>,</span> <span class='hs-conid'>IsBootInterface</span><span class='hs-layout'>,</span> <span class='hs-conid'>Usage</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> 
<a name="line-77"></a>	<span class='hs-conid'>Dependencies</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>noDependencies</span><span class='hs-layout'>,</span>
<a name="line-78"></a>	<span class='hs-conid'>NameCache</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>OrigNameCache</span><span class='hs-layout'>,</span> <span class='hs-conid'>OrigIParamCache</span><span class='hs-layout'>,</span>
<a name="line-79"></a>	<span class='hs-conid'>Avails</span><span class='hs-layout'>,</span> <span class='hs-varid'>availsToNameSet</span><span class='hs-layout'>,</span> <span class='hs-varid'>availsToNameEnv</span><span class='hs-layout'>,</span> <span class='hs-varid'>availName</span><span class='hs-layout'>,</span> <span class='hs-varid'>availNames</span><span class='hs-layout'>,</span>
<a name="line-80"></a>	<span class='hs-conid'>GenAvailInfo</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>AvailInfo</span><span class='hs-layout'>,</span> <span class='hs-conid'>RdrAvailInfo</span><span class='hs-layout'>,</span> 
<a name="line-81"></a>	<span class='hs-conid'>IfaceExport</span><span class='hs-layout'>,</span>
<a name="line-82"></a>
<a name="line-83"></a>	<span class='hs-comment'>-- * Warnings</span>
<a name="line-84"></a>	<span class='hs-conid'>Warnings</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>WarningTxt</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>plusWarns</span><span class='hs-layout'>,</span>
<a name="line-85"></a>
<a name="line-86"></a>	<span class='hs-comment'>-- * Linker stuff</span>
<a name="line-87"></a>	<span class='hs-conid'>Linkable</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>isObjectLinkable</span><span class='hs-layout'>,</span>
<a name="line-88"></a>	<span class='hs-conid'>Unlinked</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>CompiledByteCode</span><span class='hs-layout'>,</span>
<a name="line-89"></a>	<span class='hs-varid'>isObject</span><span class='hs-layout'>,</span> <span class='hs-varid'>nameOfObject</span><span class='hs-layout'>,</span> <span class='hs-varid'>isInterpretable</span><span class='hs-layout'>,</span> <span class='hs-varid'>byteCodeOfObject</span><span class='hs-layout'>,</span>
<a name="line-90"></a>        
<a name="line-91"></a>        <span class='hs-comment'>-- * Program coverage</span>
<a name="line-92"></a>        <span class='hs-conid'>HpcInfo</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>emptyHpcInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>isHpcUsed</span><span class='hs-layout'>,</span> <span class='hs-conid'>AnyHpcUsage</span><span class='hs-layout'>,</span>
<a name="line-93"></a>
<a name="line-94"></a>        <span class='hs-comment'>-- * Breakpoints</span>
<a name="line-95"></a>        <span class='hs-conid'>ModBreaks</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>BreakIndex</span><span class='hs-layout'>,</span> <span class='hs-varid'>emptyModBreaks</span><span class='hs-layout'>,</span>
<a name="line-96"></a>
<a name="line-97"></a>        <span class='hs-comment'>-- * Vectorisation information</span>
<a name="line-98"></a>        <span class='hs-conid'>VectInfo</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-conid'>IfaceVectInfo</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>noVectInfo</span><span class='hs-layout'>,</span> <span class='hs-varid'>plusVectInfo</span><span class='hs-layout'>,</span> 
<a name="line-99"></a>        <span class='hs-varid'>noIfaceVectInfo</span>
<a name="line-100"></a>    <span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-101"></a>
<a name="line-102"></a><span class='hs-cpp'>#include "HsVersions.h"</span>
<a name="line-103"></a>
<a name="line-104"></a><span class='hs-cpp'>#ifdef GHCI</span>
<a name="line-105"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>ByteCodeAsm</span>	<span class='hs-layout'>(</span> <span class='hs-conid'>CompiledByteCode</span> <span class='hs-layout'>)</span>
<a name="line-106"></a><span class='hs-keyword'>import</span> <span class='hs-comment'>{-# SOURCE #-}</span>  <span class='hs-conid'>InteractiveEval</span> <span class='hs-layout'>(</span> <span class='hs-conid'>Resume</span> <span class='hs-layout'>)</span>
<a name="line-107"></a><span class='hs-cpp'>#endif</span>
<a name="line-108"></a>
<a name="line-109"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>HsSyn</span>
<a name="line-110"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>RdrName</span>
<a name="line-111"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Name</span>
<a name="line-112"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>NameEnv</span>
<a name="line-113"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>NameSet</span>	
<a name="line-114"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Module</span>
<a name="line-115"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>InstEnv</span>		<span class='hs-layout'>(</span> <span class='hs-conid'>InstEnv</span><span class='hs-layout'>,</span> <span class='hs-conid'>Instance</span> <span class='hs-layout'>)</span>
<a name="line-116"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>FamInstEnv</span>	<span class='hs-layout'>(</span> <span class='hs-conid'>FamInstEnv</span><span class='hs-layout'>,</span> <span class='hs-conid'>FamInst</span> <span class='hs-layout'>)</span>
<a name="line-117"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Rules</span>		<span class='hs-layout'>(</span> <span class='hs-conid'>RuleBase</span> <span class='hs-layout'>)</span>
<a name="line-118"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>CoreSyn</span>		<span class='hs-layout'>(</span> <span class='hs-conid'>CoreBind</span> <span class='hs-layout'>)</span>
<a name="line-119"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>VarEnv</span>
<a name="line-120"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>VarSet</span>
<a name="line-121"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Var</span>
<a name="line-122"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Id</span>
<a name="line-123"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Type</span>		
<a name="line-124"></a>
<a name="line-125"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Annotations</span>
<a name="line-126"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Class</span>		<span class='hs-layout'>(</span> <span class='hs-conid'>Class</span><span class='hs-layout'>,</span> <span class='hs-varid'>classSelIds</span><span class='hs-layout'>,</span> <span class='hs-varid'>classATs</span><span class='hs-layout'>,</span> <span class='hs-varid'>classTyCon</span> <span class='hs-layout'>)</span>
<a name="line-127"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>TyCon</span>
<a name="line-128"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>DataCon</span>		<span class='hs-layout'>(</span> <span class='hs-conid'>DataCon</span><span class='hs-layout'>,</span> <span class='hs-varid'>dataConImplicitIds</span><span class='hs-layout'>,</span> <span class='hs-varid'>dataConWrapId</span> <span class='hs-layout'>)</span>
<a name="line-129"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>PrelNames</span>	<span class='hs-layout'>(</span> <span class='hs-varid'>gHC_PRIM</span> <span class='hs-layout'>)</span>
<a name="line-130"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Packages</span> <span class='hs-varid'>hiding</span> <span class='hs-layout'>(</span> <span class='hs-conid'>Version</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span> <span class='hs-layout'>)</span>
<a name="line-131"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>DynFlags</span>		<span class='hs-layout'>(</span> <span class='hs-conid'>DynFlags</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>isOneShot</span><span class='hs-layout'>,</span> <span class='hs-conid'>HscTarget</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>dopt</span><span class='hs-layout'>,</span>
<a name="line-132"></a>                          <span class='hs-conid'>DynFlag</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span> <span class='hs-layout'>)</span>
<a name="line-133"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>DriverPhases</span>	<span class='hs-layout'>(</span> <span class='hs-conid'>HscSource</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>isHsBoot</span><span class='hs-layout'>,</span> <span class='hs-varid'>hscSourceString</span><span class='hs-layout'>,</span> <span class='hs-conid'>Phase</span> <span class='hs-layout'>)</span>
<a name="line-134"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>BasicTypes</span>	<span class='hs-layout'>(</span> <span class='hs-conid'>IPName</span><span class='hs-layout'>,</span> <span class='hs-varid'>defaultFixity</span><span class='hs-layout'>,</span> <span class='hs-conid'>WarningTxt</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span> <span class='hs-layout'>)</span>
<a name="line-135"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>OptimizationFuel</span>	<span class='hs-layout'>(</span> <span class='hs-conid'>OptFuelState</span> <span class='hs-layout'>)</span>
<a name="line-136"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>IfaceSyn</span>
<a name="line-137"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>FiniteMap</span>	<span class='hs-layout'>(</span> <span class='hs-conid'>FiniteMap</span> <span class='hs-layout'>)</span>
<a name="line-138"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>CoreSyn</span>		<span class='hs-layout'>(</span> <span class='hs-conid'>CoreRule</span> <span class='hs-layout'>)</span>
<a name="line-139"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Maybes</span>		<span class='hs-layout'>(</span> <span class='hs-varid'>orElse</span><span class='hs-layout'>,</span> <span class='hs-varid'>expectJust</span><span class='hs-layout'>,</span> <span class='hs-varid'>catMaybes</span> <span class='hs-layout'>)</span>
<a name="line-140"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Outputable</span>
<a name="line-141"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>BreakArray</span>
<a name="line-142"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>SrcLoc</span>		<span class='hs-layout'>(</span> <span class='hs-conid'>SrcSpan</span><span class='hs-layout'>,</span> <span class='hs-conid'>Located</span><span class='hs-layout'>(</span><span class='hs-keyglyph'>..</span><span class='hs-layout'>)</span> <span class='hs-layout'>)</span>
<a name="line-143"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>LazyUniqFM</span>		<span class='hs-layout'>(</span> <span class='hs-varid'>lookupUFM</span><span class='hs-layout'>,</span> <span class='hs-varid'>eltsUFM</span><span class='hs-layout'>,</span> <span class='hs-varid'>emptyUFM</span> <span class='hs-layout'>)</span>
<a name="line-144"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>UniqSupply</span>	<span class='hs-layout'>(</span> <span class='hs-conid'>UniqSupply</span> <span class='hs-layout'>)</span>
<a name="line-145"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>FastString</span>
<a name="line-146"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>StringBuffer</span>	<span class='hs-layout'>(</span> <span class='hs-conid'>StringBuffer</span> <span class='hs-layout'>)</span>
<a name="line-147"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Fingerprint</span>
<a name="line-148"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>MonadUtils</span>
<a name="line-149"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Dynamic</span>     <span class='hs-layout'>(</span> <span class='hs-conid'>Typeable</span> <span class='hs-layout'>)</span>
<a name="line-150"></a><span class='hs-keyword'>import</span> <span class='hs-keyword'>qualified</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Dynamic</span> <span class='hs-keyword'>as</span> <span class='hs-conid'>Dyn</span>
<a name="line-151"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Bag</span>
<a name="line-152"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>ErrUtils</span>
<a name="line-153"></a>
<a name="line-154"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>FilePath</span>
<a name="line-155"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>System</span><span class='hs-varop'>.</span><span class='hs-conid'>Time</span>	<span class='hs-layout'>(</span> <span class='hs-conid'>ClockTime</span> <span class='hs-layout'>)</span>
<a name="line-156"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>IORef</span>
<a name="line-157"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>Array</span>       <span class='hs-layout'>(</span> <span class='hs-conid'>Array</span><span class='hs-layout'>,</span> <span class='hs-varid'>array</span> <span class='hs-layout'>)</span>
<a name="line-158"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Data</span><span class='hs-varop'>.</span><span class='hs-conid'>List</span>
<a name="line-159"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Control</span><span class='hs-varop'>.</span><span class='hs-conid'>Monad</span>    <span class='hs-layout'>(</span> <span class='hs-varid'>mplus</span><span class='hs-layout'>,</span> <span class='hs-varid'>guard</span><span class='hs-layout'>,</span> <span class='hs-varid'>liftM</span><span class='hs-layout'>,</span> <span class='hs-varid'>when</span> <span class='hs-layout'>)</span>
<a name="line-160"></a><span class='hs-keyword'>import</span> <span class='hs-conid'>Exception</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection{Compilation environment}
%*									*
%************************************************************************


\begin{code}
<pre><a name="line-1"></a><a name="Session"></a><span class='hs-comment'>-- | The Session is a handle to the complete state of a compilation</span>
<a name="line-2"></a><a name="Session"></a><span class='hs-comment'>-- session.  A compilation session consists of a set of modules</span>
<a name="line-3"></a><a name="Session"></a><span class='hs-comment'>-- constituting the current program or library, the context for</span>
<a name="line-4"></a><a name="Session"></a><span class='hs-comment'>-- interactive evaluation, and various caches.</span>
<a name="line-5"></a><a name="Session"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Session</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Session</span> <span class='hs-varop'>!</span><span class='hs-layout'>(</span><span class='hs-conid'>IORef</span> <span class='hs-conid'>HscEnv</span><span class='hs-layout'>)</span> <span class='hs-varop'>!</span><span class='hs-layout'>(</span><span class='hs-conid'>IORef</span> <span class='hs-conid'>WarningMessages</span><span class='hs-layout'>)</span>
<a name="line-6"></a>
<a name="line-7"></a><a name="mkSrcErr"></a><span class='hs-definition'>mkSrcErr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ErrorMessages</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SourceError</span>
<a name="line-8"></a><a name="srcErrorMessages"></a><span class='hs-definition'>srcErrorMessages</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SourceError</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ErrorMessages</span>
<a name="line-9"></a><a name="mkApiErr"></a><span class='hs-definition'>mkApiErr</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SDoc</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>GhcApiError</span>
<a name="line-10"></a>
<a name="line-11"></a><a name="throwOneError"></a><span class='hs-definition'>throwOneError</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>ErrMsg</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>ab</span>
<a name="line-12"></a><span class='hs-definition'>throwOneError</span> <span class='hs-varid'>err</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>liftIO</span> <span class='hs-varop'>$</span> <span class='hs-varid'>throwIO</span> <span class='hs-varop'>$</span> <span class='hs-varid'>mkSrcErr</span> <span class='hs-varop'>$</span> <span class='hs-varid'>unitBag</span> <span class='hs-varid'>err</span>
<a name="line-13"></a>
<a name="line-14"></a><a name="SourceError"></a><span class='hs-comment'>-- | A source error is an error that is caused by one or more errors in the</span>
<a name="line-15"></a><a name="SourceError"></a><span class='hs-comment'>-- source code.  A 'SourceError' is thrown by many functions in the</span>
<a name="line-16"></a><a name="SourceError"></a><span class='hs-comment'>-- compilation pipeline.  Inside GHC these errors are merely printed via</span>
<a name="line-17"></a><a name="SourceError"></a><span class='hs-comment'>-- 'log_action', but API clients may treat them differently, for example,</span>
<a name="line-18"></a><a name="SourceError"></a><span class='hs-comment'>-- insert them into a list box.  If you want the default behaviour, use the</span>
<a name="line-19"></a><a name="SourceError"></a><span class='hs-comment'>-- idiom:</span>
<a name="line-20"></a><a name="SourceError"></a><span class='hs-comment'>--</span>
<a name="line-21"></a><a name="SourceError"></a><span class='hs-comment'>-- &gt; handleSourceError printExceptionAndWarnings $ do</span>
<a name="line-22"></a><a name="SourceError"></a><span class='hs-comment'>-- &gt;   ... api calls that may fail ...</span>
<a name="line-23"></a><a name="SourceError"></a><span class='hs-comment'>--</span>
<a name="line-24"></a><a name="SourceError"></a><span class='hs-comment'>-- The 'SourceError's error messages can be accessed via 'srcErrorMessages'.</span>
<a name="line-25"></a><a name="SourceError"></a><span class='hs-comment'>-- This list may be empty if the compiler failed due to @-Werror@</span>
<a name="line-26"></a><a name="SourceError"></a><span class='hs-comment'>-- ('Opt_WarnIsError').</span>
<a name="line-27"></a><a name="SourceError"></a><span class='hs-comment'>--</span>
<a name="line-28"></a><a name="SourceError"></a><span class='hs-comment'>-- See 'printExceptionAndWarnings' for more information on what to take care</span>
<a name="line-29"></a><a name="SourceError"></a><span class='hs-comment'>-- of when writing a custom error handler.</span>
<a name="line-30"></a><a name="SourceError"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>SourceError</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SourceError</span> <span class='hs-conid'>ErrorMessages</span>
<a name="line-31"></a>
<a name="line-32"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Show</span> <span class='hs-conid'>SourceError</span> <span class='hs-keyword'>where</span>
<a name="line-33"></a>  <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-conid'>SourceError</span> <span class='hs-varid'>msgs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unlines</span> <span class='hs-varop'>.</span> <span class='hs-varid'>map</span> <span class='hs-varid'>show</span> <span class='hs-varop'>.</span> <span class='hs-varid'>bagToList</span> <span class='hs-varop'>$</span> <span class='hs-varid'>msgs</span>
<a name="line-34"></a>    <span class='hs-comment'>-- ToDo: is there some nicer way to print this?</span>
<a name="line-35"></a>
<a name="line-36"></a><a name="sourceErrorTc"></a><span class='hs-definition'>sourceErrorTc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Dyn</span><span class='hs-varop'>.</span><span class='hs-conid'>TyCon</span>
<a name="line-37"></a><span class='hs-definition'>sourceErrorTc</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Dyn</span><span class='hs-varop'>.</span><span class='hs-varid'>mkTyCon</span> <span class='hs-str'>"SourceError"</span>
<a name="line-38"></a><span class='hs-comment'>{-# NOINLINE sourceErrorTc #-}</span>
<a name="line-39"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Typeable</span> <span class='hs-conid'>SourceError</span> <span class='hs-keyword'>where</span>
<a name="line-40"></a>  <span class='hs-varid'>typeOf</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Dyn</span><span class='hs-varop'>.</span><span class='hs-varid'>mkTyConApp</span> <span class='hs-varid'>sourceErrorTc</span> <span class='hs-conid'>[]</span>
<a name="line-41"></a>
<a name="line-42"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Exception</span> <span class='hs-conid'>SourceError</span>
<a name="line-43"></a>
<a name="line-44"></a><span class='hs-definition'>mkSrcErr</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>SourceError</span>
<a name="line-45"></a>
<a name="line-46"></a><a name="handleSourceError"></a><span class='hs-comment'>-- | Perform the given action and call the exception handler if the action</span>
<a name="line-47"></a><span class='hs-comment'>-- throws a 'SourceError'.  See 'SourceError' for more information.</span>
<a name="line-48"></a><span class='hs-definition'>handleSourceError</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>ExceptionMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span>
<a name="line-49"></a>                     <span class='hs-layout'>(</span><span class='hs-conid'>SourceError</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- ^ exception handler</span>
<a name="line-50"></a>                  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-comment'>-- ^ action to perform</span>
<a name="line-51"></a>                  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<a name="line-52"></a><span class='hs-definition'>handleSourceError</span> <span class='hs-varid'>handler</span> <span class='hs-varid'>act</span> <span class='hs-keyglyph'>=</span>
<a name="line-53"></a>  <span class='hs-varid'>gcatch</span> <span class='hs-varid'>act</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-varid'>e</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>SourceError</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>handler</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span>
<a name="line-54"></a>
<a name="line-55"></a><span class='hs-definition'>srcErrorMessages</span> <span class='hs-layout'>(</span><span class='hs-conid'>SourceError</span> <span class='hs-varid'>msgs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>msgs</span>
<a name="line-56"></a>
<a name="line-57"></a><a name="GhcApiError"></a><span class='hs-comment'>-- | XXX: what exactly is an API error?</span>
<a name="line-58"></a><a name="GhcApiError"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>GhcApiError</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GhcApiError</span> <span class='hs-conid'>SDoc</span>
<a name="line-59"></a>
<a name="line-60"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Show</span> <span class='hs-conid'>GhcApiError</span> <span class='hs-keyword'>where</span>
<a name="line-61"></a>  <span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-conid'>GhcApiError</span> <span class='hs-varid'>msg</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>showSDoc</span> <span class='hs-varid'>msg</span>
<a name="line-62"></a>
<a name="line-63"></a><a name="ghcApiErrorTc"></a><span class='hs-definition'>ghcApiErrorTc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Dyn</span><span class='hs-varop'>.</span><span class='hs-conid'>TyCon</span>
<a name="line-64"></a><span class='hs-definition'>ghcApiErrorTc</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Dyn</span><span class='hs-varop'>.</span><span class='hs-varid'>mkTyCon</span> <span class='hs-str'>"GhcApiError"</span>
<a name="line-65"></a><span class='hs-comment'>{-# NOINLINE ghcApiErrorTc #-}</span>
<a name="line-66"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Typeable</span> <span class='hs-conid'>GhcApiError</span> <span class='hs-keyword'>where</span>
<a name="line-67"></a>  <span class='hs-varid'>typeOf</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Dyn</span><span class='hs-varop'>.</span><span class='hs-varid'>mkTyConApp</span> <span class='hs-varid'>ghcApiErrorTc</span> <span class='hs-conid'>[]</span>
<a name="line-68"></a>
<a name="line-69"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Exception</span> <span class='hs-conid'>GhcApiError</span>
<a name="line-70"></a>
<a name="line-71"></a><span class='hs-definition'>mkApiErr</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GhcApiError</span>
<a name="line-72"></a>
<a name="line-73"></a><a name="WarnLogMonad"></a><span class='hs-comment'>-- | A monad that allows logging of warnings.</span>
<a name="line-74"></a><a name="WarnLogMonad"></a><span class='hs-keyword'>class</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>WarnLogMonad</span> <span class='hs-varid'>m</span> <span class='hs-keyword'>where</span>
<a name="line-75"></a>  <span class='hs-varid'>setWarnings</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>WarningMessages</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-76"></a>  <span class='hs-varid'>getWarnings</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>m</span> <span class='hs-conid'>WarningMessages</span>
<a name="line-77"></a>
<a name="line-78"></a><a name="logWarnings"></a><span class='hs-definition'>logWarnings</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>WarnLogMonad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>WarningMessages</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-79"></a><span class='hs-definition'>logWarnings</span> <span class='hs-varid'>warns</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-80"></a>    <span class='hs-varid'>warns0</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getWarnings</span>
<a name="line-81"></a>    <span class='hs-varid'>setWarnings</span> <span class='hs-layout'>(</span><span class='hs-varid'>unionBags</span> <span class='hs-varid'>warns</span> <span class='hs-varid'>warns0</span><span class='hs-layout'>)</span>
<a name="line-82"></a>
<a name="line-83"></a><a name="clearWarnings"></a><span class='hs-comment'>-- | Clear the log of 'Warnings'.</span>
<a name="line-84"></a><span class='hs-definition'>clearWarnings</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>WarnLogMonad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-85"></a><span class='hs-definition'>clearWarnings</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>setWarnings</span> <span class='hs-varid'>emptyBag</span>
<a name="line-86"></a>
<a name="line-87"></a><a name="hasWarnings"></a><span class='hs-comment'>-- | Returns true if there were any warnings.</span>
<a name="line-88"></a><span class='hs-definition'>hasWarnings</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>WarnLogMonad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>Bool</span>
<a name="line-89"></a><span class='hs-definition'>hasWarnings</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getWarnings</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>return</span> <span class='hs-varop'>.</span> <span class='hs-varid'>not</span> <span class='hs-varop'>.</span> <span class='hs-varid'>isEmptyBag</span>
<a name="line-90"></a>
<a name="line-91"></a><a name="GhcMonad"></a><span class='hs-comment'>-- | A monad that has all the features needed by GHC API calls.</span>
<a name="line-92"></a><a name="GhcMonad"></a><span class='hs-comment'>--</span>
<a name="line-93"></a><a name="GhcMonad"></a><span class='hs-comment'>-- In short, a GHC monad</span>
<a name="line-94"></a><a name="GhcMonad"></a><span class='hs-comment'>--</span>
<a name="line-95"></a><a name="GhcMonad"></a><span class='hs-comment'>--   - allows embedding of IO actions,</span>
<a name="line-96"></a><a name="GhcMonad"></a><span class='hs-comment'>--</span>
<a name="line-97"></a><a name="GhcMonad"></a><span class='hs-comment'>--   - can log warnings,</span>
<a name="line-98"></a><a name="GhcMonad"></a><span class='hs-comment'>--</span>
<a name="line-99"></a><a name="GhcMonad"></a><span class='hs-comment'>--   - allows handling of (extensible) exceptions, and</span>
<a name="line-100"></a><a name="GhcMonad"></a><span class='hs-comment'>--</span>
<a name="line-101"></a><a name="GhcMonad"></a><span class='hs-comment'>--   - maintains a current session.</span>
<a name="line-102"></a><a name="GhcMonad"></a><span class='hs-comment'>--</span>
<a name="line-103"></a><a name="GhcMonad"></a><span class='hs-comment'>-- If you do not use 'Ghc' or 'GhcT', make sure to call 'GHC.initGhcMonad'</span>
<a name="line-104"></a><a name="GhcMonad"></a><span class='hs-comment'>-- before any call to the GHC API functions can occur.</span>
<a name="line-105"></a><a name="GhcMonad"></a><span class='hs-comment'>--</span>
<a name="line-106"></a><a name="GhcMonad"></a><span class='hs-keyword'>class</span> <span class='hs-layout'>(</span><span class='hs-conid'>Functor</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>WarnLogMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>ExceptionMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span>
<a name="line-107"></a>    <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>GhcMonad</span> <span class='hs-varid'>m</span> <span class='hs-keyword'>where</span>
<a name="line-108"></a>  <span class='hs-varid'>getSession</span> <span class='hs-keyglyph'>::</span> <span class='hs-varid'>m</span> <span class='hs-conid'>HscEnv</span>
<a name="line-109"></a>  <span class='hs-varid'>setSession</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HscEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-110"></a>
<a name="line-111"></a><a name="withSession"></a><span class='hs-comment'>-- | Call the argument with the current session.</span>
<a name="line-112"></a><span class='hs-definition'>withSession</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>GhcMonad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>HscEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<a name="line-113"></a><span class='hs-definition'>withSession</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>getSession</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>f</span>
<a name="line-114"></a>
<a name="line-115"></a><a name="modifySession"></a><span class='hs-comment'>-- | Set the current session to the result of applying the current session to</span>
<a name="line-116"></a><span class='hs-comment'>-- the argument.</span>
<a name="line-117"></a><span class='hs-definition'>modifySession</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>GhcMonad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>HscEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HscEnv</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-118"></a><span class='hs-definition'>modifySession</span> <span class='hs-varid'>f</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>h</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getSession</span>
<a name="line-119"></a>                     <span class='hs-varid'>setSession</span> <span class='hs-varop'>$!</span> <span class='hs-varid'>f</span> <span class='hs-varid'>h</span>
<a name="line-120"></a>
<a name="line-121"></a><a name="withSavedSession"></a><span class='hs-definition'>withSavedSession</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>GhcMonad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<a name="line-122"></a><span class='hs-definition'>withSavedSession</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-123"></a>  <span class='hs-varid'>saved_session</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getSession</span>
<a name="line-124"></a>  <span class='hs-varid'>m</span> <span class='hs-varop'>`gfinally`</span> <span class='hs-varid'>setSession</span> <span class='hs-varid'>saved_session</span>
<a name="line-125"></a>
<a name="line-126"></a><a name="withTempSession"></a><span class='hs-comment'>-- | Call an action with a temporarily modified Session.</span>
<a name="line-127"></a><span class='hs-definition'>withTempSession</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>GhcMonad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>HscEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HscEnv</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<a name="line-128"></a><span class='hs-definition'>withTempSession</span> <span class='hs-varid'>f</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span>
<a name="line-129"></a>  <span class='hs-varid'>withSavedSession</span> <span class='hs-varop'>$</span> <span class='hs-varid'>modifySession</span> <span class='hs-varid'>f</span> <span class='hs-varop'>&gt;&gt;</span> <span class='hs-varid'>m</span>
<a name="line-130"></a>
<a name="line-131"></a><a name="Ghc"></a><span class='hs-comment'>-- | A minimal implementation of a 'GhcMonad'.  If you need a custom monad,</span>
<a name="line-132"></a><a name="Ghc"></a><span class='hs-comment'>-- e.g., to maintain additional state consider wrapping this monad or using</span>
<a name="line-133"></a><a name="Ghc"></a><span class='hs-comment'>-- 'GhcT'.</span>
<a name="line-134"></a><a name="Ghc"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>Ghc</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Ghc</span> <span class='hs-layout'>{</span> <span class='hs-varid'>unGhc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Session</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span> <span class='hs-layout'>}</span>
<a name="line-135"></a>
<a name="line-136"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Functor</span> <span class='hs-conid'>Ghc</span> <span class='hs-keyword'>where</span>
<a name="line-137"></a>  <span class='hs-varid'>fmap</span> <span class='hs-varid'>f</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Ghc</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>f</span> <span class='hs-varop'>`fmap`</span> <span class='hs-varid'>unGhc</span> <span class='hs-varid'>m</span> <span class='hs-varid'>s</span>
<a name="line-138"></a>
<a name="line-139"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monad</span> <span class='hs-conid'>Ghc</span> <span class='hs-keyword'>where</span>
<a name="line-140"></a>  <span class='hs-varid'>return</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Ghc</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>a</span>
<a name="line-141"></a>  <span class='hs-varid'>m</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>g</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Ghc</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>unGhc</span> <span class='hs-varid'>m</span> <span class='hs-varid'>s</span><span class='hs-layout'>;</span> <span class='hs-varid'>unGhc</span> <span class='hs-layout'>(</span><span class='hs-varid'>g</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-varid'>s</span>
<a name="line-142"></a>
<a name="line-143"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>MonadIO</span> <span class='hs-conid'>Ghc</span> <span class='hs-keyword'>where</span>
<a name="line-144"></a>  <span class='hs-varid'>liftIO</span> <span class='hs-varid'>ioA</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Ghc</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>ioA</span>
<a name="line-145"></a>
<a name="line-146"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>ExceptionMonad</span> <span class='hs-conid'>Ghc</span> <span class='hs-keyword'>where</span>
<a name="line-147"></a>  <span class='hs-varid'>gcatch</span> <span class='hs-varid'>act</span> <span class='hs-varid'>handle</span> <span class='hs-keyglyph'>=</span>
<a name="line-148"></a>      <span class='hs-conid'>Ghc</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>unGhc</span> <span class='hs-varid'>act</span> <span class='hs-varid'>s</span> <span class='hs-varop'>`gcatch`</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>e</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>unGhc</span> <span class='hs-layout'>(</span><span class='hs-varid'>handle</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-varid'>s</span>
<a name="line-149"></a>  <span class='hs-varid'>gblock</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ghc</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Ghc</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>gblock</span> <span class='hs-layout'>(</span><span class='hs-varid'>m</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-150"></a>  <span class='hs-varid'>gunblock</span> <span class='hs-layout'>(</span><span class='hs-conid'>Ghc</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Ghc</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>gunblock</span> <span class='hs-layout'>(</span><span class='hs-varid'>m</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-151"></a>
<a name="line-152"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>WarnLogMonad</span> <span class='hs-conid'>Ghc</span> <span class='hs-keyword'>where</span>
<a name="line-153"></a>  <span class='hs-varid'>setWarnings</span> <span class='hs-varid'>warns</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Ghc</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-conid'>Session</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>wref</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>writeIORef</span> <span class='hs-varid'>wref</span> <span class='hs-varid'>warns</span>
<a name="line-154"></a>  <span class='hs-comment'>-- | Return 'Warnings' accumulated so far.</span>
<a name="line-155"></a>  <span class='hs-varid'>getWarnings</span>       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Ghc</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-conid'>Session</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>wref</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>readIORef</span> <span class='hs-varid'>wref</span>
<a name="line-156"></a>
<a name="line-157"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>GhcMonad</span> <span class='hs-conid'>Ghc</span> <span class='hs-keyword'>where</span>
<a name="line-158"></a>  <span class='hs-varid'>getSession</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Ghc</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-conid'>Session</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>readIORef</span> <span class='hs-varid'>r</span>
<a name="line-159"></a>  <span class='hs-varid'>setSession</span> <span class='hs-varid'>s'</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Ghc</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-conid'>Session</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>writeIORef</span> <span class='hs-varid'>r</span> <span class='hs-varid'>s'</span>
<a name="line-160"></a>
<a name="line-161"></a><a name="GhcT"></a><span class='hs-comment'>-- | A monad transformer to add GHC specific features to another monad.</span>
<a name="line-162"></a><a name="GhcT"></a><span class='hs-comment'>--</span>
<a name="line-163"></a><a name="GhcT"></a><span class='hs-comment'>-- Note that the wrapped monad must support IO and handling of exceptions.</span>
<a name="line-164"></a><a name="GhcT"></a><span class='hs-keyword'>newtype</span> <span class='hs-conid'>GhcT</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GhcT</span> <span class='hs-layout'>{</span> <span class='hs-varid'>unGhcT</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Session</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-layout'>}</span>
<a name="line-165"></a><a name="liftGhcT"></a><span class='hs-definition'>liftGhcT</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>GhcT</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<a name="line-166"></a><span class='hs-definition'>liftGhcT</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GhcT</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span>
<a name="line-167"></a>
<a name="line-168"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Functor</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Functor</span> <span class='hs-layout'>(</span><span class='hs-conid'>GhcT</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-169"></a>  <span class='hs-varid'>fmap</span> <span class='hs-varid'>f</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GhcT</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>f</span> <span class='hs-varop'>`fmap`</span> <span class='hs-varid'>unGhcT</span> <span class='hs-varid'>m</span> <span class='hs-varid'>s</span>
<a name="line-170"></a>
<a name="line-171"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Monad</span> <span class='hs-layout'>(</span><span class='hs-conid'>GhcT</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-172"></a>  <span class='hs-varid'>return</span> <span class='hs-varid'>x</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GhcT</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>x</span>
<a name="line-173"></a>  <span class='hs-varid'>m</span> <span class='hs-varop'>&gt;&gt;=</span> <span class='hs-varid'>k</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GhcT</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>unGhcT</span> <span class='hs-varid'>m</span> <span class='hs-varid'>s</span><span class='hs-layout'>;</span> <span class='hs-varid'>unGhcT</span> <span class='hs-layout'>(</span><span class='hs-varid'>k</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-varid'>s</span>
<a name="line-174"></a>
<a name="line-175"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>MonadIO</span> <span class='hs-layout'>(</span><span class='hs-conid'>GhcT</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-176"></a>  <span class='hs-varid'>liftIO</span> <span class='hs-varid'>ioA</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GhcT</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>liftIO</span> <span class='hs-varid'>ioA</span>
<a name="line-177"></a>
<a name="line-178"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>ExceptionMonad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>ExceptionMonad</span> <span class='hs-layout'>(</span><span class='hs-conid'>GhcT</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-179"></a>  <span class='hs-varid'>gcatch</span> <span class='hs-varid'>act</span> <span class='hs-varid'>handle</span> <span class='hs-keyglyph'>=</span>
<a name="line-180"></a>      <span class='hs-conid'>GhcT</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>unGhcT</span> <span class='hs-varid'>act</span> <span class='hs-varid'>s</span> <span class='hs-varop'>`gcatch`</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>e</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>unGhcT</span> <span class='hs-layout'>(</span><span class='hs-varid'>handle</span> <span class='hs-varid'>e</span><span class='hs-layout'>)</span> <span class='hs-varid'>s</span>
<a name="line-181"></a>  <span class='hs-varid'>gblock</span> <span class='hs-layout'>(</span><span class='hs-conid'>GhcT</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GhcT</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>gblock</span> <span class='hs-layout'>(</span><span class='hs-varid'>m</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-182"></a>  <span class='hs-varid'>gunblock</span> <span class='hs-layout'>(</span><span class='hs-conid'>GhcT</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GhcT</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>s</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>gunblock</span> <span class='hs-layout'>(</span><span class='hs-varid'>m</span> <span class='hs-varid'>s</span><span class='hs-layout'>)</span>
<a name="line-183"></a>
<a name="line-184"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>WarnLogMonad</span> <span class='hs-layout'>(</span><span class='hs-conid'>GhcT</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-185"></a>  <span class='hs-varid'>setWarnings</span> <span class='hs-varid'>warns</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GhcT</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-conid'>Session</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>wref</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>liftIO</span> <span class='hs-varop'>$</span> <span class='hs-varid'>writeIORef</span> <span class='hs-varid'>wref</span> <span class='hs-varid'>warns</span>
<a name="line-186"></a>  <span class='hs-comment'>-- | Return 'Warnings' accumulated so far.</span>
<a name="line-187"></a>  <span class='hs-varid'>getWarnings</span>       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GhcT</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-conid'>Session</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>wref</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>liftIO</span> <span class='hs-varop'>$</span> <span class='hs-varid'>readIORef</span> <span class='hs-varid'>wref</span>
<a name="line-188"></a>
<a name="line-189"></a><span class='hs-keyword'>instance</span> <span class='hs-layout'>(</span><span class='hs-conid'>Functor</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>ExceptionMonad</span> <span class='hs-varid'>m</span><span class='hs-layout'>,</span> <span class='hs-conid'>MonadIO</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>GhcMonad</span> <span class='hs-layout'>(</span><span class='hs-conid'>GhcT</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-190"></a>  <span class='hs-varid'>getSession</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GhcT</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-conid'>Session</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>liftIO</span> <span class='hs-varop'>$</span> <span class='hs-varid'>readIORef</span> <span class='hs-varid'>r</span>
<a name="line-191"></a>  <span class='hs-varid'>setSession</span> <span class='hs-varid'>s'</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GhcT</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-layout'>(</span><span class='hs-conid'>Session</span> <span class='hs-varid'>r</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>liftIO</span> <span class='hs-varop'>$</span> <span class='hs-varid'>writeIORef</span> <span class='hs-varid'>r</span> <span class='hs-varid'>s'</span>
<a name="line-192"></a>
<a name="line-193"></a><a name="ioMsgMaybe"></a><span class='hs-comment'>-- | Lift an IO action returning errors messages into a 'GhcMonad'.</span>
<a name="line-194"></a><span class='hs-comment'>--</span>
<a name="line-195"></a><span class='hs-comment'>-- In order to reduce dependencies to other parts of the compiler, functions</span>
<a name="line-196"></a><span class='hs-comment'>-- outside the "main" parts of GHC return warnings and errors as a parameter</span>
<a name="line-197"></a><span class='hs-comment'>-- and signal success via by wrapping the result in a 'Maybe' type.  This</span>
<a name="line-198"></a><span class='hs-comment'>-- function logs the returned warnings and propagates errors as exceptions</span>
<a name="line-199"></a><span class='hs-comment'>-- (of type 'SourceError').</span>
<a name="line-200"></a><span class='hs-comment'>--</span>
<a name="line-201"></a><span class='hs-comment'>-- This function assumes the following invariants:</span>
<a name="line-202"></a><span class='hs-comment'>--</span>
<a name="line-203"></a><span class='hs-comment'>--  1. If the second result indicates success (is of the form 'Just x'),</span>
<a name="line-204"></a><span class='hs-comment'>--     there must be no error messages in the first result.</span>
<a name="line-205"></a><span class='hs-comment'>--</span>
<a name="line-206"></a><span class='hs-comment'>--  2. If there are no error messages, but the second result indicates failure</span>
<a name="line-207"></a><span class='hs-comment'>--     there should be warnings in the first result.  That is, if the action</span>
<a name="line-208"></a><span class='hs-comment'>--     failed, it must have been due to the warnings (i.e., @-Werror@).</span>
<a name="line-209"></a><span class='hs-definition'>ioMsgMaybe</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>GhcMonad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span>
<a name="line-210"></a>              <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Messages</span><span class='hs-layout'>,</span> <span class='hs-conid'>Maybe</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<a name="line-211"></a><span class='hs-definition'>ioMsgMaybe</span> <span class='hs-varid'>ioA</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-212"></a>  <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>warns</span><span class='hs-layout'>,</span><span class='hs-varid'>errs</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>mb_r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>liftIO</span> <span class='hs-varid'>ioA</span>
<a name="line-213"></a>  <span class='hs-varid'>logWarnings</span> <span class='hs-varid'>warns</span>
<a name="line-214"></a>  <span class='hs-keyword'>case</span> <span class='hs-varid'>mb_r</span> <span class='hs-keyword'>of</span>
<a name="line-215"></a>    <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>liftIO</span> <span class='hs-varop'>$</span> <span class='hs-varid'>throwIO</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkSrcErr</span> <span class='hs-varid'>errs</span><span class='hs-layout'>)</span>
<a name="line-216"></a>    <span class='hs-conid'>Just</span> <span class='hs-varid'>r</span>  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ASSERT</span><span class='hs-layout'>(</span> <span class='hs-varid'>isEmptyBag</span> <span class='hs-varid'>errs</span> <span class='hs-layout'>)</span> <span class='hs-varid'>return</span> <span class='hs-varid'>r</span>
<a name="line-217"></a>
<a name="line-218"></a><a name="ioMsg"></a><span class='hs-comment'>-- | Lift a non-failing IO action into a 'GhcMonad'.</span>
<a name="line-219"></a><span class='hs-comment'>--</span>
<a name="line-220"></a><span class='hs-comment'>-- Like 'ioMsgMaybe', but assumes that the action will never return any error</span>
<a name="line-221"></a><span class='hs-comment'>-- messages.</span>
<a name="line-222"></a><span class='hs-definition'>ioMsg</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>GhcMonad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Messages</span><span class='hs-layout'>,</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<a name="line-223"></a><span class='hs-definition'>ioMsg</span> <span class='hs-varid'>ioA</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-224"></a>    <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>warns</span><span class='hs-layout'>,</span><span class='hs-varid'>errs</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-varid'>r</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>liftIO</span> <span class='hs-varid'>ioA</span>
<a name="line-225"></a>    <span class='hs-varid'>logWarnings</span> <span class='hs-varid'>warns</span>
<a name="line-226"></a>    <span class='hs-conid'>ASSERT</span><span class='hs-layout'>(</span> <span class='hs-varid'>isEmptyBag</span> <span class='hs-varid'>errs</span> <span class='hs-layout'>)</span> <span class='hs-varid'>return</span> <span class='hs-varid'>r</span>
<a name="line-227"></a>
<a name="line-228"></a><a name="reflectGhc"></a><span class='hs-comment'>-- | Reflect a computation in the 'Ghc' monad into the 'IO' monad.</span>
<a name="line-229"></a><span class='hs-comment'>--</span>
<a name="line-230"></a><span class='hs-comment'>-- You can use this to call functions returning an action in the 'Ghc' monad</span>
<a name="line-231"></a><span class='hs-comment'>-- inside an 'IO' action.  This is needed for some (too restrictive) callback</span>
<a name="line-232"></a><span class='hs-comment'>-- arguments of some library functions:</span>
<a name="line-233"></a><span class='hs-comment'>--</span>
<a name="line-234"></a><span class='hs-comment'>-- &gt; libFunc :: String -&gt; (Int -&gt; IO a) -&gt; IO a</span>
<a name="line-235"></a><span class='hs-comment'>-- &gt; ghcFunc :: Int -&gt; Ghc a</span>
<a name="line-236"></a><span class='hs-comment'>-- &gt;</span>
<a name="line-237"></a><span class='hs-comment'>-- &gt; ghcFuncUsingLibFunc :: String -&gt; Ghc a -&gt; Ghc a</span>
<a name="line-238"></a><span class='hs-comment'>-- &gt; ghcFuncUsingLibFunc str =</span>
<a name="line-239"></a><span class='hs-comment'>-- &gt;   reifyGhc $ \s -&gt;</span>
<a name="line-240"></a><span class='hs-comment'>-- &gt;     libFunc $ \i -&gt; do</span>
<a name="line-241"></a><span class='hs-comment'>-- &gt;       reflectGhc (ghcFunc i) s</span>
<a name="line-242"></a><span class='hs-comment'>--</span>
<a name="line-243"></a><span class='hs-definition'>reflectGhc</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Ghc</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Session</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span>
<a name="line-244"></a><span class='hs-definition'>reflectGhc</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unGhc</span> <span class='hs-varid'>m</span>
<a name="line-245"></a>
<a name="line-246"></a><a name="reifyGhc"></a><span class='hs-comment'>-- &gt; Dual to 'reflectGhc'.  See its documentation.</span>
<a name="line-247"></a><span class='hs-definition'>reifyGhc</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>Session</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-varid'>a</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Ghc</span> <span class='hs-varid'>a</span>
<a name="line-248"></a><span class='hs-definition'>reifyGhc</span> <span class='hs-varid'>act</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Ghc</span> <span class='hs-varop'>$</span> <span class='hs-varid'>act</span>
<a name="line-249"></a>
<a name="line-250"></a><a name="handleFlagWarnings"></a><span class='hs-definition'>handleFlagWarnings</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>GhcMonad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>DynFlags</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Located</span> <span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-251"></a><span class='hs-definition'>handleFlagWarnings</span> <span class='hs-varid'>dflags</span> <span class='hs-varid'>warns</span>
<a name="line-252"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>when</span> <span class='hs-layout'>(</span><span class='hs-varid'>dopt</span> <span class='hs-conid'>Opt_WarnDeprecatedFlags</span> <span class='hs-varid'>dflags</span><span class='hs-layout'>)</span>
<a name="line-253"></a>        <span class='hs-layout'>(</span><span class='hs-varid'>handleFlagWarnings'</span> <span class='hs-varid'>dflags</span> <span class='hs-varid'>warns</span><span class='hs-layout'>)</span>
<a name="line-254"></a>
<a name="line-255"></a><a name="handleFlagWarnings'"></a><span class='hs-definition'>handleFlagWarnings'</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>GhcMonad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>DynFlags</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Located</span> <span class='hs-conid'>String</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-256"></a><span class='hs-definition'>handleFlagWarnings'</span> <span class='hs-keyword'>_</span> <span class='hs-conid'>[]</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>return</span> <span class='hs-conid'>()</span>
<a name="line-257"></a><span class='hs-definition'>handleFlagWarnings'</span> <span class='hs-varid'>dflags</span> <span class='hs-varid'>warns</span>
<a name="line-258"></a> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-comment'>-- It would be nicer if warns :: [Located Message], but that has circular</span>
<a name="line-259"></a>      <span class='hs-comment'>-- import problems.</span>
<a name="line-260"></a>      <span class='hs-varid'>logWarnings</span> <span class='hs-varop'>$</span> <span class='hs-varid'>listToBag</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>mkFlagWarning</span> <span class='hs-varid'>warns</span><span class='hs-layout'>)</span>
<a name="line-261"></a>      <span class='hs-varid'>when</span> <span class='hs-layout'>(</span><span class='hs-varid'>dopt</span> <span class='hs-conid'>Opt_WarnIsError</span> <span class='hs-varid'>dflags</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span>
<a name="line-262"></a>        <span class='hs-varid'>liftIO</span> <span class='hs-varop'>$</span> <span class='hs-varid'>throwIO</span> <span class='hs-varop'>$</span> <span class='hs-varid'>mkSrcErr</span> <span class='hs-varid'>emptyBag</span>
<a name="line-263"></a>
<a name="line-264"></a><a name="mkFlagWarning"></a><span class='hs-definition'>mkFlagWarning</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Located</span> <span class='hs-conid'>String</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>WarnMsg</span>
<a name="line-265"></a><span class='hs-definition'>mkFlagWarning</span> <span class='hs-layout'>(</span><span class='hs-conid'>L</span> <span class='hs-varid'>loc</span> <span class='hs-varid'>warn</span><span class='hs-layout'>)</span>
<a name="line-266"></a> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkPlainWarnMsg</span> <span class='hs-varid'>loc</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-varid'>warn</span><span class='hs-layout'>)</span>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><a name="GhcApiCallbacks"></a><span class='hs-comment'>-- | These functions are called in various places of the GHC API.</span>
<a name="line-2"></a><a name="GhcApiCallbacks"></a><span class='hs-comment'>--</span>
<a name="line-3"></a><a name="GhcApiCallbacks"></a><span class='hs-comment'>-- API clients can override any of these callbacks to change GHC's default</span>
<a name="line-4"></a><a name="GhcApiCallbacks"></a><span class='hs-comment'>-- behaviour.</span>
<a name="line-5"></a><a name="GhcApiCallbacks"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>GhcApiCallbacks</span>
<a name="line-6"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GhcApiCallbacks</span> <span class='hs-layout'>{</span>
<a name="line-7"></a>
<a name="line-8"></a>    <span class='hs-comment'>-- | Called by 'load' after the compilating of each module.</span>
<a name="line-9"></a>    <span class='hs-comment'>--</span>
<a name="line-10"></a>    <span class='hs-comment'>-- The default implementation simply prints all warnings and errors to</span>
<a name="line-11"></a>    <span class='hs-comment'>-- @stderr@.  Don't forget to call 'clearWarnings' when implementing your</span>
<a name="line-12"></a>    <span class='hs-comment'>-- own call.</span>
<a name="line-13"></a>    <span class='hs-comment'>--</span>
<a name="line-14"></a>    <span class='hs-comment'>-- The first argument is the module that was compiled.</span>
<a name="line-15"></a>    <span class='hs-comment'>--</span>
<a name="line-16"></a>    <span class='hs-comment'>-- The second argument is @Nothing@ if no errors occured, but there may</span>
<a name="line-17"></a>    <span class='hs-comment'>-- have been warnings.  If it is @Just err@ at least one error has</span>
<a name="line-18"></a>    <span class='hs-comment'>-- occured.  If 'srcErrorMessages' is empty, compilation failed due to</span>
<a name="line-19"></a>    <span class='hs-comment'>-- @-Werror@.</span>
<a name="line-20"></a>    <span class='hs-varid'>reportModuleCompilationResult</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>GhcMonad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span>
<a name="line-21"></a>                                     <span class='hs-conid'>ModSummary</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>SourceError</span>
<a name="line-22"></a>                                  <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>()</span>
<a name="line-23"></a>  <span class='hs-layout'>}</span>
<a name="line-24"></a>
<a name="line-25"></a><a name="withLocalCallbacks"></a><span class='hs-comment'>-- | Temporarily modify the callbacks.  After the action is executed all</span>
<a name="line-26"></a><span class='hs-comment'>-- callbacks are reset (not, however, any other modifications to the session</span>
<a name="line-27"></a><span class='hs-comment'>-- state.)</span>
<a name="line-28"></a><span class='hs-definition'>withLocalCallbacks</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>GhcMonad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span>
<a name="line-29"></a>                      <span class='hs-layout'>(</span><span class='hs-conid'>GhcApiCallbacks</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>GhcApiCallbacks</span><span class='hs-layout'>)</span>
<a name="line-30"></a>                   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-varid'>a</span>
<a name="line-31"></a><span class='hs-definition'>withLocalCallbacks</span> <span class='hs-varid'>f</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-32"></a>  <span class='hs-varid'>hsc_env</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getSession</span>
<a name="line-33"></a>  <span class='hs-keyword'>let</span> <span class='hs-varid'>cb0</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hsc_callbacks</span> <span class='hs-varid'>hsc_env</span>
<a name="line-34"></a>  <span class='hs-keyword'>let</span> <span class='hs-varid'>cb'</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>f</span> <span class='hs-varid'>cb0</span>
<a name="line-35"></a>  <span class='hs-varid'>setSession</span> <span class='hs-layout'>(</span><span class='hs-varid'>hsc_env</span> <span class='hs-layout'>{</span> <span class='hs-varid'>hsc_callbacks</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cb'</span> <span class='hs-varop'>`seq`</span> <span class='hs-varid'>cb'</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-36"></a>  <span class='hs-varid'>r</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>m</span>
<a name="line-37"></a>  <span class='hs-varid'>hsc_env'</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>getSession</span>
<a name="line-38"></a>  <span class='hs-varid'>setSession</span> <span class='hs-layout'>(</span><span class='hs-varid'>hsc_env'</span> <span class='hs-layout'>{</span> <span class='hs-varid'>hsc_callbacks</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cb0</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span>
<a name="line-39"></a>  <span class='hs-varid'>return</span> <span class='hs-varid'>r</span>
<a name="line-40"></a>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><a name="HscEnv"></a><span class='hs-comment'>-- | Hscenv is like 'Session', except that some of the fields are immutable.</span>
<a name="line-2"></a><a name="HscEnv"></a><span class='hs-comment'>-- An HscEnv is used to compile a single module from plain Haskell source</span>
<a name="line-3"></a><a name="HscEnv"></a><span class='hs-comment'>-- code (after preprocessing) to either C, assembly or C--.  Things like</span>
<a name="line-4"></a><a name="HscEnv"></a><span class='hs-comment'>-- the module graph don't change during a single compilation.</span>
<a name="line-5"></a><a name="HscEnv"></a><span class='hs-comment'>--</span>
<a name="line-6"></a><a name="HscEnv"></a><span class='hs-comment'>-- Historical note: \"hsc\" used to be the name of the compiler binary,</span>
<a name="line-7"></a><a name="HscEnv"></a><span class='hs-comment'>-- when there was a separate driver and compiler.  To compile a single</span>
<a name="line-8"></a><a name="HscEnv"></a><span class='hs-comment'>-- module, the driver would invoke hsc on the source code... so nowadays</span>
<a name="line-9"></a><a name="HscEnv"></a><span class='hs-comment'>-- we think of hsc as the layer of the compiler that deals with compiling</span>
<a name="line-10"></a><a name="HscEnv"></a><span class='hs-comment'>-- a single module.</span>
<a name="line-11"></a><a name="HscEnv"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>HscEnv</span> 
<a name="line-12"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HscEnv</span> <span class='hs-layout'>{</span> 
<a name="line-13"></a>	<span class='hs-varid'>hsc_dflags</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DynFlags</span><span class='hs-layout'>,</span>
<a name="line-14"></a>		<span class='hs-comment'>-- ^ The dynamic flag settings</span>
<a name="line-15"></a>
<a name="line-16"></a>        <span class='hs-varid'>hsc_callbacks</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>GhcApiCallbacks</span><span class='hs-layout'>,</span>
<a name="line-17"></a>                <span class='hs-comment'>-- ^ Callbacks for the GHC API.</span>
<a name="line-18"></a>
<a name="line-19"></a>	<span class='hs-varid'>hsc_targets</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Target</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>
<a name="line-20"></a>		<span class='hs-comment'>-- ^ The targets (or roots) of the current session</span>
<a name="line-21"></a>
<a name="line-22"></a>	<span class='hs-varid'>hsc_mod_graph</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ModuleGraph</span><span class='hs-layout'>,</span>
<a name="line-23"></a>		<span class='hs-comment'>-- ^ The module graph of the current session</span>
<a name="line-24"></a>
<a name="line-25"></a>	<span class='hs-varid'>hsc_IC</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InteractiveContext</span><span class='hs-layout'>,</span>
<a name="line-26"></a>		<span class='hs-comment'>-- ^ The context for evaluating interactive statements</span>
<a name="line-27"></a>
<a name="line-28"></a>	<span class='hs-varid'>hsc_HPT</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HomePackageTable</span><span class='hs-layout'>,</span>
<a name="line-29"></a>		<span class='hs-comment'>-- ^ The home package table describes already-compiled</span>
<a name="line-30"></a>		<span class='hs-comment'>-- home-package modules, /excluding/ the module we </span>
<a name="line-31"></a>		<span class='hs-comment'>-- are compiling right now.</span>
<a name="line-32"></a>		<span class='hs-comment'>-- (In one-shot mode the current module is the only</span>
<a name="line-33"></a>		<span class='hs-comment'>--  home-package module, so hsc_HPT is empty.  All other</span>
<a name="line-34"></a>		<span class='hs-comment'>--  modules count as \"external-package\" modules.</span>
<a name="line-35"></a>		<span class='hs-comment'>--  However, even in GHCi mode, hi-boot interfaces are</span>
<a name="line-36"></a>		<span class='hs-comment'>--  demand-loaded into the external-package table.)</span>
<a name="line-37"></a>		<span class='hs-comment'>--</span>
<a name="line-38"></a>		<span class='hs-comment'>-- 'hsc_HPT' is not mutable because we only demand-load </span>
<a name="line-39"></a>		<span class='hs-comment'>-- external packages; the home package is eagerly </span>
<a name="line-40"></a>		<span class='hs-comment'>-- loaded, module by module, by the compilation manager.</span>
<a name="line-41"></a>		<span class='hs-comment'>--	</span>
<a name="line-42"></a>		<span class='hs-comment'>-- The HPT may contain modules compiled earlier by @--make@</span>
<a name="line-43"></a>		<span class='hs-comment'>-- but not actually below the current module in the dependency</span>
<a name="line-44"></a>		<span class='hs-comment'>-- graph.</span>
<a name="line-45"></a>
<a name="line-46"></a>		<span class='hs-comment'>-- (This changes a previous invariant: changed Jan 05.)</span>
<a name="line-47"></a>	
<a name="line-48"></a>	<span class='hs-varid'>hsc_EPS</span>	<span class='hs-keyglyph'>::</span> <span class='hs-comment'>{-# UNPACK #-}</span> <span class='hs-varop'>!</span><span class='hs-layout'>(</span><span class='hs-conid'>IORef</span> <span class='hs-conid'>ExternalPackageState</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-49"></a>	        <span class='hs-comment'>-- ^ Information about the currently loaded external packages.</span>
<a name="line-50"></a>	        <span class='hs-comment'>-- This is mutable because packages will be demand-loaded during</span>
<a name="line-51"></a>	        <span class='hs-comment'>-- a compilation run as required.</span>
<a name="line-52"></a>	
<a name="line-53"></a>	<span class='hs-varid'>hsc_NC</span>	<span class='hs-keyglyph'>::</span> <span class='hs-comment'>{-# UNPACK #-}</span> <span class='hs-varop'>!</span><span class='hs-layout'>(</span><span class='hs-conid'>IORef</span> <span class='hs-conid'>NameCache</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-54"></a>		<span class='hs-comment'>-- ^ As with 'hsc_EPS', this is side-effected by compiling to</span>
<a name="line-55"></a>		<span class='hs-comment'>-- reflect sucking in interface files.  They cache the state of</span>
<a name="line-56"></a>		<span class='hs-comment'>-- external interface files, in effect.</span>
<a name="line-57"></a>
<a name="line-58"></a>	<span class='hs-varid'>hsc_FC</span>   <span class='hs-keyglyph'>::</span> <span class='hs-comment'>{-# UNPACK #-}</span> <span class='hs-varop'>!</span><span class='hs-layout'>(</span><span class='hs-conid'>IORef</span> <span class='hs-conid'>FinderCache</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-59"></a>	        <span class='hs-comment'>-- ^ The cached result of performing finding in the file system</span>
<a name="line-60"></a>	<span class='hs-varid'>hsc_MLC</span>  <span class='hs-keyglyph'>::</span> <span class='hs-comment'>{-# UNPACK #-}</span> <span class='hs-varop'>!</span><span class='hs-layout'>(</span><span class='hs-conid'>IORef</span> <span class='hs-conid'>ModLocationCache</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-61"></a>		<span class='hs-comment'>-- ^ This caches the location of modules, so we don't have to </span>
<a name="line-62"></a>		<span class='hs-comment'>-- search the filesystem multiple times. See also 'hsc_FC'.</span>
<a name="line-63"></a>
<a name="line-64"></a>        <span class='hs-varid'>hsc_OptFuel</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OptFuelState</span><span class='hs-layout'>,</span>
<a name="line-65"></a>                <span class='hs-comment'>-- ^ Settings to control the use of \"optimization fuel\":</span>
<a name="line-66"></a>                <span class='hs-comment'>-- by limiting the number of transformations,</span>
<a name="line-67"></a>                <span class='hs-comment'>-- we can use binary search to help find compiler bugs.</span>
<a name="line-68"></a>
<a name="line-69"></a>        <span class='hs-varid'>hsc_type_env_var</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>Module</span><span class='hs-layout'>,</span> <span class='hs-conid'>IORef</span> <span class='hs-conid'>TypeEnv</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-70"></a>                <span class='hs-comment'>-- ^ Used for one-shot compilation only, to initialise</span>
<a name="line-71"></a>                <span class='hs-comment'>-- the 'IfGblEnv'. See 'TcRnTypes.tcg_type_env_var' for </span>
<a name="line-72"></a>                <span class='hs-comment'>-- 'TcRunTypes.TcGblEnv'</span>
<a name="line-73"></a>
<a name="line-74"></a>        <span class='hs-varid'>hsc_global_rdr_env</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>GlobalRdrEnv</span><span class='hs-layout'>,</span>
<a name="line-75"></a>                <span class='hs-comment'>-- ^ A mapping from 'RdrName's that are in global scope during</span>
<a name="line-76"></a>                <span class='hs-comment'>-- the compilation of the current file to more detailed</span>
<a name="line-77"></a>                <span class='hs-comment'>-- information about those names. Not necessarily just the</span>
<a name="line-78"></a>                <span class='hs-comment'>-- names directly imported by the module being compiled!</span>
<a name="line-79"></a>        
<a name="line-80"></a>        <span class='hs-varid'>hsc_global_type_env</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TypeEnv</span>
<a name="line-81"></a>                <span class='hs-comment'>-- ^ Typing information about all those things in global scope.</span>
<a name="line-82"></a>                <span class='hs-comment'>-- Not necessarily just the things directly imported by the module </span>
<a name="line-83"></a>                <span class='hs-comment'>-- being compiled!</span>
<a name="line-84"></a> <span class='hs-layout'>}</span>
<a name="line-85"></a>
<a name="line-86"></a><a name="hscEPS"></a><span class='hs-definition'>hscEPS</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HscEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>ExternalPackageState</span>
<a name="line-87"></a><span class='hs-definition'>hscEPS</span> <span class='hs-varid'>hsc_env</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>readIORef</span> <span class='hs-layout'>(</span><span class='hs-varid'>hsc_EPS</span> <span class='hs-varid'>hsc_env</span><span class='hs-layout'>)</span>
<a name="line-88"></a>
<a name="line-89"></a><a name="Target"></a><span class='hs-comment'>-- | A compilation target.</span>
<a name="line-90"></a><a name="Target"></a><span class='hs-comment'>--</span>
<a name="line-91"></a><a name="Target"></a><span class='hs-comment'>-- A target may be supplied with the actual text of the</span>
<a name="line-92"></a><a name="Target"></a><span class='hs-comment'>-- module.  If so, use this instead of the file contents (this</span>
<a name="line-93"></a><a name="Target"></a><span class='hs-comment'>-- is for use in an IDE where the file hasn't been saved by</span>
<a name="line-94"></a><a name="Target"></a><span class='hs-comment'>-- the user yet).</span>
<a name="line-95"></a><a name="Target"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Target</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Target</span>
<a name="line-96"></a>      <span class='hs-layout'>{</span> <span class='hs-varid'>targetId</span>           <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TargetId</span>  <span class='hs-comment'>-- ^ module or filename</span>
<a name="line-97"></a>      <span class='hs-layout'>,</span> <span class='hs-varid'>targetAllowObjCode</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Bool</span>      <span class='hs-comment'>-- ^ object code allowed?</span>
<a name="line-98"></a>      <span class='hs-layout'>,</span> <span class='hs-varid'>targetContents</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>StringBuffer</span><span class='hs-layout'>,</span><span class='hs-conid'>ClockTime</span><span class='hs-layout'>)</span>
<a name="line-99"></a>                                        <span class='hs-comment'>-- ^ in-memory text buffer?</span>
<a name="line-100"></a>      <span class='hs-layout'>}</span>
<a name="line-101"></a>
<a name="line-102"></a><a name="TargetId"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>TargetId</span>
<a name="line-103"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TargetModule</span> <span class='hs-conid'>ModuleName</span>
<a name="line-104"></a>	<span class='hs-comment'>-- ^ A module name: search for the file</span>
<a name="line-105"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>TargetFile</span> <span class='hs-conid'>FilePath</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Phase</span><span class='hs-layout'>)</span>
<a name="line-106"></a>	<span class='hs-comment'>-- ^ A filename: preprocess &amp; parse it to find the module name.</span>
<a name="line-107"></a>	<span class='hs-comment'>-- If specified, the Phase indicates how to compile this file</span>
<a name="line-108"></a>	<span class='hs-comment'>-- (which phase to start from).  Nothing indicates the starting phase</span>
<a name="line-109"></a>	<span class='hs-comment'>-- should be determined from the suffix of the filename.</span>
<a name="line-110"></a>  <span class='hs-keyword'>deriving</span> <span class='hs-conid'>Eq</span>
<a name="line-111"></a>
<a name="line-112"></a><a name="pprTarget"></a><span class='hs-definition'>pprTarget</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Target</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-113"></a><span class='hs-definition'>pprTarget</span> <span class='hs-layout'>(</span><span class='hs-conid'>Target</span> <span class='hs-varid'>id</span> <span class='hs-varid'>obj</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> 
<a name="line-114"></a>   <span class='hs-layout'>(</span><span class='hs-keyword'>if</span> <span class='hs-varid'>obj</span> <span class='hs-keyword'>then</span> <span class='hs-varid'>char</span> <span class='hs-chr'>'*'</span> <span class='hs-keyword'>else</span> <span class='hs-varid'>empty</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>pprTargetId</span> <span class='hs-varid'>id</span>
<a name="line-115"></a>
<a name="line-116"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>Target</span> <span class='hs-keyword'>where</span>
<a name="line-117"></a>    <span class='hs-varid'>ppr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprTarget</span>
<a name="line-118"></a>
<a name="line-119"></a><a name="pprTargetId"></a><span class='hs-definition'>pprTargetId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TargetId</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-120"></a><span class='hs-definition'>pprTargetId</span> <span class='hs-layout'>(</span><span class='hs-conid'>TargetModule</span> <span class='hs-varid'>m</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>m</span>
<a name="line-121"></a><span class='hs-definition'>pprTargetId</span> <span class='hs-layout'>(</span><span class='hs-conid'>TargetFile</span> <span class='hs-varid'>f</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-varid'>f</span>
<a name="line-122"></a>
<a name="line-123"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>TargetId</span> <span class='hs-keyword'>where</span>
<a name="line-124"></a>    <span class='hs-varid'>ppr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprTargetId</span>
<a name="line-125"></a>
<a name="line-126"></a><a name="HomePackageTable"></a><span class='hs-comment'>-- | Helps us find information about modules in the home package</span>
<a name="line-127"></a><a name="HomePackageTable"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>HomePackageTable</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ModuleNameEnv</span> <span class='hs-conid'>HomeModInfo</span>
<a name="line-128"></a>	<span class='hs-comment'>-- Domain = modules in the home package that have been fully compiled</span>
<a name="line-129"></a>	<span class='hs-comment'>-- "home" package name cached here for convenience</span>
<a name="line-130"></a>
<a name="line-131"></a><a name="PackageIfaceTable"></a><span class='hs-comment'>-- | Helps us find information about modules in the imported packages</span>
<a name="line-132"></a><a name="PackageIfaceTable"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>PackageIfaceTable</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ModuleEnv</span> <span class='hs-conid'>ModIface</span>
<a name="line-133"></a>	<span class='hs-comment'>-- Domain = modules in the imported packages</span>
<a name="line-134"></a>
<a name="line-135"></a><a name="emptyHomePackageTable"></a><span class='hs-definition'>emptyHomePackageTable</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HomePackageTable</span>
<a name="line-136"></a><span class='hs-definition'>emptyHomePackageTable</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>emptyUFM</span>
<a name="line-137"></a>
<a name="line-138"></a><a name="emptyPackageIfaceTable"></a><span class='hs-definition'>emptyPackageIfaceTable</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>PackageIfaceTable</span>
<a name="line-139"></a><span class='hs-definition'>emptyPackageIfaceTable</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>emptyModuleEnv</span>
<a name="line-140"></a>
<a name="line-141"></a><a name="HomeModInfo"></a><span class='hs-comment'>-- | Information about modules in the package being compiled</span>
<a name="line-142"></a><a name="HomeModInfo"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>HomeModInfo</span> 
<a name="line-143"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HomeModInfo</span> <span class='hs-layout'>{</span>
<a name="line-144"></a>      <span class='hs-varid'>hm_iface</span>    <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>ModIface</span><span class='hs-layout'>,</span>
<a name="line-145"></a>        <span class='hs-comment'>-- ^ The basic loaded interface file: every loaded module has one of</span>
<a name="line-146"></a>        <span class='hs-comment'>-- these, even if it is imported from another package</span>
<a name="line-147"></a>      <span class='hs-varid'>hm_details</span>  <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>ModDetails</span><span class='hs-layout'>,</span>
<a name="line-148"></a>        <span class='hs-comment'>-- ^ Extra information that has been created from the 'ModIface' for</span>
<a name="line-149"></a>	<span class='hs-comment'>-- the module, typically during typechecking</span>
<a name="line-150"></a>      <span class='hs-varid'>hm_linkable</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>Linkable</span><span class='hs-layout'>)</span>
<a name="line-151"></a>        <span class='hs-comment'>-- ^ The actual artifact we would like to link to access things in</span>
<a name="line-152"></a>	<span class='hs-comment'>-- this module.</span>
<a name="line-153"></a>	<span class='hs-comment'>--</span>
<a name="line-154"></a>	<span class='hs-comment'>-- 'hm_linkable' might be Nothing:</span>
<a name="line-155"></a>	<span class='hs-comment'>--</span>
<a name="line-156"></a>	<span class='hs-comment'>--   1. If this is an .hs-boot module</span>
<a name="line-157"></a>	<span class='hs-comment'>--</span>
<a name="line-158"></a>	<span class='hs-comment'>--   2. Temporarily during compilation if we pruned away</span>
<a name="line-159"></a>	<span class='hs-comment'>--      the old linkable because it was out of date.</span>
<a name="line-160"></a>	<span class='hs-comment'>--</span>
<a name="line-161"></a>	<span class='hs-comment'>-- After a complete compilation ('GHC.load'), all 'hm_linkable' fields</span>
<a name="line-162"></a>	<span class='hs-comment'>-- in the 'HomePackageTable' will be @Just@.</span>
<a name="line-163"></a>	<span class='hs-comment'>--</span>
<a name="line-164"></a>	<span class='hs-comment'>-- When re-linking a module ('HscMain.HscNoRecomp'), we construct the</span>
<a name="line-165"></a>	<span class='hs-comment'>-- 'HomeModInfo' by building a new 'ModDetails' from the old</span>
<a name="line-166"></a>	<span class='hs-comment'>-- 'ModIface' (only).</span>
<a name="line-167"></a>    <span class='hs-layout'>}</span>
<a name="line-168"></a>
<a name="line-169"></a><a name="lookupIfaceByModule"></a><span class='hs-comment'>-- | Find the 'ModIface' for a 'Module', searching in both the loaded home</span>
<a name="line-170"></a><span class='hs-comment'>-- and external package module information</span>
<a name="line-171"></a><span class='hs-definition'>lookupIfaceByModule</span>
<a name="line-172"></a>	<span class='hs-keyglyph'>::</span> <span class='hs-conid'>DynFlags</span>
<a name="line-173"></a>	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HomePackageTable</span>
<a name="line-174"></a>	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PackageIfaceTable</span>
<a name="line-175"></a>	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Module</span>
<a name="line-176"></a>	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>ModIface</span>
<a name="line-177"></a><span class='hs-definition'>lookupIfaceByModule</span> <span class='hs-varid'>dflags</span> <span class='hs-varid'>hpt</span> <span class='hs-varid'>pit</span> <span class='hs-varid'>mod</span>
<a name="line-178"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>modulePackageId</span> <span class='hs-varid'>mod</span> <span class='hs-varop'>==</span> <span class='hs-varid'>thisPackage</span> <span class='hs-varid'>dflags</span>
<a name="line-179"></a>  <span class='hs-keyglyph'>=</span> 	<span class='hs-comment'>-- The module comes from the home package, so look first</span>
<a name="line-180"></a>	<span class='hs-comment'>-- in the HPT.  If it's not from the home package it's wrong to look</span>
<a name="line-181"></a>	<span class='hs-comment'>-- in the HPT, because the HPT is indexed by *ModuleName* not Module</span>
<a name="line-182"></a>    <span class='hs-varid'>fmap</span> <span class='hs-varid'>hm_iface</span> <span class='hs-layout'>(</span><span class='hs-varid'>lookupUFM</span> <span class='hs-varid'>hpt</span> <span class='hs-layout'>(</span><span class='hs-varid'>moduleName</span> <span class='hs-varid'>mod</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> 
<a name="line-183"></a>    <span class='hs-varop'>`mplus`</span> <span class='hs-varid'>lookupModuleEnv</span> <span class='hs-varid'>pit</span> <span class='hs-varid'>mod</span>
<a name="line-184"></a>
<a name="line-185"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lookupModuleEnv</span> <span class='hs-varid'>pit</span> <span class='hs-varid'>mod</span>		<span class='hs-comment'>-- Look in PIT only </span>
<a name="line-186"></a>
<a name="line-187"></a><span class='hs-comment'>-- If the module does come from the home package, why do we look in the PIT as well?</span>
<a name="line-188"></a><span class='hs-comment'>-- (a) In OneShot mode, even home-package modules accumulate in the PIT</span>
<a name="line-189"></a><span class='hs-comment'>-- (b) Even in Batch (--make) mode, there is *one* case where a home-package</span>
<a name="line-190"></a><span class='hs-comment'>--     module is in the PIT, namely GHC.Prim when compiling the base package.</span>
<a name="line-191"></a><span class='hs-comment'>-- We could eliminate (b) if we wanted, by making GHC.Prim belong to a package</span>
<a name="line-192"></a><span class='hs-comment'>-- of its own, but it doesn't seem worth the bother.</span>
</pre>\end{code}


\begin{code}
<pre><a name="line-1"></a><a name="hptInstances"></a><span class='hs-definition'>hptInstances</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HscEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>ModuleName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>Instance</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>FamInst</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-2"></a><span class='hs-comment'>-- ^ Find all the instance declarations (of classes and families) that are in</span>
<a name="line-3"></a><span class='hs-comment'>-- modules imported by this one, directly or indirectly, and are in the Home</span>
<a name="line-4"></a><span class='hs-comment'>-- Package Table.  This ensures that we don't see instances from modules @--make@</span>
<a name="line-5"></a><span class='hs-comment'>-- compiled before this one, but which are not below this one.</span>
<a name="line-6"></a><span class='hs-definition'>hptInstances</span> <span class='hs-varid'>hsc_env</span> <span class='hs-varid'>want_this_module</span>
<a name="line-7"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> <span class='hs-layout'>(</span><span class='hs-varid'>insts</span><span class='hs-layout'>,</span> <span class='hs-varid'>famInsts</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>unzip</span> <span class='hs-varop'>$</span> <span class='hs-varid'>flip</span> <span class='hs-varid'>hptAllThings</span> <span class='hs-varid'>hsc_env</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>mod_info</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyword'>do</span>
<a name="line-8"></a>                <span class='hs-varid'>guard</span> <span class='hs-layout'>(</span><span class='hs-varid'>want_this_module</span> <span class='hs-layout'>(</span><span class='hs-varid'>moduleName</span> <span class='hs-layout'>(</span><span class='hs-varid'>mi_module</span> <span class='hs-layout'>(</span><span class='hs-varid'>hm_iface</span> <span class='hs-varid'>mod_info</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-9"></a>                <span class='hs-keyword'>let</span> <span class='hs-varid'>details</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hm_details</span> <span class='hs-varid'>mod_info</span>
<a name="line-10"></a>                <span class='hs-varid'>return</span> <span class='hs-layout'>(</span><span class='hs-varid'>md_insts</span> <span class='hs-varid'>details</span><span class='hs-layout'>,</span> <span class='hs-varid'>md_fam_insts</span> <span class='hs-varid'>details</span><span class='hs-layout'>)</span>
<a name="line-11"></a>    <span class='hs-keyword'>in</span> <span class='hs-layout'>(</span><span class='hs-varid'>concat</span> <span class='hs-varid'>insts</span><span class='hs-layout'>,</span> <span class='hs-varid'>concat</span> <span class='hs-varid'>famInsts</span><span class='hs-layout'>)</span>
<a name="line-12"></a>
<a name="line-13"></a><a name="hptVectInfo"></a><span class='hs-definition'>hptVectInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HscEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>VectInfo</span>
<a name="line-14"></a><span class='hs-comment'>-- ^ Get the combined VectInfo of all modules in the home package table.  In</span>
<a name="line-15"></a><span class='hs-comment'>-- contrast to instances and rules, we don't care whether the modules are</span>
<a name="line-16"></a><span class='hs-comment'>-- \"below\" us in the dependency sense.  The VectInfo of those modules not \"below\" </span>
<a name="line-17"></a><span class='hs-comment'>-- us does not affect the compilation of the current module.</span>
<a name="line-18"></a><span class='hs-definition'>hptVectInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>concatVectInfo</span> <span class='hs-varop'>.</span> <span class='hs-varid'>hptAllThings</span> <span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-conop'>:</span> <span class='hs-conid'>[]</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>md_vect_info</span> <span class='hs-varop'>.</span> <span class='hs-varid'>hm_details</span><span class='hs-layout'>)</span>
<a name="line-19"></a>
<a name="line-20"></a><a name="hptRules"></a><span class='hs-definition'>hptRules</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HscEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>ModuleName</span><span class='hs-layout'>,</span> <span class='hs-conid'>IsBootInterface</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CoreRule</span><span class='hs-keyglyph'>]</span>
<a name="line-21"></a><span class='hs-comment'>-- ^ Get rules from modules \"below\" this one (in the dependency sense)</span>
<a name="line-22"></a><span class='hs-definition'>hptRules</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hptSomeThingsBelowUs</span> <span class='hs-layout'>(</span><span class='hs-varid'>md_rules</span> <span class='hs-varop'>.</span> <span class='hs-varid'>hm_details</span><span class='hs-layout'>)</span> <span class='hs-conid'>False</span>
<a name="line-23"></a>
<a name="line-24"></a>
<a name="line-25"></a><a name="hptAnns"></a><span class='hs-definition'>hptAnns</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HscEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>ModuleName</span><span class='hs-layout'>,</span> <span class='hs-conid'>IsBootInterface</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Annotation</span><span class='hs-keyglyph'>]</span>
<a name="line-26"></a><span class='hs-comment'>-- ^ Get annotations from modules \"below\" this one (in the dependency sense)</span>
<a name="line-27"></a><span class='hs-definition'>hptAnns</span> <span class='hs-varid'>hsc_env</span> <span class='hs-layout'>(</span><span class='hs-conid'>Just</span> <span class='hs-varid'>deps</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hptSomeThingsBelowUs</span> <span class='hs-layout'>(</span><span class='hs-varid'>md_anns</span> <span class='hs-varop'>.</span> <span class='hs-varid'>hm_details</span><span class='hs-layout'>)</span> <span class='hs-conid'>False</span> <span class='hs-varid'>hsc_env</span> <span class='hs-varid'>deps</span>
<a name="line-28"></a><span class='hs-definition'>hptAnns</span> <span class='hs-varid'>hsc_env</span> <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hptAllThings</span> <span class='hs-layout'>(</span><span class='hs-varid'>md_anns</span> <span class='hs-varop'>.</span> <span class='hs-varid'>hm_details</span><span class='hs-layout'>)</span> <span class='hs-varid'>hsc_env</span>
<a name="line-29"></a>
<a name="line-30"></a><a name="hptAllThings"></a><span class='hs-definition'>hptAllThings</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>HomeModInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HscEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>
<a name="line-31"></a><span class='hs-definition'>hptAllThings</span> <span class='hs-varid'>extract</span> <span class='hs-varid'>hsc_env</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>concatMap</span> <span class='hs-varid'>extract</span> <span class='hs-layout'>(</span><span class='hs-varid'>eltsUFM</span> <span class='hs-layout'>(</span><span class='hs-varid'>hsc_HPT</span> <span class='hs-varid'>hsc_env</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-32"></a>
<a name="line-33"></a><a name="hptSomeThingsBelowUs"></a><span class='hs-definition'>hptSomeThingsBelowUs</span> <span class='hs-keyglyph'>::</span> <span class='hs-layout'>(</span><span class='hs-conid'>HomeModInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HscEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>ModuleName</span><span class='hs-layout'>,</span> <span class='hs-conid'>IsBootInterface</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>a</span><span class='hs-keyglyph'>]</span>
<a name="line-34"></a><span class='hs-comment'>-- Get things from modules \"below\" this one (in the dependency sense)</span>
<a name="line-35"></a><span class='hs-comment'>-- C.f Inst.hptInstances</span>
<a name="line-36"></a><span class='hs-definition'>hptSomeThingsBelowUs</span> <span class='hs-varid'>extract</span> <span class='hs-varid'>include_hi_boot</span> <span class='hs-varid'>hsc_env</span> <span class='hs-varid'>deps</span>
<a name="line-37"></a> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isOneShot</span> <span class='hs-layout'>(</span><span class='hs-varid'>ghcMode</span> <span class='hs-layout'>(</span><span class='hs-varid'>hsc_dflags</span> <span class='hs-varid'>hsc_env</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-38"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>
<a name="line-39"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>let</span> 
<a name="line-40"></a>	<span class='hs-varid'>hpt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hsc_HPT</span> <span class='hs-varid'>hsc_env</span>
<a name="line-41"></a>    <span class='hs-keyword'>in</span>
<a name="line-42"></a>    <span class='hs-keyglyph'>[</span> <span class='hs-varid'>thing</span>
<a name="line-43"></a>    <span class='hs-keyglyph'>|</span>	<span class='hs-comment'>-- Find each non-hi-boot module below me</span>
<a name="line-44"></a>      <span class='hs-layout'>(</span><span class='hs-varid'>mod</span><span class='hs-layout'>,</span> <span class='hs-varid'>is_boot_mod</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>deps</span>
<a name="line-45"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>include_hi_boot</span> <span class='hs-varop'>||</span> <span class='hs-varid'>not</span> <span class='hs-varid'>is_boot_mod</span>
<a name="line-46"></a>
<a name="line-47"></a>	<span class='hs-comment'>-- unsavoury: when compiling the base package with --make, we</span>
<a name="line-48"></a>	<span class='hs-comment'>-- sometimes try to look up RULES etc for GHC.Prim.  GHC.Prim won't</span>
<a name="line-49"></a>	<span class='hs-comment'>-- be in the HPT, because we never compile it; it's in the EPT</span>
<a name="line-50"></a>	<span class='hs-comment'>-- instead.  ToDo: clean up, and remove this slightly bogus</span>
<a name="line-51"></a>	<span class='hs-comment'>-- filter:</span>
<a name="line-52"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>mod</span> <span class='hs-varop'>/=</span> <span class='hs-varid'>moduleName</span> <span class='hs-varid'>gHC_PRIM</span>
<a name="line-53"></a>
<a name="line-54"></a>	<span class='hs-comment'>-- Look it up in the HPT</span>
<a name="line-55"></a>    <span class='hs-layout'>,</span> <span class='hs-keyword'>let</span> <span class='hs-varid'>things</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>lookupUFM</span> <span class='hs-varid'>hpt</span> <span class='hs-varid'>mod</span> <span class='hs-keyword'>of</span>
<a name="line-56"></a>		    <span class='hs-conid'>Just</span> <span class='hs-varid'>info</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>extract</span> <span class='hs-varid'>info</span>
<a name="line-57"></a>		    <span class='hs-conid'>Nothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>pprTrace</span> <span class='hs-str'>"WARNING in hptSomeThingsBelowUs"</span> <span class='hs-varid'>msg</span> <span class='hs-conid'>[]</span> 
<a name="line-58"></a>	  <span class='hs-varid'>msg</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>vcat</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"missing module"</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>mod</span><span class='hs-layout'>,</span>
<a name="line-59"></a>		      <span class='hs-varid'>ptext</span> <span class='hs-layout'>(</span><span class='hs-varid'>sLit</span> <span class='hs-str'>"Probable cause: out-of-date interface files"</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-60"></a>			<span class='hs-comment'>-- This really shouldn't happen, but see Trac #962</span>
<a name="line-61"></a>
<a name="line-62"></a>	<span class='hs-comment'>-- And get its dfuns</span>
<a name="line-63"></a>    <span class='hs-layout'>,</span> <span class='hs-varid'>thing</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>things</span> <span class='hs-keyglyph'>]</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection{Dealing with Annotations}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="prepareAnnotations"></a><span class='hs-definition'>prepareAnnotations</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HscEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>ModGuts</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-conid'>AnnEnv</span>
<a name="line-2"></a><span class='hs-comment'>-- ^ Deal with gathering annotations in from all possible places </span>
<a name="line-3"></a><span class='hs-comment'>--   and combining them into a single 'AnnEnv'</span>
<a name="line-4"></a><span class='hs-definition'>prepareAnnotations</span> <span class='hs-varid'>hsc_env</span> <span class='hs-varid'>mb_guts</span>
<a name="line-5"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-layout'>{</span> <span class='hs-varid'>eps</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>hscEPS</span> <span class='hs-varid'>hsc_env</span>
<a name="line-6"></a>       <span class='hs-layout'>;</span> <span class='hs-keyword'>let</span> <span class='hs-comment'>-- Extract annotations from the module being compiled if supplied one</span>
<a name="line-7"></a>            <span class='hs-varid'>mb_this_module_anns</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fmap</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkAnnEnv</span> <span class='hs-varop'>.</span> <span class='hs-varid'>mg_anns</span><span class='hs-layout'>)</span> <span class='hs-varid'>mb_guts</span>
<a name="line-8"></a>        <span class='hs-comment'>-- Extract dependencies of the module if we are supplied one,</span>
<a name="line-9"></a>        <span class='hs-comment'>-- otherwise load annotations from all home package table</span>
<a name="line-10"></a>        <span class='hs-comment'>-- entries regardless of dependency ordering.</span>
<a name="line-11"></a>            <span class='hs-varid'>home_pkg_anns</span>  <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkAnnEnv</span> <span class='hs-varop'>.</span> <span class='hs-varid'>hptAnns</span> <span class='hs-varid'>hsc_env</span><span class='hs-layout'>)</span> <span class='hs-varop'>$</span> <span class='hs-varid'>fmap</span> <span class='hs-layout'>(</span><span class='hs-varid'>dep_mods</span> <span class='hs-varop'>.</span> <span class='hs-varid'>mg_deps</span><span class='hs-layout'>)</span> <span class='hs-varid'>mb_guts</span>
<a name="line-12"></a>            <span class='hs-varid'>other_pkg_anns</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>eps_ann_env</span> <span class='hs-varid'>eps</span>
<a name="line-13"></a>            <span class='hs-varid'>ann_env</span>        <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldl1'</span> <span class='hs-varid'>plusAnnEnv</span> <span class='hs-varop'>$</span> <span class='hs-varid'>catMaybes</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>mb_this_module_anns</span><span class='hs-layout'>,</span> 
<a name="line-14"></a>                                                             <span class='hs-conid'>Just</span> <span class='hs-varid'>home_pkg_anns</span><span class='hs-layout'>,</span> 
<a name="line-15"></a>                                                             <span class='hs-conid'>Just</span> <span class='hs-varid'>other_pkg_anns</span><span class='hs-keyglyph'>]</span>
<a name="line-16"></a>
<a name="line-17"></a>       <span class='hs-layout'>;</span> <span class='hs-varid'>return</span> <span class='hs-varid'>ann_env</span> <span class='hs-layout'>}</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection{The Finder cache}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="FinderCache"></a><span class='hs-comment'>-- | The 'FinderCache' maps home module names to the result of</span>
<a name="line-2"></a><a name="FinderCache"></a><span class='hs-comment'>-- searching for that module.  It records the results of searching for</span>
<a name="line-3"></a><a name="FinderCache"></a><span class='hs-comment'>-- modules along the search path.  On @:load@, we flush the entire</span>
<a name="line-4"></a><a name="FinderCache"></a><span class='hs-comment'>-- contents of this cache.</span>
<a name="line-5"></a><a name="FinderCache"></a><span class='hs-comment'>--</span>
<a name="line-6"></a><a name="FinderCache"></a><span class='hs-comment'>-- Although the @FinderCache@ range is 'FindResult' for convenience ,</span>
<a name="line-7"></a><a name="FinderCache"></a><span class='hs-comment'>-- in fact it will only ever contain 'Found' or 'NotFound' entries.</span>
<a name="line-8"></a><a name="FinderCache"></a><span class='hs-comment'>--</span>
<a name="line-9"></a><a name="FinderCache"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>FinderCache</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ModuleNameEnv</span> <span class='hs-conid'>FindResult</span>
<a name="line-10"></a>
<a name="line-11"></a><a name="FindResult"></a><span class='hs-comment'>-- | The result of searching for an imported module.</span>
<a name="line-12"></a><a name="FindResult"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>FindResult</span>
<a name="line-13"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Found</span> <span class='hs-conid'>ModLocation</span> <span class='hs-conid'>Module</span>
<a name="line-14"></a>	<span class='hs-comment'>-- ^ The module was found</span>
<a name="line-15"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>NoPackage</span> <span class='hs-conid'>PackageId</span>
<a name="line-16"></a>	<span class='hs-comment'>-- ^ The requested package was not found</span>
<a name="line-17"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>FoundMultiple</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>PackageId</span><span class='hs-keyglyph'>]</span>
<a name="line-18"></a>	<span class='hs-comment'>-- ^ _Error_: both in multiple packages</span>
<a name="line-19"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>NotFound</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>FilePath</span><span class='hs-keyglyph'>]</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>PackageId</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>PackageId</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>PackageId</span><span class='hs-keyglyph'>]</span>
<a name="line-20"></a>	<span class='hs-comment'>-- ^ The module was not found, including either</span>
<a name="line-21"></a>        <span class='hs-comment'>--    * the specified places were searched</span>
<a name="line-22"></a>        <span class='hs-comment'>--    * the package that this module should have been in</span>
<a name="line-23"></a>        <span class='hs-comment'>--    * list of packages in which the module was hidden,</span>
<a name="line-24"></a>        <span class='hs-comment'>--    * list of hidden packages containing this module</span>
<a name="line-25"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>NotFoundInPackage</span> <span class='hs-conid'>PackageId</span>
<a name="line-26"></a>	<span class='hs-comment'>-- ^ The module was not found in this package</span>
<a name="line-27"></a>
<a name="line-28"></a><a name="ModLocationCache"></a><span class='hs-comment'>-- | Cache that remembers where we found a particular module.  Contains both</span>
<a name="line-29"></a><a name="ModLocationCache"></a><span class='hs-comment'>-- home modules and package modules.  On @:load@, only home modules are</span>
<a name="line-30"></a><a name="ModLocationCache"></a><span class='hs-comment'>-- purged from this cache.</span>
<a name="line-31"></a><a name="ModLocationCache"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>ModLocationCache</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ModuleEnv</span> <span class='hs-conid'>ModLocation</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection{Symbol tables and Module details}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="ModIface"></a><span class='hs-comment'>-- | A 'ModIface' plus a 'ModDetails' summarises everything we know </span>
<a name="line-2"></a><a name="ModIface"></a><span class='hs-comment'>-- about a compiled module.  The 'ModIface' is the stuff *before* linking,</span>
<a name="line-3"></a><a name="ModIface"></a><span class='hs-comment'>-- and can be written out to an interface file. The 'ModDetails is after </span>
<a name="line-4"></a><a name="ModIface"></a><span class='hs-comment'>-- linking and can be completely recovered from just the 'ModIface'.</span>
<a name="line-5"></a><a name="ModIface"></a><span class='hs-comment'>-- </span>
<a name="line-6"></a><a name="ModIface"></a><span class='hs-comment'>-- When we read an interface file, we also construct a 'ModIface' from it,</span>
<a name="line-7"></a><a name="ModIface"></a><span class='hs-comment'>-- except that we explicitly make the 'mi_decls' and a few other fields empty;</span>
<a name="line-8"></a><a name="ModIface"></a><span class='hs-comment'>-- as when reading we consolidate the declarations etc. into a number of indexed</span>
<a name="line-9"></a><a name="ModIface"></a><span class='hs-comment'>-- maps and environments in the 'ExternalPackageState'.</span>
<a name="line-10"></a><a name="ModIface"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>ModIface</span> 
<a name="line-11"></a>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ModIface</span> <span class='hs-layout'>{</span>
<a name="line-12"></a>        <span class='hs-varid'>mi_module</span>   <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>Module</span><span class='hs-layout'>,</span>             <span class='hs-comment'>-- ^ Name of the module we are for</span>
<a name="line-13"></a>        <span class='hs-varid'>mi_iface_hash</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>Fingerprint</span><span class='hs-layout'>,</span>      <span class='hs-comment'>-- ^ Hash of the whole interface</span>
<a name="line-14"></a>        <span class='hs-varid'>mi_mod_hash</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>Fingerprint</span><span class='hs-layout'>,</span>	    <span class='hs-comment'>-- ^ Hash of the ABI only</span>
<a name="line-15"></a>
<a name="line-16"></a>        <span class='hs-varid'>mi_orphan</span>   <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>WhetherHasOrphans</span><span class='hs-layout'>,</span>  <span class='hs-comment'>-- ^ Whether this module has orphans</span>
<a name="line-17"></a>        <span class='hs-varid'>mi_finsts</span>   <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>WhetherHasFamInst</span><span class='hs-layout'>,</span>  <span class='hs-comment'>-- ^ Whether this module has family instances</span>
<a name="line-18"></a>	<span class='hs-varid'>mi_boot</span>	    <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>IsBootInterface</span><span class='hs-layout'>,</span>    <span class='hs-comment'>-- ^ Read from an hi-boot file?</span>
<a name="line-19"></a>
<a name="line-20"></a>	<span class='hs-varid'>mi_deps</span>	    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Dependencies</span><span class='hs-layout'>,</span>
<a name="line-21"></a>	        <span class='hs-comment'>-- ^ The dependencies of the module.  This is</span>
<a name="line-22"></a>		<span class='hs-comment'>-- consulted for directly-imported modules, but not</span>
<a name="line-23"></a>		<span class='hs-comment'>-- for anything else (hence lazy)</span>
<a name="line-24"></a>
<a name="line-25"></a>        <span class='hs-varid'>mi_usages</span>   <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Usage</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>
<a name="line-26"></a>                <span class='hs-comment'>-- ^ Usages; kept sorted so that it's easy to decide</span>
<a name="line-27"></a>		<span class='hs-comment'>-- whether to write a new iface file (changing usages</span>
<a name="line-28"></a>		<span class='hs-comment'>-- doesn't affect the hash of this module)</span>
<a name="line-29"></a>        
<a name="line-30"></a>		<span class='hs-comment'>-- NOT STRICT!  we read this field lazily from the interface file</span>
<a name="line-31"></a>		<span class='hs-comment'>-- It is *only* consulted by the recompilation checker</span>
<a name="line-32"></a>
<a name="line-33"></a>		<span class='hs-comment'>-- Exports</span>
<a name="line-34"></a>		<span class='hs-comment'>-- Kept sorted by (mod,occ), to make version comparisons easier</span>
<a name="line-35"></a>        <span class='hs-varid'>mi_exports</span>  <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>IfaceExport</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>
<a name="line-36"></a>                <span class='hs-comment'>-- ^ Records the modules that are the declaration points for things</span>
<a name="line-37"></a>                <span class='hs-comment'>-- exported by this module, and the 'OccName's of those things</span>
<a name="line-38"></a>        
<a name="line-39"></a>        <span class='hs-varid'>mi_exp_hash</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>Fingerprint</span><span class='hs-layout'>,</span>	<span class='hs-comment'>-- ^ Hash of export list</span>
<a name="line-40"></a>
<a name="line-41"></a>        <span class='hs-varid'>mi_fixities</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>OccName</span><span class='hs-layout'>,</span><span class='hs-conid'>Fixity</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>
<a name="line-42"></a>                <span class='hs-comment'>-- ^ Fixities</span>
<a name="line-43"></a>        
<a name="line-44"></a>		<span class='hs-comment'>-- NOT STRICT!  we read this field lazily from the interface file</span>
<a name="line-45"></a>
<a name="line-46"></a>	<span class='hs-varid'>mi_warns</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Warnings</span><span class='hs-layout'>,</span>
<a name="line-47"></a>		<span class='hs-comment'>-- ^ Warnings</span>
<a name="line-48"></a>		
<a name="line-49"></a>		<span class='hs-comment'>-- NOT STRICT!  we read this field lazily from the interface file</span>
<a name="line-50"></a>
<a name="line-51"></a>	<span class='hs-varid'>mi_anns</span>  <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>IfaceAnnotation</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>
<a name="line-52"></a>	        <span class='hs-comment'>-- ^ Annotations</span>
<a name="line-53"></a>	
<a name="line-54"></a>		<span class='hs-comment'>-- NOT STRICT!  we read this field lazily from the interface file</span>
<a name="line-55"></a>
<a name="line-56"></a>		<span class='hs-comment'>-- Type, class and variable declarations</span>
<a name="line-57"></a>		<span class='hs-comment'>-- The hash of an Id changes if its fixity or deprecations change</span>
<a name="line-58"></a>		<span class='hs-comment'>--	(as well as its type of course)</span>
<a name="line-59"></a>		<span class='hs-comment'>-- Ditto data constructors, class operations, except that </span>
<a name="line-60"></a>		<span class='hs-comment'>-- the hash of the parent class/tycon changes</span>
<a name="line-61"></a>	<span class='hs-varid'>mi_decls</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>Fingerprint</span><span class='hs-layout'>,</span><span class='hs-conid'>IfaceDecl</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>	<span class='hs-comment'>-- ^ Sorted type, variable, class etc. declarations</span>
<a name="line-62"></a>
<a name="line-63"></a>        <span class='hs-varid'>mi_globals</span>  <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>GlobalRdrEnv</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-64"></a>		<span class='hs-comment'>-- ^ Binds all the things defined at the top level in</span>
<a name="line-65"></a>		<span class='hs-comment'>-- the /original source/ code for this module. which</span>
<a name="line-66"></a>		<span class='hs-comment'>-- is NOT the same as mi_exports, nor mi_decls (which</span>
<a name="line-67"></a>		<span class='hs-comment'>-- may contains declarations for things not actually</span>
<a name="line-68"></a>		<span class='hs-comment'>-- defined by the user).  Used for GHCi and for inspecting</span>
<a name="line-69"></a>		<span class='hs-comment'>-- the contents of modules via the GHC API only.</span>
<a name="line-70"></a>		<span class='hs-comment'>--</span>
<a name="line-71"></a>		<span class='hs-comment'>-- (We need the source file to figure out the</span>
<a name="line-72"></a>		<span class='hs-comment'>-- top-level environment, if we didn't compile this module</span>
<a name="line-73"></a>		<span class='hs-comment'>-- from source then this field contains @Nothing@).</span>
<a name="line-74"></a>		<span class='hs-comment'>--</span>
<a name="line-75"></a>		<span class='hs-comment'>-- Strictly speaking this field should live in the</span>
<a name="line-76"></a>		<span class='hs-comment'>-- 'HomeModInfo', but that leads to more plumbing.</span>
<a name="line-77"></a>
<a name="line-78"></a>		<span class='hs-comment'>-- Instance declarations and rules</span>
<a name="line-79"></a>	<span class='hs-varid'>mi_insts</span>     <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>IfaceInst</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>			<span class='hs-comment'>-- ^ Sorted class instance</span>
<a name="line-80"></a>	<span class='hs-varid'>mi_fam_insts</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>IfaceFamInst</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>			<span class='hs-comment'>-- ^ Sorted family instances</span>
<a name="line-81"></a>	<span class='hs-varid'>mi_rules</span>     <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>IfaceRule</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>			<span class='hs-comment'>-- ^ Sorted rules</span>
<a name="line-82"></a>	<span class='hs-varid'>mi_orphan_hash</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>Fingerprint</span><span class='hs-layout'>,</span>	<span class='hs-comment'>-- ^ Hash for orphan rules and </span>
<a name="line-83"></a>					<span class='hs-comment'>-- class and family instances</span>
<a name="line-84"></a>					<span class='hs-comment'>-- combined</span>
<a name="line-85"></a>
<a name="line-86"></a>        <span class='hs-varid'>mi_vect_info</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>IfaceVectInfo</span><span class='hs-layout'>,</span> <span class='hs-comment'>-- ^ Vectorisation information</span>
<a name="line-87"></a>
<a name="line-88"></a>		<span class='hs-comment'>-- Cached environments for easy lookup</span>
<a name="line-89"></a>		<span class='hs-comment'>-- These are computed (lazily) from other fields</span>
<a name="line-90"></a>		<span class='hs-comment'>-- and are not put into the interface file</span>
<a name="line-91"></a>	<span class='hs-varid'>mi_warn_fn</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>WarningTxt</span><span class='hs-layout'>,</span>        <span class='hs-comment'>-- ^ Cached lookup for 'mi_warns'</span>
<a name="line-92"></a>	<span class='hs-varid'>mi_fix_fn</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Fixity</span><span class='hs-layout'>,</span>	        <span class='hs-comment'>-- ^ Cached lookup for 'mi_fixities'</span>
<a name="line-93"></a>	<span class='hs-varid'>mi_hash_fn</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span><span class='hs-layout'>,</span> <span class='hs-conid'>Fingerprint</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-94"></a>                        <span class='hs-comment'>-- ^ Cached lookup for 'mi_decls'.</span>
<a name="line-95"></a>			<span class='hs-comment'>-- The @Nothing@ in 'mi_hash_fn' means that the thing</span>
<a name="line-96"></a>			<span class='hs-comment'>-- isn't in decls. It's useful to know that when</span>
<a name="line-97"></a>			<span class='hs-comment'>-- seeing if we are up to date wrt. the old interface.</span>
<a name="line-98"></a>                        <span class='hs-comment'>-- The 'OccName' is the parent of the name, if it has one.</span>
<a name="line-99"></a>	<span class='hs-varid'>mi_hpc</span>    <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>AnyHpcUsage</span>
<a name="line-100"></a>	        <span class='hs-comment'>-- ^ True if this program uses Hpc at any point in the program.</span>
<a name="line-101"></a>     <span class='hs-layout'>}</span>
<a name="line-102"></a>
<a name="line-103"></a><a name="ModDetails"></a><span class='hs-comment'>-- | The 'ModDetails' is essentially a cache for information in the 'ModIface'</span>
<a name="line-104"></a><a name="ModDetails"></a><span class='hs-comment'>-- for home modules only. Information relating to packages will be loaded into</span>
<a name="line-105"></a><a name="ModDetails"></a><span class='hs-comment'>-- global environments in 'ExternalPackageState'.</span>
<a name="line-106"></a><a name="ModDetails"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>ModDetails</span>
<a name="line-107"></a>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ModDetails</span> <span class='hs-layout'>{</span>
<a name="line-108"></a>	<span class='hs-comment'>-- The next two fields are created by the typechecker</span>
<a name="line-109"></a>	<span class='hs-varid'>md_exports</span>   <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>AvailInfo</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>
<a name="line-110"></a>        <span class='hs-varid'>md_types</span>     <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>TypeEnv</span><span class='hs-layout'>,</span>       <span class='hs-comment'>-- ^ Local type environment for this particular module</span>
<a name="line-111"></a>        <span class='hs-varid'>md_insts</span>     <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>Instance</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>    <span class='hs-comment'>-- ^ 'DFunId's for the instances in this module</span>
<a name="line-112"></a>        <span class='hs-varid'>md_fam_insts</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>FamInst</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>
<a name="line-113"></a>        <span class='hs-varid'>md_rules</span>     <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>CoreRule</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>    <span class='hs-comment'>-- ^ Domain may include 'Id's from other modules</span>
<a name="line-114"></a>        <span class='hs-varid'>md_anns</span>      <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>Annotation</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>  <span class='hs-comment'>-- ^ Annotations present in this module: currently </span>
<a name="line-115"></a>                                        <span class='hs-comment'>-- they only annotate things also declared in this module</span>
<a name="line-116"></a>        <span class='hs-varid'>md_vect_info</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>VectInfo</span>       <span class='hs-comment'>-- ^ Module vectorisation information</span>
<a name="line-117"></a>     <span class='hs-layout'>}</span>
<a name="line-118"></a>
<a name="line-119"></a><a name="emptyModDetails"></a><span class='hs-definition'>emptyModDetails</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ModDetails</span>
<a name="line-120"></a><span class='hs-definition'>emptyModDetails</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ModDetails</span> <span class='hs-layout'>{</span> <span class='hs-varid'>md_types</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>emptyTypeEnv</span><span class='hs-layout'>,</span>
<a name="line-121"></a>			       <span class='hs-varid'>md_exports</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span>
<a name="line-122"></a>			       <span class='hs-varid'>md_insts</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span>
<a name="line-123"></a>			       <span class='hs-varid'>md_rules</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span>
<a name="line-124"></a>			       <span class='hs-varid'>md_fam_insts</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span>
<a name="line-125"></a>                               <span class='hs-varid'>md_anns</span>      <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span>
<a name="line-126"></a>                               <span class='hs-varid'>md_vect_info</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>noVectInfo</span>
<a name="line-127"></a>                             <span class='hs-layout'>}</span> 
<a name="line-128"></a>
<a name="line-129"></a><a name="ImportedMods"></a><span class='hs-comment'>-- | Records the modules directly imported by a module for extracting e.g. usage information</span>
<a name="line-130"></a><a name="ImportedMods"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>ImportedMods</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ModuleEnv</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>ModuleName</span><span class='hs-layout'>,</span> <span class='hs-conid'>Bool</span><span class='hs-layout'>,</span> <span class='hs-conid'>SrcSpan</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-131"></a><span class='hs-comment'>-- TODO: we are not actually using the codomain of this type at all, so it can be</span>
<a name="line-132"></a><span class='hs-comment'>-- replaced with ModuleEnv ()</span>
<a name="line-133"></a>
<a name="line-134"></a><a name="ModGuts"></a><span class='hs-comment'>-- | A ModGuts is carried through the compiler, accumulating stuff as it goes</span>
<a name="line-135"></a><a name="ModGuts"></a><span class='hs-comment'>-- There is only one ModGuts at any time, the one for the module</span>
<a name="line-136"></a><a name="ModGuts"></a><span class='hs-comment'>-- being compiled right now.  Once it is compiled, a 'ModIface' and </span>
<a name="line-137"></a><a name="ModGuts"></a><span class='hs-comment'>-- 'ModDetails' are extracted and the ModGuts is dicarded.</span>
<a name="line-138"></a><a name="ModGuts"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>ModGuts</span>
<a name="line-139"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ModGuts</span> <span class='hs-layout'>{</span>
<a name="line-140"></a>        <span class='hs-varid'>mg_module</span>    <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>Module</span><span class='hs-layout'>,</span>         <span class='hs-comment'>-- ^ Module being compiled</span>
<a name="line-141"></a>	<span class='hs-varid'>mg_boot</span>      <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IsBootInterface</span><span class='hs-layout'>,</span> <span class='hs-comment'>-- ^ Whether it's an hs-boot module</span>
<a name="line-142"></a>	<span class='hs-varid'>mg_exports</span>   <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>AvailInfo</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>	 <span class='hs-comment'>-- ^ What it exports</span>
<a name="line-143"></a>	<span class='hs-varid'>mg_deps</span>	     <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>Dependencies</span><span class='hs-layout'>,</span>	 <span class='hs-comment'>-- ^ What it depends on, directly or</span>
<a name="line-144"></a>	                                 <span class='hs-comment'>-- otherwise</span>
<a name="line-145"></a>	<span class='hs-varid'>mg_dir_imps</span>  <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>ImportedMods</span><span class='hs-layout'>,</span>	 <span class='hs-comment'>-- ^ Directly-imported modules; used to</span>
<a name="line-146"></a>					 <span class='hs-comment'>-- generate initialisation code</span>
<a name="line-147"></a>	<span class='hs-varid'>mg_used_names</span><span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>NameSet</span><span class='hs-layout'>,</span>	 <span class='hs-comment'>-- ^ What the module needed (used in 'MkIface.mkIface')</span>
<a name="line-148"></a>
<a name="line-149"></a>        <span class='hs-varid'>mg_rdr_env</span>   <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>GlobalRdrEnv</span><span class='hs-layout'>,</span>	 <span class='hs-comment'>-- ^ Top-level lexical environment</span>
<a name="line-150"></a>
<a name="line-151"></a>	<span class='hs-comment'>-- These fields all describe the things **declared in this module**</span>
<a name="line-152"></a>	<span class='hs-varid'>mg_fix_env</span>   <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>FixityEnv</span><span class='hs-layout'>,</span>	 <span class='hs-comment'>-- ^ Fixities declared in this module</span>
<a name="line-153"></a>	                                 <span class='hs-comment'>-- TODO: I'm unconvinced this is actually used anywhere</span>
<a name="line-154"></a>	<span class='hs-varid'>mg_types</span>     <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>TypeEnv</span><span class='hs-layout'>,</span>        <span class='hs-comment'>-- ^ Types declared in this module</span>
<a name="line-155"></a>	<span class='hs-varid'>mg_insts</span>     <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>Instance</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>	 <span class='hs-comment'>-- ^ Class instances declared in this module</span>
<a name="line-156"></a>	<span class='hs-varid'>mg_fam_insts</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>FamInst</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>	 <span class='hs-comment'>-- ^ Family instances declared in this module</span>
<a name="line-157"></a>        <span class='hs-varid'>mg_rules</span>     <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>CoreRule</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>	 <span class='hs-comment'>-- ^ Before the core pipeline starts, contains </span>
<a name="line-158"></a>                                         <span class='hs-comment'>-- rules declared in this module. After the core</span>
<a name="line-159"></a>                                         <span class='hs-comment'>-- pipeline starts, it is changed to contain all</span>
<a name="line-160"></a>                                         <span class='hs-comment'>-- known rules for those things imported</span>
<a name="line-161"></a>	<span class='hs-varid'>mg_binds</span>     <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>CoreBind</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>	 <span class='hs-comment'>-- ^ Bindings for this module</span>
<a name="line-162"></a>	<span class='hs-varid'>mg_foreign</span>   <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>ForeignStubs</span><span class='hs-layout'>,</span>   <span class='hs-comment'>-- ^ Foreign exports declared in this module</span>
<a name="line-163"></a>	<span class='hs-varid'>mg_warns</span>     <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>Warnings</span><span class='hs-layout'>,</span>	 <span class='hs-comment'>-- ^ Warnings declared in the module</span>
<a name="line-164"></a>	<span class='hs-varid'>mg_anns</span>      <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Annotation</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>    <span class='hs-comment'>-- ^ Annotations declared in this module</span>
<a name="line-165"></a>	<span class='hs-varid'>mg_hpc_info</span>  <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>HpcInfo</span><span class='hs-layout'>,</span>        <span class='hs-comment'>-- ^ Coverage tick boxes in the module</span>
<a name="line-166"></a>        <span class='hs-varid'>mg_modBreaks</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>ModBreaks</span><span class='hs-layout'>,</span>      <span class='hs-comment'>-- ^ Breakpoints for the module</span>
<a name="line-167"></a>        <span class='hs-varid'>mg_vect_info</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>VectInfo</span><span class='hs-layout'>,</span>       <span class='hs-comment'>-- ^ Pool of vectorised declarations in the module</span>
<a name="line-168"></a>
<a name="line-169"></a>	<span class='hs-comment'>-- The next two fields are unusual, because they give instance</span>
<a name="line-170"></a>	<span class='hs-comment'>-- environments for *all* modules in the home package, including</span>
<a name="line-171"></a>	<span class='hs-comment'>-- this module, rather than for *just* this module.  </span>
<a name="line-172"></a>	<span class='hs-comment'>-- Reason: when looking up an instance we don't want to have to</span>
<a name="line-173"></a>	<span class='hs-comment'>--	  look at each module in the home package in turn</span>
<a name="line-174"></a>	<span class='hs-varid'>mg_inst_env</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InstEnv</span><span class='hs-layout'>,</span>
<a name="line-175"></a>        <span class='hs-comment'>-- ^ Class instance environment from /home-package/ modules (including</span>
<a name="line-176"></a>	<span class='hs-comment'>-- this one); c.f. 'tcg_inst_env'</span>
<a name="line-177"></a>	<span class='hs-varid'>mg_fam_inst_env</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FamInstEnv</span>
<a name="line-178"></a>        <span class='hs-comment'>-- ^ Type-family instance enviroment for /home-package/ modules</span>
<a name="line-179"></a>	<span class='hs-comment'>-- (including this one); c.f. 'tcg_fam_inst_env'</span>
<a name="line-180"></a>    <span class='hs-layout'>}</span>
<a name="line-181"></a>
<a name="line-182"></a><span class='hs-comment'>-- The ModGuts takes on several slightly different forms:</span>
<a name="line-183"></a><span class='hs-comment'>--</span>
<a name="line-184"></a><span class='hs-comment'>-- After simplification, the following fields change slightly:</span>
<a name="line-185"></a><span class='hs-comment'>--	mg_rules	Orphan rules only (local ones now attached to binds)</span>
<a name="line-186"></a><span class='hs-comment'>--	mg_binds	With rules attached</span>
<a name="line-187"></a>
<a name="line-188"></a><a name="CoreModule"></a><span class='hs-comment'>-- | A CoreModule consists of just the fields of a 'ModGuts' that are needed for</span>
<a name="line-189"></a><a name="CoreModule"></a><span class='hs-comment'>-- the 'GHC.compileToCoreModule' interface.</span>
<a name="line-190"></a><a name="CoreModule"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>CoreModule</span>
<a name="line-191"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CoreModule</span> <span class='hs-layout'>{</span>
<a name="line-192"></a>      <span class='hs-comment'>-- | Module name</span>
<a name="line-193"></a>      <span class='hs-varid'>cm_module</span>   <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>Module</span><span class='hs-layout'>,</span>
<a name="line-194"></a>      <span class='hs-comment'>-- | Type environment for types declared in this module</span>
<a name="line-195"></a>      <span class='hs-varid'>cm_types</span>    <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>TypeEnv</span><span class='hs-layout'>,</span>
<a name="line-196"></a>      <span class='hs-comment'>-- | Declarations</span>
<a name="line-197"></a>      <span class='hs-varid'>cm_binds</span>    <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CoreBind</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>
<a name="line-198"></a>      <span class='hs-comment'>-- | Imports</span>
<a name="line-199"></a>      <span class='hs-varid'>cm_imports</span>  <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>Module</span><span class='hs-keyglyph'>]</span>
<a name="line-200"></a>    <span class='hs-layout'>}</span>
<a name="line-201"></a>
<a name="line-202"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>CoreModule</span> <span class='hs-keyword'>where</span>
<a name="line-203"></a>   <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>CoreModule</span> <span class='hs-layout'>{</span><span class='hs-varid'>cm_module</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mn</span><span class='hs-layout'>,</span> <span class='hs-varid'>cm_types</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>te</span><span class='hs-layout'>,</span> <span class='hs-varid'>cm_binds</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cb</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span>
<a name="line-204"></a>      <span class='hs-varid'>text</span> <span class='hs-str'>"%module"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>mn</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>te</span> <span class='hs-varop'>$$</span> <span class='hs-varid'>vcat</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>cb</span><span class='hs-layout'>)</span>
<a name="line-205"></a>
<a name="line-206"></a><span class='hs-comment'>-- The ModGuts takes on several slightly different forms:</span>
<a name="line-207"></a><span class='hs-comment'>--</span>
<a name="line-208"></a><span class='hs-comment'>-- After simplification, the following fields change slightly:</span>
<a name="line-209"></a><span class='hs-comment'>--	mg_rules	Orphan rules only (local ones now attached to binds)</span>
<a name="line-210"></a><span class='hs-comment'>--	mg_binds	With rules attached</span>
<a name="line-211"></a>
<a name="line-212"></a>
<a name="line-213"></a><span class='hs-comment'>---------------------------------------------------------</span>
<a name="line-214"></a><span class='hs-comment'>-- The Tidy pass forks the information about this module: </span>
<a name="line-215"></a><span class='hs-comment'>--	* one lot goes to interface file generation (ModIface)</span>
<a name="line-216"></a><span class='hs-comment'>--	  and later compilations (ModDetails)</span>
<a name="line-217"></a><span class='hs-comment'>--	* the other lot goes to code generation (CgGuts)</span>
<a name="line-218"></a>
<a name="line-219"></a><a name="CgGuts"></a><span class='hs-comment'>-- | A restricted form of 'ModGuts' for code generation purposes</span>
<a name="line-220"></a><a name="CgGuts"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>CgGuts</span> 
<a name="line-221"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CgGuts</span> <span class='hs-layout'>{</span>
<a name="line-222"></a>	<span class='hs-varid'>cg_module</span>   <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>Module</span><span class='hs-layout'>,</span> <span class='hs-comment'>-- ^ Module being compiled</span>
<a name="line-223"></a>
<a name="line-224"></a>	<span class='hs-varid'>cg_tycons</span>   <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TyCon</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>
<a name="line-225"></a>		<span class='hs-comment'>-- ^ Algebraic data types (including ones that started</span>
<a name="line-226"></a>		<span class='hs-comment'>-- life as classes); generate constructors and info</span>
<a name="line-227"></a>		<span class='hs-comment'>-- tables. Includes newtypes, just for the benefit of</span>
<a name="line-228"></a>		<span class='hs-comment'>-- External Core</span>
<a name="line-229"></a>
<a name="line-230"></a>	<span class='hs-varid'>cg_binds</span>    <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>CoreBind</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>
<a name="line-231"></a>		<span class='hs-comment'>-- ^ The tidied main bindings, including</span>
<a name="line-232"></a>		<span class='hs-comment'>-- previously-implicit bindings for record and class</span>
<a name="line-233"></a>		<span class='hs-comment'>-- selectors, and data construtor wrappers.  But *not*</span>
<a name="line-234"></a>		<span class='hs-comment'>-- data constructor workers; reason: we we regard them</span>
<a name="line-235"></a>		<span class='hs-comment'>-- as part of the code-gen of tycons</span>
<a name="line-236"></a>
<a name="line-237"></a>	<span class='hs-varid'>cg_dir_imps</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>Module</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>
<a name="line-238"></a>		<span class='hs-comment'>-- ^ Directly-imported modules; used to generate</span>
<a name="line-239"></a>		<span class='hs-comment'>-- initialisation code</span>
<a name="line-240"></a>
<a name="line-241"></a>	<span class='hs-varid'>cg_foreign</span>  <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>ForeignStubs</span><span class='hs-layout'>,</span>	<span class='hs-comment'>-- ^ Foreign export stubs</span>
<a name="line-242"></a>	<span class='hs-varid'>cg_dep_pkgs</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-keyglyph'>[</span><span class='hs-conid'>PackageId</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>	<span class='hs-comment'>-- ^ Dependent packages, used to </span>
<a name="line-243"></a>	                                <span class='hs-comment'>-- generate #includes for C code gen</span>
<a name="line-244"></a>        <span class='hs-varid'>cg_hpc_info</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>HpcInfo</span><span class='hs-layout'>,</span>        <span class='hs-comment'>-- ^ Program coverage tick box information</span>
<a name="line-245"></a>        <span class='hs-varid'>cg_modBreaks</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>ModBreaks</span>      <span class='hs-comment'>-- ^ Module breakpoints</span>
<a name="line-246"></a>    <span class='hs-layout'>}</span>
<a name="line-247"></a>
<a name="line-248"></a><a name="ForeignStubs"></a><span class='hs-comment'>-----------------------------------</span>
<a name="line-249"></a><a name="ForeignStubs"></a><span class='hs-comment'>-- | Foreign export stubs</span>
<a name="line-250"></a><a name="ForeignStubs"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>ForeignStubs</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NoStubs</span>             <span class='hs-comment'>-- ^ We don't have any stubs</span>
<a name="line-251"></a>		  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>ForeignStubs</span>
<a name="line-252"></a>			<span class='hs-conid'>SDoc</span> 		
<a name="line-253"></a>			<span class='hs-conid'>SDoc</span> 		
<a name="line-254"></a>		   <span class='hs-comment'>-- ^ There are some stubs. Parameters:</span>
<a name="line-255"></a>		   <span class='hs-comment'>--</span>
<a name="line-256"></a>		   <span class='hs-comment'>--  1) Header file prototypes for</span>
<a name="line-257"></a>                   <span class='hs-comment'>--     "foreign exported" functions</span>
<a name="line-258"></a>                   <span class='hs-comment'>--</span>
<a name="line-259"></a>                   <span class='hs-comment'>--  2) C stubs to use when calling</span>
<a name="line-260"></a>                   <span class='hs-comment'>--     "foreign exported" functions</span>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><a name="emptyModIface"></a><span class='hs-definition'>emptyModIface</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Module</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ModIface</span>
<a name="line-2"></a><span class='hs-definition'>emptyModIface</span> <span class='hs-varid'>mod</span>
<a name="line-3"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ModIface</span> <span class='hs-layout'>{</span> <span class='hs-varid'>mi_module</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mod</span><span class='hs-layout'>,</span>
<a name="line-4"></a>	       <span class='hs-varid'>mi_iface_hash</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fingerprint0</span><span class='hs-layout'>,</span>
<a name="line-5"></a>	       <span class='hs-varid'>mi_mod_hash</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fingerprint0</span><span class='hs-layout'>,</span>
<a name="line-6"></a>	       <span class='hs-varid'>mi_orphan</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span><span class='hs-layout'>,</span>
<a name="line-7"></a>	       <span class='hs-varid'>mi_finsts</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span><span class='hs-layout'>,</span>
<a name="line-8"></a>	       <span class='hs-varid'>mi_boot</span>	   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span><span class='hs-layout'>,</span>
<a name="line-9"></a>	       <span class='hs-varid'>mi_deps</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>noDependencies</span><span class='hs-layout'>,</span>
<a name="line-10"></a>	       <span class='hs-varid'>mi_usages</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span>
<a name="line-11"></a>	       <span class='hs-varid'>mi_exports</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span>
<a name="line-12"></a>	       <span class='hs-varid'>mi_exp_hash</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fingerprint0</span><span class='hs-layout'>,</span>
<a name="line-13"></a>	       <span class='hs-varid'>mi_fixities</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span>
<a name="line-14"></a>	       <span class='hs-varid'>mi_warns</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NoWarnings</span><span class='hs-layout'>,</span>
<a name="line-15"></a>	       <span class='hs-varid'>mi_anns</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span>
<a name="line-16"></a>	       <span class='hs-varid'>mi_insts</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span>
<a name="line-17"></a>	       <span class='hs-varid'>mi_fam_insts</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span>
<a name="line-18"></a>	       <span class='hs-varid'>mi_rules</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span>
<a name="line-19"></a>	       <span class='hs-varid'>mi_decls</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span>
<a name="line-20"></a>	       <span class='hs-varid'>mi_globals</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span><span class='hs-layout'>,</span>
<a name="line-21"></a>	       <span class='hs-varid'>mi_orphan_hash</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fingerprint0</span><span class='hs-layout'>,</span>
<a name="line-22"></a>               <span class='hs-varid'>mi_vect_info</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>noIfaceVectInfo</span><span class='hs-layout'>,</span>
<a name="line-23"></a>	       <span class='hs-varid'>mi_warn_fn</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>emptyIfaceWarnCache</span><span class='hs-layout'>,</span>
<a name="line-24"></a>	       <span class='hs-varid'>mi_fix_fn</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>emptyIfaceFixCache</span><span class='hs-layout'>,</span>
<a name="line-25"></a>	       <span class='hs-varid'>mi_hash_fn</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>emptyIfaceHashCache</span><span class='hs-layout'>,</span>
<a name="line-26"></a>	       <span class='hs-varid'>mi_hpc</span>       <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-27"></a>    <span class='hs-layout'>}</span>		
</pre>\end{code}


%************************************************************************
%*									*
\subsection{The interactive context}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="InteractiveContext"></a><span class='hs-comment'>-- | Interactive context, recording information relevant to GHCi</span>
<a name="line-2"></a><a name="InteractiveContext"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>InteractiveContext</span> 
<a name="line-3"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>InteractiveContext</span> <span class='hs-layout'>{</span> 
<a name="line-4"></a>	<span class='hs-varid'>ic_toplev_scope</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Module</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>	<span class='hs-comment'>-- ^ The context includes the "top-level" scope of</span>
<a name="line-5"></a>					<span class='hs-comment'>-- these modules</span>
<a name="line-6"></a>
<a name="line-7"></a>	<span class='hs-varid'>ic_exports</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Module</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>		<span class='hs-comment'>-- ^ The context includes just the exports of these</span>
<a name="line-8"></a>					<span class='hs-comment'>-- modules</span>
<a name="line-9"></a>
<a name="line-10"></a>	<span class='hs-varid'>ic_rn_gbl_env</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>GlobalRdrEnv</span><span class='hs-layout'>,</span>	<span class='hs-comment'>-- ^ The contexts' cached 'GlobalRdrEnv', built from</span>
<a name="line-11"></a>					<span class='hs-comment'>-- 'ic_toplev_scope' and 'ic_exports'</span>
<a name="line-12"></a>
<a name="line-13"></a>	<span class='hs-varid'>ic_tmp_ids</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Id</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>             <span class='hs-comment'>-- ^ Names bound during interaction with the user.</span>
<a name="line-14"></a>                                        <span class='hs-comment'>-- Later Ids shadow earlier ones with the same OccName.</span>
<a name="line-15"></a>
<a name="line-16"></a>        <span class='hs-varid'>ic_tyvars</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TyVarSet</span>           <span class='hs-comment'>-- ^ Skolem type variables free in</span>
<a name="line-17"></a>                                        <span class='hs-comment'>-- 'ic_tmp_ids'.  These arise at</span>
<a name="line-18"></a>                                        <span class='hs-comment'>-- breakpoints in a polymorphic </span>
<a name="line-19"></a>                                        <span class='hs-comment'>-- context, where we have only partial</span>
<a name="line-20"></a>                                        <span class='hs-comment'>-- type information.</span>
<a name="line-21"></a>
<a name="line-22"></a><span class='hs-cpp'>#ifdef GHCI</span>
<a name="line-23"></a>        <span class='hs-layout'>,</span> <span class='hs-varid'>ic_resume</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Resume</span><span class='hs-keyglyph'>]</span>         <span class='hs-comment'>-- ^ The stack of breakpoint contexts</span>
<a name="line-24"></a><span class='hs-cpp'>#endif</span>
<a name="line-25"></a>
<a name="line-26"></a>        <span class='hs-layout'>,</span> <span class='hs-varid'>ic_cwd</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>FilePath</span>      <span class='hs-comment'>-- virtual CWD of the program</span>
<a name="line-27"></a>    <span class='hs-layout'>}</span>
<a name="line-28"></a>
<a name="line-29"></a>
<a name="line-30"></a><a name="emptyInteractiveContext"></a><span class='hs-definition'>emptyInteractiveContext</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InteractiveContext</span>
<a name="line-31"></a><span class='hs-definition'>emptyInteractiveContext</span>
<a name="line-32"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>InteractiveContext</span> <span class='hs-layout'>{</span> <span class='hs-varid'>ic_toplev_scope</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span>
<a name="line-33"></a>			 <span class='hs-varid'>ic_exports</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span>
<a name="line-34"></a>			 <span class='hs-varid'>ic_rn_gbl_env</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>emptyGlobalRdrEnv</span><span class='hs-layout'>,</span>
<a name="line-35"></a>			 <span class='hs-varid'>ic_tmp_ids</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span><span class='hs-layout'>,</span>
<a name="line-36"></a>                         <span class='hs-varid'>ic_tyvars</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>emptyVarSet</span>
<a name="line-37"></a><span class='hs-cpp'>#ifdef GHCI</span>
<a name="line-38"></a>                         <span class='hs-layout'>,</span> <span class='hs-varid'>ic_resume</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-39"></a><span class='hs-cpp'>#endif</span>
<a name="line-40"></a>                         <span class='hs-layout'>,</span> <span class='hs-varid'>ic_cwd</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-41"></a>                       <span class='hs-layout'>}</span>
<a name="line-42"></a>
<a name="line-43"></a><a name="icPrintUnqual"></a><span class='hs-definition'>icPrintUnqual</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DynFlags</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>InteractiveContext</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PrintUnqualified</span>
<a name="line-44"></a><span class='hs-definition'>icPrintUnqual</span> <span class='hs-varid'>dflags</span> <span class='hs-varid'>ictxt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkPrintUnqualified</span> <span class='hs-varid'>dflags</span> <span class='hs-layout'>(</span><span class='hs-varid'>ic_rn_gbl_env</span> <span class='hs-varid'>ictxt</span><span class='hs-layout'>)</span>
<a name="line-45"></a>
<a name="line-46"></a>
<a name="line-47"></a><a name="extendInteractiveContext"></a><span class='hs-definition'>extendInteractiveContext</span>
<a name="line-48"></a>        <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InteractiveContext</span>
<a name="line-49"></a>        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Id</span><span class='hs-keyglyph'>]</span>
<a name="line-50"></a>        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TyVarSet</span>
<a name="line-51"></a>        <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>InteractiveContext</span>
<a name="line-52"></a><span class='hs-definition'>extendInteractiveContext</span> <span class='hs-varid'>ictxt</span> <span class='hs-varid'>ids</span> <span class='hs-varid'>tyvars</span>
<a name="line-53"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ictxt</span> <span class='hs-layout'>{</span> <span class='hs-varid'>ic_tmp_ids</span> <span class='hs-keyglyph'>=</span>  <span class='hs-varid'>snub</span><span class='hs-layout'>(</span><span class='hs-layout'>(</span><span class='hs-varid'>ic_tmp_ids</span> <span class='hs-varid'>ictxt</span> <span class='hs-varop'>\\</span> <span class='hs-varid'>ids</span><span class='hs-layout'>)</span> <span class='hs-varop'>++</span> <span class='hs-varid'>ids</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-54"></a>                          <span class='hs-comment'>-- NB. must be this way around, because we want</span>
<a name="line-55"></a>                          <span class='hs-comment'>-- new ids to shadow existing bindings.</span>
<a name="line-56"></a>            <span class='hs-varid'>ic_tyvars</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ic_tyvars</span> <span class='hs-varid'>ictxt</span> <span class='hs-varop'>`unionVarSet`</span> <span class='hs-varid'>tyvars</span> <span class='hs-layout'>}</span>
<a name="line-57"></a>    <span class='hs-keyword'>where</span> <span class='hs-varid'>snub</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-varid'>head</span> <span class='hs-varop'>.</span> <span class='hs-varid'>group</span> <span class='hs-varop'>.</span> <span class='hs-varid'>sort</span>
<a name="line-58"></a>
<a name="line-59"></a><a name="substInteractiveContext"></a><span class='hs-definition'>substInteractiveContext</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>InteractiveContext</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TvSubst</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>InteractiveContext</span>
<a name="line-60"></a><span class='hs-definition'>substInteractiveContext</span> <span class='hs-varid'>ictxt</span> <span class='hs-varid'>subst</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>isEmptyTvSubst</span> <span class='hs-varid'>subst</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ictxt</span>
<a name="line-61"></a><span class='hs-definition'>substInteractiveContext</span> <span class='hs-varid'>ictxt</span><span class='hs-keyglyph'>@</span><span class='hs-conid'>InteractiveContext</span><span class='hs-layout'>{</span><span class='hs-varid'>ic_tmp_ids</span><span class='hs-keyglyph'>=</span><span class='hs-varid'>ids</span><span class='hs-layout'>}</span> <span class='hs-varid'>subst</span> <span class='hs-keyglyph'>=</span>
<a name="line-62"></a>   <span class='hs-keyword'>let</span> <span class='hs-varid'>ids'</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-layout'>(</span><span class='hs-keyglyph'>\</span><span class='hs-varid'>id</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>id</span> <span class='hs-varop'>`setIdType`</span> <span class='hs-varid'>substTy</span> <span class='hs-varid'>subst</span> <span class='hs-layout'>(</span><span class='hs-varid'>idType</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>ids</span>
<a name="line-63"></a>       <span class='hs-varid'>subst_dom</span><span class='hs-keyglyph'>=</span> <span class='hs-varid'>varEnvKeys</span><span class='hs-varop'>$</span> <span class='hs-varid'>getTvSubstEnv</span> <span class='hs-varid'>subst</span>
<a name="line-64"></a>       <span class='hs-varid'>subst_ran</span><span class='hs-keyglyph'>=</span> <span class='hs-varid'>varEnvElts</span><span class='hs-varop'>$</span> <span class='hs-varid'>getTvSubstEnv</span> <span class='hs-varid'>subst</span>
<a name="line-65"></a>       <span class='hs-varid'>new_tvs</span>  <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span> <span class='hs-varid'>tv</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>tv</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>map</span> <span class='hs-varid'>getTyVar_maybe</span> <span class='hs-varid'>subst_ran</span><span class='hs-keyglyph'>]</span>  
<a name="line-66"></a>       <span class='hs-varid'>ic_tyvars'</span><span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varop'>`delVarSetListByKey`</span> <span class='hs-varid'>subst_dom</span><span class='hs-layout'>)</span> 
<a name="line-67"></a>                 <span class='hs-varop'>.</span> <span class='hs-layout'>(</span><span class='hs-varop'>`extendVarSetList`</span>   <span class='hs-varid'>new_tvs</span><span class='hs-layout'>)</span>
<a name="line-68"></a>                   <span class='hs-varop'>$</span> <span class='hs-varid'>ic_tyvars</span> <span class='hs-varid'>ictxt</span>
<a name="line-69"></a>    <span class='hs-keyword'>in</span> <span class='hs-varid'>ictxt</span> <span class='hs-layout'>{</span> <span class='hs-varid'>ic_tmp_ids</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ids'</span>
<a name="line-70"></a>             <span class='hs-layout'>,</span> <span class='hs-varid'>ic_tyvars</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ic_tyvars'</span> <span class='hs-layout'>}</span>
<a name="line-71"></a>
<a name="line-72"></a>          <span class='hs-keyword'>where</span> <span class='hs-varid'>delVarSetListByKey</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldl'</span> <span class='hs-varid'>delVarSetByKey</span>
</pre>\end{code}

%************************************************************************
%*									*
        Building a PrintUnqualified		
%*									*
%************************************************************************

Note [Printing original names]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Deciding how to print names is pretty tricky.  We are given a name
P:M.T, where P is the package name, M is the defining module, and T is
the occurrence name, and we have to decide in which form to display
the name given a GlobalRdrEnv describing the current scope.

Ideally we want to display the name in the form in which it is in
scope.  However, the name might not be in scope at all, and that's
where it gets tricky.  Here are the cases:

 1. T uniquely maps to  P:M.T      --->  "T"      NameUnqual
 2. There is an X for which X.T 
       uniquely maps to  P:M.T     --->  "X.T"    NameQual X
 3. There is no binding for "M.T"  --->  "M.T"    NameNotInScope1
 4. Otherwise                      --->  "P:M.T"  NameNotInScope2

(3) and (4) apply when the entity P:M.T is not in the GlobalRdrEnv at
all. In these cases we still want to refer to the name as "M.T", *but*
"M.T" might mean something else in the current scope (e.g. if there's
an "import X as M"), so to avoid confusion we avoid using "M.T" if
there's already a binding for it.  Instead we write P:M.T.

There's one further subtlety: in case (3), what if there are two
things around, P1:M.T and P2:M.T?  Then we don't want to print both of
them as M.T!  However only one of the modules P1:M and P2:M can be
exposed (say P2), so we use M.T for that, and P1:M.T for the other one.
This is handled by the qual_mod component of PrintUnqualified, inside
the (ppr mod) of case (3), in Name.pprModulePrefix

\begin{code}
<pre><a name="line-1"></a><a name="mkPrintUnqualified"></a><span class='hs-comment'>-- | Creates some functions that work out the best ways to format</span>
<a name="line-2"></a><span class='hs-comment'>-- names for the user according to a set of heuristics</span>
<a name="line-3"></a><span class='hs-definition'>mkPrintUnqualified</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DynFlags</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>GlobalRdrEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PrintUnqualified</span>
<a name="line-4"></a><span class='hs-definition'>mkPrintUnqualified</span> <span class='hs-varid'>dflags</span> <span class='hs-varid'>env</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>qual_name</span><span class='hs-layout'>,</span> <span class='hs-varid'>qual_mod</span><span class='hs-layout'>)</span>
<a name="line-5"></a>  <span class='hs-keyword'>where</span>
<a name="line-6"></a>  <span class='hs-varid'>qual_name</span> <span class='hs-varid'>mod</span> <span class='hs-varid'>occ</span>	<span class='hs-comment'>-- The (mod,occ) pair is the original name of the thing</span>
<a name="line-7"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>gre</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>unqual_gres</span><span class='hs-layout'>,</span> <span class='hs-varid'>right_name</span> <span class='hs-varid'>gre</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NameUnqual</span>
<a name="line-8"></a>		<span class='hs-comment'>-- If there's a unique entity that's in scope unqualified with 'occ'</span>
<a name="line-9"></a>		<span class='hs-comment'>-- AND that entity is the right one, then we can use the unqualified name</span>
<a name="line-10"></a>
<a name="line-11"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>gre</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>qual_gres</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NameQual</span> <span class='hs-layout'>(</span><span class='hs-varid'>get_qual_mod</span> <span class='hs-layout'>(</span><span class='hs-varid'>gre_prov</span> <span class='hs-varid'>gre</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-12"></a>
<a name="line-13"></a>        <span class='hs-keyglyph'>|</span> <span class='hs-varid'>null</span> <span class='hs-varid'>qual_gres</span> <span class='hs-keyglyph'>=</span> 
<a name="line-14"></a>              <span class='hs-keyword'>if</span> <span class='hs-varid'>null</span> <span class='hs-layout'>(</span><span class='hs-varid'>lookupGRE_RdrName</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkRdrQual</span> <span class='hs-layout'>(</span><span class='hs-varid'>moduleName</span> <span class='hs-varid'>mod</span><span class='hs-layout'>)</span> <span class='hs-varid'>occ</span><span class='hs-layout'>)</span> <span class='hs-varid'>env</span><span class='hs-layout'>)</span>
<a name="line-15"></a>                   <span class='hs-keyword'>then</span> <span class='hs-conid'>NameNotInScope1</span>
<a name="line-16"></a>                   <span class='hs-keyword'>else</span> <span class='hs-conid'>NameNotInScope2</span>
<a name="line-17"></a>
<a name="line-18"></a>	<span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>panic</span> <span class='hs-str'>"mkPrintUnqualified"</span>
<a name="line-19"></a>      <span class='hs-keyword'>where</span>
<a name="line-20"></a>	<span class='hs-varid'>right_name</span> <span class='hs-varid'>gre</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nameModule_maybe</span> <span class='hs-layout'>(</span><span class='hs-varid'>gre_name</span> <span class='hs-varid'>gre</span><span class='hs-layout'>)</span> <span class='hs-varop'>==</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>mod</span>
<a name="line-21"></a>
<a name="line-22"></a>        <span class='hs-varid'>unqual_gres</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lookupGRE_RdrName</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkRdrUnqual</span> <span class='hs-varid'>occ</span><span class='hs-layout'>)</span> <span class='hs-varid'>env</span>
<a name="line-23"></a>        <span class='hs-varid'>qual_gres</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>filter</span> <span class='hs-varid'>right_name</span> <span class='hs-layout'>(</span><span class='hs-varid'>lookupGlobalRdrEnv</span> <span class='hs-varid'>env</span> <span class='hs-varid'>occ</span><span class='hs-layout'>)</span>
<a name="line-24"></a>
<a name="line-25"></a>	<span class='hs-varid'>get_qual_mod</span> <span class='hs-conid'>LocalDef</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>moduleName</span> <span class='hs-varid'>mod</span>
<a name="line-26"></a>	<span class='hs-varid'>get_qual_mod</span> <span class='hs-layout'>(</span><span class='hs-conid'>Imported</span> <span class='hs-varid'>is</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ASSERT</span><span class='hs-layout'>(</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>null</span> <span class='hs-varid'>is</span><span class='hs-layout'>)</span> <span class='hs-layout'>)</span> <span class='hs-varid'>is_as</span> <span class='hs-layout'>(</span><span class='hs-varid'>is_decl</span> <span class='hs-layout'>(</span><span class='hs-varid'>head</span> <span class='hs-varid'>is</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-27"></a>
<a name="line-28"></a>    <span class='hs-comment'>-- we can mention a module P:M without the P: qualifier iff</span>
<a name="line-29"></a>    <span class='hs-comment'>-- "import M" would resolve unambiguously to P:M.  (if P is the</span>
<a name="line-30"></a>    <span class='hs-comment'>-- current package we can just assume it is unqualified).</span>
<a name="line-31"></a>
<a name="line-32"></a>  <span class='hs-varid'>qual_mod</span> <span class='hs-varid'>mod</span>
<a name="line-33"></a>     <span class='hs-keyglyph'>|</span> <span class='hs-varid'>modulePackageId</span> <span class='hs-varid'>mod</span> <span class='hs-varop'>==</span> <span class='hs-varid'>thisPackage</span> <span class='hs-varid'>dflags</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-34"></a>
<a name="line-35"></a>     <span class='hs-keyglyph'>|</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>pkgconfig</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>pkg</span> <span class='hs-keyglyph'>|</span> <span class='hs-layout'>(</span><span class='hs-varid'>pkg</span><span class='hs-layout'>,</span><span class='hs-varid'>exposed_module</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookup</span><span class='hs-layout'>,</span> 
<a name="line-36"></a>                             <span class='hs-varid'>exposed</span> <span class='hs-varid'>pkg</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>exposed_module</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>
<a name="line-37"></a>       <span class='hs-varid'>packageConfigId</span> <span class='hs-varid'>pkgconfig</span> <span class='hs-varop'>==</span> <span class='hs-varid'>modulePackageId</span> <span class='hs-varid'>mod</span>
<a name="line-38"></a>        <span class='hs-comment'>-- this says: we are given a module P:M, is there just one exposed package</span>
<a name="line-39"></a>        <span class='hs-comment'>-- that exposes a module M, and is it package P?</span>
<a name="line-40"></a>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-41"></a>
<a name="line-42"></a>     <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-43"></a>     <span class='hs-keyword'>where</span> <span class='hs-varid'>lookup</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lookupModuleInAllPackages</span> <span class='hs-varid'>dflags</span> <span class='hs-layout'>(</span><span class='hs-varid'>moduleName</span> <span class='hs-varid'>mod</span><span class='hs-layout'>)</span>
</pre>\end{code}


%************************************************************************
%*									*
		TyThing
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><span class='hs-comment'>-- | Determine the 'TyThing's brought into scope by another 'TyThing'</span>
<a name="line-2"></a><span class='hs-comment'>-- /other/ than itself. For example, Id's don't have any implicit TyThings</span>
<a name="line-3"></a><span class='hs-comment'>-- as they just bring themselves into scope, but classes bring their</span>
<a name="line-4"></a><span class='hs-comment'>-- dictionary datatype, type constructor and some selector functions into</span>
<a name="line-5"></a><span class='hs-comment'>-- scope, just for a start!</span>
<a name="line-6"></a>
<a name="line-7"></a><a name="implicitTyThings"></a><span class='hs-comment'>-- N.B. the set of TyThings returned here *must* match the set of</span>
<a name="line-8"></a><span class='hs-comment'>-- names returned by LoadIface.ifaceDeclSubBndrs, in the sense that</span>
<a name="line-9"></a><span class='hs-comment'>-- TyThing.getOccName should define a bijection between the two lists.</span>
<a name="line-10"></a><span class='hs-comment'>-- This invariant is used in LoadIface.loadDecl (see note [Tricky iface loop])</span>
<a name="line-11"></a><span class='hs-comment'>-- The order of the list does not matter.</span>
<a name="line-12"></a><span class='hs-definition'>implicitTyThings</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TyThing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TyThing</span><span class='hs-keyglyph'>]</span>
<a name="line-13"></a>
<a name="line-14"></a><span class='hs-comment'>-- For data and newtype declarations:</span>
<a name="line-15"></a><span class='hs-definition'>implicitTyThings</span> <span class='hs-layout'>(</span><span class='hs-conid'>ATyCon</span> <span class='hs-varid'>tc</span><span class='hs-layout'>)</span>
<a name="line-16"></a>  <span class='hs-keyglyph'>=</span>   <span class='hs-comment'>-- fields (names of selectors)</span>
<a name="line-17"></a>      <span class='hs-comment'>-- (possibly) implicit coercion and family coercion</span>
<a name="line-18"></a>      <span class='hs-comment'>--   depending on whether it's a newtype or a family instance or both</span>
<a name="line-19"></a>    <span class='hs-varid'>implicitCoTyCon</span> <span class='hs-varid'>tc</span> <span class='hs-varop'>++</span>
<a name="line-20"></a>      <span class='hs-comment'>-- for each data constructor in order,</span>
<a name="line-21"></a>      <span class='hs-comment'>--   the contructor, worker, and (possibly) wrapper</span>
<a name="line-22"></a>    <span class='hs-varid'>concatMap</span> <span class='hs-layout'>(</span><span class='hs-varid'>extras_plus</span> <span class='hs-varop'>.</span> <span class='hs-conid'>ADataCon</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>tyConDataCons</span> <span class='hs-varid'>tc</span><span class='hs-layout'>)</span>
<a name="line-23"></a>		     
<a name="line-24"></a><span class='hs-definition'>implicitTyThings</span> <span class='hs-layout'>(</span><span class='hs-conid'>AClass</span> <span class='hs-varid'>cl</span><span class='hs-layout'>)</span> 
<a name="line-25"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-comment'>-- dictionary datatype:</span>
<a name="line-26"></a>    <span class='hs-comment'>--    [extras_plus:]</span>
<a name="line-27"></a>    <span class='hs-comment'>--      type constructor </span>
<a name="line-28"></a>    <span class='hs-comment'>--    [recursive call:]</span>
<a name="line-29"></a>    <span class='hs-comment'>--      (possibly) newtype coercion; definitely no family coercion here</span>
<a name="line-30"></a>    <span class='hs-comment'>--      data constructor</span>
<a name="line-31"></a>    <span class='hs-comment'>--      worker</span>
<a name="line-32"></a>    <span class='hs-comment'>--      (no wrapper by invariant)</span>
<a name="line-33"></a>    <span class='hs-varid'>extras_plus</span> <span class='hs-layout'>(</span><span class='hs-conid'>ATyCon</span> <span class='hs-layout'>(</span><span class='hs-varid'>classTyCon</span> <span class='hs-varid'>cl</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>++</span>
<a name="line-34"></a>    <span class='hs-comment'>-- associated types </span>
<a name="line-35"></a>    <span class='hs-comment'>--    No extras_plus (recursive call) for the classATs, because they</span>
<a name="line-36"></a>    <span class='hs-comment'>--    are only the family decls; they have no implicit things</span>
<a name="line-37"></a>    <span class='hs-varid'>map</span> <span class='hs-conid'>ATyCon</span> <span class='hs-layout'>(</span><span class='hs-varid'>classATs</span> <span class='hs-varid'>cl</span><span class='hs-layout'>)</span> <span class='hs-varop'>++</span>
<a name="line-38"></a>    <span class='hs-comment'>-- superclass and operation selectors</span>
<a name="line-39"></a>    <span class='hs-varid'>map</span> <span class='hs-conid'>AnId</span> <span class='hs-layout'>(</span><span class='hs-varid'>classSelIds</span> <span class='hs-varid'>cl</span><span class='hs-layout'>)</span>
<a name="line-40"></a>
<a name="line-41"></a><span class='hs-definition'>implicitTyThings</span> <span class='hs-layout'>(</span><span class='hs-conid'>ADataCon</span> <span class='hs-varid'>dc</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> 
<a name="line-42"></a>    <span class='hs-comment'>-- For data cons add the worker and (possibly) wrapper</span>
<a name="line-43"></a>    <span class='hs-varid'>map</span> <span class='hs-conid'>AnId</span> <span class='hs-layout'>(</span><span class='hs-varid'>dataConImplicitIds</span> <span class='hs-varid'>dc</span><span class='hs-layout'>)</span>
<a name="line-44"></a>
<a name="line-45"></a><span class='hs-definition'>implicitTyThings</span> <span class='hs-layout'>(</span><span class='hs-conid'>AnId</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-46"></a>
<a name="line-47"></a><a name="extras_plus"></a><span class='hs-comment'>-- add a thing and recursive call</span>
<a name="line-48"></a><span class='hs-definition'>extras_plus</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TyThing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TyThing</span><span class='hs-keyglyph'>]</span>
<a name="line-49"></a><span class='hs-definition'>extras_plus</span> <span class='hs-varid'>thing</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>thing</span> <span class='hs-conop'>:</span> <span class='hs-varid'>implicitTyThings</span> <span class='hs-varid'>thing</span>
<a name="line-50"></a>
<a name="line-51"></a><a name="implicitCoTyCon"></a><span class='hs-comment'>-- For newtypes and indexed data types (and both),</span>
<a name="line-52"></a><span class='hs-comment'>-- add the implicit coercion tycon</span>
<a name="line-53"></a><span class='hs-definition'>implicitCoTyCon</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TyCon</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TyThing</span><span class='hs-keyglyph'>]</span>
<a name="line-54"></a><span class='hs-definition'>implicitCoTyCon</span> <span class='hs-varid'>tc</span> 
<a name="line-55"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>map</span> <span class='hs-conid'>ATyCon</span> <span class='hs-varop'>.</span> <span class='hs-varid'>catMaybes</span> <span class='hs-varop'>$</span> <span class='hs-keyglyph'>[</span><span class='hs-comment'>-- Just if newtype, Nothing if not</span>
<a name="line-56"></a>                              <span class='hs-varid'>newTyConCo_maybe</span> <span class='hs-varid'>tc</span><span class='hs-layout'>,</span> 
<a name="line-57"></a>                              <span class='hs-comment'>-- Just if family instance, Nothing if not</span>
<a name="line-58"></a>			        <span class='hs-varid'>tyConFamilyCoercion_maybe</span> <span class='hs-varid'>tc</span><span class='hs-keyglyph'>]</span> 
<a name="line-59"></a>
<a name="line-60"></a><span class='hs-comment'>-- sortByOcc = sortBy (\ x -&gt; \ y -&gt; getOccName x &lt; getOccName y)</span>
<a name="line-61"></a>
<a name="line-62"></a>
<a name="line-63"></a><a name="isImplicitTyThing"></a><span class='hs-comment'>-- | Returns @True@ if there should be no interface-file declaration</span>
<a name="line-64"></a><span class='hs-comment'>-- for this thing on its own: either it is built-in, or it is part</span>
<a name="line-65"></a><span class='hs-comment'>-- of some other declaration, or it is generated implicitly by some</span>
<a name="line-66"></a><span class='hs-comment'>-- other declaration.</span>
<a name="line-67"></a><span class='hs-definition'>isImplicitTyThing</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TyThing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-68"></a><span class='hs-definition'>isImplicitTyThing</span> <span class='hs-layout'>(</span><span class='hs-conid'>ADataCon</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-69"></a><span class='hs-definition'>isImplicitTyThing</span> <span class='hs-layout'>(</span><span class='hs-conid'>AnId</span>     <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isImplicitId</span> <span class='hs-varid'>id</span>
<a name="line-70"></a><span class='hs-definition'>isImplicitTyThing</span> <span class='hs-layout'>(</span><span class='hs-conid'>AClass</span>   <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-71"></a><span class='hs-definition'>isImplicitTyThing</span> <span class='hs-layout'>(</span><span class='hs-conid'>ATyCon</span>   <span class='hs-varid'>tc</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isImplicitTyCon</span> <span class='hs-varid'>tc</span>
<a name="line-72"></a>
<a name="line-73"></a><a name="extendTypeEnvWithIds"></a><span class='hs-definition'>extendTypeEnvWithIds</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TypeEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Id</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TypeEnv</span>
<a name="line-74"></a><span class='hs-definition'>extendTypeEnvWithIds</span> <span class='hs-varid'>env</span> <span class='hs-varid'>ids</span>
<a name="line-75"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>extendNameEnvList</span> <span class='hs-varid'>env</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-varid'>getName</span> <span class='hs-varid'>id</span><span class='hs-layout'>,</span> <span class='hs-conid'>AnId</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>id</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>ids</span><span class='hs-keyglyph'>]</span>
</pre>\end{code}

%************************************************************************
%*									*
		TypeEnv
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="TypeEnv"></a><span class='hs-comment'>-- | A map from 'Name's to 'TyThing's, constructed by typechecking</span>
<a name="line-2"></a><a name="TypeEnv"></a><span class='hs-comment'>-- local declarations or interface files</span>
<a name="line-3"></a><a name="TypeEnv"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>TypeEnv</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NameEnv</span> <span class='hs-conid'>TyThing</span>
<a name="line-4"></a>
<a name="line-5"></a><a name="emptyTypeEnv"></a><span class='hs-definition'>emptyTypeEnv</span>    <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TypeEnv</span>
<a name="line-6"></a><a name="typeEnvElts"></a><span class='hs-definition'>typeEnvElts</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TypeEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TyThing</span><span class='hs-keyglyph'>]</span>
<a name="line-7"></a><a name="typeEnvClasses"></a><span class='hs-definition'>typeEnvClasses</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TypeEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Class</span><span class='hs-keyglyph'>]</span>
<a name="line-8"></a><a name="typeEnvTyCons"></a><span class='hs-definition'>typeEnvTyCons</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TypeEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TyCon</span><span class='hs-keyglyph'>]</span>
<a name="line-9"></a><a name="typeEnvIds"></a><span class='hs-definition'>typeEnvIds</span>      <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TypeEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Id</span><span class='hs-keyglyph'>]</span>
<a name="line-10"></a><a name="typeEnvDataCons"></a><span class='hs-definition'>typeEnvDataCons</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TypeEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>DataCon</span><span class='hs-keyglyph'>]</span>
<a name="line-11"></a><a name="lookupTypeEnv"></a><span class='hs-definition'>lookupTypeEnv</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TypeEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>TyThing</span>
<a name="line-12"></a>
<a name="line-13"></a><span class='hs-definition'>emptyTypeEnv</span> 	    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>emptyNameEnv</span>
<a name="line-14"></a><span class='hs-definition'>typeEnvElts</span>     <span class='hs-varid'>env</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>nameEnvElts</span> <span class='hs-varid'>env</span>
<a name="line-15"></a><span class='hs-definition'>typeEnvClasses</span>  <span class='hs-varid'>env</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>cl</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>AClass</span> <span class='hs-varid'>cl</span>   <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>typeEnvElts</span> <span class='hs-varid'>env</span><span class='hs-keyglyph'>]</span>
<a name="line-16"></a><span class='hs-definition'>typeEnvTyCons</span>   <span class='hs-varid'>env</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>tc</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>ATyCon</span> <span class='hs-varid'>tc</span>   <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>typeEnvElts</span> <span class='hs-varid'>env</span><span class='hs-keyglyph'>]</span> 
<a name="line-17"></a><span class='hs-definition'>typeEnvIds</span>      <span class='hs-varid'>env</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>id</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>AnId</span> <span class='hs-varid'>id</span>     <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>typeEnvElts</span> <span class='hs-varid'>env</span><span class='hs-keyglyph'>]</span> 
<a name="line-18"></a><span class='hs-definition'>typeEnvDataCons</span> <span class='hs-varid'>env</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>dc</span> <span class='hs-keyglyph'>|</span> <span class='hs-conid'>ADataCon</span> <span class='hs-varid'>dc</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>typeEnvElts</span> <span class='hs-varid'>env</span><span class='hs-keyglyph'>]</span> 
<a name="line-19"></a>
<a name="line-20"></a><a name="mkTypeEnv"></a><span class='hs-definition'>mkTypeEnv</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TyThing</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TypeEnv</span>
<a name="line-21"></a><span class='hs-definition'>mkTypeEnv</span> <span class='hs-varid'>things</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>extendTypeEnvList</span> <span class='hs-varid'>emptyTypeEnv</span> <span class='hs-varid'>things</span>
<a name="line-22"></a>		
<a name="line-23"></a><span class='hs-definition'>lookupTypeEnv</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lookupNameEnv</span>
<a name="line-24"></a>
<a name="line-25"></a><a name="extendTypeEnv"></a><span class='hs-comment'>-- Extend the type environment</span>
<a name="line-26"></a><span class='hs-definition'>extendTypeEnv</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TypeEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TyThing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TypeEnv</span>
<a name="line-27"></a><span class='hs-definition'>extendTypeEnv</span> <span class='hs-varid'>env</span> <span class='hs-varid'>thing</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>extendNameEnv</span> <span class='hs-varid'>env</span> <span class='hs-layout'>(</span><span class='hs-varid'>getName</span> <span class='hs-varid'>thing</span><span class='hs-layout'>)</span> <span class='hs-varid'>thing</span> 
<a name="line-28"></a>
<a name="line-29"></a><a name="extendTypeEnvList"></a><span class='hs-definition'>extendTypeEnvList</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TypeEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>TyThing</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TypeEnv</span>
<a name="line-30"></a><span class='hs-definition'>extendTypeEnvList</span> <span class='hs-varid'>env</span> <span class='hs-varid'>things</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldl</span> <span class='hs-varid'>extendTypeEnv</span> <span class='hs-varid'>env</span> <span class='hs-varid'>things</span>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><a name="lookupType"></a><span class='hs-comment'>-- | Find the 'TyThing' for the given 'Name' by using all the resources</span>
<a name="line-2"></a><span class='hs-comment'>-- at our disposal: the compiled modules in the 'HomePackageTable' and the</span>
<a name="line-3"></a><span class='hs-comment'>-- compiled modules in other packages that live in 'PackageTypeEnv'. Note</span>
<a name="line-4"></a><span class='hs-comment'>-- that this does NOT look up the 'TyThing' in the module being compiled: you</span>
<a name="line-5"></a><span class='hs-comment'>-- have to do that yourself, if desired</span>
<a name="line-6"></a><span class='hs-definition'>lookupType</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DynFlags</span>
<a name="line-7"></a>	   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HomePackageTable</span>
<a name="line-8"></a>	   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>PackageTypeEnv</span>
<a name="line-9"></a>	   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Name</span>
<a name="line-10"></a>	   <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>TyThing</span>
<a name="line-11"></a>
<a name="line-12"></a><span class='hs-definition'>lookupType</span> <span class='hs-varid'>dflags</span> <span class='hs-varid'>hpt</span> <span class='hs-varid'>pte</span> <span class='hs-varid'>name</span>
<a name="line-13"></a>  <span class='hs-comment'>-- in one-shot, we don't use the HPT</span>
<a name="line-14"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>isOneShot</span> <span class='hs-layout'>(</span><span class='hs-varid'>ghcMode</span> <span class='hs-varid'>dflags</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>modulePackageId</span> <span class='hs-varid'>mod</span> <span class='hs-varop'>==</span> <span class='hs-varid'>this_pkg</span> 
<a name="line-15"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span> <span class='hs-varid'>hm</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>lookupUFM</span> <span class='hs-varid'>hpt</span> <span class='hs-layout'>(</span><span class='hs-varid'>moduleName</span> <span class='hs-varid'>mod</span><span class='hs-layout'>)</span> <span class='hs-comment'>-- Maybe monad</span>
<a name="line-16"></a>       <span class='hs-varid'>lookupNameEnv</span> <span class='hs-layout'>(</span><span class='hs-varid'>md_types</span> <span class='hs-layout'>(</span><span class='hs-varid'>hm_details</span> <span class='hs-varid'>hm</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varid'>name</span>
<a name="line-17"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-varid'>otherwise</span>
<a name="line-18"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lookupNameEnv</span> <span class='hs-varid'>pte</span> <span class='hs-varid'>name</span>
<a name="line-19"></a>  <span class='hs-keyword'>where</span> <span class='hs-varid'>mod</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ASSERT</span><span class='hs-layout'>(</span> <span class='hs-varid'>isExternalName</span> <span class='hs-varid'>name</span> <span class='hs-layout'>)</span> <span class='hs-varid'>nameModule</span> <span class='hs-varid'>name</span>
<a name="line-20"></a>	<span class='hs-varid'>this_pkg</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>thisPackage</span> <span class='hs-varid'>dflags</span>
<a name="line-21"></a>
<a name="line-22"></a><a name="lookupTypeHscEnv"></a><span class='hs-comment'>-- | As 'lookupType', but with a marginally easier-to-use interface</span>
<a name="line-23"></a><span class='hs-comment'>-- if you have a 'HscEnv'</span>
<a name="line-24"></a><span class='hs-definition'>lookupTypeHscEnv</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HscEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>IO</span> <span class='hs-layout'>(</span><span class='hs-conid'>Maybe</span> <span class='hs-conid'>TyThing</span><span class='hs-layout'>)</span>
<a name="line-25"></a><span class='hs-definition'>lookupTypeHscEnv</span> <span class='hs-varid'>hsc_env</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>do</span>
<a name="line-26"></a>    <span class='hs-varid'>eps</span> <span class='hs-keyglyph'>&lt;-</span> <span class='hs-varid'>readIORef</span> <span class='hs-layout'>(</span><span class='hs-varid'>hsc_EPS</span> <span class='hs-varid'>hsc_env</span><span class='hs-layout'>)</span>
<a name="line-27"></a>    <span class='hs-varid'>return</span> <span class='hs-varop'>$!</span> <span class='hs-varid'>lookupType</span> <span class='hs-varid'>dflags</span> <span class='hs-varid'>hpt</span> <span class='hs-layout'>(</span><span class='hs-varid'>eps_PTE</span> <span class='hs-varid'>eps</span><span class='hs-layout'>)</span> <span class='hs-varid'>name</span>
<a name="line-28"></a>  <span class='hs-keyword'>where</span> 
<a name="line-29"></a>    <span class='hs-varid'>dflags</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hsc_dflags</span> <span class='hs-varid'>hsc_env</span>
<a name="line-30"></a>    <span class='hs-varid'>hpt</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>hsc_HPT</span> <span class='hs-varid'>hsc_env</span>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><a name="tyThingTyCon"></a><span class='hs-comment'>-- | Get the 'TyCon' from a 'TyThing' if it is a type constructor thing. Panics otherwise</span>
<a name="line-2"></a><span class='hs-definition'>tyThingTyCon</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TyThing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>TyCon</span>
<a name="line-3"></a><span class='hs-definition'>tyThingTyCon</span> <span class='hs-layout'>(</span><span class='hs-conid'>ATyCon</span> <span class='hs-varid'>tc</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>tc</span>
<a name="line-4"></a><span class='hs-definition'>tyThingTyCon</span> <span class='hs-varid'>other</span>	 <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"tyThingTyCon"</span> <span class='hs-layout'>(</span><span class='hs-varid'>pprTyThing</span> <span class='hs-varid'>other</span><span class='hs-layout'>)</span>
<a name="line-5"></a>
<a name="line-6"></a><a name="tyThingClass"></a><span class='hs-comment'>-- | Get the 'Class' from a 'TyThing' if it is a class thing. Panics otherwise</span>
<a name="line-7"></a><span class='hs-definition'>tyThingClass</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TyThing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Class</span>
<a name="line-8"></a><span class='hs-definition'>tyThingClass</span> <span class='hs-layout'>(</span><span class='hs-conid'>AClass</span> <span class='hs-varid'>cls</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>cls</span>
<a name="line-9"></a><span class='hs-definition'>tyThingClass</span> <span class='hs-varid'>other</span>	  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"tyThingClass"</span> <span class='hs-layout'>(</span><span class='hs-varid'>pprTyThing</span> <span class='hs-varid'>other</span><span class='hs-layout'>)</span>
<a name="line-10"></a>
<a name="line-11"></a><a name="tyThingDataCon"></a><span class='hs-comment'>-- | Get the 'DataCon' from a 'TyThing' if it is a data constructor thing. Panics otherwise</span>
<a name="line-12"></a><span class='hs-definition'>tyThingDataCon</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TyThing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>DataCon</span>
<a name="line-13"></a><span class='hs-definition'>tyThingDataCon</span> <span class='hs-layout'>(</span><span class='hs-conid'>ADataCon</span> <span class='hs-varid'>dc</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dc</span>
<a name="line-14"></a><span class='hs-definition'>tyThingDataCon</span> <span class='hs-varid'>other</span>	     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"tyThingDataCon"</span> <span class='hs-layout'>(</span><span class='hs-varid'>pprTyThing</span> <span class='hs-varid'>other</span><span class='hs-layout'>)</span>
<a name="line-15"></a>
<a name="line-16"></a><a name="tyThingId"></a><span class='hs-comment'>-- | Get the 'Id' from a 'TyThing' if it is a id *or* data constructor thing. Panics otherwise</span>
<a name="line-17"></a><span class='hs-definition'>tyThingId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>TyThing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Id</span>
<a name="line-18"></a><span class='hs-definition'>tyThingId</span> <span class='hs-layout'>(</span><span class='hs-conid'>AnId</span> <span class='hs-varid'>id</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>id</span>
<a name="line-19"></a><span class='hs-definition'>tyThingId</span> <span class='hs-layout'>(</span><span class='hs-conid'>ADataCon</span> <span class='hs-varid'>dc</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>dataConWrapId</span> <span class='hs-varid'>dc</span>
<a name="line-20"></a><span class='hs-definition'>tyThingId</span> <span class='hs-varid'>other</span>         <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"tyThingId"</span> <span class='hs-layout'>(</span><span class='hs-varid'>pprTyThing</span> <span class='hs-varid'>other</span><span class='hs-layout'>)</span>
</pre>\end{code}

%************************************************************************
%*                                                                      *
\subsection{MonadThings and friends}
%*                                                                      *
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="MonadThings"></a><span class='hs-comment'>-- | Class that abstracts out the common ability of the monads in GHC</span>
<a name="line-2"></a><a name="MonadThings"></a><span class='hs-comment'>-- to lookup a 'TyThing' in the monadic environment by 'Name'. Provides</span>
<a name="line-3"></a><a name="MonadThings"></a><span class='hs-comment'>-- a number of related convenience functions for accessing particular</span>
<a name="line-4"></a><a name="MonadThings"></a><span class='hs-comment'>-- kinds of 'TyThing'</span>
<a name="line-5"></a><a name="MonadThings"></a><span class='hs-keyword'>class</span> <span class='hs-conid'>Monad</span> <span class='hs-varid'>m</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>MonadThings</span> <span class='hs-varid'>m</span> <span class='hs-keyword'>where</span>
<a name="line-6"></a>        <span class='hs-varid'>lookupThing</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>TyThing</span>
<a name="line-7"></a>
<a name="line-8"></a>        <span class='hs-varid'>lookupId</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>Id</span>
<a name="line-9"></a>        <span class='hs-varid'>lookupId</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>liftM</span> <span class='hs-varid'>tyThingId</span> <span class='hs-varop'>.</span> <span class='hs-varid'>lookupThing</span>
<a name="line-10"></a>
<a name="line-11"></a>        <span class='hs-varid'>lookupDataCon</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>DataCon</span>
<a name="line-12"></a>        <span class='hs-varid'>lookupDataCon</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>liftM</span> <span class='hs-varid'>tyThingDataCon</span> <span class='hs-varop'>.</span> <span class='hs-varid'>lookupThing</span>
<a name="line-13"></a>
<a name="line-14"></a>        <span class='hs-varid'>lookupTyCon</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>TyCon</span>
<a name="line-15"></a>        <span class='hs-varid'>lookupTyCon</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>liftM</span> <span class='hs-varid'>tyThingTyCon</span> <span class='hs-varop'>.</span> <span class='hs-varid'>lookupThing</span>
<a name="line-16"></a>
<a name="line-17"></a>        <span class='hs-varid'>lookupClass</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>m</span> <span class='hs-conid'>Class</span>
<a name="line-18"></a>        <span class='hs-varid'>lookupClass</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>liftM</span> <span class='hs-varid'>tyThingClass</span> <span class='hs-varop'>.</span> <span class='hs-varid'>lookupThing</span>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><a name="mkIfaceHashCache"></a><span class='hs-comment'>-- | Constructs cache for the 'mi_hash_fn' field of a 'ModIface'</span>
<a name="line-2"></a><span class='hs-definition'>mkIfaceHashCache</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>Fingerprint</span><span class='hs-layout'>,</span><span class='hs-conid'>IfaceDecl</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-3"></a>                 <span class='hs-keyglyph'>-&gt;</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span><span class='hs-layout'>,</span> <span class='hs-conid'>Fingerprint</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-4"></a><span class='hs-definition'>mkIfaceHashCache</span> <span class='hs-varid'>pairs</span> 
<a name="line-5"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>occ</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>lookupOccEnv</span> <span class='hs-varid'>env</span> <span class='hs-varid'>occ</span>
<a name="line-6"></a>  <span class='hs-keyword'>where</span>
<a name="line-7"></a>    <span class='hs-varid'>env</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr</span> <span class='hs-varid'>add_decl</span> <span class='hs-varid'>emptyOccEnv</span> <span class='hs-varid'>pairs</span>
<a name="line-8"></a>    <span class='hs-varid'>add_decl</span> <span class='hs-layout'>(</span><span class='hs-varid'>v</span><span class='hs-layout'>,</span><span class='hs-varid'>d</span><span class='hs-layout'>)</span> <span class='hs-varid'>env0</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr</span> <span class='hs-varid'>add_imp</span> <span class='hs-varid'>env1</span> <span class='hs-layout'>(</span><span class='hs-varid'>ifaceDeclSubBndrs</span> <span class='hs-varid'>d</span><span class='hs-layout'>)</span>
<a name="line-9"></a>      <span class='hs-keyword'>where</span>
<a name="line-10"></a>          <span class='hs-varid'>decl_name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ifName</span> <span class='hs-varid'>d</span>
<a name="line-11"></a>          <span class='hs-varid'>env1</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>extendOccEnv</span> <span class='hs-varid'>env0</span> <span class='hs-varid'>decl_name</span> <span class='hs-layout'>(</span><span class='hs-varid'>decl_name</span><span class='hs-layout'>,</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-12"></a>          <span class='hs-varid'>add_imp</span> <span class='hs-varid'>bndr</span> <span class='hs-varid'>env</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>extendOccEnv</span> <span class='hs-varid'>env</span> <span class='hs-varid'>bndr</span> <span class='hs-layout'>(</span><span class='hs-varid'>decl_name</span><span class='hs-layout'>,</span> <span class='hs-varid'>v</span><span class='hs-layout'>)</span>
<a name="line-13"></a>
<a name="line-14"></a><a name="emptyIfaceHashCache"></a><span class='hs-definition'>emptyIfaceHashCache</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccName</span><span class='hs-layout'>,</span> <span class='hs-conid'>Fingerprint</span><span class='hs-layout'>)</span>
<a name="line-15"></a><span class='hs-definition'>emptyIfaceHashCache</span> <span class='hs-sel'>_occ</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection{Auxiliary types}
%*									*
%************************************************************************

These types are defined here because they are mentioned in ModDetails,
but they are mostly elaborated elsewhere

\begin{code}
<pre><a name="line-1"></a><a name="Warnings"></a><span class='hs-comment'>------------------ Warnings -------------------------</span>
<a name="line-2"></a><a name="Warnings"></a><span class='hs-comment'>-- | Warning information for a module</span>
<a name="line-3"></a><a name="Warnings"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Warnings</span>
<a name="line-4"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NoWarnings</span>                          <span class='hs-comment'>-- ^ Nothing deprecated</span>
<a name="line-5"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>WarnAll</span> <span class='hs-conid'>WarningTxt</span>	                <span class='hs-comment'>-- ^ Whole module deprecated</span>
<a name="line-6"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>WarnSome</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>OccName</span><span class='hs-layout'>,</span><span class='hs-conid'>WarningTxt</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>     <span class='hs-comment'>-- ^ Some specific things deprecated</span>
<a name="line-7"></a>
<a name="line-8"></a>     <span class='hs-comment'>-- Only an OccName is needed because</span>
<a name="line-9"></a>     <span class='hs-comment'>--    (1) a deprecation always applies to a binding</span>
<a name="line-10"></a>     <span class='hs-comment'>--        defined in the module in which the deprecation appears.</span>
<a name="line-11"></a>     <span class='hs-comment'>--    (2) deprecations are only reported outside the defining module.</span>
<a name="line-12"></a>     <span class='hs-comment'>--        this is important because, otherwise, if we saw something like</span>
<a name="line-13"></a>     <span class='hs-comment'>--</span>
<a name="line-14"></a>     <span class='hs-comment'>--        {-# DEPRECATED f "" #-}</span>
<a name="line-15"></a>     <span class='hs-comment'>--        f = ...</span>
<a name="line-16"></a>     <span class='hs-comment'>--        h = f</span>
<a name="line-17"></a>     <span class='hs-comment'>--        g = let f = undefined in f</span>
<a name="line-18"></a>     <span class='hs-comment'>--</span>
<a name="line-19"></a>     <span class='hs-comment'>--        we'd need more information than an OccName to know to say something</span>
<a name="line-20"></a>     <span class='hs-comment'>--        about the use of f in h but not the use of the locally bound f in g</span>
<a name="line-21"></a>     <span class='hs-comment'>--</span>
<a name="line-22"></a>     <span class='hs-comment'>--        however, because we only report about deprecations from the outside,</span>
<a name="line-23"></a>     <span class='hs-comment'>--        and a module can only export one value called f,</span>
<a name="line-24"></a>     <span class='hs-comment'>--        an OccName suffices.</span>
<a name="line-25"></a>     <span class='hs-comment'>--</span>
<a name="line-26"></a>     <span class='hs-comment'>--        this is in contrast with fixity declarations, where we need to map</span>
<a name="line-27"></a>     <span class='hs-comment'>--        a Name to its fixity declaration.</span>
<a name="line-28"></a>  <span class='hs-keyword'>deriving</span><span class='hs-layout'>(</span> <span class='hs-conid'>Eq</span> <span class='hs-layout'>)</span>
<a name="line-29"></a>
<a name="line-30"></a><a name="mkIfaceWarnCache"></a><span class='hs-comment'>-- | Constructs the cache for the 'mi_warn_fn' field of a 'ModIface'</span>
<a name="line-31"></a><span class='hs-definition'>mkIfaceWarnCache</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Warnings</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>WarningTxt</span>
<a name="line-32"></a><span class='hs-definition'>mkIfaceWarnCache</span> <span class='hs-conid'>NoWarnings</span>  <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Nothing</span>
<a name="line-33"></a><span class='hs-definition'>mkIfaceWarnCache</span> <span class='hs-layout'>(</span><span class='hs-conid'>WarnAll</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><span class='hs-keyword'>_</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Just</span> <span class='hs-varid'>t</span>
<a name="line-34"></a><span class='hs-definition'>mkIfaceWarnCache</span> <span class='hs-layout'>(</span><span class='hs-conid'>WarnSome</span> <span class='hs-varid'>pairs</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>lookupOccEnv</span> <span class='hs-layout'>(</span><span class='hs-varid'>mkOccEnv</span> <span class='hs-varid'>pairs</span><span class='hs-layout'>)</span> <span class='hs-varop'>.</span> <span class='hs-varid'>nameOccName</span>
<a name="line-35"></a>
<a name="line-36"></a><a name="emptyIfaceWarnCache"></a><span class='hs-definition'>emptyIfaceWarnCache</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>WarningTxt</span>
<a name="line-37"></a><span class='hs-definition'>emptyIfaceWarnCache</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Nothing</span>
<a name="line-38"></a>
<a name="line-39"></a><a name="plusWarns"></a><span class='hs-definition'>plusWarns</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Warnings</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Warnings</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Warnings</span>
<a name="line-40"></a><span class='hs-definition'>plusWarns</span> <span class='hs-varid'>d</span> <span class='hs-conid'>NoWarnings</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>d</span>
<a name="line-41"></a><span class='hs-definition'>plusWarns</span> <span class='hs-conid'>NoWarnings</span> <span class='hs-varid'>d</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>d</span>
<a name="line-42"></a><span class='hs-definition'>plusWarns</span> <span class='hs-keyword'>_</span> <span class='hs-layout'>(</span><span class='hs-conid'>WarnAll</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>WarnAll</span> <span class='hs-varid'>t</span>
<a name="line-43"></a><span class='hs-definition'>plusWarns</span> <span class='hs-layout'>(</span><span class='hs-conid'>WarnAll</span> <span class='hs-varid'>t</span><span class='hs-layout'>)</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>WarnAll</span> <span class='hs-varid'>t</span>
<a name="line-44"></a><span class='hs-definition'>plusWarns</span> <span class='hs-layout'>(</span><span class='hs-conid'>WarnSome</span> <span class='hs-varid'>v1</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>WarnSome</span> <span class='hs-varid'>v2</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>WarnSome</span> <span class='hs-layout'>(</span><span class='hs-varid'>v1</span> <span class='hs-varop'>++</span> <span class='hs-varid'>v2</span><span class='hs-layout'>)</span>
</pre>\end{code}
\begin{code}
<pre><a name="line-1"></a><a name="Avails"></a><span class='hs-comment'>-- | A collection of 'AvailInfo' - several things that are \"available\"</span>
<a name="line-2"></a><a name="Avails"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>Avails</span>	  <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>AvailInfo</span><span class='hs-keyglyph'>]</span>
<a name="line-3"></a><a name="AvailInfo"></a><span class='hs-comment'>-- | 'Name'd things that are available</span>
<a name="line-4"></a><a name="AvailInfo"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>AvailInfo</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GenAvailInfo</span> <span class='hs-conid'>Name</span>
<a name="line-5"></a><a name="RdrAvailInfo"></a><span class='hs-comment'>-- | 'RdrName'd things that are available</span>
<a name="line-6"></a><a name="RdrAvailInfo"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>RdrAvailInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>GenAvailInfo</span> <span class='hs-conid'>OccName</span>
<a name="line-7"></a>
<a name="line-8"></a><a name="GenAvailInfo"></a><span class='hs-comment'>-- | Records what things are "available", i.e. in scope</span>
<a name="line-9"></a><a name="GenAvailInfo"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>GenAvailInfo</span> <span class='hs-varid'>name</span>	<span class='hs-keyglyph'>=</span> <span class='hs-conid'>Avail</span> <span class='hs-varid'>name</span>	 <span class='hs-comment'>-- ^ An ordinary identifier in scope</span>
<a name="line-10"></a>			<span class='hs-keyglyph'>|</span> <span class='hs-conid'>AvailTC</span> <span class='hs-varid'>name</span>
<a name="line-11"></a>				  <span class='hs-keyglyph'>[</span><span class='hs-varid'>name</span><span class='hs-keyglyph'>]</span> <span class='hs-comment'>-- ^ A type or class in scope. Parameters:</span>
<a name="line-12"></a>				         <span class='hs-comment'>--</span>
<a name="line-13"></a>				         <span class='hs-comment'>--  1) The name of the type or class</span>
<a name="line-14"></a>				         <span class='hs-comment'>--</span>
<a name="line-15"></a>				         <span class='hs-comment'>--  2) The available pieces of type or class.</span>
<a name="line-16"></a>					 <span class='hs-comment'>--     NB: If the type or class is itself</span>
<a name="line-17"></a>					 <span class='hs-comment'>--     to be in scope, it must be in this list.</span>
<a name="line-18"></a>					 <span class='hs-comment'>--     Thus, typically: @AvailTC Eq [Eq, ==, \/=]@</span>
<a name="line-19"></a>			<span class='hs-keyword'>deriving</span><span class='hs-layout'>(</span> <span class='hs-conid'>Eq</span> <span class='hs-layout'>)</span>
<a name="line-20"></a>			<span class='hs-comment'>-- Equality used when deciding if the interface has changed</span>
<a name="line-21"></a>
<a name="line-22"></a><a name="IfaceExport"></a><span class='hs-comment'>-- | The original names declared of a certain module that are exported</span>
<a name="line-23"></a><a name="IfaceExport"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>IfaceExport</span> <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-conid'>Module</span><span class='hs-layout'>,</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>GenAvailInfo</span> <span class='hs-conid'>OccName</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-24"></a>
<a name="line-25"></a><a name="availsToNameSet"></a><span class='hs-definition'>availsToNameSet</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>AvailInfo</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>NameSet</span>
<a name="line-26"></a><span class='hs-definition'>availsToNameSet</span> <span class='hs-varid'>avails</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr</span> <span class='hs-varid'>add</span> <span class='hs-varid'>emptyNameSet</span> <span class='hs-varid'>avails</span>
<a name="line-27"></a>      <span class='hs-keyword'>where</span> <span class='hs-varid'>add</span> <span class='hs-varid'>avail</span> <span class='hs-varid'>set</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>addListToNameSet</span> <span class='hs-varid'>set</span> <span class='hs-layout'>(</span><span class='hs-varid'>availNames</span> <span class='hs-varid'>avail</span><span class='hs-layout'>)</span>
<a name="line-28"></a>
<a name="line-29"></a><a name="availsToNameEnv"></a><span class='hs-definition'>availsToNameEnv</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>AvailInfo</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>NameEnv</span> <span class='hs-conid'>AvailInfo</span>
<a name="line-30"></a><span class='hs-definition'>availsToNameEnv</span> <span class='hs-varid'>avails</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr</span> <span class='hs-varid'>add</span> <span class='hs-varid'>emptyNameEnv</span> <span class='hs-varid'>avails</span>
<a name="line-31"></a>     <span class='hs-keyword'>where</span> <span class='hs-varid'>add</span> <span class='hs-varid'>avail</span> <span class='hs-varid'>env</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>extendNameEnvList</span> <span class='hs-varid'>env</span>
<a name="line-32"></a>                                <span class='hs-layout'>(</span><span class='hs-varid'>zip</span> <span class='hs-layout'>(</span><span class='hs-varid'>availNames</span> <span class='hs-varid'>avail</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-varid'>repeat</span> <span class='hs-varid'>avail</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-33"></a>
<a name="line-34"></a><a name="availName"></a><span class='hs-comment'>-- | Just the main name made available, i.e. not the available pieces</span>
<a name="line-35"></a><span class='hs-comment'>-- of type or class brought into scope by the 'GenAvailInfo'</span>
<a name="line-36"></a><span class='hs-definition'>availName</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>GenAvailInfo</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>name</span>
<a name="line-37"></a><span class='hs-definition'>availName</span> <span class='hs-layout'>(</span><span class='hs-conid'>Avail</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>n</span>
<a name="line-38"></a><span class='hs-definition'>availName</span> <span class='hs-layout'>(</span><span class='hs-conid'>AvailTC</span> <span class='hs-varid'>n</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>n</span>
<a name="line-39"></a>
<a name="line-40"></a><a name="availNames"></a><span class='hs-comment'>-- | All names made available by the availability information</span>
<a name="line-41"></a><span class='hs-definition'>availNames</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>GenAvailInfo</span> <span class='hs-varid'>name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>name</span><span class='hs-keyglyph'>]</span>
<a name="line-42"></a><span class='hs-definition'>availNames</span> <span class='hs-layout'>(</span><span class='hs-conid'>Avail</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>n</span><span class='hs-keyglyph'>]</span>
<a name="line-43"></a><span class='hs-definition'>availNames</span> <span class='hs-layout'>(</span><span class='hs-conid'>AvailTC</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>ns</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ns</span>
<a name="line-44"></a>
<a name="line-45"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>Outputable</span> <span class='hs-layout'>(</span><span class='hs-conid'>GenAvailInfo</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span> <span class='hs-keyword'>where</span>
<a name="line-46"></a>   <span class='hs-varid'>ppr</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprAvail</span>
<a name="line-47"></a>
<a name="line-48"></a><a name="pprAvail"></a><span class='hs-definition'>pprAvail</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Outputable</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=&gt;</span> <span class='hs-conid'>GenAvailInfo</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>SDoc</span>
<a name="line-49"></a><span class='hs-definition'>pprAvail</span> <span class='hs-layout'>(</span><span class='hs-conid'>Avail</span> <span class='hs-varid'>n</span><span class='hs-layout'>)</span>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>n</span>
<a name="line-50"></a><span class='hs-definition'>pprAvail</span> <span class='hs-layout'>(</span><span class='hs-conid'>AvailTC</span> <span class='hs-varid'>n</span> <span class='hs-varid'>ns</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>n</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>braces</span> <span class='hs-layout'>(</span><span class='hs-varid'>hsep</span> <span class='hs-layout'>(</span><span class='hs-varid'>punctuate</span> <span class='hs-varid'>comma</span> <span class='hs-layout'>(</span><span class='hs-varid'>map</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>ns</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
</pre>\end{code}

\begin{code}
<pre><a name="line-1"></a><a name="mkIfaceFixCache"></a><span class='hs-comment'>-- | Creates cached lookup for the 'mi_fix_fn' field of 'ModIface'</span>
<a name="line-2"></a><span class='hs-definition'>mkIfaceFixCache</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>OccName</span><span class='hs-layout'>,</span> <span class='hs-conid'>Fixity</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Fixity</span>
<a name="line-3"></a><span class='hs-definition'>mkIfaceFixCache</span> <span class='hs-varid'>pairs</span> 
<a name="line-4"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>\</span><span class='hs-varid'>n</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>lookupOccEnv</span> <span class='hs-varid'>env</span> <span class='hs-varid'>n</span> <span class='hs-varop'>`orElse`</span> <span class='hs-varid'>defaultFixity</span>
<a name="line-5"></a>  <span class='hs-keyword'>where</span>
<a name="line-6"></a>   <span class='hs-varid'>env</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>mkOccEnv</span> <span class='hs-varid'>pairs</span>
<a name="line-7"></a>
<a name="line-8"></a><a name="emptyIfaceFixCache"></a><span class='hs-definition'>emptyIfaceFixCache</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OccName</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Fixity</span>
<a name="line-9"></a><span class='hs-definition'>emptyIfaceFixCache</span> <span class='hs-keyword'>_</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>defaultFixity</span>
<a name="line-10"></a>
<a name="line-11"></a><a name="FixityEnv"></a><span class='hs-comment'>-- | Fixity environment mapping names to their fixities</span>
<a name="line-12"></a><a name="FixityEnv"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>FixityEnv</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NameEnv</span> <span class='hs-conid'>FixItem</span>
<a name="line-13"></a>
<a name="line-14"></a><a name="FixItem"></a><span class='hs-comment'>-- | Fixity information for an 'Name'. We keep the OccName in the range </span>
<a name="line-15"></a><a name="FixItem"></a><span class='hs-comment'>-- so that we can generate an interface from it</span>
<a name="line-16"></a><a name="FixItem"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>FixItem</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>FixItem</span> <span class='hs-conid'>OccName</span> <span class='hs-conid'>Fixity</span>
<a name="line-17"></a>
<a name="line-18"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>FixItem</span> <span class='hs-keyword'>where</span>
<a name="line-19"></a>  <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>FixItem</span> <span class='hs-varid'>occ</span> <span class='hs-varid'>fix</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>fix</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>occ</span>
<a name="line-20"></a>
<a name="line-21"></a><a name="emptyFixityEnv"></a><span class='hs-definition'>emptyFixityEnv</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FixityEnv</span>
<a name="line-22"></a><span class='hs-definition'>emptyFixityEnv</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>emptyNameEnv</span>
<a name="line-23"></a>
<a name="line-24"></a><a name="lookupFixity"></a><span class='hs-definition'>lookupFixity</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FixityEnv</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Name</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Fixity</span>
<a name="line-25"></a><span class='hs-definition'>lookupFixity</span> <span class='hs-varid'>env</span> <span class='hs-varid'>n</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyword'>case</span> <span class='hs-varid'>lookupNameEnv</span> <span class='hs-varid'>env</span> <span class='hs-varid'>n</span> <span class='hs-keyword'>of</span>
<a name="line-26"></a>			<span class='hs-conid'>Just</span> <span class='hs-layout'>(</span><span class='hs-conid'>FixItem</span> <span class='hs-keyword'>_</span> <span class='hs-varid'>fix</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>fix</span>
<a name="line-27"></a>			<span class='hs-conid'>Nothing</span>	      	<span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>defaultFixity</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection{WhatsImported}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="WhetherHasOrphans"></a><span class='hs-comment'>-- | Records whether a module has orphans. An \"orphan\" is one of:</span>
<a name="line-2"></a><a name="WhetherHasOrphans"></a><span class='hs-comment'>--</span>
<a name="line-3"></a><a name="WhetherHasOrphans"></a><span class='hs-comment'>-- * An instance declaration in a module other than the definition</span>
<a name="line-4"></a><a name="WhetherHasOrphans"></a><span class='hs-comment'>--   module for one of the type constructors or classes in the instance head</span>
<a name="line-5"></a><a name="WhetherHasOrphans"></a><span class='hs-comment'>--</span>
<a name="line-6"></a><a name="WhetherHasOrphans"></a><span class='hs-comment'>-- * A transformation rule in a module other than the one defining</span>
<a name="line-7"></a><a name="WhetherHasOrphans"></a><span class='hs-comment'>--   the function in the head of the rule</span>
<a name="line-8"></a><a name="WhetherHasOrphans"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>WhetherHasOrphans</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Bool</span>
<a name="line-9"></a>
<a name="line-10"></a><a name="WhetherHasFamInst"></a><span class='hs-comment'>-- | Does this module define family instances?</span>
<a name="line-11"></a><a name="WhetherHasFamInst"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>WhetherHasFamInst</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Bool</span>
<a name="line-12"></a>
<a name="line-13"></a><a name="IsBootInterface"></a><span class='hs-comment'>-- | Did this module originate from a *-boot file?</span>
<a name="line-14"></a><a name="IsBootInterface"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>IsBootInterface</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Bool</span>
<a name="line-15"></a>
<a name="line-16"></a><a name="Dependencies"></a><span class='hs-comment'>-- | Dependency information about modules and packages below this one</span>
<a name="line-17"></a><a name="Dependencies"></a><span class='hs-comment'>-- in the import hierarchy.</span>
<a name="line-18"></a><a name="Dependencies"></a><span class='hs-comment'>--</span>
<a name="line-19"></a><a name="Dependencies"></a><span class='hs-comment'>-- Invariant: the dependencies of a module @M@ never includes @M@.</span>
<a name="line-20"></a><a name="Dependencies"></a><span class='hs-comment'>--</span>
<a name="line-21"></a><a name="Dependencies"></a><span class='hs-comment'>-- Invariant: none of the lists contain duplicates.</span>
<a name="line-22"></a><a name="Dependencies"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Dependencies</span>
<a name="line-23"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Deps</span> <span class='hs-layout'>{</span> <span class='hs-varid'>dep_mods</span>   <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>ModuleName</span><span class='hs-layout'>,</span> <span class='hs-conid'>IsBootInterface</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span>
<a name="line-24"></a>                        <span class='hs-comment'>-- ^ Home-package module dependencies</span>
<a name="line-25"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>dep_pkgs</span>   <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>PackageId</span><span class='hs-keyglyph'>]</span>
<a name="line-26"></a>	                <span class='hs-comment'>-- ^ External package dependencies</span>
<a name="line-27"></a>	 <span class='hs-layout'>,</span> <span class='hs-varid'>dep_orphs</span>  <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Module</span><span class='hs-keyglyph'>]</span>	    
<a name="line-28"></a>	                <span class='hs-comment'>-- ^ Orphan modules (whether home or external pkg),</span>
<a name="line-29"></a>	                <span class='hs-comment'>-- *not* including family instance orphans as they</span>
<a name="line-30"></a>	                <span class='hs-comment'>-- are anyway included in 'dep_finsts'</span>
<a name="line-31"></a>         <span class='hs-layout'>,</span> <span class='hs-varid'>dep_finsts</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Module</span><span class='hs-keyglyph'>]</span>	    
<a name="line-32"></a>                        <span class='hs-comment'>-- ^ Modules that contain family instances (whether the</span>
<a name="line-33"></a>                        <span class='hs-comment'>-- instances are from the home or an external package)</span>
<a name="line-34"></a>         <span class='hs-layout'>}</span>
<a name="line-35"></a>  <span class='hs-keyword'>deriving</span><span class='hs-layout'>(</span> <span class='hs-conid'>Eq</span> <span class='hs-layout'>)</span>
<a name="line-36"></a>	<span class='hs-comment'>-- Equality used only for old/new comparison in MkIface.addVersionInfo</span>
<a name="line-37"></a>
<a name="line-38"></a>        <span class='hs-comment'>-- See 'TcRnTypes.ImportAvails' for details on dependencies.</span>
<a name="line-39"></a>
<a name="line-40"></a><a name="noDependencies"></a><span class='hs-definition'>noDependencies</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Dependencies</span>
<a name="line-41"></a><span class='hs-definition'>noDependencies</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Deps</span> <span class='hs-conid'>[]</span> <span class='hs-conid'>[]</span> <span class='hs-conid'>[]</span> <span class='hs-conid'>[]</span>
<a name="line-42"></a>
<a name="line-43"></a><a name="Usage"></a><span class='hs-comment'>-- | Records modules that we depend on by making a direct import from</span>
<a name="line-44"></a><a name="Usage"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Usage</span>
<a name="line-45"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>UsagePackageModule</span> <span class='hs-layout'>{</span>
<a name="line-46"></a>        <span class='hs-varid'>usg_mod</span>      <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Module</span><span class='hs-layout'>,</span>
<a name="line-47"></a>           <span class='hs-comment'>-- ^ External package module depended on</span>
<a name="line-48"></a>        <span class='hs-varid'>usg_mod_hash</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Fingerprint</span>
<a name="line-49"></a>    <span class='hs-layout'>}</span>                                           <span class='hs-comment'>-- ^ Module from another package</span>
<a name="line-50"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>UsageHomeModule</span> <span class='hs-layout'>{</span>
<a name="line-51"></a>        <span class='hs-varid'>usg_mod_name</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ModuleName</span><span class='hs-layout'>,</span>
<a name="line-52"></a>            <span class='hs-comment'>-- ^ Name of the module</span>
<a name="line-53"></a>	<span class='hs-varid'>usg_mod_hash</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Fingerprint</span><span class='hs-layout'>,</span>
<a name="line-54"></a>	    <span class='hs-comment'>-- ^ Cached module fingerprint</span>
<a name="line-55"></a>	<span class='hs-varid'>usg_entities</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-layout'>(</span><span class='hs-conid'>OccName</span><span class='hs-layout'>,</span><span class='hs-conid'>Fingerprint</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>
<a name="line-56"></a>            <span class='hs-comment'>-- ^ Entities we depend on, sorted by occurrence name and fingerprinted.</span>
<a name="line-57"></a>            <span class='hs-comment'>-- NB: usages are for parent names only, e.g. type constructors </span>
<a name="line-58"></a>            <span class='hs-comment'>-- but not the associated data constructors.</span>
<a name="line-59"></a>	<span class='hs-varid'>usg_exports</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>Fingerprint</span>
<a name="line-60"></a>            <span class='hs-comment'>-- ^ Fingerprint for the export list we used to depend on this module,</span>
<a name="line-61"></a>            <span class='hs-comment'>-- if we depend on the export list</span>
<a name="line-62"></a>    <span class='hs-layout'>}</span>                                           <span class='hs-comment'>-- ^ Module from the current package</span>
<a name="line-63"></a>    <span class='hs-keyword'>deriving</span><span class='hs-layout'>(</span> <span class='hs-conid'>Eq</span> <span class='hs-layout'>)</span>
<a name="line-64"></a>	<span class='hs-comment'>-- The export list field is (Just v) if we depend on the export list:</span>
<a name="line-65"></a>	<span class='hs-comment'>--	i.e. we imported the module directly, whether or not we</span>
<a name="line-66"></a>	<span class='hs-comment'>--	     enumerated the things we imported, or just imported </span>
<a name="line-67"></a>        <span class='hs-comment'>--           everything</span>
<a name="line-68"></a>	<span class='hs-comment'>-- We need to recompile if M's exports change, because </span>
<a name="line-69"></a>	<span class='hs-comment'>-- if the import was	import M, 	we might now have a name clash</span>
<a name="line-70"></a>        <span class='hs-comment'>--                                      in the importing module.</span>
<a name="line-71"></a>	<span class='hs-comment'>-- if the import was	import M(x)	M might no longer export x</span>
<a name="line-72"></a>	<span class='hs-comment'>-- The only way we don't depend on the export list is if we have</span>
<a name="line-73"></a>	<span class='hs-comment'>--			import M()</span>
<a name="line-74"></a>	<span class='hs-comment'>-- And of course, for modules that aren't imported directly we don't</span>
<a name="line-75"></a>	<span class='hs-comment'>-- depend on their export lists</span>
</pre>\end{code}


%************************************************************************
%*									*
		The External Package State
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="PackageTypeEnv"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>PackageTypeEnv</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>TypeEnv</span>
<a name="line-2"></a><a name="PackageRuleBase"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>PackageRuleBase</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>RuleBase</span>
<a name="line-3"></a><a name="PackageInstEnv"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>PackageInstEnv</span>    <span class='hs-keyglyph'>=</span> <span class='hs-conid'>InstEnv</span>
<a name="line-4"></a><a name="PackageFamInstEnv"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>PackageFamInstEnv</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>FamInstEnv</span>
<a name="line-5"></a><a name="PackageVectInfo"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>PackageVectInfo</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>VectInfo</span>
<a name="line-6"></a><a name="PackageAnnEnv"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>PackageAnnEnv</span>     <span class='hs-keyglyph'>=</span> <span class='hs-conid'>AnnEnv</span>
<a name="line-7"></a>
<a name="line-8"></a><a name="ExternalPackageState"></a><span class='hs-comment'>-- | Information about other packages that we have slurped in by reading</span>
<a name="line-9"></a><a name="ExternalPackageState"></a><span class='hs-comment'>-- their interface files</span>
<a name="line-10"></a><a name="ExternalPackageState"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>ExternalPackageState</span>
<a name="line-11"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EPS</span> <span class='hs-layout'>{</span>
<a name="line-12"></a>	<span class='hs-varid'>eps_is_boot</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-layout'>(</span><span class='hs-conid'>ModuleNameEnv</span> <span class='hs-layout'>(</span><span class='hs-conid'>ModuleName</span><span class='hs-layout'>,</span> <span class='hs-conid'>IsBootInterface</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-13"></a>		<span class='hs-comment'>-- ^ In OneShot mode (only), home-package modules</span>
<a name="line-14"></a>		<span class='hs-comment'>-- accumulate in the external package state, and are</span>
<a name="line-15"></a>		<span class='hs-comment'>-- sucked in lazily.  For these home-pkg modules</span>
<a name="line-16"></a>		<span class='hs-comment'>-- (only) we need to record which are boot modules.</span>
<a name="line-17"></a>		<span class='hs-comment'>-- We set this field after loading all the</span>
<a name="line-18"></a>		<span class='hs-comment'>-- explicitly-imported interfaces, but before doing</span>
<a name="line-19"></a>		<span class='hs-comment'>-- anything else</span>
<a name="line-20"></a>		<span class='hs-comment'>--</span>
<a name="line-21"></a>		<span class='hs-comment'>-- The 'ModuleName' part is not necessary, but it's useful for</span>
<a name="line-22"></a>		<span class='hs-comment'>-- debug prints, and it's convenient because this field comes</span>
<a name="line-23"></a>		<span class='hs-comment'>-- direct from 'TcRnTypes.imp_dep_mods'</span>
<a name="line-24"></a>
<a name="line-25"></a>	<span class='hs-varid'>eps_PIT</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>PackageIfaceTable</span><span class='hs-layout'>,</span>
<a name="line-26"></a>		<span class='hs-comment'>-- ^ The 'ModIface's for modules in external packages</span>
<a name="line-27"></a>		<span class='hs-comment'>-- whose interfaces we have opened.</span>
<a name="line-28"></a>		<span class='hs-comment'>-- The declarations in these interface files are held in the</span>
<a name="line-29"></a>		<span class='hs-comment'>-- 'eps_decls', 'eps_inst_env', 'eps_fam_inst_env' and 'eps_rules'</span>
<a name="line-30"></a>		<span class='hs-comment'>-- fields of this record, not in the 'mi_decls' fields of the </span>
<a name="line-31"></a>		<span class='hs-comment'>-- interface we have sucked in.</span>
<a name="line-32"></a>		<span class='hs-comment'>--</span>
<a name="line-33"></a>		<span class='hs-comment'>-- What /is/ in the PIT is:</span>
<a name="line-34"></a>		<span class='hs-comment'>--</span>
<a name="line-35"></a>		<span class='hs-comment'>-- * The Module</span>
<a name="line-36"></a>		<span class='hs-comment'>--</span>
<a name="line-37"></a>		<span class='hs-comment'>-- * Fingerprint info</span>
<a name="line-38"></a>		<span class='hs-comment'>--</span>
<a name="line-39"></a>		<span class='hs-comment'>-- * Its exports</span>
<a name="line-40"></a>		<span class='hs-comment'>--</span>
<a name="line-41"></a>		<span class='hs-comment'>-- * Fixities</span>
<a name="line-42"></a>		<span class='hs-comment'>--</span>
<a name="line-43"></a>		<span class='hs-comment'>-- * Deprecations and warnings</span>
<a name="line-44"></a>
<a name="line-45"></a>	<span class='hs-varid'>eps_PTE</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>PackageTypeEnv</span><span class='hs-layout'>,</span>	   
<a name="line-46"></a>	        <span class='hs-comment'>-- ^ Result of typechecking all the external package</span>
<a name="line-47"></a>	        <span class='hs-comment'>-- interface files we have sucked in. The domain of</span>
<a name="line-48"></a>	        <span class='hs-comment'>-- the mapping is external-package modules</span>
<a name="line-49"></a>	        
<a name="line-50"></a>	<span class='hs-varid'>eps_inst_env</span>     <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>PackageInstEnv</span><span class='hs-layout'>,</span>   <span class='hs-comment'>-- ^ The total 'InstEnv' accumulated</span>
<a name="line-51"></a>					       <span class='hs-comment'>-- from all the external-package modules</span>
<a name="line-52"></a>	<span class='hs-varid'>eps_fam_inst_env</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>PackageFamInstEnv</span><span class='hs-layout'>,</span><span class='hs-comment'>-- ^ The total 'FamInstEnv' accumulated</span>
<a name="line-53"></a>					       <span class='hs-comment'>-- from all the external-package modules</span>
<a name="line-54"></a>	<span class='hs-varid'>eps_rule_base</span>    <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>PackageRuleBase</span><span class='hs-layout'>,</span>  <span class='hs-comment'>-- ^ The total 'RuleEnv' accumulated</span>
<a name="line-55"></a>					       <span class='hs-comment'>-- from all the external-package modules</span>
<a name="line-56"></a>	<span class='hs-varid'>eps_vect_info</span>    <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>PackageVectInfo</span><span class='hs-layout'>,</span>  <span class='hs-comment'>-- ^ The total 'VectInfo' accumulated</span>
<a name="line-57"></a>					       <span class='hs-comment'>-- from all the external-package modules</span>
<a name="line-58"></a>        <span class='hs-varid'>eps_ann_env</span>      <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>PackageAnnEnv</span><span class='hs-layout'>,</span>    <span class='hs-comment'>-- ^ The total 'AnnEnv' accumulated</span>
<a name="line-59"></a>					       <span class='hs-comment'>-- from all the external-package modules</span>
<a name="line-60"></a>
<a name="line-61"></a>        <span class='hs-varid'>eps_mod_fam_inst_env</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-layout'>(</span><span class='hs-conid'>ModuleEnv</span> <span class='hs-conid'>FamInstEnv</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-comment'>-- ^ The family instances accumulated from external</span>
<a name="line-62"></a>                                                         <span class='hs-comment'>-- packages, keyed off the module that declared them</span>
<a name="line-63"></a>
<a name="line-64"></a>	<span class='hs-varid'>eps_stats</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>EpsStats</span>                 <span class='hs-comment'>-- ^ Stastics about what was loaded from external packages</span>
<a name="line-65"></a>  <span class='hs-layout'>}</span>
<a name="line-66"></a>
<a name="line-67"></a><a name="EpsStats"></a><span class='hs-comment'>-- | Accumulated statistics about what we are putting into the 'ExternalPackageState'.</span>
<a name="line-68"></a><a name="EpsStats"></a><span class='hs-comment'>-- \"In\" means stuff that is just /read/ from interface files,</span>
<a name="line-69"></a><a name="EpsStats"></a><span class='hs-comment'>-- \"Out\" means actually sucked in and type-checked</span>
<a name="line-70"></a><a name="EpsStats"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>EpsStats</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>EpsStats</span> <span class='hs-layout'>{</span> <span class='hs-varid'>n_ifaces_in</span>
<a name="line-71"></a>			 <span class='hs-layout'>,</span> <span class='hs-varid'>n_decls_in</span><span class='hs-layout'>,</span> <span class='hs-varid'>n_decls_out</span> 
<a name="line-72"></a>			 <span class='hs-layout'>,</span> <span class='hs-varid'>n_rules_in</span><span class='hs-layout'>,</span> <span class='hs-varid'>n_rules_out</span>
<a name="line-73"></a>			 <span class='hs-layout'>,</span> <span class='hs-varid'>n_insts_in</span><span class='hs-layout'>,</span> <span class='hs-varid'>n_insts_out</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-conid'>Int</span> <span class='hs-layout'>}</span>
<a name="line-74"></a>
<a name="line-75"></a><a name="addEpsInStats"></a><span class='hs-definition'>addEpsInStats</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>EpsStats</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Int</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>EpsStats</span>
<a name="line-76"></a><span class='hs-comment'>-- ^ Add stats for one newly-read interface</span>
<a name="line-77"></a><span class='hs-definition'>addEpsInStats</span> <span class='hs-varid'>stats</span> <span class='hs-varid'>n_decls</span> <span class='hs-varid'>n_insts</span> <span class='hs-varid'>n_rules</span>
<a name="line-78"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>stats</span> <span class='hs-layout'>{</span> <span class='hs-varid'>n_ifaces_in</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>n_ifaces_in</span> <span class='hs-varid'>stats</span> <span class='hs-varop'>+</span> <span class='hs-num'>1</span>
<a name="line-79"></a>	  <span class='hs-layout'>,</span> <span class='hs-varid'>n_decls_in</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>n_decls_in</span> <span class='hs-varid'>stats</span> <span class='hs-varop'>+</span> <span class='hs-varid'>n_decls</span>
<a name="line-80"></a>	  <span class='hs-layout'>,</span> <span class='hs-varid'>n_insts_in</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>n_insts_in</span> <span class='hs-varid'>stats</span> <span class='hs-varop'>+</span> <span class='hs-varid'>n_insts</span>
<a name="line-81"></a>	  <span class='hs-layout'>,</span> <span class='hs-varid'>n_rules_in</span>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>n_rules_in</span> <span class='hs-varid'>stats</span> <span class='hs-varop'>+</span> <span class='hs-varid'>n_rules</span> <span class='hs-layout'>}</span>
</pre>\end{code}

Names in a NameCache are always stored as a Global, and have the SrcLoc 
of their binding locations.

Actually that's not quite right.  When we first encounter the original
name, we might not be at its binding site (e.g. we are reading an
interface file); so we give it 'noSrcLoc' then.  Later, when we find
its binding site, we fix it up.

\begin{code}
<pre><a name="line-1"></a><a name="NameCache"></a><span class='hs-comment'>-- | The NameCache makes sure that there is just one Unique assigned for</span>
<a name="line-2"></a><a name="NameCache"></a><span class='hs-comment'>-- each original name; i.e. (module-name, occ-name) pair and provides</span>
<a name="line-3"></a><a name="NameCache"></a><span class='hs-comment'>-- something of a lookup mechanism for those names.</span>
<a name="line-4"></a><a name="NameCache"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>NameCache</span>
<a name="line-5"></a> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NameCache</span> <span class='hs-layout'>{</span>  <span class='hs-varid'>nsUniqs</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>UniqSupply</span><span class='hs-layout'>,</span>
<a name="line-6"></a>		<span class='hs-comment'>-- ^ Supply of uniques</span>
<a name="line-7"></a>		<span class='hs-varid'>nsNames</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OrigNameCache</span><span class='hs-layout'>,</span>
<a name="line-8"></a>		<span class='hs-comment'>-- ^ Ensures that one original name gets one unique</span>
<a name="line-9"></a>		<span class='hs-varid'>nsIPs</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>OrigIParamCache</span>
<a name="line-10"></a>		<span class='hs-comment'>-- ^ Ensures that one implicit parameter name gets one unique</span>
<a name="line-11"></a>   <span class='hs-layout'>}</span>
<a name="line-12"></a>
<a name="line-13"></a><a name="OrigNameCache"></a><span class='hs-comment'>-- | Per-module cache of original 'OccName's given 'Name's</span>
<a name="line-14"></a><a name="OrigNameCache"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>OrigNameCache</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ModuleEnv</span> <span class='hs-layout'>(</span><span class='hs-conid'>OccEnv</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span>
<a name="line-15"></a>
<a name="line-16"></a><a name="OrigIParamCache"></a><span class='hs-comment'>-- | Module-local cache of implicit parameter 'OccName's given 'Name's</span>
<a name="line-17"></a><a name="OrigIParamCache"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>OrigIParamCache</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>FiniteMap</span> <span class='hs-layout'>(</span><span class='hs-conid'>IPName</span> <span class='hs-conid'>OccName</span><span class='hs-layout'>)</span> <span class='hs-layout'>(</span><span class='hs-conid'>IPName</span> <span class='hs-conid'>Name</span><span class='hs-layout'>)</span>
</pre>\end{code}



%************************************************************************
%*									*
		The module graph and ModSummary type
	A ModSummary is a node in the compilation manager's
	dependency graph, and it's also passed to hscMain
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="ModuleGraph"></a><span class='hs-comment'>-- | A ModuleGraph contains all the nodes from the home package (only).</span>
<a name="line-2"></a><a name="ModuleGraph"></a><span class='hs-comment'>-- There will be a node for each source module, plus a node for each hi-boot</span>
<a name="line-3"></a><a name="ModuleGraph"></a><span class='hs-comment'>-- module.</span>
<a name="line-4"></a><a name="ModuleGraph"></a><span class='hs-comment'>--</span>
<a name="line-5"></a><a name="ModuleGraph"></a><span class='hs-comment'>-- The graph is not necessarily stored in topologically-sorted order.  Use</span>
<a name="line-6"></a><a name="ModuleGraph"></a><span class='hs-comment'>-- 'GHC.topSortModuleGraph' and 'Digraph.flattenSCC' to achieve this.</span>
<a name="line-7"></a><a name="ModuleGraph"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>ModuleGraph</span> <span class='hs-keyglyph'>=</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>ModSummary</span><span class='hs-keyglyph'>]</span>
<a name="line-8"></a>
<a name="line-9"></a><a name="emptyMG"></a><span class='hs-definition'>emptyMG</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ModuleGraph</span>
<a name="line-10"></a><span class='hs-definition'>emptyMG</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>[]</span>
<a name="line-11"></a>
<a name="line-12"></a><a name="ModSummary"></a><span class='hs-comment'>-- | A single node in a 'ModuleGraph. The nodes of the module graph are one of:</span>
<a name="line-13"></a><a name="ModSummary"></a><span class='hs-comment'>--</span>
<a name="line-14"></a><a name="ModSummary"></a><span class='hs-comment'>-- * A regular Haskell source module</span>
<a name="line-15"></a><a name="ModSummary"></a><span class='hs-comment'>--</span>
<a name="line-16"></a><a name="ModSummary"></a><span class='hs-comment'>-- * A hi-boot source module</span>
<a name="line-17"></a><a name="ModSummary"></a><span class='hs-comment'>--</span>
<a name="line-18"></a><a name="ModSummary"></a><span class='hs-comment'>-- * An external-core source module</span>
<a name="line-19"></a><a name="ModSummary"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>ModSummary</span>
<a name="line-20"></a>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ModSummary</span> <span class='hs-layout'>{</span>
<a name="line-21"></a>        <span class='hs-varid'>ms_mod</span>       <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Module</span><span class='hs-layout'>,</span>			<span class='hs-comment'>-- ^ Identity of the module</span>
<a name="line-22"></a>	<span class='hs-varid'>ms_hsc_src</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HscSource</span><span class='hs-layout'>,</span>		<span class='hs-comment'>-- ^ The module source either plain Haskell, hs-boot or external core</span>
<a name="line-23"></a>        <span class='hs-varid'>ms_location</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ModLocation</span><span class='hs-layout'>,</span>		<span class='hs-comment'>-- ^ Location of the various files belonging to the module</span>
<a name="line-24"></a>        <span class='hs-varid'>ms_hs_date</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ClockTime</span><span class='hs-layout'>,</span>		<span class='hs-comment'>-- ^ Timestamp of source file</span>
<a name="line-25"></a>	<span class='hs-varid'>ms_obj_date</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>ClockTime</span><span class='hs-layout'>,</span>	<span class='hs-comment'>-- ^ Timestamp of object, if we have one</span>
<a name="line-26"></a>        <span class='hs-varid'>ms_srcimps</span>   <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Located</span> <span class='hs-layout'>(</span><span class='hs-conid'>ImportDecl</span> <span class='hs-conid'>RdrName</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>	<span class='hs-comment'>-- ^ Source imports of the module</span>
<a name="line-27"></a>        <span class='hs-varid'>ms_imps</span>      <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Located</span> <span class='hs-layout'>(</span><span class='hs-conid'>ImportDecl</span> <span class='hs-conid'>RdrName</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>	<span class='hs-comment'>-- ^ Non-source imports of the module</span>
<a name="line-28"></a>        <span class='hs-varid'>ms_hspp_file</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>FilePath</span><span class='hs-layout'>,</span>		<span class='hs-comment'>-- ^ Filename of preprocessed source file</span>
<a name="line-29"></a>        <span class='hs-varid'>ms_hspp_opts</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>DynFlags</span><span class='hs-layout'>,</span>               <span class='hs-comment'>-- ^ Cached flags from @OPTIONS@, @INCLUDE@</span>
<a name="line-30"></a>                                                <span class='hs-comment'>-- and @LANGUAGE@ pragmas in the modules source code</span>
<a name="line-31"></a>	<span class='hs-varid'>ms_hspp_buf</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Maybe</span> <span class='hs-conid'>StringBuffer</span>    	<span class='hs-comment'>-- ^ The actual preprocessed source, if we have it</span>
<a name="line-32"></a>     <span class='hs-layout'>}</span>
<a name="line-33"></a>
<a name="line-34"></a><a name="ms_mod_name"></a><span class='hs-definition'>ms_mod_name</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ModSummary</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ModuleName</span>
<a name="line-35"></a><span class='hs-definition'>ms_mod_name</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>moduleName</span> <span class='hs-varop'>.</span> <span class='hs-varid'>ms_mod</span>
<a name="line-36"></a>
<a name="line-37"></a><span class='hs-comment'>-- The ModLocation contains both the original source filename and the</span>
<a name="line-38"></a><span class='hs-comment'>-- filename of the cleaned-up source file after all preprocessing has been</span>
<a name="line-39"></a><span class='hs-comment'>-- done.  The point is that the summariser will have to cpp/unlit/whatever</span>
<a name="line-40"></a><span class='hs-comment'>-- all files anyway, and there's no point in doing this twice -- just </span>
<a name="line-41"></a><span class='hs-comment'>-- park the result in a temp file, put the name of it in the location,</span>
<a name="line-42"></a><span class='hs-comment'>-- and let @compile@ read from that file on the way back up.</span>
<a name="line-43"></a>
<a name="line-44"></a><span class='hs-comment'>-- The ModLocation is stable over successive up-sweeps in GHCi, wheres</span>
<a name="line-45"></a><span class='hs-comment'>-- the ms_hs_date and imports can, of course, change</span>
<a name="line-46"></a>
<a name="line-47"></a><a name="msHsFilePath"></a><span class='hs-definition'>msHsFilePath</span><span class='hs-layout'>,</span> <span class='hs-varid'>msHiFilePath</span><span class='hs-layout'>,</span> <span class='hs-varid'>msObjFilePath</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ModSummary</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FilePath</span>
<a name="line-48"></a><span class='hs-definition'>msHsFilePath</span>  <span class='hs-varid'>ms</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>expectJust</span> <span class='hs-str'>"msHsFilePath"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ml_hs_file</span>  <span class='hs-layout'>(</span><span class='hs-varid'>ms_location</span> <span class='hs-varid'>ms</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span>
<a name="line-49"></a><a name="msHiFilePath"></a><span class='hs-definition'>msHiFilePath</span>  <span class='hs-varid'>ms</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ml_hi_file</span>  <span class='hs-layout'>(</span><span class='hs-varid'>ms_location</span> <span class='hs-varid'>ms</span><span class='hs-layout'>)</span>
<a name="line-50"></a><a name="msObjFilePath"></a><span class='hs-definition'>msObjFilePath</span> <span class='hs-varid'>ms</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>ml_obj_file</span> <span class='hs-layout'>(</span><span class='hs-varid'>ms_location</span> <span class='hs-varid'>ms</span><span class='hs-layout'>)</span>
<a name="line-51"></a>
<a name="line-52"></a><a name="isBootSummary"></a><span class='hs-comment'>-- | Did this 'ModSummary' originate from a hs-boot file?</span>
<a name="line-53"></a><span class='hs-definition'>isBootSummary</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ModSummary</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-54"></a><span class='hs-definition'>isBootSummary</span> <span class='hs-varid'>ms</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>isHsBoot</span> <span class='hs-layout'>(</span><span class='hs-varid'>ms_hsc_src</span> <span class='hs-varid'>ms</span><span class='hs-layout'>)</span>
<a name="line-55"></a>
<a name="line-56"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>ModSummary</span> <span class='hs-keyword'>where</span>
<a name="line-57"></a>   <span class='hs-varid'>ppr</span> <span class='hs-varid'>ms</span>
<a name="line-58"></a>      <span class='hs-keyglyph'>=</span> <span class='hs-varid'>sep</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>text</span> <span class='hs-str'>"ModSummary {"</span><span class='hs-layout'>,</span>
<a name="line-59"></a>             <span class='hs-varid'>nest</span> <span class='hs-num'>3</span> <span class='hs-layout'>(</span><span class='hs-varid'>sep</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>text</span> <span class='hs-str'>"ms_hs_date = "</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>text</span> <span class='hs-layout'>(</span><span class='hs-varid'>show</span> <span class='hs-layout'>(</span><span class='hs-varid'>ms_hs_date</span> <span class='hs-varid'>ms</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-60"></a>                          <span class='hs-varid'>text</span> <span class='hs-str'>"ms_mod ="</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-varid'>ms_mod</span> <span class='hs-varid'>ms</span><span class='hs-layout'>)</span> 
<a name="line-61"></a>				<span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>text</span> <span class='hs-layout'>(</span><span class='hs-varid'>hscSourceString</span> <span class='hs-layout'>(</span><span class='hs-varid'>ms_hsc_src</span> <span class='hs-varid'>ms</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>comma</span><span class='hs-layout'>,</span>
<a name="line-62"></a>                          <span class='hs-varid'>text</span> <span class='hs-str'>"ms_imps ="</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-varid'>ms_imps</span> <span class='hs-varid'>ms</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-63"></a>                          <span class='hs-varid'>text</span> <span class='hs-str'>"ms_srcimps ="</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-varid'>ms_srcimps</span> <span class='hs-varid'>ms</span><span class='hs-layout'>)</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-64"></a>             <span class='hs-varid'>char</span> <span class='hs-chr'>'}'</span>
<a name="line-65"></a>            <span class='hs-keyglyph'>]</span>
<a name="line-66"></a>
<a name="line-67"></a><a name="showModMsg"></a><span class='hs-definition'>showModMsg</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HscTarget</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>ModSummary</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>String</span>
<a name="line-68"></a><span class='hs-definition'>showModMsg</span> <span class='hs-varid'>target</span> <span class='hs-varid'>recomp</span> <span class='hs-varid'>mod_summary</span>
<a name="line-69"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-varid'>showSDoc</span> <span class='hs-varop'>$</span>
<a name="line-70"></a>        <span class='hs-varid'>hsep</span> <span class='hs-keyglyph'>[</span><span class='hs-varid'>text</span> <span class='hs-layout'>(</span><span class='hs-varid'>mod_str</span> <span class='hs-varop'>++</span> <span class='hs-varid'>replicate</span> <span class='hs-layout'>(</span><span class='hs-varid'>max</span> <span class='hs-num'>0</span> <span class='hs-layout'>(</span><span class='hs-num'>16</span> <span class='hs-comment'>-</span> <span class='hs-varid'>length</span> <span class='hs-varid'>mod_str</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-chr'>' '</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-71"></a>              <span class='hs-varid'>char</span> <span class='hs-chr'>'('</span><span class='hs-layout'>,</span> <span class='hs-varid'>text</span> <span class='hs-layout'>(</span><span class='hs-varid'>normalise</span> <span class='hs-varop'>$</span> <span class='hs-varid'>msHsFilePath</span> <span class='hs-varid'>mod_summary</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;&gt;</span> <span class='hs-varid'>comma</span><span class='hs-layout'>,</span>
<a name="line-72"></a>              <span class='hs-keyword'>case</span> <span class='hs-varid'>target</span> <span class='hs-keyword'>of</span>
<a name="line-73"></a>                  <span class='hs-conid'>HscInterpreted</span> <span class='hs-keyglyph'>|</span> <span class='hs-varid'>recomp</span> 
<a name="line-74"></a>                             <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>text</span> <span class='hs-str'>"interpreted"</span>
<a name="line-75"></a>                  <span class='hs-conid'>HscNothing</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>text</span> <span class='hs-str'>"nothing"</span>
<a name="line-76"></a>                  <span class='hs-keyword'>_</span>          <span class='hs-keyglyph'>-&gt;</span> <span class='hs-varid'>text</span> <span class='hs-layout'>(</span><span class='hs-varid'>normalise</span> <span class='hs-varop'>$</span> <span class='hs-varid'>msObjFilePath</span> <span class='hs-varid'>mod_summary</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>
<a name="line-77"></a>              <span class='hs-varid'>char</span> <span class='hs-chr'>')'</span><span class='hs-keyglyph'>]</span>
<a name="line-78"></a> <span class='hs-keyword'>where</span> 
<a name="line-79"></a>    <span class='hs-varid'>mod</span>     <span class='hs-keyglyph'>=</span> <span class='hs-varid'>moduleName</span> <span class='hs-layout'>(</span><span class='hs-varid'>ms_mod</span> <span class='hs-varid'>mod_summary</span><span class='hs-layout'>)</span>
<a name="line-80"></a>    <span class='hs-varid'>mod_str</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>showSDoc</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>mod</span><span class='hs-layout'>)</span> <span class='hs-varop'>++</span> <span class='hs-varid'>hscSourceString</span> <span class='hs-layout'>(</span><span class='hs-varid'>ms_hsc_src</span> <span class='hs-varid'>mod_summary</span><span class='hs-layout'>)</span>
</pre>\end{code}


%************************************************************************
%*									*
\subsection{Hpc Support}
%*									*
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="HpcInfo"></a><span class='hs-comment'>-- | Information about a modules use of Haskell Program Coverage</span>
<a name="line-2"></a><a name="HpcInfo"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>HpcInfo</span>
<a name="line-3"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>HpcInfo</span> 
<a name="line-4"></a>     <span class='hs-layout'>{</span> <span class='hs-varid'>hpcInfoTickCount</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>
<a name="line-5"></a>     <span class='hs-layout'>,</span> <span class='hs-varid'>hpcInfoHash</span>      <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Int</span>
<a name="line-6"></a>     <span class='hs-layout'>}</span>
<a name="line-7"></a>  <span class='hs-keyglyph'>|</span> <span class='hs-conid'>NoHpcInfo</span> 
<a name="line-8"></a>     <span class='hs-layout'>{</span> <span class='hs-varid'>hpcUsed</span>          <span class='hs-keyglyph'>::</span> <span class='hs-conid'>AnyHpcUsage</span>  <span class='hs-comment'>-- ^ Is hpc used anywhere on the module \*tree\*?</span>
<a name="line-9"></a>     <span class='hs-layout'>}</span>
<a name="line-10"></a>
<a name="line-11"></a><a name="AnyHpcUsage"></a><span class='hs-comment'>-- | This is used to signal if one of my imports used HPC instrumentation</span>
<a name="line-12"></a><a name="AnyHpcUsage"></a><span class='hs-comment'>-- even if there is no module-local HPC usage</span>
<a name="line-13"></a><a name="AnyHpcUsage"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>AnyHpcUsage</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Bool</span>
<a name="line-14"></a>
<a name="line-15"></a><a name="emptyHpcInfo"></a><span class='hs-definition'>emptyHpcInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>AnyHpcUsage</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>HpcInfo</span>
<a name="line-16"></a><span class='hs-definition'>emptyHpcInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>NoHpcInfo</span> 
<a name="line-17"></a>
<a name="line-18"></a><a name="isHpcUsed"></a><span class='hs-comment'>-- | Find out if HPC is used by this module or any of the modules</span>
<a name="line-19"></a><span class='hs-comment'>-- it depends upon</span>
<a name="line-20"></a><span class='hs-definition'>isHpcUsed</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>HpcInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>AnyHpcUsage</span>
<a name="line-21"></a><span class='hs-definition'>isHpcUsed</span> <span class='hs-layout'>(</span><span class='hs-conid'>HpcInfo</span> <span class='hs-layout'>{</span><span class='hs-layout'>}</span><span class='hs-layout'>)</span>     		 <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-22"></a><span class='hs-definition'>isHpcUsed</span> <span class='hs-layout'>(</span><span class='hs-conid'>NoHpcInfo</span> <span class='hs-layout'>{</span> <span class='hs-varid'>hpcUsed</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>used</span> <span class='hs-layout'>}</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>used</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection{Vectorisation Support}
%*									*
%************************************************************************

The following information is generated and consumed by the vectorisation
subsystem.  It communicates the vectorisation status of declarations from one
module to another.

Why do we need both f and f_v in the ModGuts/ModDetails/EPS version VectInfo
below?  We need to know `f' when converting to IfaceVectInfo.  However, during
vectorisation, we need to know `f_v', whose `Var' we cannot lookup based
on just the OccName easily in a Core pass.

\begin{code}
<pre><a name="line-1"></a><a name="VectInfo"></a><span class='hs-comment'>-- | Vectorisation information for 'ModGuts', 'ModDetails' and 'ExternalPackageState'.</span>
<a name="line-2"></a><a name="VectInfo"></a><span class='hs-comment'>-- All of this information is always tidy, even in ModGuts.</span>
<a name="line-3"></a><a name="VectInfo"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>VectInfo</span>      
<a name="line-4"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>VectInfo</span> <span class='hs-layout'>{</span>
<a name="line-5"></a>      <span class='hs-varid'>vectInfoVar</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>VarEnv</span>  <span class='hs-layout'>(</span><span class='hs-conid'>Var</span>    <span class='hs-layout'>,</span> <span class='hs-conid'>Var</span>  <span class='hs-layout'>)</span><span class='hs-layout'>,</span>   <span class='hs-comment'>-- ^ @(f, f_v)@ keyed on @f@</span>
<a name="line-6"></a>      <span class='hs-varid'>vectInfoTyCon</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameEnv</span> <span class='hs-layout'>(</span><span class='hs-conid'>TyCon</span>  <span class='hs-layout'>,</span> <span class='hs-conid'>TyCon</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>   <span class='hs-comment'>-- ^ @(T, T_v)@ keyed on @T@</span>
<a name="line-7"></a>      <span class='hs-varid'>vectInfoDataCon</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameEnv</span> <span class='hs-layout'>(</span><span class='hs-conid'>DataCon</span><span class='hs-layout'>,</span> <span class='hs-conid'>DataCon</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span> <span class='hs-comment'>-- ^ @(C, C_v)@ keyed on @C@</span>
<a name="line-8"></a>      <span class='hs-varid'>vectInfoPADFun</span>  <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameEnv</span> <span class='hs-layout'>(</span><span class='hs-conid'>TyCon</span>  <span class='hs-layout'>,</span> <span class='hs-conid'>Var</span><span class='hs-layout'>)</span><span class='hs-layout'>,</span>     <span class='hs-comment'>-- ^ @(T_v, paT)@ keyed on @T_v@</span>
<a name="line-9"></a>      <span class='hs-varid'>vectInfoIso</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>NameEnv</span> <span class='hs-layout'>(</span><span class='hs-conid'>TyCon</span>  <span class='hs-layout'>,</span> <span class='hs-conid'>Var</span><span class='hs-layout'>)</span>      <span class='hs-comment'>-- ^ @(T, isoT)@ keyed on @T@</span>
<a name="line-10"></a>    <span class='hs-layout'>}</span>
<a name="line-11"></a>
<a name="line-12"></a><a name="IfaceVectInfo"></a><span class='hs-comment'>-- | Vectorisation information for 'ModIface': a slightly less low-level view</span>
<a name="line-13"></a><a name="IfaceVectInfo"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>IfaceVectInfo</span> 
<a name="line-14"></a>  <span class='hs-keyglyph'>=</span> <span class='hs-conid'>IfaceVectInfo</span> <span class='hs-layout'>{</span>
<a name="line-15"></a>      <span class='hs-varid'>ifaceVectInfoVar</span>        <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>
<a name="line-16"></a>        <span class='hs-comment'>-- ^ All variables in here have a vectorised variant</span>
<a name="line-17"></a>      <span class='hs-varid'>ifaceVectInfoTyCon</span>      <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>,</span>
<a name="line-18"></a>        <span class='hs-comment'>-- ^ All 'TyCon's in here have a vectorised variant;</span>
<a name="line-19"></a>        <span class='hs-comment'>-- the name of the vectorised variant and those of its</span>
<a name="line-20"></a>        <span class='hs-comment'>-- data constructors are determined by 'OccName.mkVectTyConOcc'</span>
<a name="line-21"></a>        <span class='hs-comment'>-- and 'OccName.mkVectDataConOcc'; the names of</span>
<a name="line-22"></a>        <span class='hs-comment'>-- the isomorphisms are determined by 'OccName.mkVectIsoOcc'</span>
<a name="line-23"></a>      <span class='hs-varid'>ifaceVectInfoTyConReuse</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Name</span><span class='hs-keyglyph'>]</span>              
<a name="line-24"></a>        <span class='hs-comment'>-- ^ The vectorised form of all the 'TyCon's in here coincides with</span>
<a name="line-25"></a>        <span class='hs-comment'>-- the unconverted form; the name of the isomorphisms is determined</span>
<a name="line-26"></a>        <span class='hs-comment'>-- by 'OccName.mkVectIsoOcc'</span>
<a name="line-27"></a>    <span class='hs-layout'>}</span>
<a name="line-28"></a>
<a name="line-29"></a><a name="noVectInfo"></a><span class='hs-definition'>noVectInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>VectInfo</span>
<a name="line-30"></a><span class='hs-definition'>noVectInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>VectInfo</span> <span class='hs-varid'>emptyVarEnv</span> <span class='hs-varid'>emptyNameEnv</span> <span class='hs-varid'>emptyNameEnv</span> <span class='hs-varid'>emptyNameEnv</span> <span class='hs-varid'>emptyNameEnv</span>
<a name="line-31"></a>
<a name="line-32"></a><a name="plusVectInfo"></a><span class='hs-definition'>plusVectInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>VectInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>VectInfo</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>VectInfo</span>
<a name="line-33"></a><span class='hs-definition'>plusVectInfo</span> <span class='hs-varid'>vi1</span> <span class='hs-varid'>vi2</span> <span class='hs-keyglyph'>=</span> 
<a name="line-34"></a>  <span class='hs-conid'>VectInfo</span> <span class='hs-layout'>(</span><span class='hs-varid'>vectInfoVar</span>     <span class='hs-varid'>vi1</span> <span class='hs-varop'>`plusVarEnv`</span>  <span class='hs-varid'>vectInfoVar</span>     <span class='hs-varid'>vi2</span><span class='hs-layout'>)</span>
<a name="line-35"></a>           <span class='hs-layout'>(</span><span class='hs-varid'>vectInfoTyCon</span>   <span class='hs-varid'>vi1</span> <span class='hs-varop'>`plusNameEnv`</span> <span class='hs-varid'>vectInfoTyCon</span>   <span class='hs-varid'>vi2</span><span class='hs-layout'>)</span>
<a name="line-36"></a>           <span class='hs-layout'>(</span><span class='hs-varid'>vectInfoDataCon</span> <span class='hs-varid'>vi1</span> <span class='hs-varop'>`plusNameEnv`</span> <span class='hs-varid'>vectInfoDataCon</span> <span class='hs-varid'>vi2</span><span class='hs-layout'>)</span>
<a name="line-37"></a>           <span class='hs-layout'>(</span><span class='hs-varid'>vectInfoPADFun</span>  <span class='hs-varid'>vi1</span> <span class='hs-varop'>`plusNameEnv`</span> <span class='hs-varid'>vectInfoPADFun</span>  <span class='hs-varid'>vi2</span><span class='hs-layout'>)</span>
<a name="line-38"></a>           <span class='hs-layout'>(</span><span class='hs-varid'>vectInfoIso</span>     <span class='hs-varid'>vi1</span> <span class='hs-varop'>`plusNameEnv`</span> <span class='hs-varid'>vectInfoIso</span>     <span class='hs-varid'>vi2</span><span class='hs-layout'>)</span>
<a name="line-39"></a>
<a name="line-40"></a><a name="concatVectInfo"></a><span class='hs-definition'>concatVectInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>VectInfo</span><span class='hs-keyglyph'>]</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>VectInfo</span>
<a name="line-41"></a><span class='hs-definition'>concatVectInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>foldr</span> <span class='hs-varid'>plusVectInfo</span> <span class='hs-varid'>noVectInfo</span>
<a name="line-42"></a>
<a name="line-43"></a><a name="noIfaceVectInfo"></a><span class='hs-definition'>noIfaceVectInfo</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>IfaceVectInfo</span>
<a name="line-44"></a><span class='hs-definition'>noIfaceVectInfo</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>IfaceVectInfo</span> <span class='hs-conid'>[]</span> <span class='hs-conid'>[]</span> <span class='hs-conid'>[]</span>
</pre>\end{code}

%************************************************************************
%*									*
\subsection{Linkable stuff}
%*									*
%************************************************************************

This stuff is in here, rather than (say) in Linker.lhs, because the Linker.lhs
stuff is the *dynamic* linker, and isn't present in a stage-1 compiler

\begin{code}
<pre><a name="line-1"></a><a name="Linkable"></a><span class='hs-comment'>-- | Information we can use to dynamically link modules into the compiler</span>
<a name="line-2"></a><a name="Linkable"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Linkable</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>LM</span> <span class='hs-layout'>{</span>
<a name="line-3"></a>  <span class='hs-varid'>linkableTime</span>     <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ClockTime</span><span class='hs-layout'>,</span>	<span class='hs-comment'>-- ^ Time at which this linkable was built</span>
<a name="line-4"></a>					<span class='hs-comment'>-- (i.e. when the bytecodes were produced,</span>
<a name="line-5"></a>					<span class='hs-comment'>--	 or the mod date on the files)</span>
<a name="line-6"></a>  <span class='hs-varid'>linkableModule</span>   <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Module</span><span class='hs-layout'>,</span>           <span class='hs-comment'>-- ^ The linkable module itself</span>
<a name="line-7"></a>  <span class='hs-varid'>linkableUnlinked</span> <span class='hs-keyglyph'>::</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>Unlinked</span><span class='hs-keyglyph'>]</span>
<a name="line-8"></a>    <span class='hs-comment'>-- ^ Those files and chunks of code we have yet to link.</span>
<a name="line-9"></a>    <span class='hs-comment'>--</span>
<a name="line-10"></a>    <span class='hs-comment'>-- INVARIANT: A valid linkable always has at least one 'Unlinked' item.</span>
<a name="line-11"></a>    <span class='hs-comment'>-- If this list is empty, the Linkable represents a fake linkable, which</span>
<a name="line-12"></a>    <span class='hs-comment'>-- is generated in HscNothing mode to avoid recompiling modules.</span>
<a name="line-13"></a>    <span class='hs-comment'>--</span>
<a name="line-14"></a>    <span class='hs-comment'>-- XXX: Do items get removed from this list when they get linked?</span>
<a name="line-15"></a> <span class='hs-layout'>}</span>
<a name="line-16"></a>
<a name="line-17"></a><a name="isObjectLinkable"></a><span class='hs-definition'>isObjectLinkable</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Linkable</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-18"></a><span class='hs-definition'>isObjectLinkable</span> <span class='hs-varid'>l</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>not</span> <span class='hs-layout'>(</span><span class='hs-varid'>null</span> <span class='hs-varid'>unlinked</span><span class='hs-layout'>)</span> <span class='hs-varop'>&amp;&amp;</span> <span class='hs-varid'>all</span> <span class='hs-varid'>isObject</span> <span class='hs-varid'>unlinked</span>
<a name="line-19"></a>  <span class='hs-keyword'>where</span> <span class='hs-varid'>unlinked</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>linkableUnlinked</span> <span class='hs-varid'>l</span>
<a name="line-20"></a>	<span class='hs-comment'>-- A linkable with no Unlinked's is treated as a BCO.  We can</span>
<a name="line-21"></a>	<span class='hs-comment'>-- generate a linkable with no Unlinked's as a result of</span>
<a name="line-22"></a>	<span class='hs-comment'>-- compiling a module in HscNothing mode, and this choice</span>
<a name="line-23"></a>	<span class='hs-comment'>-- happens to work well with checkStability in module GHC.</span>
<a name="line-24"></a>
<a name="line-25"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>Linkable</span> <span class='hs-keyword'>where</span>
<a name="line-26"></a>   <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>LM</span> <span class='hs-varid'>when_made</span> <span class='hs-varid'>mod</span> <span class='hs-varid'>unlinkeds</span><span class='hs-layout'>)</span>
<a name="line-27"></a>      <span class='hs-keyglyph'>=</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-str'>"LinkableM"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>parens</span> <span class='hs-layout'>(</span><span class='hs-varid'>text</span> <span class='hs-layout'>(</span><span class='hs-varid'>show</span> <span class='hs-varid'>when_made</span><span class='hs-layout'>)</span><span class='hs-layout'>)</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>mod</span><span class='hs-layout'>)</span>
<a name="line-28"></a>        <span class='hs-varop'>$$</span> <span class='hs-varid'>nest</span> <span class='hs-num'>3</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>unlinkeds</span><span class='hs-layout'>)</span>
<a name="line-29"></a>
<a name="line-30"></a><span class='hs-comment'>-------------------------------------------</span>
<a name="line-31"></a>
<a name="line-32"></a><a name="Unlinked"></a><span class='hs-comment'>-- | Objects which have yet to be linked by the compiler</span>
<a name="line-33"></a><a name="Unlinked"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>Unlinked</span>
<a name="line-34"></a>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>DotO</span> <span class='hs-conid'>FilePath</span>      <span class='hs-comment'>-- ^ An object file (.o)</span>
<a name="line-35"></a>   <span class='hs-keyglyph'>|</span> <span class='hs-conid'>DotA</span> <span class='hs-conid'>FilePath</span>      <span class='hs-comment'>-- ^ Static archive file (.a)</span>
<a name="line-36"></a>   <span class='hs-keyglyph'>|</span> <span class='hs-conid'>DotDLL</span> <span class='hs-conid'>FilePath</span>    <span class='hs-comment'>-- ^ Dynamically linked library file (.so, .dll, .dylib)</span>
<a name="line-37"></a>   <span class='hs-keyglyph'>|</span> <span class='hs-conid'>BCOs</span> <span class='hs-conid'>CompiledByteCode</span> <span class='hs-conid'>ModBreaks</span>    <span class='hs-comment'>-- ^ A byte-code object, lives only in memory</span>
<a name="line-38"></a>
<a name="line-39"></a><span class='hs-cpp'>#ifndef GHCI</span>
<a name="line-40"></a><a name="CompiledByteCode"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>CompiledByteCode</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CompiledByteCodeUndefined</span>
<a name="line-41"></a><span class='hs-sel'>_unused</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>CompiledByteCode</span>
<a name="line-42"></a><span class='hs-sel'>_unused</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>CompiledByteCodeUndefined</span>
<a name="line-43"></a><span class='hs-cpp'>#endif</span>
<a name="line-44"></a>
<a name="line-45"></a><span class='hs-keyword'>instance</span> <span class='hs-conid'>Outputable</span> <span class='hs-conid'>Unlinked</span> <span class='hs-keyword'>where</span>
<a name="line-46"></a>   <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>DotO</span> <span class='hs-varid'>path</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-str'>"DotO"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>text</span> <span class='hs-varid'>path</span>
<a name="line-47"></a>   <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>DotA</span> <span class='hs-varid'>path</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-str'>"DotA"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>text</span> <span class='hs-varid'>path</span>
<a name="line-48"></a>   <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>DotDLL</span> <span class='hs-varid'>path</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-str'>"DotDLL"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>text</span> <span class='hs-varid'>path</span>
<a name="line-49"></a><span class='hs-cpp'>#ifdef GHCI</span>
<a name="line-50"></a>   <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>BCOs</span> <span class='hs-varid'>bcos</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-str'>"BCOs"</span> <span class='hs-varop'>&lt;+&gt;</span> <span class='hs-varid'>ppr</span> <span class='hs-varid'>bcos</span>
<a name="line-51"></a><span class='hs-cpp'>#else</span>
<a name="line-52"></a>   <span class='hs-varid'>ppr</span> <span class='hs-layout'>(</span><span class='hs-conid'>BCOs</span> <span class='hs-keyword'>_</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>    <span class='hs-keyglyph'>=</span> <span class='hs-varid'>text</span> <span class='hs-str'>"No byte code"</span>
<a name="line-53"></a><span class='hs-cpp'>#endif</span>
<a name="line-54"></a>
<a name="line-55"></a><a name="isObject"></a><span class='hs-comment'>-- | Is this an actual file on disk we can link in somehow?</span>
<a name="line-56"></a><span class='hs-definition'>isObject</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Unlinked</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-57"></a><span class='hs-definition'>isObject</span> <span class='hs-layout'>(</span><span class='hs-conid'>DotO</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-58"></a><span class='hs-definition'>isObject</span> <span class='hs-layout'>(</span><span class='hs-conid'>DotA</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-59"></a><span class='hs-definition'>isObject</span> <span class='hs-layout'>(</span><span class='hs-conid'>DotDLL</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>True</span>
<a name="line-60"></a><span class='hs-definition'>isObject</span> <span class='hs-keyword'>_</span>          <span class='hs-keyglyph'>=</span> <span class='hs-conid'>False</span>
<a name="line-61"></a>
<a name="line-62"></a><a name="isInterpretable"></a><span class='hs-comment'>-- | Is this a bytecode linkable with no file on disk?</span>
<a name="line-63"></a><span class='hs-definition'>isInterpretable</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Unlinked</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>Bool</span>
<a name="line-64"></a><span class='hs-definition'>isInterpretable</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>not</span> <span class='hs-varop'>.</span> <span class='hs-varid'>isObject</span>
<a name="line-65"></a>
<a name="line-66"></a><a name="nameOfObject"></a><span class='hs-comment'>-- | Retrieve the filename of the linkable if possible. Panic if it is a byte-code object</span>
<a name="line-67"></a><span class='hs-definition'>nameOfObject</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Unlinked</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>FilePath</span>
<a name="line-68"></a><span class='hs-definition'>nameOfObject</span> <span class='hs-layout'>(</span><span class='hs-conid'>DotO</span> <span class='hs-varid'>fn</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fn</span>
<a name="line-69"></a><span class='hs-definition'>nameOfObject</span> <span class='hs-layout'>(</span><span class='hs-conid'>DotA</span> <span class='hs-varid'>fn</span><span class='hs-layout'>)</span>   <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fn</span>
<a name="line-70"></a><span class='hs-definition'>nameOfObject</span> <span class='hs-layout'>(</span><span class='hs-conid'>DotDLL</span> <span class='hs-varid'>fn</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>fn</span>
<a name="line-71"></a><span class='hs-definition'>nameOfObject</span> <span class='hs-varid'>other</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"nameOfObject"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>other</span><span class='hs-layout'>)</span>
<a name="line-72"></a>
<a name="line-73"></a><a name="byteCodeOfObject"></a><span class='hs-comment'>-- | Retrieve the compiled byte-code if possible. Panic if it is a file-based linkable</span>
<a name="line-74"></a><span class='hs-definition'>byteCodeOfObject</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>Unlinked</span> <span class='hs-keyglyph'>-&gt;</span> <span class='hs-conid'>CompiledByteCode</span>
<a name="line-75"></a><span class='hs-definition'>byteCodeOfObject</span> <span class='hs-layout'>(</span><span class='hs-conid'>BCOs</span> <span class='hs-varid'>bc</span> <span class='hs-keyword'>_</span><span class='hs-layout'>)</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>bc</span>
<a name="line-76"></a><span class='hs-definition'>byteCodeOfObject</span> <span class='hs-varid'>other</span>       <span class='hs-keyglyph'>=</span> <span class='hs-varid'>pprPanic</span> <span class='hs-str'>"byteCodeOfObject"</span> <span class='hs-layout'>(</span><span class='hs-varid'>ppr</span> <span class='hs-varid'>other</span><span class='hs-layout'>)</span>
</pre>\end{code}

%************************************************************************
%*                                                                      *
\subsection{Breakpoint Support}
%*                                                                      *
%************************************************************************

\begin{code}
<pre><a name="line-1"></a><a name="BreakIndex"></a><span class='hs-comment'>-- | Breakpoint index</span>
<a name="line-2"></a><a name="BreakIndex"></a><span class='hs-keyword'>type</span> <span class='hs-conid'>BreakIndex</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>Int</span>
<a name="line-3"></a>
<a name="line-4"></a><a name="ModBreaks"></a><span class='hs-comment'>-- | All the information about the breakpoints for a given module</span>
<a name="line-5"></a><a name="ModBreaks"></a><span class='hs-keyword'>data</span> <span class='hs-conid'>ModBreaks</span>
<a name="line-6"></a>   <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ModBreaks</span>
<a name="line-7"></a>   <span class='hs-layout'>{</span> <span class='hs-varid'>modBreaks_flags</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>BreakArray</span>
<a name="line-8"></a>        <span class='hs-comment'>-- ^ The array of flags, one per breakpoint, </span>
<a name="line-9"></a>        <span class='hs-comment'>-- indicating which breakpoints are enabled.</span>
<a name="line-10"></a>   <span class='hs-layout'>,</span> <span class='hs-varid'>modBreaks_locs</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-layout'>(</span><span class='hs-conid'>Array</span> <span class='hs-conid'>BreakIndex</span> <span class='hs-conid'>SrcSpan</span><span class='hs-layout'>)</span>
<a name="line-11"></a>        <span class='hs-comment'>-- ^ An array giving the source span of each breakpoint.</span>
<a name="line-12"></a>   <span class='hs-layout'>,</span> <span class='hs-varid'>modBreaks_vars</span> <span class='hs-keyglyph'>::</span> <span class='hs-varop'>!</span><span class='hs-layout'>(</span><span class='hs-conid'>Array</span> <span class='hs-conid'>BreakIndex</span> <span class='hs-keyglyph'>[</span><span class='hs-conid'>OccName</span><span class='hs-keyglyph'>]</span><span class='hs-layout'>)</span>
<a name="line-13"></a>        <span class='hs-comment'>-- ^ An array giving the names of the free variables at each breakpoint.</span>
<a name="line-14"></a>   <span class='hs-layout'>}</span>
<a name="line-15"></a>
<a name="line-16"></a><a name="emptyModBreaks"></a><span class='hs-definition'>emptyModBreaks</span> <span class='hs-keyglyph'>::</span> <span class='hs-conid'>ModBreaks</span>
<a name="line-17"></a><span class='hs-definition'>emptyModBreaks</span> <span class='hs-keyglyph'>=</span> <span class='hs-conid'>ModBreaks</span>
<a name="line-18"></a>   <span class='hs-layout'>{</span> <span class='hs-varid'>modBreaks_flags</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>error</span> <span class='hs-str'>"ModBreaks.modBreaks_array not initialised"</span>
<a name="line-19"></a>         <span class='hs-comment'>-- Todo: can we avoid this? </span>
<a name="line-20"></a>   <span class='hs-layout'>,</span> <span class='hs-varid'>modBreaks_locs</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>array</span> <span class='hs-layout'>(</span><span class='hs-num'>0</span><span class='hs-layout'>,</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-conid'>[]</span>
<a name="line-21"></a>   <span class='hs-layout'>,</span> <span class='hs-varid'>modBreaks_vars</span> <span class='hs-keyglyph'>=</span> <span class='hs-varid'>array</span> <span class='hs-layout'>(</span><span class='hs-num'>0</span><span class='hs-layout'>,</span><span class='hs-comment'>-</span><span class='hs-num'>1</span><span class='hs-layout'>)</span> <span class='hs-conid'>[]</span>
<a name="line-22"></a>   <span class='hs-layout'>}</span>
</pre>\end{code}
</body>
</html>