summaryrefslogtreecommitdiff
path: root/ghc/compiler/rename/RenameExpr4.lhs
diff options
context:
space:
mode:
Diffstat (limited to 'ghc/compiler/rename/RenameExpr4.lhs')
-rw-r--r--ghc/compiler/rename/RenameExpr4.lhs431
1 files changed, 431 insertions, 0 deletions
diff --git a/ghc/compiler/rename/RenameExpr4.lhs b/ghc/compiler/rename/RenameExpr4.lhs
new file mode 100644
index 0000000000..34c702e8b6
--- /dev/null
+++ b/ghc/compiler/rename/RenameExpr4.lhs
@@ -0,0 +1,431 @@
+%
+% (c) The GRASP/AQUA Project, Glasgow University, 1992-1994
+%
+\section[RenameExpr]{Renaming of expressions}
+
+Basically dependency analysis.
+
+Handles @Match@, @GRHSsAndBinds@, @Expr@, and @Qual@ datatypes. In
+general, all of these functions return a renamed thing, and a set of
+free variables.
+
+\begin{code}
+#include "HsVersions.h"
+
+module RenameExpr4 (
+ rnMatch4, rnGRHSsAndBinds4, rnPat4,
+
+ -- and to make the interface self-sufficient...
+ Bag, GRHSsAndBinds, InPat, Name, Maybe,
+ ProtoName, GlobalNameFun(..), UniqSet(..), UniqFM, SrcLoc,
+ Unique, SplitUniqSupply,
+ Pretty(..), PprStyle, PrettyRep
+ ) where
+
+import AbsSyn
+import NameTypes ( FullName )
+import Outputable
+import ProtoName ( ProtoName(..) )
+import Rename4 ( rnPolyType4 )
+import RenameAuxFuns ( GlobalNameFuns(..) ) -- ToDo: rm this line
+import RenameBinds4 ( rnBinds4, FreeVars(..) )
+import RenameMonad4
+import UniqSet
+import Util
+\end{code}
+
+
+*********************************************************
+* *
+\subsection{Patterns}
+* *
+*********************************************************
+
+\begin{code}
+rnPat4 :: ProtoNamePat -> Rn4M RenamedPat
+
+rnPat4 WildPatIn = returnRn4 WildPatIn
+
+rnPat4 (VarPatIn name)
+ = lookupValue name `thenRn4` \ vname ->
+ returnRn4 (VarPatIn vname)
+
+rnPat4 (LitPatIn n) = returnRn4 (LitPatIn n)
+
+rnPat4 (LazyPatIn pat)
+ = rnPat4 pat `thenRn4` \ pat' ->
+ returnRn4 (LazyPatIn pat')
+
+rnPat4 (AsPatIn name pat)
+ = rnPat4 pat `thenRn4` \ pat' ->
+ lookupValue name `thenRn4` \ vname ->
+ returnRn4 (AsPatIn vname pat')
+
+rnPat4 (ConPatIn name pats)
+ = lookupValue name `thenRn4` \ name' ->
+ mapRn4 rnPat4 pats `thenRn4` \ patslist ->
+ returnRn4 (ConPatIn name' patslist)
+
+rnPat4 (ConOpPatIn pat1 name pat2)
+ = lookupValue name `thenRn4` \ name' ->
+ rnPat4 pat1 `thenRn4` \ pat1' ->
+ rnPat4 pat2 `thenRn4` \ pat2' ->
+ returnRn4 (ConOpPatIn pat1' name' pat2')
+
+rnPat4 (ListPatIn pats)
+ = mapRn4 rnPat4 pats `thenRn4` \ patslist ->
+ returnRn4 (ListPatIn patslist)
+
+rnPat4 (TuplePatIn pats)
+ = mapRn4 rnPat4 pats `thenRn4` \ patslist ->
+ returnRn4 (TuplePatIn patslist)
+
+rnPat4 (NPlusKPatIn name lit)
+ = lookupValue name `thenRn4` \ vname ->
+ returnRn4 (NPlusKPatIn vname lit)
+
+#ifdef DPH
+rnPat4 (ProcessorPatIn pats pat)
+ = mapRn4 rnPat4 pats `thenRn4` \ pats' ->
+ rnPat4 pat `thenRn4` \ pat' ->
+ returnRn4 (ProcessorPatIn pats' pat')
+#endif {- Data Parallel Haskell -}
+\end{code}
+
+************************************************************************
+* *
+\subsection{Match}
+* *
+************************************************************************
+
+\begin{code}
+rnMatch4 :: ProtoNameMatch -> Rn4M (RenamedMatch, FreeVars)
+
+rnMatch4 match
+ = getSrcLocRn4 `thenRn4` \ src_loc ->
+ namesFromProtoNames "variable in pattern"
+ (binders `zip` repeat src_loc) `thenRn4` \ new_binders ->
+ extendSS2 new_binders (rnMatch4_aux match)
+ where
+ binders = collect_binders match
+
+ collect_binders :: ProtoNameMatch -> [ProtoName]
+
+ collect_binders (GRHSMatch _) = []
+ collect_binders (PatMatch pat match)
+ = collectPatBinders pat ++ collect_binders match
+
+rnMatch4_aux (PatMatch pat match)
+ = rnPat4 pat `thenRn4` \ pat' ->
+ rnMatch4_aux match `thenRn4` \ (match', fvMatch) ->
+ returnRn4 (PatMatch pat' match', fvMatch)
+
+rnMatch4_aux (GRHSMatch grhss_and_binds)
+ = rnGRHSsAndBinds4 grhss_and_binds `thenRn4` \ (grhss_and_binds', fvs) ->
+ returnRn4 (GRHSMatch grhss_and_binds', fvs)
+\end{code}
+
+%************************************************************************
+%* *
+\subsubsection[dep-GRHSs]{Guarded right-hand sides (GRHSsAndBinds)}
+%* *
+%************************************************************************
+
+\begin{code}
+rnGRHSsAndBinds4 :: ProtoNameGRHSsAndBinds -> Rn4M (RenamedGRHSsAndBinds, FreeVars)
+
+rnGRHSsAndBinds4 (GRHSsAndBindsIn grhss binds)
+ = rnBinds4 binds `thenRn4` \ (binds', fvBinds, scope) ->
+ extendSS2 scope (rnGRHSs4 grhss) `thenRn4` \ (grhss', fvGRHS) ->
+ returnRn4 (GRHSsAndBindsIn grhss' binds', fvBinds `unionUniqSets` fvGRHS)
+ where
+ rnGRHSs4 [] = returnRn4 ([], emptyUniqSet)
+
+ rnGRHSs4 (grhs:grhss)
+ = rnGRHS4 grhs `thenRn4` \ (grhs', fvs) ->
+ rnGRHSs4 grhss `thenRn4` \ (grhss', fvss) ->
+ returnRn4 (grhs' : grhss', fvs `unionUniqSets` fvss)
+
+ rnGRHS4 (GRHS guard expr locn)
+ = pushSrcLocRn4 locn (
+ rnExpr4 guard `thenRn4` \ (guard', fvsg) ->
+ rnExpr4 expr `thenRn4` \ (expr', fvse) ->
+ returnRn4 (GRHS guard' expr' locn, fvsg `unionUniqSets` fvse)
+ )
+
+ rnGRHS4 (OtherwiseGRHS expr locn)
+ = pushSrcLocRn4 locn (
+ rnExpr4 expr `thenRn4` \ (expr', fvs) ->
+ returnRn4 (OtherwiseGRHS expr' locn, fvs)
+ )
+\end{code}
+
+%************************************************************************
+%* *
+\subsubsection[dep-Expr]{Expressions}
+%* *
+%************************************************************************
+
+\begin{code}
+rnExprs4 :: [ProtoNameExpr] -> Rn4M ([RenamedExpr], FreeVars)
+
+rnExprs4 [] = returnRn4 ([], emptyUniqSet)
+
+rnExprs4 (expr:exprs)
+ = rnExpr4 expr `thenRn4` \ (expr', fvExpr) ->
+ rnExprs4 exprs `thenRn4` \ (exprs', fvExprs) ->
+ returnRn4 (expr':exprs', fvExpr `unionUniqSets` fvExprs)
+\end{code}
+
+Variables. We look up the variable and return the resulting name. The
+interesting question is what the free-variable set should be. We
+don't want to return imported or prelude things as free vars. So we
+look at the Name returned from the lookup, and make it part of the
+free-var set iff:
+\begin{itemize}
+\item
+if it's a @Short@,
+\item
+or it's an @OtherTopId@ and it's defined in this module
+(this includes locally-defined constructrs, but that's too bad)
+\end{itemize}
+
+\begin{code}
+rnExpr4 :: ProtoNameExpr -> Rn4M (RenamedExpr, FreeVars)
+
+rnExpr4 (Var v)
+ = lookupValue v `thenRn4` \ vname ->
+ returnRn4 (Var vname, fv_set vname)
+ where
+ fv_set n@(Short uniq sname) = singletonUniqSet n
+ fv_set n@(OtherTopId uniq fname)
+ | isLocallyDefined fname
+ && not (isConop (getOccurrenceName fname))
+ = singletonUniqSet n
+ fv_set other = emptyUniqSet
+
+rnExpr4 (Lit lit) = returnRn4 (Lit lit, emptyUniqSet)
+
+rnExpr4 (Lam match)
+ = rnMatch4 match `thenRn4` \ (match', fvMatch) ->
+ returnRn4 (Lam match', fvMatch)
+
+rnExpr4 (App fun arg)
+ = rnExpr4 fun `thenRn4` \ (fun',fvFun) ->
+ rnExpr4 arg `thenRn4` \ (arg',fvArg) ->
+ returnRn4 (App fun' arg', fvFun `unionUniqSets` fvArg)
+
+rnExpr4 (OpApp e1 op e2)
+ = rnExpr4 e1 `thenRn4` \ (e1', fvs_e1) ->
+ rnExpr4 op `thenRn4` \ (op', fvs_op) ->
+ rnExpr4 e2 `thenRn4` \ (e2', fvs_e2) ->
+ returnRn4 (OpApp e1' op' e2', (fvs_op `unionUniqSets` fvs_e1) `unionUniqSets` fvs_e2)
+
+rnExpr4 (SectionL expr op)
+ = rnExpr4 expr `thenRn4` \ (expr', fvs_expr) ->
+ rnExpr4 op `thenRn4` \ (op', fvs_op) ->
+ returnRn4 (SectionL expr' op', fvs_op `unionUniqSets` fvs_expr)
+
+rnExpr4 (SectionR op expr)
+ = rnExpr4 op `thenRn4` \ (op', fvs_op) ->
+ rnExpr4 expr `thenRn4` \ (expr', fvs_expr) ->
+ returnRn4 (SectionR op' expr', fvs_op `unionUniqSets` fvs_expr)
+
+rnExpr4 (CCall fun args may_gc is_casm fake_result_ty)
+ = rnExprs4 args `thenRn4` \ (args', fvs_args) ->
+ returnRn4 (CCall fun args' may_gc is_casm fake_result_ty, fvs_args)
+
+rnExpr4 (SCC label expr)
+ = rnExpr4 expr `thenRn4` \ (expr', fvs_expr) ->
+ returnRn4 (SCC label expr', fvs_expr)
+
+rnExpr4 (Case expr ms)
+ = rnExpr4 expr `thenRn4` \ (new_expr, e_fvs) ->
+ mapAndUnzipRn4 rnMatch4 ms `thenRn4` \ (new_ms, ms_fvs) ->
+ returnRn4 (Case new_expr new_ms, unionManyUniqSets (e_fvs : ms_fvs))
+
+rnExpr4 (ListComp expr quals)
+ = rnQuals4 quals `thenRn4` \ ((quals', qual_binders), fvQuals) ->
+ extendSS2 qual_binders (rnExpr4 expr) `thenRn4` \ (expr', fvExpr) ->
+ returnRn4 (ListComp expr' quals', fvExpr `unionUniqSets` fvQuals)
+
+rnExpr4 (Let binds expr)
+ = rnBinds4 binds `thenRn4` \ (binds', fvBinds, new_binders) ->
+ extendSS2 new_binders (rnExpr4 expr) `thenRn4` \ (expr',fvExpr) ->
+ returnRn4 (Let binds' expr', fvBinds `unionUniqSets` fvExpr)
+
+rnExpr4 (ExplicitList exps)
+ = rnExprs4 exps `thenRn4` \ (exps', fvs) ->
+ returnRn4 (ExplicitList exps', fvs)
+
+rnExpr4 (ExplicitTuple exps)
+ = rnExprs4 exps `thenRn4` \ (exps', fvExps) ->
+ returnRn4 (ExplicitTuple exps', fvExps)
+
+rnExpr4 (ExprWithTySig expr pty)
+ = rnExpr4 expr `thenRn4` \ (expr', fvExpr) ->
+ rnPolyType4 False True nullTyVarNamesEnv pty `thenRn4` \ pty' ->
+ returnRn4 (ExprWithTySig expr' pty', fvExpr)
+
+rnExpr4 (If p b1 b2)
+ = rnExpr4 p `thenRn4` \ (p', fvP) ->
+ rnExpr4 b1 `thenRn4` \ (b1', fvB1) ->
+ rnExpr4 b2 `thenRn4` \ (b2', fvB2) ->
+ returnRn4 (If p' b1' b2', unionManyUniqSets [fvP, fvB1, fvB2])
+
+rnExpr4 (ArithSeqIn seq)
+ = rn_seq seq `thenRn4` \ (new_seq, fvs) ->
+ returnRn4 (ArithSeqIn new_seq, fvs)
+ where
+ rn_seq (From expr)
+ = rnExpr4 expr `thenRn4` \ (expr', fvExpr) ->
+ returnRn4 (From expr', fvExpr)
+
+ rn_seq (FromThen expr1 expr2)
+ = rnExpr4 expr1 `thenRn4` \ (expr1', fvExpr1) ->
+ rnExpr4 expr2 `thenRn4` \ (expr2', fvExpr2) ->
+ returnRn4 (FromThen expr1' expr2', fvExpr1 `unionUniqSets` fvExpr2)
+
+ rn_seq (FromTo expr1 expr2)
+ = rnExpr4 expr1 `thenRn4` \ (expr1', fvExpr1) ->
+ rnExpr4 expr2 `thenRn4` \ (expr2', fvExpr2) ->
+ returnRn4 (FromTo expr1' expr2', fvExpr1 `unionUniqSets` fvExpr2)
+
+ rn_seq (FromThenTo expr1 expr2 expr3)
+ = rnExpr4 expr1 `thenRn4` \ (expr1', fvExpr1) ->
+ rnExpr4 expr2 `thenRn4` \ (expr2', fvExpr2) ->
+ rnExpr4 expr3 `thenRn4` \ (expr3', fvExpr3) ->
+ returnRn4 (FromThenTo expr1' expr2' expr3',
+ unionManyUniqSets [fvExpr1, fvExpr2, fvExpr3])
+
+#ifdef DPH
+rnExpr4 (ParallelZF expr quals)
+ = rnParQuals4 quals `thenRn4` \ ((quals',binds),fvQuals)->
+ extendSS2 binds
+ (rnExpr4 expr) `thenRn4` \ (expr', fvExpr ) ->
+ returnRn4 (ParallelZF expr' quals' , fvExpr `unionUniqSets` fvQuals)
+
+rnExpr4 (ExplicitProcessor exprs expr)
+ = rnExprs4 exprs `thenRn4` \ (exprs',fvExprs) ->
+ rnExpr4 expr `thenRn4` \ (expr' ,fvExpr) ->
+ returnRn4 (ExplicitProcessor exprs' expr',fvExprs `unionUniqSets` fvExpr)
+
+rnExpr4 (ExplicitPodIn exprs)
+ = rnExprs4 exprs `thenRn4` \ (exprs',fvExprs) ->
+ returnRn4 (ExplicitPodIn exprs',fvExprs)
+
+-- ExplicitPodOut : not in ProtoNameExprs (pops out of typechecker :-)
+
+#endif {- Data Parallel Haskell -}
+
+-- ArithSeqOut: not in ProtoNameExprs
+\end{code}
+
+%************************************************************************
+%* *
+\subsubsection[dep-Quals]{@Qual@s: in list comprehensions}
+%* *
+%************************************************************************
+
+Note that although some bound vars may appear in the free var set for
+the first qual, these will eventually be removed by the caller. For
+example, if we have @[p | r <- s, q <- r, p <- q]@, when doing
+@(AndQuals (q <- r) (p <- q))@, the free var set for @(q <- r)@ will
+be @[r]@, and the free var set for the entire Quals will be @[r]@. This
+@r@ will be removed only when we finally return from examining all the
+Quals.
+
+\begin{code}
+rnQuals4 :: [ProtoNameQual] -> Rn4M (([RenamedQual], [Name]), FreeVars)
+
+rnQuals4 [qual]
+ = rnQual4 qual `thenRn4` \ ((new_qual, bs), fvs) ->
+ returnRn4 (([new_qual], bs), fvs)
+
+rnQuals4 (qual: quals)
+ = rnQual4 qual `thenRn4` \ ((qual', bs1), fvQuals1) ->
+ extendSS2 bs1 (rnQuals4 quals) `thenRn4` \ ((quals', bs2), fvQuals2) ->
+ returnRn4
+ ((qual' : quals', bs2 ++ bs1), -- The ones on the right (bs2) shadow the
+ -- ones on the left (bs1)
+ fvQuals1 `unionUniqSets` fvQuals2)
+
+rnQual4 (GeneratorQual pat expr)
+ = rnExpr4 expr `thenRn4` \ (expr', fvExpr) ->
+ let
+ binders = collectPatBinders pat
+ in
+ getSrcLocRn4 `thenRn4` \ src_loc ->
+ namesFromProtoNames "variable in list-comprehension-generator pattern"
+ (binders `zip` repeat src_loc) `thenRn4` \ new_binders ->
+ extendSS new_binders (rnPat4 pat) `thenRn4` \ pat' ->
+
+ returnRn4 ((GeneratorQual pat' expr', new_binders), fvExpr)
+
+rnQual4 (FilterQual expr)
+ = rnExpr4 expr `thenRn4` \ (expr', fvs) ->
+ returnRn4 ((FilterQual expr', []), fvs)
+\end{code}
+
+%************************************************************************
+%* *
+%* Parallel Quals (in Parallel Zf expressions) *
+%* *
+%************************************************************************
+\subsubsection[dep-ParQuals]{ParQuals}
+
+\begin{code}
+#ifdef DPH
+rnPats4 :: [ProtoNamePat] -> Rn4M [RenamedPat]
+rnPats4 [] = returnRn4 []
+rnPats4 (pat:pats)
+ = (rnPat4 pat) `thenRn4` (\ pat' ->
+ (rnPats4 pats) `thenRn4` (\ pats' ->
+ returnRn4 (pat':pats') ))
+
+rnParQuals4 :: ProtoNameParQuals -> Rn4M ((RenamedParQuals, [Name]), FreeVars)
+
+rnParQuals4 (AndParQuals q1 q2)
+ = rnParQuals4 q1 `thenRn4` (\ ((quals1', bs1), fvQuals1) ->
+ extendSS2 bs1 (rnParQuals4 q2)
+ `thenRn4` (\ ((quals2', bs2), fvQuals2) ->
+ returnRn4 ((AndParQuals quals1' quals2', bs2 ++ bs1),
+ fvQuals1 `unionUniqSets` fvQuals2) ))
+
+
+rnParQuals4 (DrawnGenIn pats pat expr)
+ = rnExpr4 expr `thenRn4` (\ (expr', fvExpr) ->
+ let_1_0 (concat (map collectPatBinders pats)) (\ binders1 ->
+ getSrcLocRn4 `thenRn4` (\ src_loc ->
+ namesFromProtoNames "variable in pattern"
+ (binders1 `zip` repeat src_loc)
+ `thenRn4` (\ binders1' ->
+ extendSS binders1' (rnPats4 pats)
+ `thenRn4` (\ pats' ->
+ let_1_0 (collectPatBinders pat) (\ binders2 ->
+ namesFromProtoNames "variable in pattern"
+ (binders2 `zip` repeat src_loc)
+ `thenRn4` (\ binders2' ->
+ extendSS binders2' (rnPat4 pat)
+ `thenRn4` (\ pat' ->
+ returnRn4 ((DrawnGenIn pats' pat' expr' , binders1' ++ binders2'),
+ fvExpr) ))))))))
+
+rnParQuals4 (IndexGen exprs pat expr)
+ = rnExpr4 expr `thenRn4` (\ (expr', fvExpr) ->
+ rnExprs4 exprs `thenRn4` (\ (exprs', fvExprs) ->
+ let_1_0 (collectPatBinders pat) (\ binders ->
+ getSrcLocRn4 `thenRn4` (\ src_loc ->
+ namesFromProtoNames "variable in pattern"
+ (binders `zip` repeat src_loc)
+ `thenRn4` (\ binders' ->
+ extendSS binders' (rnPat4 pat)
+ `thenRn4` (\ pat' ->
+ returnRn4 ((IndexGen exprs' pat' expr' , binders'),
+ fvExpr `unionUniqSets` fvExprs) ))))))
+
+rnParQuals4 (ParFilter expr)
+ = rnExpr4 expr `thenRn4` (\ (expr', fvExpr) ->
+ returnRn4 ((ParFilter expr', []), fvExpr) )
+#endif {- Data Parallel Haskell -}
+\end{code}