@@ -32,6 +32,7 @@ import Control.Monad.State
32import Data.Maybe (fromMaybe)
32import Data.Maybe (fromMaybe)
33import Data.List (nub)
33import Data.List (nub)
34import Data.Generics (mkQ, everything)
34import Data.Generics (mkQ, everything)
35+import Language.PureScript.Pretty.Common (identToJs)
36type MemberMap = M.Map (ModuleName, ProperName) (String, [(String, Type)])
37type MemberMap = M.Map (ModuleName, ProperName) (String, [(String, Type)])
@@ -52,11 +53,11 @@ desugarDecl mn d@(TypeInstanceDeclaration deps name ty members) = do
52 desugared <- lift $ desugarCases members
53 desugared <- lift $ desugarCases members
53 entries <- mapM (typeInstanceDictionaryEntryDeclaration mn deps name ty) desugared
54 entries <- mapM (typeInstanceDictionaryEntryDeclaration mn deps name ty) desugared
54 dictDecl <- typeInstanceDictionaryDeclaration mn deps name ty desugared
55 dictDecl <- typeInstanceDictionaryDeclaration mn deps name ty desugared
55− return $ d : dictDecl : entries
56+ return $ d : entries ++ [dictDecl]
56desugarDecl _ other = return [other]
57desugarDecl _ other = return [other]
58memberToNameAndType :: Declaration -> (String, Type)
59memberToNameAndType :: Declaration -> (String, Type)
59−memberToNameAndType (TypeDeclaration ident ty) = (identToString ident, ty)
60+memberToNameAndType (TypeDeclaration ident ty) = (identToJs ident, ty)
60memberToNameAndType _ = error "Invalid declaration in type class definition"
61memberToNameAndType _ = error "Invalid declaration in type class definition"
62typeClassDictionaryDeclaration :: ProperName -> String -> [Declaration] -> Declaration
63typeClassDictionaryDeclaration :: ProperName -> String -> [Declaration] -> Declaration
@@ -65,16 +66,16 @@ typeClassDictionaryDeclaration name arg members =
66typeClassMemberToDictionaryAccessor :: ProperName -> String -> Declaration -> Declaration
67typeClassMemberToDictionaryAccessor :: ProperName -> String -> Declaration -> Declaration
67typeClassMemberToDictionaryAccessor name arg (TypeDeclaration ident ty) =
68typeClassMemberToDictionaryAccessor name arg (TypeDeclaration ident ty) =
68− ExternDeclaration ident
69+ ExternDeclaration TypeClassAccessorImport ident
69− (Just (JSFunction (Just ident) [Ident "dict"] (JSBlock [JSReturn (JSAccessor arg (JSVar (Ident "dict")))])))
70+ (Just (JSFunction (Just ident) [Ident "dict"] (JSBlock [JSReturn (JSAccessor (identToJs ident) (JSVar (Ident "dict")))])))
70− (ForAll arg (ConstrainedType [(Qualified Nothing name, TypeVar arg)] ty))
71+ (ForAll arg (ConstrainedType [(Qualified Nothing name, TypeVar arg)] ty))
71typeClassMemberToDictionaryAccessor _ _ _ = error "Invalid declaration in type class definition"
72typeClassMemberToDictionaryAccessor _ _ _ = error "Invalid declaration in type class definition"
73typeInstanceDictionaryDeclaration :: ModuleName -> [(Qualified ProperName, Type)] -> Qualified ProperName -> Type -> [Declaration] -> Desugar Declaration
74typeInstanceDictionaryDeclaration :: ModuleName -> [(Qualified ProperName, Type)] -> Qualified ProperName -> Type -> [Declaration] -> Desugar Declaration
74typeInstanceDictionaryDeclaration mn deps name ty decls = do
75typeInstanceDictionaryDeclaration mn deps name ty decls = do
75 entryName <- lift $ mkDictionaryValueName mn name ty
76 entryName <- lift $ mkDictionaryValueName mn name ty
76 memberNames <- mapM memberToNameAndValue decls
77 memberNames <- mapM memberToNameAndValue decls
77− return $ ExternDeclaration entryName
78+ return $ ExternDeclaration TypeClassDictionaryImport entryName
78 (Just (JSFunction (Just entryName)
79 (Just (JSFunction (Just entryName)
79 (map (\n -> Ident ('_' : show n)) [1..length deps])
80 (map (\n -> Ident ('_' : show n)) [1..length deps])
80 (JSBlock [JSReturn (JSObjectLiteral memberNames)])))
81 (JSBlock [JSReturn (JSObjectLiteral memberNames)])))
@@ -83,7 +84,8 @@ typeInstanceDictionaryDeclaration mn deps name ty decls = do
83 memberToNameAndValue :: Declaration -> Desugar (String, JS)
84 memberToNameAndValue :: Declaration -> Desugar (String, JS)
84 memberToNameAndValue (ValueDeclaration ident _ _ _) = do
85 memberToNameAndValue (ValueDeclaration ident _ _ _) = do
85 memberName <- mkDictionaryEntryName mn name ty ident
86 memberName <- mkDictionaryEntryName mn name ty ident
87+ return (identToJs ident, if null deps then JSVar memberName
86− return (identToString ident, JSApp (JSVar memberName) (map (\n -> JSVar (Ident ('_' : show n))) [1..length deps]))
88+ else JSApp (JSVar memberName) (map (\n -> JSVar (Ident ('_' : show n))) [1..length deps]))
87 memberToNameAndValue _ = error "Invalid declaration in type instance definition"
89 memberToNameAndValue _ = error "Invalid declaration in type instance definition"
89typeInstanceDictionaryEntryDeclaration :: ModuleName -> [(Qualified ProperName, Type)] -> Qualified ProperName -> Type -> Declaration -> Desugar Declaration
91typeInstanceDictionaryEntryDeclaration :: ModuleName -> [(Qualified ProperName, Type)] -> Qualified ProperName -> Type -> Declaration -> Desugar Declaration
@@ -91,16 +93,14 @@ typeInstanceDictionaryEntryDeclaration mn deps name ty (ValueDeclaration ident [
92 let valTy = fromMaybe (error "Type class instance dictionary member is missing in typeInstanceDictionaryEntryDeclaration") $
94 let valTy = fromMaybe (error "Type class instance dictionary member is missing in typeInstanceDictionaryEntryDeclaration") $
93 do (arg, members) <- M.lookup (qualify mn name) m
95 do (arg, members) <- M.lookup (qualify mn name) m
94− ty' <- lookup (identToString ident) members
96+ ty' <- lookup (identToJs ident) members
95 return $ replaceTypeVars arg ty ty'
97 return $ replaceTypeVars arg ty ty'
96 entryName <- mkDictionaryEntryName mn name ty ident
98 entryName <- mkDictionaryEntryName mn name ty ident
97 return $ ValueDeclaration entryName [] Nothing
99 return $ ValueDeclaration entryName [] Nothing
98 (TypedValue val (quantify (if null deps then valTy else ConstrainedType deps valTy)))
100 (TypedValue val (quantify (if null deps then valTy else ConstrainedType deps valTy)))
99typeInstanceDictionaryEntryDeclaration _ _ _ _ _ = error "Invalid declaration in type instance definition"
101typeInstanceDictionaryEntryDeclaration _ _ _ _ _ = error "Invalid declaration in type instance definition"
101−identToString :: Ident -> String
103+--TODO handle unqualified names
102−identToString (Ident s) = s
103−identToString (Op _) = error "TODO: Unsupported type class instance name"
105qualifiedToString :: ModuleName -> Qualified ProperName -> String
105qualifiedToString :: ModuleName -> Qualified ProperName -> String
106qualifiedToString mn (Qualified Nothing pn) = qualifiedToString mn (Qualified (Just mn) pn)
106qualifiedToString mn (Qualified Nothing pn) = qualifiedToString mn (Qualified (Just mn) pn)
@@ -130,4 +130,4 @@ typeToString _ _ = Left "Type class instance must be of the form T a1 ... an"
130mkDictionaryEntryName :: ModuleName -> Qualified ProperName -> Type -> Ident -> Desugar Ident
130mkDictionaryEntryName :: ModuleName -> Qualified ProperName -> Type -> Ident -> Desugar Ident
131mkDictionaryEntryName mn name ty ident = do
131mkDictionaryEntryName mn name ty ident = do
132 Ident dictName <- lift $ mkDictionaryValueName mn name ty
132 Ident dictName <- lift $ mkDictionaryValueName mn name ty
133− return $ Ident $ dictName ++ "_" ++ identToString ident
133+ return $ Ident $ dictName ++ "_" ++ identToJs ident