@@ -41,7 +41,7 @@ import Language.PureScript.Options
4141import Language.PureScript.CodeGen.JS.AST as AST
4242import Language.PureScript.Types
4343import Language.PureScript.CodeGen.Optimize
44−import Language.PureScript.CodeGen.Common (identToJs)
44+import Language.PureScript.CodeGen.Common
4545import Language.PureScript.TypeChecker.Monad (canonicalizeDataConstructor)
4646
4747-- |
@@ -87,14 +87,18 @@ declToJs _ _ _ _ = Nothing
8787
8888setProperty :: Ident -> JS -> ModuleName -> [JS]
8989setProperty ident@(Op op) val (ModuleName (ProperName moduleName)) =
90− [ JSAssignment (JSAccessor (identToJs ident) (JSVar moduleName)) val
91− , JSAssignment (JSIndexer (JSStringLiteral op) (JSVar moduleName)) (JSAccessor (identToJs ident) (JSVar moduleName)) ]
90+ [ JSAssignment (accessor ident (JSVar moduleName)) val
91+ , JSAssignment (JSIndexer (JSStringLiteral op) (JSVar moduleName)) (accessor ident (JSVar moduleName)) ]
9292setProperty ident val (ModuleName (ProperName moduleName)) =
93− [ JSAssignment (JSAccessor (identToJs ident) (JSVar moduleName)) val ]
93+ [ JSAssignment (accessor ident (JSVar moduleName)) val ]
9494
9595var :: Ident -> JS
9696var = JSVar . identToJs
9797
98+accessor :: Ident -> JS -> JS
99+accessor (Ident name) | nameIsJsReserved name = JSIndexer (JSStringLiteral name)
100+accessor ident = JSAccessor (identToJs ident)
101+
98102valueToJs :: Options -> ModuleName -> Environment -> Value -> JS
99103valueToJs _ _ _ (NumericLiteral n) = JSNumericLiteral n
100104valueToJs _ _ _ (StringLiteral s) = JSStringLiteral s
@@ -104,9 +108,9 @@ valueToJs opts m e (ObjectLiteral ps) = JSObjectLiteral (map (second (valueToJs
104108valueToJs opts m e (ObjectUpdate o ps) = JSApp (JSAccessor "extend" (JSVar "Object")) [ valueToJs opts m e o, JSObjectLiteral (map (second (valueToJs opts m e)) ps)]
105109valueToJs _ m e (Constructor (Qualified Nothing name)) =
106110 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)
108112 _ -> JSVar . runProperName $ name
109−valueToJs _ _ _ (Constructor name) = qualifiedToJS runProperName name
113+valueToJs _ _ _ (Constructor name) = qualifiedToJS (Ident . runProperName) name
110114valueToJs opts m e (Block sts) = JSApp (JSFunction Nothing [] (JSBlock (map (statementToJs opts m e) sts))) []
111115valueToJs opts m e (Case values binders) = bindersToJs opts m e binders (map (valueToJs opts m e) values)
112116valueToJs 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
156160 Just (_, Alias aliasModule aliasIdent) -> go (Qualified (Just aliasModule) aliasIdent)
157161 _ -> case qual of
158162 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
161164 isExtern (Extern ForeignImport) = True
162165 isExtern (Alias m' ident') = case M.lookup (m', ident') (names e) of
163166 Just (_, ty') -> isExtern ty'
164167 Nothing -> error "Undefined alias in varToJs"
165168 isExtern _ = False
166169
167−qualifiedToJS :: (a -> String) -> Qualified a -> JS
168−qualifiedToJS f (Qualified (Just (ModuleName (ProperName m))) a) = JSAccessor (f a) (JSVar m)
169−qualifiedToJS f (Qualified Nothing a) = JSVar (f a)
170+qualifiedToJS :: (a -> Ident) -> Qualified a -> JS
171+qualifiedToJS f (Qualified (Just (ModuleName (ProperName m))) a) = accessor (f a) (JSVar m)
172+qualifiedToJS f (Qualified Nothing a) = JSVar $ identToJs (f a)
170173
171174bindersToJs :: Options -> ModuleName -> Environment -> [([Binder], Maybe Guard, Value)] -> [JS] -> JS
172175bindersToJs opts m e binders vals = runGen (map identToJs (unusedNames (binders, vals))) $ do