@@ -66,11 +66,11 @@ moduleToJs opts (Module pname@(ProperName name) decls) env =
6666declToJs :: Options -> ModuleName -> Declaration -> Environment -> Maybe [JS]
6767declToJs opts mp (ValueDeclaration ident _ _ val) e =
6868 Just [ JSVariableIntroduction ident (Just (valueToJs opts mp e val)),
69− setProperty ident (JSVar ident) mp ]
69+ setProperty (identToJs ident) (JSVar ident) mp ]
7070declToJs opts mp (BindingGroupDeclaration vals) e =
7171 Just $ concatMap (\(ident, val) ->
7272 [ JSVariableIntroduction ident (Just (valueToJs opts mp e val)),
73− setProperty ident (JSVar ident) mp ]
73+ setProperty (identToJs ident) (JSVar ident) mp ]
7474 ) vals
7575declToJs _ mp (DataDeclaration _ _ ctors) _ =
7676 Just $ flip concatMap ctors $ \(pn@(ProperName ctor), maybeTy) ->
@@ -82,15 +82,15 @@ declToJs _ mp (DataDeclaration _ _ ctors) _ =
8282 (JSBlock [JSReturn
8383 (JSObjectLiteral [ ("ctor", JSStringLiteral (show (Qualified (Just mp) pn)))
8484 , ("value", JSVar (Ident "value")) ])])
85− in [ ctorJs, setProperty (Ident ctor) (JSVar (Ident ctor)) mp ]
85+ in [ ctorJs, setProperty ctor (JSVar (Ident ctor)) mp ]
8686declToJs opts mp (DataBindingGroupDeclaration ds) e =
8787 Just $ concat $ mapMaybe (flip (declToJs opts mp) e) ds
8888declToJs _ mp (ExternDeclaration importTy ident (Just js) _) _ =
8989 Just [ js
90− , setProperty ident (JSVar ident) mp ]
90+ , setProperty (identToJs ident) (JSVar ident) mp ]
9191declToJs _ _ _ _ = Nothing
9292
93−setProperty :: Ident -> JS -> ModuleName -> JS
93+setProperty :: String -> JS -> ModuleName -> JS
9494setProperty prop val (ModuleName (ProperName moduleName)) = JSAssignment (JSAssignProperty prop (JSAssignVariable (Ident moduleName))) val
9595
9696valueToJs :: Options -> ModuleName -> Environment -> Value -> JS
@@ -99,16 +99,16 @@ valueToJs _ _ _ (StringLiteral s) = JSStringLiteral s
9999valueToJs _ _ _ (BooleanLiteral b) = JSBooleanLiteral b
100100valueToJs opts m e (ArrayLiteral xs) = JSArrayLiteral (map (valueToJs opts m e) xs)
101101valueToJs opts m e (ObjectLiteral ps) = JSObjectLiteral (map (second (valueToJs opts m e)) ps)
102−valueToJs opts m e (ObjectUpdate o ps) = JSApp (JSAccessor (Ident "extend") (JSVar (Ident "Object"))) [ valueToJs opts m e o, JSObjectLiteral (map (second (valueToJs opts m e)) ps)]
102+valueToJs opts m e (ObjectUpdate o ps) = JSApp (JSAccessor "extend" (JSVar (Ident "Object"))) [ valueToJs opts m e o, JSObjectLiteral (map (second (valueToJs opts m e)) ps)]
103103valueToJs _ m e (Constructor (Qualified Nothing name)) =
104104 case M.lookup (m, name) (dataConstructors e) of
105− Just (_, Alias aliasModule aliasIdent) -> qualifiedToJS id (Qualified (Just aliasModule) aliasIdent)
105+ Just (_, Alias aliasModule aliasIdent) -> qualifiedToJS identToJs (Qualified (Just aliasModule) aliasIdent)
106106 _ -> JSVar . Ident . runProperName $ name
107−valueToJs _ _ _ (Constructor name) = qualifiedToJS (Ident . runProperName) name
107+valueToJs _ _ _ (Constructor name) = qualifiedToJS runProperName name
108108valueToJs opts m e (Block sts) = JSApp (JSFunction Nothing [] (JSBlock (map (statementToJs opts m e) sts))) []
109109valueToJs opts m e (Case values binders) = bindersToJs opts m e binders (map (valueToJs opts m e) values)
110110valueToJs opts m e (IfThenElse cond th el) = JSConditional (valueToJs opts m e cond) (valueToJs opts m e th) (valueToJs opts m e el)
111−valueToJs opts m e (Accessor prop val) = JSAccessor (Ident prop) (valueToJs opts m e val)
111+valueToJs opts m e (Accessor prop val) = JSAccessor prop (valueToJs opts m e val)
112112valueToJs opts m e (Indexer index val) = JSIndexer (valueToJs opts m e index) (valueToJs opts m e val)
113113valueToJs opts m e (App val arg) = JSApp (valueToJs opts m e val) [valueToJs opts m e arg]
114114valueToJs opts m e (Abs arg val) = JSFunction Nothing [arg] (JSBlock [JSReturn (valueToJs opts m e val)])
@@ -140,22 +140,22 @@ runtimeTypeChecks arg ty =
140140 let
141141 (pairs, _) = rowToList row
142142 in
143− typeCheck val "object" : concatMap (\(prop, ty') -> argumentCheck (JSAccessor (Ident prop) val) ty') pairs
143+ typeCheck val "object" : concatMap (\(prop, ty') -> argumentCheck (JSAccessor prop val) ty') pairs
144144 argumentCheck val (TypeApp (TypeApp t _) _) | t == tyFunction = [typeCheck val "function"]
145145 argumentCheck val (ForAll _ ty') = argumentCheck val ty'
146146 argumentCheck _ _ = []
147147 typeCheck :: JS -> String -> JS
148148 typeCheck js ty' = JSIfElse (JSBinary NotEqualTo (JSTypeOf js) (JSStringLiteral ty')) (JSBlock [JSThrow (JSStringLiteral $ ty' ++ " expected")]) Nothing
149149 arrayCheck :: JS -> JS
150− arrayCheck js = JSIfElse (JSUnary Not (JSApp (JSAccessor (Ident "isArray") (JSVar (Ident "Array"))) [js])) (JSBlock [JSThrow (JSStringLiteral "Array expected")]) Nothing
150+ arrayCheck js = JSIfElse (JSUnary Not (JSApp (JSAccessor "isArray" (JSVar (Ident "Array"))) [js])) (JSBlock [JSThrow (JSStringLiteral "Array expected")]) Nothing
151151
152152varToJs :: ModuleName -> Environment -> Qualified Ident -> JS
153153varToJs m e qual@(Qualified _ ident) = case M.lookup (qualify m qual) (names e) of
154154 Just (_, ty) | isExtern ty -> JSVar ident
155− Just (_, Alias aliasModule aliasIdent) -> qualifiedToJS id (Qualified (Just aliasModule) aliasIdent)
155+ Just (_, Alias aliasModule aliasIdent) -> qualifiedToJS identToJs (Qualified (Just aliasModule) aliasIdent)
156156 _ -> case qual of
157157 Qualified Nothing _ -> JSVar ident
158− _ -> qualifiedToJS id qual
158+ _ -> qualifiedToJS identToJs qual
159159 where
160160 isExtern (Extern ForeignImport) = True
161161 isExtern (Alias m' ident') = case M.lookup (m', ident') (names e) of
@@ -163,9 +163,9 @@ varToJs m e qual@(Qualified _ ident) = case M.lookup (qualify m qual) (names e)
163163 Nothing -> error "Undefined alias in varToJs"
164164 isExtern _ = False
165165
166−qualifiedToJS :: (a -> Ident) -> Qualified a -> JS
166+qualifiedToJS :: (a -> String) -> Qualified a -> JS
167167qualifiedToJS f (Qualified (Just (ModuleName (ProperName m))) a) = JSAccessor (f a) (JSVar (Ident m))
168−qualifiedToJS f (Qualified Nothing a) = JSVar (f a)
168+qualifiedToJS f (Qualified Nothing a) = JSVar (Ident (f a))
169169
170170bindersToJs :: Options -> ModuleName -> Environment -> [([Binder], Maybe Guard, Value)] -> [JS] -> JS
171171bindersToJs opts m e binders vals = runGen (unusedNames (binders, vals)) $ do
@@ -199,16 +199,16 @@ binderToJs m e varName done (NullaryBinder ctor) =
199199 then
200200 return done
201201 else
202− return [JSIfElse (JSBinary EqualTo (JSAccessor (Ident "ctor") (JSVar varName)) (JSStringLiteral (show ((\(mp, nm) -> Qualified (Just mp) nm) $ canonicalizeDataConstructor m e ctor)))) (JSBlock done) Nothing]
202+ return [JSIfElse (JSBinary EqualTo (JSAccessor "ctor" (JSVar varName)) (JSStringLiteral (show ((\(mp, nm) -> Qualified (Just mp) nm) $ canonicalizeDataConstructor m e ctor)))) (JSBlock done) Nothing]
203203binderToJs m e varName done (UnaryBinder ctor b) = do
204204 value <- fresh
205205 js <- binderToJs m e value done b
206− let success = JSBlock (JSVariableIntroduction value (Just (JSAccessor (Ident "value") (JSVar varName))) : js)
206+ let success = JSBlock (JSVariableIntroduction value (Just (JSAccessor "value" (JSVar varName))) : js)
207207 if isOnlyConstructor m e ctor
208208 then
209209 return [success]
210210 else
211− return [JSIfElse (JSBinary EqualTo (JSAccessor (Ident "ctor") (JSVar varName)) (JSStringLiteral (show ((\(mp, nm) -> Qualified (Just mp) nm) $ canonicalizeDataConstructor m e ctor))))
211+ return [JSIfElse (JSBinary EqualTo (JSAccessor "ctor" (JSVar varName)) (JSStringLiteral (show ((\(mp, nm) -> Qualified (Just mp) nm) $ canonicalizeDataConstructor m e ctor))))
212212 success
213213 Nothing]
214214binderToJs m e varName done (ObjectBinder bs) = go done bs
@@ -219,10 +219,10 @@ binderToJs m e varName done (ObjectBinder bs) = go done bs
219219 propVar <- fresh
220220 done'' <- go done' bs'
221221 js <- binderToJs m e propVar done'' binder
222− return (JSVariableIntroduction propVar (Just (JSAccessor (Ident prop) (JSVar varName))) : js)
222+ return (JSVariableIntroduction propVar (Just (JSAccessor prop (JSVar varName))) : js)
223223binderToJs m e varName done (ArrayBinder bs) = do
224224 js <- go done 0 bs
225− return [JSIfElse (JSBinary EqualTo (JSAccessor (Ident "length") (JSVar varName)) (JSNumericLiteral (Left (fromIntegral $ length bs)))) (JSBlock js) Nothing]
225+ return [JSIfElse (JSBinary EqualTo (JSAccessor "length" (JSVar varName)) (JSNumericLiteral (Left (fromIntegral $ length bs)))) (JSBlock js) Nothing]
226226 where
227227 go :: [JS] -> Integer -> [Binder] -> Gen [JS]
228228 go done' _ [] = return done'
@@ -236,9 +236,9 @@ binderToJs m e varName done (ConsBinder headBinder tailBinder) = do
236236 tailVar <- fresh
237237 js1 <- binderToJs m e headVar done headBinder
238238 js2 <- binderToJs m e tailVar js1 tailBinder
239− return [JSIfElse (JSBinary GreaterThan (JSAccessor (Ident "length") (JSVar varName)) (JSNumericLiteral (Left 0))) (JSBlock
239+ return [JSIfElse (JSBinary GreaterThan (JSAccessor "length" (JSVar varName)) (JSNumericLiteral (Left 0))) (JSBlock
240240 ( JSVariableIntroduction headVar (Just (JSIndexer (JSNumericLiteral (Left 0)) (JSVar varName))) :
241− JSVariableIntroduction tailVar (Just (JSApp (JSAccessor (Ident "slice") (JSVar varName)) [JSNumericLiteral (Left 1)])) :
241+ JSVariableIntroduction tailVar (Just (JSApp (JSAccessor "slice" (JSVar varName)) [JSNumericLiteral (Left 1)])) :
242242 js2
243243 )) Nothing]
244244binderToJs m e varName done (NamedBinder ident binder) = do