@@ -41,7 +41,7 @@ import Language.PureScript.Options
41import Language.PureScript.CodeGen.JS.AST as AST
41import Language.PureScript.CodeGen.JS.AST as AST
42import Language.PureScript.Types
42import Language.PureScript.Types
43import Language.PureScript.CodeGen.Optimize
43import Language.PureScript.CodeGen.Optimize
44−import Language.PureScript.CodeGen.Common (identToJs)
44+import Language.PureScript.CodeGen.Common
45import Language.PureScript.TypeChecker.Monad (canonicalizeDataConstructor)
45import Language.PureScript.TypeChecker.Monad (canonicalizeDataConstructor)
@@ -87,14 +87,18 @@ declToJs _ _ _ _ = Nothing
88setProperty :: Ident -> JS -> ModuleName -> [JS]
88setProperty :: Ident -> JS -> ModuleName -> [JS]
89setProperty ident@(Op op) val (ModuleName (ProperName moduleName)) =
89setProperty ident@(Op op) val (ModuleName (ProperName moduleName)) =
90− [ JSAssignment (JSAccessor (identToJs ident) (JSVar moduleName)) val
90+ [ JSAssignment (accessor ident (JSVar moduleName)) val
91− , JSAssignment (JSIndexer (JSStringLiteral op) (JSVar moduleName)) (JSAccessor (identToJs ident) (JSVar moduleName)) ]
91+ , JSAssignment (JSIndexer (JSStringLiteral op) (JSVar moduleName)) (accessor ident (JSVar moduleName)) ]
92setProperty ident val (ModuleName (ProperName moduleName)) =
92setProperty ident val (ModuleName (ProperName moduleName)) =
93− [ JSAssignment (JSAccessor (identToJs ident) (JSVar moduleName)) val ]
93+ [ JSAssignment (accessor ident (JSVar moduleName)) val ]
95var :: Ident -> JS
95var :: Ident -> JS
96var = JSVar . identToJs
96var = JSVar . identToJs
98+accessor :: Ident -> JS -> JS
99+accessor (Ident name) | nameIsJsReserved name = JSIndexer (JSStringLiteral name)
100+accessor ident = JSAccessor (identToJs ident)
98valueToJs :: Options -> ModuleName -> Environment -> Value -> JS
102valueToJs :: Options -> ModuleName -> Environment -> Value -> JS
99valueToJs _ _ _ (NumericLiteral n) = JSNumericLiteral n
103valueToJs _ _ _ (NumericLiteral n) = JSNumericLiteral n
100valueToJs _ _ _ (StringLiteral s) = JSStringLiteral s
104valueToJs _ _ _ (StringLiteral s) = JSStringLiteral s
@@ -104,9 +108,9 @@ valueToJs opts m e (ObjectLiteral ps) = JSObjectLiteral (map (second (valueToJs
104valueToJs opts m e (ObjectUpdate o ps) = JSApp (JSAccessor "extend" (JSVar "Object")) [ valueToJs opts m e o, JSObjectLiteral (map (second (valueToJs opts m e)) ps)]
108valueToJs opts m e (ObjectUpdate o ps) = JSApp (JSAccessor "extend" (JSVar "Object")) [ valueToJs opts m e o, JSObjectLiteral (map (second (valueToJs opts m e)) ps)]
105valueToJs _ m e (Constructor (Qualified Nothing name)) =
109valueToJs _ m e (Constructor (Qualified Nothing name)) =
106 case M.lookup (m, name) (dataConstructors e) of
110 case M.lookup (m, name) (dataConstructors e) of
107− Just (_, Alias aliasModule aliasIdent) -> qualifiedToJS identToJs (Qualified (Just aliasModule) aliasIdent)
111+ Just (_, Alias aliasModule aliasIdent) -> qualifiedToJS id (Qualified (Just aliasModule) aliasIdent)
108 _ -> JSVar . runProperName $ name
112 _ -> JSVar . runProperName $ name
109−valueToJs _ _ _ (Constructor name) = qualifiedToJS runProperName name
113+valueToJs _ _ _ (Constructor name) = qualifiedToJS (Ident . runProperName) name
110valueToJs opts m e (Block sts) = JSApp (JSFunction Nothing [] (JSBlock (map (statementToJs opts m e) sts))) []
114valueToJs opts m e (Block sts) = JSApp (JSFunction Nothing [] (JSBlock (map (statementToJs opts m e) sts))) []
111valueToJs opts m e (Case values binders) = bindersToJs opts m e binders (map (valueToJs opts m e) values)
115valueToJs opts m e (Case values binders) = bindersToJs opts m e binders (map (valueToJs opts m e) values)
112valueToJs opts m e (IfThenElse cond th el) = JSConditional (valueToJs opts m e cond) (valueToJs opts m e th) (valueToJs opts m e el)
116valueToJs opts m e (IfThenElse cond th el) = JSConditional (valueToJs opts m e cond) (valueToJs opts m e th) (valueToJs opts m e el)
@@ -156,17 +160,16 @@ varToJs m e qual@(Qualified _ ident) = go qual
156 Just (_, Alias aliasModule aliasIdent) -> go (Qualified (Just aliasModule) aliasIdent)
160 Just (_, Alias aliasModule aliasIdent) -> go (Qualified (Just aliasModule) aliasIdent)
157 _ -> case qual of
161 _ -> case qual of
158 Qualified Nothing _ -> var ident
162 Qualified Nothing _ -> var ident
159− Qualified (Just (ModuleName (ProperName mn))) (Op op) -> JSIndexer (JSStringLiteral op) (JSVar mn)
160− _ -> qualifiedToJS identToJs qual
163+ _ -> qualifiedToJS id qual
161 isExtern (Extern ForeignImport) = True
164 isExtern (Extern ForeignImport) = True
162 isExtern (Alias m' ident') = case M.lookup (m', ident') (names e) of
165 isExtern (Alias m' ident') = case M.lookup (m', ident') (names e) of
163 Just (_, ty') -> isExtern ty'
166 Just (_, ty') -> isExtern ty'
164 Nothing -> error "Undefined alias in varToJs"
167 Nothing -> error "Undefined alias in varToJs"
165 isExtern _ = False
168 isExtern _ = False
167−qualifiedToJS :: (a -> String) -> Qualified a -> JS
170+qualifiedToJS :: (a -> Ident) -> Qualified a -> JS
168−qualifiedToJS f (Qualified (Just (ModuleName (ProperName m))) a) = JSAccessor (f a) (JSVar m)
171+qualifiedToJS f (Qualified (Just (ModuleName (ProperName m))) a) = accessor (f a) (JSVar m)
169−qualifiedToJS f (Qualified Nothing a) = JSVar (f a)
172+qualifiedToJS f (Qualified Nothing a) = JSVar $ identToJs (f a)
171bindersToJs :: Options -> ModuleName -> Environment -> [([Binder], Maybe Guard, Value)] -> [JS] -> JS
174bindersToJs :: Options -> ModuleName -> Environment -> [([Binder], Maybe Guard, Value)] -> [JS] -> JS
172bindersToJs opts m e binders vals = runGen (map identToJs (unusedNames (binders, vals))) $ do
175bindersToJs opts m e binders vals = runGen (map identToJs (unusedNames (binders, vals))) $ do