@@ -7,7 +7,7 @@ import Control.Monad.State (evalState, State, get, put)
7import Data.Char (isLower,isDigit)
7import Data.Char (isLower,isDigit)
8import qualified Data.Map as Map
8import qualified Data.Map as Map
9import Unique
9import Unique
10−import SourceSyntax.Location
10+import SourceSyntax.Location as Loc
11import SourceSyntax.Pattern
11import SourceSyntax.Pattern
12import SourceSyntax.Expression
12import SourceSyntax.Expression
13import SourceSyntax.Declaration hiding (Assoc(..))
13import SourceSyntax.Declaration hiding (Assoc(..))
@@ -30,17 +30,17 @@ class Rename a where
30 rename :: Env -> a -> Unique a
30 rename :: Env -> a -> Unique a
32instance Rename (Module t v) where
32instance Rename (Module t v) where
33− rename env (Module name ex im stmts) = do stmts' <- renameStmts env stmts
33+ rename env (Module name ex im decls) = do decls' <- renameDecls env decls
34− return (Module name ex im stmts')
34+ return (Module name ex im decls')
36instance Rename (Def t v) where
36instance Rename (Def t v) where
37− rename env (OpDef op a1 a2 e) =
37+ rename env def =
38− do env' <- extends env [a1,a2]
38+ case def of
39− OpDef op (replace env' a1) (replace env' a2) `liftM` rename env' e
39+ Def p e ->
40− rename env (FnDef f args e) =
40+ do (p', e', _) <- patternRename env (p,e)
41− do env' <- extends env args
41+ return (Def p' e')
42− FnDef (replace env f) (map (replace env') args) `liftM` rename env' e
42+ TypeAnnotation n t ->
43− rename env (TypeAnnotation n t) = return (TypeAnnotation (replace env n) t)
43+ return (TypeAnnotation (replace env n) t)
46instance Rename (Declaration t v) where
46instance Rename (Declaration t v) where
@@ -56,10 +56,11 @@ instance Rename (Declaration t v) where
56 ExportEvent js elm tipe ->
56 ExportEvent js elm tipe ->
57 return $ ExportEvent js (replace env elm) tipe
57 return $ ExportEvent js (replace env elm) tipe
59+renameDecls env decls =
59−renameStmts env stmts = do env' <- extends env $ concatMap getNames stmts
60+ do env' <- extends env $ concatMap getNames decls
60− mapM (rename env') stmts
61+ mapM (rename env') decls
61 where getNames stmt = case stmt of
62 where getNames stmt = case stmt of
62− Definition (FnDef n _ _) -> [n]
63+ --Definition (Def n _) -> [n]
63 Datatype _ _ tcs -> map fst tcs
64 Datatype _ _ tcs -> map fst tcs
64 ImportEvent _ _ n _ -> [n]
65 ImportEvent _ _ n _ -> [n]
@@ -87,10 +88,8 @@ instance Rename (Expr t v) where
87 `ap` mapM (\(x,e) -> (,) x `liftM` rnm e) fs
88 `ap` mapM (\(x,e) -> (,) x `liftM` rnm e) fs
89 Record fs -> Record `liftM` mapM frnm fs
90 Record fs -> Record `liftM` mapM frnm fs
90− where frnm (f,as,e) = do
91+ where
91− env' <- extends env as
92− e' <- rename env' e
92+ frnm (f,e) = (,) f `liftM` rename env e
93− return (f, map (replace env') as, e')
95 Binop op@(h:_) e1 e2 ->
94 Binop op@(h:_) e1 e2 ->
96 let rop = if isLower h || '_' == h
95 let rop = if isLower h || '_' == h
@@ -99,9 +98,9 @@ instance Rename (Expr t v) where
99 in Binop rop `liftM` rnm e1
98 in Binop rop `liftM` rnm e1
100 `ap` rnm e2
99 `ap` rnm e2
102− Lambda x e -> do
101+ Lambda pattern e -> do
103− (rx, env') <- extend env x
102+ (pattern', env') <- patternExtend env pattern
104− Lambda rx `liftM` rename env' e
103+ Lambda pattern' `liftM` rename env' e
106 App e1 e2 -> App `liftM` rnm e1
105 App e1 e2 -> App `liftM` rnm e1
107 `ap` rnm e2
106 `ap` rnm e2
@@ -119,7 +118,9 @@ instance Rename (Expr t v) where
119 ExplicitList es -> ExplicitList `liftM` mapM rnm es
118 ExplicitList es -> ExplicitList `liftM` mapM rnm es
121 Case e cases -> Case `liftM` rnm e
120 Case e cases -> Case `liftM` rnm e
122− `ap` mapM (patternRename env) cases
121+ `ap` mapM (liftM drop3rd . patternRename env) cases
123+ drop3rd (a,b,c) = (a,b)
124 _ -> return expr
125 _ -> return expr
@@ -134,31 +135,36 @@ extend env x = do
134extends :: Env -> [String] -> Unique Env
135extends :: Env -> [String] -> Unique Env
135extends env xs = foldM (\e x -> liftM snd $ extend e x) env xs
136extends env xs = foldM (\e x -> liftM snd $ extend e x) env xs
137−patternExtend :: Pattern -> Env -> Unique (Pattern, Env)
138+patternExtend :: Env -> Pattern -> Unique (Pattern, Env)
138−patternExtend pattern env =
139+patternExtend env pattern =
139 case pattern of
140 case pattern of
140 PLiteral _ -> return (pattern, env)
141 PLiteral _ -> return (pattern, env)
141 PAnything -> return (pattern, env)
142 PAnything -> return (pattern, env)
142 PVar x -> first PVar `liftM` extend env x
143 PVar x -> first PVar `liftM` extend env x
143 PAlias x p -> do
144 PAlias x p -> do
144 (x', env') <- extend env x
145 (x', env') <- extend env x
145− (p', env'') <- patternExtend p env'
146+ (p', env'') <- patternExtend env' p
146 return (PAlias x' p', env'')
147 return (PAlias x' p', env'')
147 PData name ps ->
148 PData name ps ->
148 first (PData name . reverse) `liftM` foldM f ([], env) ps
149 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
150 return (rp:rps, env'')
151 return (rp:rps, env'')
151 PRecord fs ->
152 PRecord fs ->
152 return (pattern, Map.union (Map.fromList $ map (\f -> (f,f)) fs) env)
153 return (pattern, Map.union (Map.fromList $ map (\f -> (f,f)) fs) env)
154−patternRename :: Env -> (Pattern, LExpr t v) -> Unique (Pattern, LExpr t v)
155+patternRename :: Env -> (Pattern, LExpr t v) -> Unique (Pattern, LExpr t v, Env)
155−patternRename env (p,e) = do
156+patternRename env (pattern,expr) = do
156− (rp,env') <- patternExtend p env
157+ (pattern',env') <- patternExtend env pattern
157− re <- rename env' e
158+ expr' <- rename env' expr
158− return (rp,re)
159+ return (pattern', expr', env')
160−renameLet env defs e = do env' <- extends env $ concatMap getNames defs
161+renameLet env defs e =
162+ do (env', ps') <- foldM addPattern (env, []) (map fst defPairs)
161− defs' <- mapM (rename env') defs
163+ bodies <- mapM (rename env') (map snd defPairs)
162− Let defs' `liftM` rename env' e
164+ Let (zipWith Def ps' bodies) `liftM` rename env' e
163− where getNames (FnDef n _ _) = [n]
165+ where
164− getNames _ = []
166+ defPairs = map (\(Def p e) -> (p,e)) defs
168+ addPattern (env,ps) pattern =
169+ do (pattern', _, env') <- patternRename env (pattern, Loc.none (Var ""))
170+ return (env', pattern' : ps)