@@ -32,6 +32,7 @@ import Control.Monad.State
3232import Data.Maybe (fromMaybe)
3333import Data.List (nub)
3434import Data.Generics (mkQ, everything)
35+import Language.PureScript.Pretty.Common (identToJs)
3536
3637type MemberMap = M.Map (ModuleName, ProperName) (String, [(String, Type)])
3738
@@ -52,11 +53,11 @@ desugarDecl mn d@(TypeInstanceDeclaration deps name ty members) = do
5253 desugared <- lift $ desugarCases members
5354 entries <- mapM (typeInstanceDictionaryEntryDeclaration mn deps name ty) desugared
5455 dictDecl <- typeInstanceDictionaryDeclaration mn deps name ty desugared
55− return $ d : dictDecl : entries
56+ return $ d : entries ++ [dictDecl]
5657desugarDecl _ other = return [other]
5758
5859memberToNameAndType :: Declaration -> (String, Type)
59−memberToNameAndType (TypeDeclaration ident ty) = (identToString ident, ty)
60+memberToNameAndType (TypeDeclaration ident ty) = (identToJs ident, ty)
6061memberToNameAndType _ = error "Invalid declaration in type class definition"
6162
6263typeClassDictionaryDeclaration :: ProperName -> String -> [Declaration] -> Declaration
@@ -65,16 +66,16 @@ typeClassDictionaryDeclaration name arg members =
6566
6667typeClassMemberToDictionaryAccessor :: ProperName -> String -> Declaration -> Declaration
6768typeClassMemberToDictionaryAccessor name arg (TypeDeclaration ident ty) =
68− ExternDeclaration ident
69− (Just (JSFunction (Just ident) [Ident "dict"] (JSBlock [JSReturn (JSAccessor arg (JSVar (Ident "dict")))])))
70− (ForAll arg (ConstrainedType [(Qualified Nothing name, TypeVar arg)] ty))
69+ ExternDeclaration TypeClassAccessorImport ident
70+ (Just (JSFunction (Just ident) [Ident "dict"] (JSBlock [JSReturn (JSAccessor (identToJs ident) (JSVar (Ident "dict")))])))
71+ (ForAll arg (ConstrainedType [(Qualified Nothing name, TypeVar arg)] ty))
7172typeClassMemberToDictionaryAccessor _ _ _ = error "Invalid declaration in type class definition"
7273
7374typeInstanceDictionaryDeclaration :: ModuleName -> [(Qualified ProperName, Type)] -> Qualified ProperName -> Type -> [Declaration] -> Desugar Declaration
7475typeInstanceDictionaryDeclaration mn deps name ty decls = do
7576 entryName <- lift $ mkDictionaryValueName mn name ty
7677 memberNames <- mapM memberToNameAndValue decls
77− return $ ExternDeclaration entryName
78+ return $ ExternDeclaration TypeClassDictionaryImport entryName
7879 (Just (JSFunction (Just entryName)
7980 (map (\n -> Ident ('_' : show n)) [1..length deps])
8081 (JSBlock [JSReturn (JSObjectLiteral memberNames)])))
@@ -83,7 +84,8 @@ typeInstanceDictionaryDeclaration mn deps name ty decls = do
8384 memberToNameAndValue :: Declaration -> Desugar (String, JS)
8485 memberToNameAndValue (ValueDeclaration ident _ _ _) = do
8586 memberName <- mkDictionaryEntryName mn name ty ident
86− return (identToString ident, JSApp (JSVar memberName) (map (\n -> JSVar (Ident ('_' : show n))) [1..length deps]))
87+ return (identToJs ident, if null deps then JSVar memberName
88+ else JSApp (JSVar memberName) (map (\n -> JSVar (Ident ('_' : show n))) [1..length deps]))
8789 memberToNameAndValue _ = error "Invalid declaration in type instance definition"
8890
8991typeInstanceDictionaryEntryDeclaration :: ModuleName -> [(Qualified ProperName, Type)] -> Qualified ProperName -> Type -> Declaration -> Desugar Declaration
@@ -91,16 +93,14 @@ typeInstanceDictionaryEntryDeclaration mn deps name ty (ValueDeclaration ident [
9193 m <- get
9294 let valTy = fromMaybe (error "Type class instance dictionary member is missing in typeInstanceDictionaryEntryDeclaration") $
9395 do (arg, members) <- M.lookup (qualify mn name) m
94− ty' <- lookup (identToString ident) members
96+ ty' <- lookup (identToJs ident) members
9597 return $ replaceTypeVars arg ty ty'
9698 entryName <- mkDictionaryEntryName mn name ty ident
9799 return $ ValueDeclaration entryName [] Nothing
98100 (TypedValue val (quantify (if null deps then valTy else ConstrainedType deps valTy)))
99101typeInstanceDictionaryEntryDeclaration _ _ _ _ _ = error "Invalid declaration in type instance definition"
100102
101−identToString :: Ident -> String
102−identToString (Ident s) = s
103−identToString (Op _) = error "TODO: Unsupported type class instance name"
103+--TODO handle unqualified names
104104
105105qualifiedToString :: ModuleName -> Qualified ProperName -> String
106106qualifiedToString 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"
130130mkDictionaryEntryName :: ModuleName -> Qualified ProperName -> Type -> Ident -> Desugar Ident
131131mkDictionaryEntryName mn name ty ident = do
132132 Ident dictName <- lift $ mkDictionaryValueName mn name ty
133− return $ Ident $ dictName ++ "_" ++ identToString ident
133+ return $ Ident $ dictName ++ "_" ++ identToJs ident