git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Rename data constructors
commit00c53032c51f0ee240edf28e7288d6c709031cd2 authorGary Burgess <gary.burgess@gmail.com> dateThu 27 Feb 2014, 10:43 (13 years ago) parent6f1d52f
4 files changed+40−28
src/Language/PureScript/CodeGen/JS.hs+1−2 src/Language/PureScript/DeadCodeElimination.hs+2−1 src/Language/PureScript/Sugar/Names.hs+37−16 src/Language/PureScript/TypeChecker/Monad.hs−9
src/Language/PureScript/CodeGen/JS.hs+1−2
@@ -43,7 +43,6 @@ import Language.PureScript.CodeGen.JS.AST as AST
4343import Language.PureScript.Types
4444import Language.PureScript.CodeGen.Optimize
4545import Language.PureScript.CodeGen.Common
46−import Language.PureScript.TypeChecker.Monad (canonicalizeDataConstructor)
4746
4847-- |
4948-- Generate code in the simplified Javascript intermediate representation for all declarations in a
@@ -262,7 +261,7 @@ binderToJs m e varName done (ConstructorBinder ctor bs) = do
262261 then
263262 return js
264263 else
265− return [JSIfElse (JSBinary EqualTo (JSAccessor "ctor" (JSVar varName)) (JSStringLiteral (show ((\(mp, nm) -> Qualified (Just mp) nm) $ canonicalizeDataConstructor m e ctor))))
264+ return [JSIfElse (JSBinary EqualTo (JSAccessor "ctor" (JSVar varName)) (JSStringLiteral (show ctor)))
266265 (JSBlock js)
267266 Nothing]
268267 where
src/Language/PureScript/DeadCodeElimination.hs+2−1
@@ -55,7 +55,8 @@ dependencies env moduleName = nub . everything (++) (mkQ [] values)
5555 where
5656 values :: Value -> [Key]
5757 values (Var ident) = let (mn, name) = canonicalize moduleName env ident in [(mn, Left name)]
58− values (Constructor pn) = let (mn, name) = canonicalizeDataConstructor moduleName env pn in [(mn, Right name)]
58+ values (Constructor (Qualified (Just mn) name)) = [(mn, Right name)]
59+ values (Constructor (Qualified Nothing _)) = error "Found unqualified data constructor"
5960 values _ = []
6061
6162isUsed :: ModuleName -> Graph -> (Key -> Maybe Vertex) -> [Vertex] -> Declaration -> Bool
src/Language/PureScript/Sugar/Names.hs+37−16
@@ -17,63 +17,84 @@ module Language.PureScript.Sugar.Names (
1717) where
1818
1919import Control.Applicative ((<$>))
20−import Control.Arrow (first)
21−import Data.Maybe (fromJust)
22−import Data.Generics (mkM, everywhereM)
20+import Data.Generics (extM, mkM, everywhereM)
2321import qualified Data.Map as M
2422import qualified Data.Set as S
25−import Data.Generics.Extras
2623import Language.PureScript.Declarations
2724import Language.PureScript.Names
2825import Language.PureScript.Types
29−import Language.PureScript.Pretty.Types
26+import Language.PureScript.Values
3027import Debug.Trace
3128
32−data ExportEnvironment = ExportEnvironment { exportedTypeClasses :: M.Map ModuleName (S.Set ProperName) } deriving (Show)
33−data ImportEnvironment = ImportEnvironment { importedTypeClasses :: M.Map ProperName (Qualified ProperName) } deriving (Show)
29+data ExportEnvironment = ExportEnvironment
30+ { exportedDataConstructors :: M.Map ModuleName (S.Set ProperName)
31+ , exportedTypeClasses :: M.Map ModuleName (S.Set ProperName)
32+ } deriving (Show)
33+
34+data ImportEnvironment = ImportEnvironment
35+ { importedDataConstructors :: M.Map ProperName (Qualified ProperName)
36+ , importedTypeClasses :: M.Map ProperName (Qualified ProperName)
37+ } deriving (Show)
3438
35−nullEnv = ExportEnvironment M.empty
39+nullEnv = ExportEnvironment M.empty M.empty
40+
41+addDataConstructor :: ExportEnvironment -> ModuleName -> ProperName -> ExportEnvironment
42+addDataConstructor env mn id = env { exportedDataConstructors = M.insertWith S.union mn (S.singleton id) (exportedDataConstructors env) }
3643
3744addTypeclass :: ExportEnvironment -> ModuleName -> ProperName -> ExportEnvironment
3845addTypeclass env mn id = env { exportedTypeClasses = M.insertWith S.union mn (S.singleton id) (exportedTypeClasses env) }
3946
4047rename :: [Module] -> Either String [Module]
41−rename modules = mapM (renameInModule $ findExports modules) modules
48+rename modules = trace (show $ findExports modules) $ mapM (renameInModule $ findExports modules) modules
4249
4350renameInModule :: ExportEnvironment -> Module -> Either String Module
44−renameInModule exports m@(Module mn decls) = Module mn <$> everywhereM (mkM updateDecl) decls >>= everywhereM (mkM updateType)
51+renameInModule exports m@(Module mn decls) = Module mn <$> mapM updateDecl decls >>= everywhereM (mkM updateType) >>= everywhereM (mkM updateValue) >>= everywhereM (mkM updateBinder)
4552 where
46− updateDecl (TypeInstanceDeclaration cs cn ts ds) = do
53+ updateDecl (TypeInstanceDeclaration cs (Qualified Nothing cn) ts ds) = do
4754 cn' <- updateClassName cn
4855 cs' <- updateConstraints cs
4956 return $ TypeInstanceDeclaration cs' cn' ts ds
5057 updateDecl d = return d
58+ updateValue (Constructor (Qualified Nothing nm)) = do
59+ nm' <- updateDataConstructorName nm
60+ return $ Constructor nm'
61+ updateValue v = return v
62+ updateBinder (ConstructorBinder (Qualified Nothing nm) b) = do
63+ nm' <- updateDataConstructorName nm
64+ return $ ConstructorBinder nm' b
65+ updateBinder v = return v
5166 updateType (ConstrainedType cs t) = do
5267 cs' <- updateConstraints cs
5368 return $ ConstrainedType cs' t
5469 updateType t = return t
5570 updateConstraints = mapM updateConstraint
56− updateConstraint (nm, ts) = do
71+ updateConstraint (Qualified Nothing nm, ts) = do
5772 nm' <- updateClassName nm
5873 return (nm', ts)
59− updateClassName (Qualified Nothing nm) =
60− maybe (Left $ "Unknown typeclass '" ++ show nm ++ "'") Right $ M.lookup nm (importedTypeClasses imports)
61− updateClassName q = return q
74+ updateConstraint other = return other
75+ updateClassName nm =
76+ maybe (err "typeclass" nm mn) return $ M.lookup nm (importedTypeClasses imports)
77+ updateDataConstructorName nm =
78+ maybe (err "data constructor" nm mn) return $ M.lookup nm (importedDataConstructors imports)
6279 imports = resolveImports exports m
80+ err t nm mn = Left $ "Unknown " ++ t ++ " '" ++ show nm ++ "' in module '" ++ show mn ++ "'"
6381
6482findExports :: [Module] -> ExportEnvironment
6583findExports = foldl addModule nullEnv
6684 where
6785 addModule env (Module mn ds) = foldl (addDecl mn) env ds
6886 addDecl mn env (TypeClassDeclaration tcn _ _) = addTypeclass env mn tcn
87+ addDecl mn env (DataDeclaration tcn _ dcs) = foldl (flip addDataConstructor mn) env (map fst dcs)
6988 addDecl _ env _ = env
7089
7190findImports :: [Declaration] -> [ModuleName]
7291findImports decls = [ mn | (ImportDeclaration mn Nothing) <- decls ]
7392
7493resolveImports :: ExportEnvironment -> Module -> ImportEnvironment
75−resolveImports env (Module mn decls) = ImportEnvironment $ resolve (mn : findImports decls) (exportedTypeClasses env)
94+resolveImports env (Module mn decls) = ImportEnvironment (resolve scope $ exportedDataConstructors env)
95+ (resolve scope $ exportedTypeClasses env)
7696 where
97+ scope = (mn : findImports decls)
7798 resolve imns = M.foldlWithKey (resolveDefs imns) M.empty
7899 resolveDefs imns result mn ids | mn `elem` imns = S.foldl (resolveDef mn) result ids
79100 resolveDefs imns result mn ids = result
src/Language/PureScript/TypeChecker/Monad.hs−9
@@ -219,15 +219,6 @@ canonicalizeType mn env (Qualified Nothing nm) = case (mn, nm) `M.lookup` types
219219 Just (_, DataAlias mn' pn') -> (mn', pn')
220220 _ -> (mn, nm)
221221
222−-- |
223−-- Canonicalize a data constructor by resolving any aliases introduced by module imports
224−--
225−canonicalizeDataConstructor :: ModuleName -> Environment -> Qualified ProperName -> (ModuleName, ProperName)
226−canonicalizeDataConstructor _ _ (Qualified (Just mn) pn) = (mn, pn)
227−canonicalizeDataConstructor mn env (Qualified Nothing pn) = case (mn, pn) `M.lookup` dataConstructors env of
228− Just (_, Alias mn' (Ident pn')) -> (mn', ProperName pn')
229− _ -> (mn, pn)
230−
231222-- |
232223-- State required for type checking:
233224--