@@ -1,4 +1,4 @@
1−module Generate.JavaScript where
1+module Generate.JavaScript (generate) where
3import Control.Arrow (first,(***))
3import Control.Arrow (first,(***))
4import Control.Applicative ((<$>),(<*>))
4import Control.Applicative ((<$>),(<*>))
@@ -9,31 +9,27 @@ import qualified Data.Set as Set
10import qualified Generate.Cases as Case
10import qualified Generate.Cases as Case
11import qualified Generate.Markdown as MD
11import qualified Generate.Markdown as MD
12+import qualified SourceSyntax.Helpers as Help
13+import SourceSyntax.Literal
12−import SourceSyntax.Everything
14+import SourceSyntax.Pattern
13import SourceSyntax.Location
15import SourceSyntax.Location
16+import SourceSyntax.Expression
17+import SourceSyntax.Module
14import qualified Transform.SortDefinitions as SD
18import qualified Transform.SortDefinitions as SD
15import Language.ECMAScript3.Syntax
19import Language.ECMAScript3.Syntax
16import Language.ECMAScript3.PrettyPrint
20import Language.ECMAScript3.PrettyPrint
17−import Parse.Helpers (jsReserveds)
21+import qualified Transform.SafeNames as MakeSafe
19−makeSafe :: String -> String
20−makeSafe = List.intercalate "." . map dereserve . split . deprime
22− deprime = map (\c -> if c == '\'' then '$' else c)
23− dereserve x = case Set.member x jsReserveds of
27split :: String -> [String]
23split :: String -> [String]
28split = go []
24split = go []
30 go vars str =
26 go vars str =
31 case break (=='.') str of
27 case break (=='.') str of
32− (x,'.':rest) | isOp x -> vars ++ [x ++ '.' : rest]
28+ (x,'.':rest) | Help.isOp x -> vars ++ [x ++ '.' : rest]
33 | otherwise -> go (vars ++ [x]) rest
29 | otherwise -> go (vars ++ [x]) rest
34 (x,[]) -> vars ++ [x]
30 (x,[]) -> vars ++ [x]
36−var name = Id () (makeSafe name)
32+var name = Id () name
37ref name = VarRef () (var name)
33ref name = VarRef () (var name)
38prop name = PropId () (var name)
34prop name = PropId () (var name)
39f <| x = CallExpr () f [x]
35f <| x = CallExpr () f [x]
@@ -185,7 +181,7 @@ expression (L span expr) =
185 do es' <- mapM expression es
181 do es' <- mapM expression es
186 return $ ObjectLit () (ctor : fields es')
182 return $ ObjectLit () (ctor : fields es')
188− ctor = (prop "ctor", string (makeSafe name))
184+ ctor = (prop "ctor", string name)
189 fields = zipWith (\n e -> (prop ("_" ++ show n), e)) [0..]
185 fields = zipWith (\n e -> (prop ("_" ++ show n), e)) [0..]
191 Markdown uid doc es ->
187 Markdown uid doc es ->
@@ -205,7 +201,7 @@ definition def =
205 let assign x = varDecl x expr'
201 let assign x = varDecl x expr'
206 case pattern of
202 case pattern of
208− | isOp x ->
204+ | Help.isOp x ->
209 let op = LBracket () (ref "_op") (string x) in
205 let op = LBracket () (ref "_op") (string x) in
210 return [ ExprStmt () $ AssignExpr () OpAssign op expr' ]
206 return [ ExprStmt () $ AssignExpr () OpAssign op expr' ]
211 | otherwise ->
207 | otherwise ->
@@ -228,7 +224,7 @@ definition def =
229 decl x n = varDecl x (dotSep ["$","_" ++ show n])
225 decl x n = varDecl x (dotSep ["$","_" ++ show n])
230 setup vars
226 setup vars
231− | isTuple name = assign "$" : vars
227+ | Help.isTuple name = assign "$" : vars
232 | otherwise = safeAssign : vars
228 | otherwise = safeAssign : vars
234 safeAssign = varDecl "$" (CondExpr () if' expr' exception)
230 safeAssign = varDecl "$" (CondExpr () if' expr' exception)
@@ -291,10 +287,11 @@ clause span variable (Case.Clause value vars mtch) =
293generate :: MetadataModule () () -> String
289generate :: MetadataModule () () -> String
294−generate modul =
290+generate unsafeModule =
295 show . prettyPrint $ setup (Just "Elm") (names modul ++ ["make"]) ++
291 show . prettyPrint $ setup (Just "Elm") (names modul ++ ["make"]) ++
296 [ assign ("Elm" : names modul ++ ["make"]) (function ["_elm"] programStmts) ]
292 [ assign ("Elm" : names modul ++ ["make"]) (function ["_elm"] programStmts) ]
294+ modul = MakeSafe.metadataModule unsafeModule
298 thisModule = dotSep ("_elm" : names modul ++ ["values"])
295 thisModule = dotSep ("_elm" : names modul ++ ["values"])
299 programStmts =
296 programStmts =
300 concat [ setup (Just "_elm") (names modul ++ ["values"])
297 concat [ setup (Just "_elm") (names modul ++ ["values"])
@@ -311,7 +308,7 @@ generate modul =
312 jsExports = assign ("_elm" : names modul ++ ["values"]) (ObjectLit () exs)
309 jsExports = assign ("_elm" : names modul ++ ["values"]) (ObjectLit () exs)
314− exs = map entry . filter (not . isOp) $ "_op" : exports modul
311+ exs = map entry . filter (not . Help.isOp) $ "_op" : exports modul
315 entry x = (PropId () (var x), ref x)
312 entry x = (PropId () (var x), ref x)
317 assign path expr =
314 assign path expr =
@@ -387,7 +384,7 @@ binop span op e1 e2 =
387 js1 = expression e1
384 js1 = expression e1
388 js2 = expression e2
385 js2 = expression e2
390− func | isOp operator = BracketRef () (dotSep (init parts ++ ["_op"])) (string operator)
387+ func | Help.isOp operator = BracketRef () (dotSep (init parts ++ ["_op"])) (string operator)
391 | otherwise = dotSep parts
388 | otherwise = dotSep parts
393 parts = split op
390 parts = split op