@@ -7,7 +7,7 @@ import Control.Monad.State (evalState, State, get, put)
77import Data.Char (isLower,isDigit)
88import qualified Data.Map as Map
99import Unique
10−import SourceSyntax.Location
10+import SourceSyntax.Location as Loc
1111import SourceSyntax.Pattern
1212import SourceSyntax.Expression
1313import SourceSyntax.Declaration hiding (Assoc(..))
@@ -30,17 +30,17 @@ class Rename a where
3030 rename :: Env -> a -> Unique a
3131
3232instance Rename (Module t v) where
33− rename env (Module name ex im stmts) = do stmts' <- renameStmts env stmts
34− return (Module name ex im stmts')
33+ rename env (Module name ex im decls) = do decls' <- renameDecls env decls
34+ return (Module name ex im decls')
3535
3636instance Rename (Def t v) where
37− rename env (OpDef op a1 a2 e) =
38− do env' <- extends env [a1,a2]
39− OpDef op (replace env' a1) (replace env' a2) `liftM` rename env' e
40− rename env (FnDef f args e) =
41− do env' <- extends env args
42− FnDef (replace env f) (map (replace env') args) `liftM` rename env' e
43− rename env (TypeAnnotation n t) = return (TypeAnnotation (replace env n) t)
37+ rename env def =
38+ case def of
39+ Def p e ->
40+ do (p', e', _) <- patternRename env (p,e)
41+ return (Def p' e')
42+ TypeAnnotation n t ->
43+ return (TypeAnnotation (replace env n) t)
4444
4545
4646instance Rename (Declaration t v) where
@@ -56,10 +56,11 @@ instance Rename (Declaration t v) where
5656 ExportEvent js elm tipe ->
5757 return $ ExportEvent js (replace env elm) tipe
5858
59−renameStmts env stmts = do env' <- extends env $ concatMap getNames stmts
60− mapM (rename env') stmts
59+renameDecls env decls =
60+ do env' <- extends env $ concatMap getNames decls
61+ mapM (rename env') decls
6162 where getNames stmt = case stmt of
62− Definition (FnDef n _ _) -> [n]
63+ --Definition (Def n _) -> [n]
6364 Datatype _ _ tcs -> map fst tcs
6465 ImportEvent _ _ n _ -> [n]
6566 _ -> []
@@ -87,10 +88,8 @@ instance Rename (Expr t v) where
8788 `ap` mapM (\(x,e) -> (,) x `liftM` rnm e) fs
8889
8990 Record fs -> Record `liftM` mapM frnm fs
90− where frnm (f,as,e) = do
91− env' <- extends env as
92− e' <- rename env' e
93− return (f, map (replace env') as, e')
91+ where
92+ frnm (f,e) = (,) f `liftM` rename env e
9493
9594 Binop op@(h:_) e1 e2 ->
9695 let rop = if isLower h || '_' == h
@@ -99,9 +98,9 @@ instance Rename (Expr t v) where
9998 in Binop rop `liftM` rnm e1
10099 `ap` rnm e2
101100
102− Lambda x e -> do
103− (rx, env') <- extend env x
104− Lambda rx `liftM` rename env' e
101+ Lambda pattern e -> do
102+ (pattern', env') <- patternExtend env pattern
103+ Lambda pattern' `liftM` rename env' e
105104
106105 App e1 e2 -> App `liftM` rnm e1
107106 `ap` rnm e2
@@ -119,7 +118,9 @@ instance Rename (Expr t v) where
119118 ExplicitList es -> ExplicitList `liftM` mapM rnm es
120119
121120 Case e cases -> Case `liftM` rnm e
122− `ap` mapM (patternRename env) cases
121+ `ap` mapM (liftM drop3rd . patternRename env) cases
122+ where
123+ drop3rd (a,b,c) = (a,b)
123124
124125 _ -> return expr
125126
@@ -134,31 +135,36 @@ extend env x = do
134135extends :: Env -> [String] -> Unique Env
135136extends env xs = foldM (\e x -> liftM snd $ extend e x) env xs
136137
137−patternExtend :: Pattern -> Env -> Unique (Pattern, Env)
138−patternExtend pattern env =
138+patternExtend :: Env -> Pattern -> Unique (Pattern, Env)
139+patternExtend env pattern =
139140 case pattern of
140141 PLiteral _ -> return (pattern, env)
141142 PAnything -> return (pattern, env)
142143 PVar x -> first PVar `liftM` extend env x
143144 PAlias x p -> do
144145 (x', env') <- extend env x
145− (p', env'') <- patternExtend p env'
146+ (p', env'') <- patternExtend env' p
146147 return (PAlias x' p', env'')
147148 PData name ps ->
148149 first (PData name . reverse) `liftM` foldM f ([], env) ps
149− where f (rps,env') p = do (rp,env'') <- patternExtend p env'
150+ where f (rps,env') p = do (rp,env'') <- patternExtend env' p
150151 return (rp:rps, env'')
151152 PRecord fs ->
152153 return (pattern, Map.union (Map.fromList $ map (\f -> (f,f)) fs) env)
153154
154−patternRename :: Env -> (Pattern, LExpr t v) -> Unique (Pattern, LExpr t v)
155−patternRename env (p,e) = do
156− (rp,env') <- patternExtend p env
157− re <- rename env' e
158− return (rp,re)
159−
160−renameLet env defs e = do env' <- extends env $ concatMap getNames defs
161− defs' <- mapM (rename env') defs
162− Let defs' `liftM` rename env' e
163− where getNames (FnDef n _ _) = [n]
164− getNames _ = []
155+patternRename :: Env -> (Pattern, LExpr t v) -> Unique (Pattern, LExpr t v, Env)
156+patternRename env (pattern,expr) = do
157+ (pattern',env') <- patternExtend env pattern
158+ expr' <- rename env' expr
159+ return (pattern', expr', env')
160+
161+renameLet env defs e =
162+ do (env', ps') <- foldM addPattern (env, []) (map fst defPairs)
163+ bodies <- mapM (rename env') (map snd defPairs)
164+ Let (zipWith Def ps' bodies) `liftM` rename env' e
165+ where
166+ defPairs = map (\(Def p e) -> (p,e)) defs
167+
168+ addPattern (env,ps) pattern =
169+ do (pattern', _, env') <- patternRename env (pattern, Loc.none (Var ""))
170+ return (env', pattern' : ps)