@@ -18,21 +18,21 @@ module Language.PureScript.Renamer (renameInModules) where
1818import Control.Applicative
1919import Control.Monad.State
2020
21+import Data.List (find)
2122import qualified Data.Map as M
2223
2324import Language.PureScript.Declarations
2425import Language.PureScript.Environment
2526import Language.PureScript.Names
26−import Language.PureScript.Supply
2727import Language.PureScript.Traversals
2828
29−type Rename = StateT (M.Map Ident Ident) Supply
29+type Rename = State (M.Map Ident Ident)
3030
3131-- |
32−-- Create a Rename state value for a scope from a list of idents.
32+-- Runs renaming starting with a list of idents for the initial scope.
3333--
34−createScope :: [Ident] -> M.Map Ident Ident
35−createScope scopeNames = M.fromList (zip scopeNames scopeNames)
34+runRename :: [Ident] -> Rename a -> a
35+runRename scope = flip evalState (M.fromList $ zip scope scope)
3636
3737-- |
3838-- Creates a new renaming scope using the current as a basis. Used to backtrack
@@ -47,12 +47,16 @@ newScope x = get >>= lift . evalStateT x
4747--
4848updateScope :: Ident -> Rename Ident
4949updateScope name = do
50− name' <- gets $ M.lookup name
51− name'' <- case name' of
52− Just _ -> Ident . (runIdent name ++) <$> lift freshName
50+ scope <- get
51+ name' <- case M.lookup name scope of
52+ Just _ -> do
53+ let newNames = map (\i -> Ident (runIdent name ++ "_" ++ show (i :: Int))) [1..]
54+ let (Just newName) = find (\nn -> M.lookup nn scope == Nothing) newNames
55+ modify $ M.insert newName newName
56+ return newName
5357 Nothing -> return name
54− modify $ M.insert name name''
55− return name''
58+ modify $ M.insert name name'
59+ return name'
5660
5761-- |
5862-- Finds the new name to use for an ident.
@@ -86,7 +90,7 @@ renameInModules = map go
8690 go :: Module -> Module
8791 go (Module mn decls exps) = Module mn (renameInDecl' (findDeclIdents decls) `map` decls) exps
8892 renameInDecl' :: [Ident] -> Declaration -> Declaration
89− renameInDecl' scope = evalSupply 1 . flip evalStateT (createScope scope) . renameInDecl True
93+ renameInDecl' scope = runRename scope . renameInDecl True
9094
9195-- |
9296-- Renames within a declaration. isTopLevel is used to determine whether the