summaryrefslogtreecommitdiff
path: root/ghc/compiler/deSugar/Desugar.lhs
diff options
context:
space:
mode:
authorsimonpj <unknown>2000-11-16 14:43:06 +0000
committersimonpj <unknown>2000-11-16 14:43:06 +0000
commit490cba33825083f8e785aeb35b5ac1667fc3954b (patch)
tree31772e378d2d5e47af6e12ada7a23e760d79ea81 /ghc/compiler/deSugar/Desugar.lhs
parent9e9d8b056fb2342e5c0f9f67b94d0667814cb6b6 (diff)
downloadhaskell-490cba33825083f8e785aeb35b5ac1667fc3954b.tar.gz
[project @ 2000-11-16 14:43:05 by simonpj]
Add stuff to support hscExpr
Diffstat (limited to 'ghc/compiler/deSugar/Desugar.lhs')
-rw-r--r--ghc/compiler/deSugar/Desugar.lhs61
1 files changed, 50 insertions, 11 deletions
diff --git a/ghc/compiler/deSugar/Desugar.lhs b/ghc/compiler/deSugar/Desugar.lhs
index 49f8939bbd..fb217653b9 100644
--- a/ghc/compiler/deSugar/Desugar.lhs
+++ b/ghc/compiler/deSugar/Desugar.lhs
@@ -4,18 +4,18 @@
\section[Desugar]{@deSugar@: the main function}
\begin{code}
-module Desugar ( deSugar ) where
+module Desugar ( deSugar, deSugarExpr ) where
#include "HsVersions.h"
import CmdLineOpts ( DynFlags, DynFlag(..), dopt, opt_SccProfilingOn )
import HsSyn ( MonoBinds, RuleDecl(..), RuleBndr(..),
HsExpr(..), HsBinds(..), MonoBinds(..) )
-import TcHsSyn ( TypecheckedRuleDecl )
+import TcHsSyn ( TypecheckedRuleDecl, TypecheckedHsExpr )
import TcModule ( TcResults(..) )
import Id ( Id )
import CoreSyn
-import PprCore ( pprIdCoreRule )
+import PprCore ( pprIdCoreRule, pprCoreExpr )
import Subst ( substExpr, mkSubst, mkInScopeSet )
import DsMonad
import DsExpr ( dsExpr )
@@ -25,6 +25,7 @@ import DsExpr () -- Forces DsExpr to be compiled; DsBinds only
-- depends on DsExpr.hi-boot.
import Module ( Module )
import Id ( Id )
+import Name ( lookupNameEnv )
import VarEnv
import VarSet
import Bag ( isEmptyBag )
@@ -32,7 +33,7 @@ import CoreLint ( showPass, endPass )
import ErrUtils ( doIfSet, pprBagOfWarnings )
import Outputable
import UniqSupply ( mkSplitUniqSupply )
-import HscTypes ( HomeSymbolTable )
+import HscTypes ( HomeSymbolTable, PersistentCompilerState(..), TyThing(..), lookupType, )
\end{code}
%************************************************************************
@@ -46,14 +47,13 @@ start.
\begin{code}
deSugar :: DynFlags
+ -> PersistentCompilerState -> HomeSymbolTable
-> Module -> PrintUnqualified
- -> HomeSymbolTable
-> TcResults
-> IO ([CoreBind], [(Id,CoreRule)], SDoc, SDoc, [CoreBndr])
-deSugar dflags mod_name unqual hst
- (TcResults {tc_env = global_val_env,
- tc_pcs = pcs,
+deSugar dflags pcs hst mod_name unqual
+ (TcResults {tc_env = local_type_env,
tc_binds = all_binds,
tc_rules = rules,
tc_fords = fo_decls})
@@ -61,7 +61,7 @@ deSugar dflags mod_name unqual hst
; us <- mkSplitUniqSupply 'd'
-- Do desugaring
- ; let (result, ds_warns) = initDs dflags us (hst,pcs,global_val_env) mod_name
+ ; let (result, ds_warns) = initDs dflags us lookup mod_name
(dsProgram mod_name all_binds rules fo_decls)
(ds_binds, ds_rules, _, _, _) = result
@@ -79,8 +79,47 @@ deSugar dflags mod_name unqual hst
; return result
}
--- deSugarExpr dflags unqual hst tc_expr
--- = do {
+ where
+ -- The lookup function passed to initDs is used for well-known Ids,
+ -- such as fold, build, cons etc, so the chances are
+ -- it'll be found in the package symbol table. That's
+ -- why we don't merge all these tables
+ pte = pcs_PTE pcs
+ lookup n = case lookupType hst pte n of {
+ Just (AnId v) -> v ;
+ other ->
+ case lookupNameEnv local_type_env n of
+ Just (AnId v) -> v ;
+ other -> pprPanic "Desugar: lookup:" (ppr n)
+ }
+
+deSugarExpr :: DynFlags
+ -> PersistentCompilerState -> HomeSymbolTable
+ -> Module -> PrintUnqualified
+ -> TypecheckedHsExpr
+ -> IO CoreExpr
+deSugarExpr dflags pcs hst mod_name unqual tc_expr
+ = do { showPass dflags "Desugar"
+ ; us <- mkSplitUniqSupply 'd'
+
+ -- Do desugaring
+ ; let (core_expr, ds_warns) = initDs dflags us lookup mod_name (dsExpr tc_expr)
+
+ -- Display any warnings
+ ; doIfSet (not (isEmptyBag ds_warns))
+ (printErrs unqual (pprBagOfWarnings ds_warns))
+
+ -- Dump output
+ ; let do_dump_ds = dopt Opt_D_dump_ds dflags
+ ; doIfSet do_dump_ds (printDump (pprCoreExpr core_expr))
+
+ ; return core_expr
+ }
+ where
+ pte = pcs_PTE pcs
+ lookup n = case lookupType hst pte n of
+ Just (AnId v) -> v
+ other -> pprPanic "Desugar: lookup:" (ppr n)
dsProgram mod_name all_binds rules fo_decls
= dsMonoBinds auto_scc all_binds [] `thenDs` \ core_prs ->