@@ -1,4 +1,4 @@
1−module Generate.JavaScript where
1+module Generate.JavaScript (generate) where
22
33import Control.Arrow (first,(***))
44import Control.Applicative ((<$>),(<*>))
@@ -9,31 +9,27 @@ import qualified Data.Set as Set
99
1010import qualified Generate.Cases as Case
1111import qualified Generate.Markdown as MD
12−import SourceSyntax.Everything
12+import qualified SourceSyntax.Helpers as Help
13+import SourceSyntax.Literal
14+import SourceSyntax.Pattern
1315import SourceSyntax.Location
16+import SourceSyntax.Expression
17+import SourceSyntax.Module
1418import qualified Transform.SortDefinitions as SD
1519import Language.ECMAScript3.Syntax
1620import Language.ECMAScript3.PrettyPrint
17−import Parse.Helpers (jsReserveds)
18−
19−makeSafe :: String -> String
20−makeSafe = List.intercalate "." . map dereserve . split . deprime
21− where
22− deprime = map (\c -> if c == '\'' then '$' else c)
23− dereserve x = case Set.member x jsReserveds of
24− False -> x
25− True -> "$" ++ x
21+import qualified Transform.SafeNames as MakeSafe
2622
2723split :: String -> [String]
2824split = go []
2925 where
3026 go vars str =
3127 case break (=='.') str of
32− (x,'.':rest) | isOp x -> vars ++ [x ++ '.' : rest]
28+ (x,'.':rest) | Help.isOp x -> vars ++ [x ++ '.' : rest]
3329 | otherwise -> go (vars ++ [x]) rest
3430 (x,[]) -> vars ++ [x]
3531
36−var name = Id () (makeSafe name)
32+var name = Id () name
3733ref name = VarRef () (var name)
3834prop name = PropId () (var name)
3935f <| x = CallExpr () f [x]
@@ -185,7 +181,7 @@ expression (L span expr) =
185181 do es' <- mapM expression es
186182 return $ ObjectLit () (ctor : fields es')
187183 where
188− ctor = (prop "ctor", string (makeSafe name))
184+ ctor = (prop "ctor", string name)
189185 fields = zipWith (\n e -> (prop ("_" ++ show n), e)) [0..]
190186
191187 Markdown uid doc es ->
@@ -205,7 +201,7 @@ definition def =
205201 let assign x = varDecl x expr'
206202 case pattern of
207203 PVar x
208− | isOp x ->
204+ | Help.isOp x ->
209205 let op = LBracket () (ref "_op") (string x) in
210206 return [ ExprStmt () $ AssignExpr () OpAssign op expr' ]
211207 | otherwise ->
@@ -228,7 +224,7 @@ definition def =
228224
229225 decl x n = varDecl x (dotSep ["$","_" ++ show n])
230226 setup vars
231− | isTuple name = assign "$" : vars
227+ | Help.isTuple name = assign "$" : vars
232228 | otherwise = safeAssign : vars
233229
234230 safeAssign = varDecl "$" (CondExpr () if' expr' exception)
@@ -291,10 +287,11 @@ clause span variable (Case.Clause value vars mtch) =
291287
292288
293289generate :: MetadataModule () () -> String
294−generate modul =
290+generate unsafeModule =
295291 show . prettyPrint $ setup (Just "Elm") (names modul ++ ["make"]) ++
296292 [ assign ("Elm" : names modul ++ ["make"]) (function ["_elm"] programStmts) ]
297293 where
294+ modul = MakeSafe.metadataModule unsafeModule
298295 thisModule = dotSep ("_elm" : names modul ++ ["values"])
299296 programStmts =
300297 concat [ setup (Just "_elm") (names modul ++ ["values"])
@@ -311,7 +308,7 @@ generate modul =
311308
312309 jsExports = assign ("_elm" : names modul ++ ["values"]) (ObjectLit () exs)
313310 where
314− exs = map entry . filter (not . isOp) $ "_op" : exports modul
311+ exs = map entry . filter (not . Help.isOp) $ "_op" : exports modul
315312 entry x = (PropId () (var x), ref x)
316313
317314 assign path expr =
@@ -387,7 +384,7 @@ binop span op e1 e2 =
387384 js1 = expression e1
388385 js2 = expression e2
389386
390− func | isOp operator = BracketRef () (dotSep (init parts ++ ["_op"])) (string operator)
387+ func | Help.isOp operator = BracketRef () (dotSep (init parts ++ ["_op"])) (string operator)
391388 | otherwise = dotSep parts
392389 where
393390 parts = split op