on master help sign in
Flow Generate.JavaScript.Mode through other Generate modules
e4797dbEvan Czaplicki
compiler/src/Generate/JavaScript.hs+42−65
@@ -1,7 +1,6 @@
1{-# LANGUAGE OverloadedStrings #-}
1{-# LANGUAGE OverloadedStrings #-}
2module Generate.JavaScript
2module Generate.JavaScript
3− ( Mode(..)
4− , Output(..)
3+ ( Output(..)
5 , generate
4 , generate
6 , generateForRepl
5 , generateForRepl
7 )
6 )
@@ -29,6 +28,7 @@ import qualified Elm.Name as N
29import qualified Generate.JavaScript.Builder as JS
28import qualified Generate.JavaScript.Builder as JS
30import qualified Generate.JavaScript.Expression as Expr
29import qualified Generate.JavaScript.Expression as Expr
31import qualified Generate.JavaScript.Name as Name
30import qualified Generate.JavaScript.Name as Name
31+import qualified Generate.JavaScript.Mode as Mode
32import qualified Reporting.Doc as D
32import qualified Reporting.Doc as D
33
33
34
34
@@ -36,16 +36,13 @@ import qualified Reporting.Doc as D
36-- GENERATE MAINS
36-- GENERATE MAINS
37
37
38
38
39−data Mode = Prod | Dev | Debug
40−
41−
42data Output
39data Output
43 = None
40 = None
44 | Some N.Name [N.Name] B.Builder
41 | Some N.Name [N.Name] B.Builder
45
42
46
43
47−generate :: Mode -> Name.Target -> I.Interfaces -> Opt.Graph -> [ModuleName.Canonical] -> Output
44+generate :: Mode.Mode -> Opt.Graph -> [ModuleName.Canonical] -> Output
48−generate mode target interfaces (Opt.Graph mains graph fields) roots =
45+generate mode (Opt.Graph mains graph _fields) roots =
49 let
46 let
50 rootSet = Set.fromList roots
47 rootSet = Set.fromList roots
51 rootMap = Map.restrictKeys mains rootSet
48 rootMap = Map.restrictKeys mains rootSet
@@ -56,31 +53,17 @@ generate mode target interfaces (Opt.Graph mains graph fields) roots =
56
53
57 name:names ->
54 name:names ->
58 let
55 let
59− realMode = toRealMode mode target fields
60− state = Map.foldrWithKey (addMain realMode graph) emptyState rootMap
56+ state = Map.foldrWithKey (addMain mode graph) emptyState rootMap
61− builder = stateToBuilder state <> toMainExports realMode interfaces rootMap
57+ builder = stateToBuilder state <> toMainExports mode rootMap
62 in
58 in
63 Some name names builder
59 Some name names builder
64
60
65
61
66−addMain :: Name.Mode -> Graph -> ModuleName.Canonical -> main -> State -> State
62+addMain :: Mode.Mode -> Graph -> ModuleName.Canonical -> main -> State -> State
67addMain mode graph home _ state =
63addMain mode graph home _ state =
68 addGlobal mode graph state (Opt.Global home "main")
64 addGlobal mode graph state (Opt.Global home "main")
69
65
70
66
71−toRealMode :: Mode -> Name.Target -> Map.Map N.Name Int -> Name.Mode
72−toRealMode mode target fields =
73− case mode of
74− Debug ->
75− Name.Dev target Name.DebuggerOn
76−
77− Dev ->
78− Name.Dev target Name.DebuggerOff
79−
80− Prod ->
81− Name.Prod target (Name.shortenFieldNames fields)
82−
83−
84
67
85-- GENERATE FOR REPL
68-- GENERATE FOR REPL
86
69
@@ -88,7 +71,7 @@ toRealMode mode target fields =
88generateForRepl :: Opt.Graph -> I.Interface -> ModuleName.Canonical -> N.Name -> B.Builder
71generateForRepl :: Opt.Graph -> I.Interface -> ModuleName.Canonical -> N.Name -> B.Builder
89generateForRepl (Opt.Graph _ graph _) iface home name =
72generateForRepl (Opt.Graph _ graph _) iface home name =
90 let
73 let
91− mode = Name.Dev Name.Server Name.DebuggerOff
74+ mode = Mode.dev Mode.Server
92 debugState = addGlobal mode graph emptyState (Opt.Global ModuleName.debug "toString")
75 debugState = addGlobal mode graph emptyState (Opt.Global ModuleName.debug "toString")
93 evalState = addGlobal mode graph debugState (Opt.Global home name)
76 evalState = addGlobal mode graph debugState (Opt.Global home name)
94 in
77 in
@@ -139,7 +122,7 @@ stateToBuilder (State revBuilders _) =
139type Graph = Map.Map Opt.Global Opt.Node
122type Graph = Map.Map Opt.Global Opt.Node
140
123
141
124
142−addGlobal :: Name.Mode -> Graph -> State -> Opt.Global -> State
125+addGlobal :: Mode.Mode -> Graph -> State -> Opt.Global -> State
143addGlobal mode graph state@(State builders seen) global =
126addGlobal mode graph state@(State builders seen) global =
144 if Set.member global seen then
127 if Set.member global seen then
145 state
128 state
@@ -148,7 +131,7 @@ addGlobal mode graph state@(State builders seen) global =
148 State builders (Set.insert global seen)
131 State builders (Set.insert global seen)
149
132
150
133
151−addGlobalHelp :: Name.Mode -> Graph -> Opt.Global -> State -> State
134+addGlobalHelp :: Mode.Mode -> Graph -> Opt.Global -> State -> State
152addGlobalHelp mode graph global state =
135addGlobalHelp mode graph global state =
153 let
136 let
154 addDeps deps someState =
137 addDeps deps someState =
@@ -184,7 +167,7 @@ addGlobalHelp mode graph global state =
184
167
185 Opt.Kernel (Opt.KContent clientChunks clientDeps) maybeServer ->
168 Opt.Kernel (Opt.KContent clientChunks clientDeps) maybeServer ->
186 case maybeServer of
169 case maybeServer of
187− Just (Opt.KContent serverChunks serverDeps) | Name.isServer mode ->
170+ Just (Opt.KContent serverChunks serverDeps) | Mode.isServer mode ->
188 addBuilder (addDeps serverDeps state) (generateKernel mode serverChunks)
171 addBuilder (addDeps serverDeps state) (generateKernel mode serverChunks)
189
172
190 _ ->
173 _ ->
@@ -230,7 +213,7 @@ var (Opt.Global home name) code =
230-- GENERATE CYCLES
213-- GENERATE CYCLES
231
214
232
215
233−generateCycle :: Name.Mode -> Opt.Global -> [(N.Name, Opt.Expr)] -> JS.Stmt
216+generateCycle :: Mode.Mode -> Opt.Global -> [(N.Name, Opt.Expr)] -> JS.Stmt
234generateCycle mode (Opt.Global home _) cycle =
217generateCycle mode (Opt.Global home _) cycle =
235 let
218 let
236 safeDefs = map (generateSafeCycle mode home) cycle
219 safeDefs = map (generateSafeCycle mode home) cycle
@@ -238,10 +221,10 @@ generateCycle mode (Opt.Global home _) cycle =
238 block = JS.Block (safeDefs ++ realDefs)
221 block = JS.Block (safeDefs ++ realDefs)
239 in
222 in
240 case mode of
223 case mode of
241− Name.Prod _ _ ->
224+ Mode.Prod _ _ ->
242 block
225 block
243
226
244− Name.Dev _ _ ->
227+ Mode.Dev _ _ ->
245 JS.Try block Name.dollar $ JS.Throw $ JS.String $
228 JS.Try block Name.dollar $ JS.Throw $ JS.String $
246 "The following top-level definitions are causing infinite recursion:\\n"
229 "The following top-level definitions are causing infinite recursion:\\n"
247 <> drawCycle (map fst cycle)
230 <> drawCycle (map fst cycle)
@@ -250,7 +233,7 @@ generateCycle mode (Opt.Global home _) cycle =
250 <> " to learn how to fix it!"
233 <> " to learn how to fix it!"
251
234
252
235
253−generateSafeCycle :: Name.Mode -> ModuleName.Canonical -> (N.Name, Opt.Expr) -> JS.Stmt
236+generateSafeCycle :: Mode.Mode -> ModuleName.Canonical -> (N.Name, Opt.Expr) -> JS.Stmt
254generateSafeCycle mode home (name, expr) =
237generateSafeCycle mode home (name, expr) =
255 JS.FunctionStmt (Name.fromCycle home name) [] $
238 JS.FunctionStmt (Name.fromCycle home name) [] $
256 Expr.codeToStmtList (Expr.generate mode expr)
239 Expr.codeToStmtList (Expr.generate mode expr)
@@ -285,12 +268,12 @@ drawCycle names =
285-- GENERATE KERNEL
268-- GENERATE KERNEL
286
269
287
270
288−generateKernel :: Name.Mode -> [Opt.KChunk] -> B.Builder
271+generateKernel :: Mode.Mode -> [Opt.KChunk] -> B.Builder
289generateKernel mode chunks =
272generateKernel mode chunks =
290 List.foldl' (addChunk mode) mempty chunks
273 List.foldl' (addChunk mode) mempty chunks
291
274
292
275
293−addChunk :: Name.Mode -> B.Builder -> Opt.KChunk -> B.Builder
276+addChunk :: Mode.Mode -> B.Builder -> Opt.KChunk -> B.Builder
294addChunk mode builder chunk =
277addChunk mode builder chunk =
295 case chunk of
278 case chunk of
296 Opt.JS javascript ->
279 Opt.JS javascript ->
@@ -303,7 +286,7 @@ addChunk mode builder chunk =
303 Name.toBuilder (Name.fromKernel home name) <> builder
286 Name.toBuilder (Name.fromKernel home name) <> builder
304
287
305 Opt.ElmField name ->
288 Opt.ElmField name ->
306− Name.toBuilder (Name.fromField mode name) <> builder
289+ Name.toBuilder (Expr.generateField mode name) <> builder
307
290
308 Opt.JsField int ->
291 Opt.JsField int ->
309 Name.toBuilder (Name.fromInt int) <> builder
292 Name.toBuilder (Name.fromInt int) <> builder
@@ -313,18 +296,18 @@ addChunk mode builder chunk =
313
296
314 Opt.Debug ->
297 Opt.Debug ->
315 case mode of
298 case mode of
316− Name.Dev _ _ ->
299+ Mode.Dev _ _ ->
317 builder
300 builder
318
301
319− Name.Prod _ _ ->
302+ Mode.Prod _ _ ->
320 "_UNUSED" <> builder
303 "_UNUSED" <> builder
321
304
322 Opt.Prod ->
305 Opt.Prod ->
323 case mode of
306 case mode of
324− Name.Dev _ _ ->
307+ Mode.Dev _ _ ->
325 "_UNUSED" <> builder
308 "_UNUSED" <> builder
326
309
327− Name.Prod _ _ ->
310+ Mode.Prod _ _ ->
328 builder
311 builder
329
312
330
313
@@ -332,15 +315,15 @@ addChunk mode builder chunk =
332-- GENERATE ENUM
315-- GENERATE ENUM
333
316
334
317
335−generateEnum :: Name.Mode -> Opt.Global -> N.Name -> Index.ZeroBased -> JS.Stmt
318+generateEnum :: Mode.Mode -> Opt.Global -> N.Name -> Index.ZeroBased -> JS.Stmt
336generateEnum mode (Opt.Global home name) ctorName index =
319generateEnum mode (Opt.Global home name) ctorName index =
337 let
320 let
338 definition =
321 definition =
339 case mode of
322 case mode of
340− Name.Dev _ _ ->
323+ Mode.Dev _ _ ->
341 Expr.codeToExpr (Expr.generateCtor mode ctorName index 0)
324 Expr.codeToExpr (Expr.generateCtor mode ctorName index 0)
342
325
343− Name.Prod _ _ ->
326+ Mode.Prod _ _ ->
344 JS.Int (Index.toMachine index)
327 JS.Int (Index.toMachine index)
345 in
328 in
346 JS.Var [ (Name.fromGlobal home name, Just definition) ]
329 JS.Var [ (Name.fromGlobal home name, Just definition) ]
@@ -350,15 +333,15 @@ generateEnum mode (Opt.Global home name) ctorName index =
350-- GENERATE BOX
333-- GENERATE BOX
351
334
352
335
353−generateBox :: Name.Mode -> Opt.Global -> N.Name -> JS.Stmt
336+generateBox :: Mode.Mode -> Opt.Global -> N.Name -> JS.Stmt
354generateBox mode (Opt.Global home name) ctorName =
337generateBox mode (Opt.Global home name) ctorName =
355 let
338 let
356 definition =
339 definition =
357 case mode of
340 case mode of
358− Name.Dev _ _ ->
341+ Mode.Dev _ _ ->
359 Expr.codeToExpr (Expr.generateCtor mode ctorName Index.first 1)
342 Expr.codeToExpr (Expr.generateCtor mode ctorName Index.first 1)
360
343
361− Name.Prod _ _ ->
344+ Mode.Prod _ _ ->
362 JS.Ref (Name.fromGlobal ModuleName.basics N.identity)
345 JS.Ref (Name.fromGlobal ModuleName.basics N.identity)
363 in
346 in
364 JS.Var [ (Name.fromGlobal home name, Just definition) ]
347 JS.Var [ (Name.fromGlobal home name, Just definition) ]
@@ -368,7 +351,7 @@ generateBox mode (Opt.Global home name) ctorName =
368-- GENERATE PORTS
351-- GENERATE PORTS
369
352
370
353
371−generatePort :: Name.Mode -> Opt.Global -> N.Name -> Opt.Expr -> JS.Stmt
354+generatePort :: Mode.Mode -> Opt.Global -> N.Name -> Opt.Expr -> JS.Stmt
372generatePort mode (Opt.Global home name) makePort converter =
355generatePort mode (Opt.Global home name) makePort converter =
373 let
356 let
374 definition =
357 definition =
@@ -384,7 +367,7 @@ generatePort mode (Opt.Global home name) makePort converter =
384-- GENERATE MANAGER
367-- GENERATE MANAGER
385
368
386
369
387−generateManager :: Name.Mode -> Graph -> Opt.Global -> Opt.EffectsType -> State -> State
370+generateManager :: Mode.Mode -> Graph -> Opt.Global -> Opt.EffectsType -> State -> State
388generateManager mode graph (Opt.Global home@(ModuleName.Canonical _ moduleName) _) effectsType state =
371generateManager mode graph (Opt.Global home@(ModuleName.Canonical _ moduleName) _) effectsType state =
389 let
372 let
390 managerLVar =
373 managerLVar =
@@ -450,21 +433,17 @@ generateManagerHelp home effectsType =
450-- MAIN EXPORTS
433-- MAIN EXPORTS
451
434
452
435
453−toMainExports :: Name.Mode -> I.Interfaces -> Map.Map ModuleName.Canonical Opt.Main -> B.Builder
436+toMainExports :: Mode.Mode -> Map.Map ModuleName.Canonical Opt.Main -> B.Builder
454−toMainExports mode interfaces mains =
437+toMainExports mode mains =
455 let
438 let
456− export =
457− Name.fromKernel N.platform "export"
439+ export = Name.fromKernel N.platform "export"
458−
459− exports =
460− generateExports mode interfaces $
461− Map.foldrWithKey addToTrie emptyTrie mains
440+ exports = generateExports mode (Map.foldrWithKey addToTrie emptyTrie mains)
462 in
441 in
463 Name.toBuilder export <> "(" <> exports <> ");"
442 Name.toBuilder export <> "(" <> exports <> ");"
464
443
465
444
466−generateExports :: Name.Mode -> I.Interfaces -> Trie -> B.Builder
445+generateExports :: Mode.Mode -> Trie -> B.Builder
467−generateExports mode interfaces (Trie maybeMain subs) =
446+generateExports mode (Trie maybeMain subs) =
468 let
447 let
469 object =
448 object =
470 case Map.toList subs of
449 case Map.toList subs of
@@ -473,23 +452,21 @@ generateExports mode interfaces (Trie maybeMain subs) =
473
452
474 (name, subTrie) : otherSubTries ->
453 (name, subTrie) : otherSubTries ->
475 "{'" <> Text.encodeUtf8Builder name <> "':"
454 "{'" <> Text.encodeUtf8Builder name <> "':"
476− <> generateExports mode interfaces subTrie
455+ <> generateExports mode subTrie
477− <> List.foldl' (addSubTrie mode interfaces) "}" otherSubTries
456+ <> List.foldl' (addSubTrie mode) "}" otherSubTries
478 in
457 in
479 case maybeMain of
458 case maybeMain of
480 Nothing ->
459 Nothing ->
481 object
460 object
482
461
483 Just (home, main) ->
462 Just (home, main) ->
484− let initialize = Expr.generateMain mode interfaces home main in
463+ let initialize = Expr.generateMain mode home main in
485 JS.exprToBuilder initialize <> "(" <> object <> ")"
464 JS.exprToBuilder initialize <> "(" <> object <> ")"
486
465
487
466
488−addSubTrie :: Name.Mode -> I.Interfaces -> B.Builder -> (Text.Text, Trie) -> B.Builder
467+addSubTrie :: Mode.Mode -> B.Builder -> (Text.Text, Trie) -> B.Builder
489−addSubTrie mode interfaces end (name, trie) =
468+addSubTrie mode end (name, trie) =
490− ",'" <> Text.encodeUtf8Builder name <> "':"
469+ ",'" <> Text.encodeUtf8Builder name <> "':" <> generateExports mode trie <> end
491− <> generateExports mode interfaces trie
492− <> end
493
470
494
471
495
472
compiler/src/Generate/JavaScript/Expression.hs+82−78
@@ -2,6 +2,7 @@
2module Generate.JavaScript.Expression
2module Generate.JavaScript.Expression
3 ( generate
3 ( generate
4 , generateCtor
4 , generateCtor
5+ , generateField
5 , generateTailDef
6 , generateTailDef
6 , generateMain
7 , generateMain
7 , Code
8 , Code
@@ -13,6 +14,7 @@ module Generate.JavaScript.Expression
13
14
14import qualified Data.IntMap as IntMap
15import qualified Data.IntMap as IntMap
15import qualified Data.List as List
16import qualified Data.List as List
17+import Data.Map ((!))
16import qualified Data.Map as Map
18import qualified Data.Map as Map
17import qualified Data.Text.Encoding as Text
19import qualified Data.Text.Encoding as Text
18
20
@@ -22,11 +24,11 @@ import qualified AST.Module.Name as ModuleName
22import qualified Data.Index as Index
24import qualified Data.Index as Index
23import qualified Elm.Compiler.Type as Type
25import qualified Elm.Compiler.Type as Type
24import qualified Elm.Compiler.Type.Extract as Extract
26import qualified Elm.Compiler.Type.Extract as Extract
25−import qualified Elm.Interface as I
26import qualified Elm.Name as N
27import qualified Elm.Name as N
27import qualified Elm.Package as Pkg
28import qualified Elm.Package as Pkg
28import qualified Elm.Compiler.Version as Version
29import qualified Elm.Compiler.Version as Version
29import qualified Generate.JavaScript.Builder as JS
30import qualified Generate.JavaScript.Builder as JS
31+import qualified Generate.JavaScript.Mode as Mode
30import qualified Generate.JavaScript.Name as Name
32import qualified Generate.JavaScript.Name as Name
31import qualified Json.Encode as Encode
33import qualified Json.Encode as Encode
32import qualified Optimize.DecisionTree as DT
34import qualified Optimize.DecisionTree as DT
@@ -34,22 +36,15 @@ import qualified Reporting.Region as R
34
36
35
37
36
38
37−-- ENVIRONMENT
38−
39−
40−type Mode = Name.Mode
41−
42−
43−
44-- EXPRESSIONS
39-- EXPRESSIONS
45
40
46
41
47−generateJsExpr :: Mode -> Opt.Expr -> JS.Expr
42+generateJsExpr :: Mode.Mode -> Opt.Expr -> JS.Expr
48generateJsExpr mode expression =
43generateJsExpr mode expression =
49 codeToExpr (generate mode expression)
44 codeToExpr (generate mode expression)
50
45
51
46
52−generate :: Mode -> Opt.Expr -> Code
47+generate :: Mode.Mode -> Opt.Expr -> Code
53generate mode expression =
48generate mode expression =
54 case expression of
49 case expression of
55 Opt.Bool bool ->
50 Opt.Bool bool ->
@@ -58,10 +53,10 @@ generate mode expression =
58 Opt.Chr char ->
53 Opt.Chr char ->
59 JsExpr $
54 JsExpr $
60 case mode of
55 case mode of
61− Name.Dev _ _ ->
56+ Mode.Dev _ _ ->
62 JS.Call toChar [ JS.String (Text.encodeUtf8Builder char) ]
57 JS.Call toChar [ JS.String (Text.encodeUtf8Builder char) ]
63
58
64− Name.Prod _ _ ->
59+ Mode.Prod _ _ ->
65 JS.String (Text.encodeUtf8Builder char)
60 JS.String (Text.encodeUtf8Builder char)
66
61
67 Opt.Str string ->
62 Opt.Str string ->
@@ -81,17 +76,17 @@ generate mode expression =
81
76
82 Opt.VarEnum (Opt.Global home name) index ->
77 Opt.VarEnum (Opt.Global home name) index ->
83 case mode of
78 case mode of
84− Name.Dev _ _ ->
79+ Mode.Dev _ _ ->
85 JsExpr $ JS.Ref (Name.fromGlobal home name)
80 JsExpr $ JS.Ref (Name.fromGlobal home name)
86
81
87− Name.Prod _ _ ->
82+ Mode.Prod _ _ ->
88 JsExpr $ JS.Int (Index.toMachine index)
83 JsExpr $ JS.Int (Index.toMachine index)
89
84
90 Opt.VarBox (Opt.Global home name) ->
85 Opt.VarBox (Opt.Global home name) ->
91 JsExpr $ JS.Ref $
86 JsExpr $ JS.Ref $
92 case mode of
87 case mode of
93− Name.Dev _ _ -> Name.fromGlobal home name
88+ Mode.Dev _ _ -> Name.fromGlobal home name
94− Name.Prod _ _ -> Name.fromGlobal ModuleName.basics N.identity
89+ Mode.Prod _ _ -> Name.fromGlobal ModuleName.basics N.identity
95
90
96 Opt.VarCycle home name ->
91 Opt.VarCycle home name ->
97 JsExpr $ JS.Call (JS.Ref (Name.fromCycle home name)) []
92 JsExpr $ JS.Call (JS.Ref (Name.fromCycle home name)) []
@@ -143,11 +138,11 @@ generate mode expression =
143 Opt.Accessor field ->
138 Opt.Accessor field ->
144 JsExpr $ JS.Function Nothing [Name.dollar]
139 JsExpr $ JS.Function Nothing [Name.dollar]
145 [ JS.Return $ Just $
140 [ JS.Return $ Just $
146− JS.Access (JS.Ref Name.dollar) (Name.fromField mode field)
141+ JS.Access (JS.Ref Name.dollar) (generateField mode field)
147 ]
142 ]
148
143
149 Opt.Access record field ->
144 Opt.Access record field ->
150− JsExpr $ JS.Access (generateJsExpr mode record) (Name.fromField mode field)
145+ JsExpr $ JS.Access (generateJsExpr mode record) (generateField mode field)
151
146
152 Opt.Update record fields ->
147 Opt.Update record fields ->
153 JsExpr $
148 JsExpr $
@@ -161,10 +156,10 @@ generate mode expression =
161
156
162 Opt.Unit ->
157 Opt.Unit ->
163 case mode of
158 case mode of
164− Name.Dev _ _ ->
159+ Mode.Dev _ _ ->
165 JsExpr $ JS.Ref (Name.fromKernel N.utils "Tuple0")
160 JsExpr $ JS.Ref (Name.fromKernel N.utils "Tuple0")
166
161
167− Name.Prod _ _ ->
162+ Mode.Prod _ _ ->
168 JsExpr $ JS.Int 0
163 JsExpr $ JS.Int 0
169
164
170 Opt.Tuple a b maybeC ->
165 Opt.Tuple a b maybeC ->
@@ -253,7 +248,7 @@ toChar =
253-- CTOR
248-- CTOR
254
249
255
250
256−generateCtor :: Mode -> N.Name -> Index.ZeroBased -> Int -> Code
251+generateCtor :: Mode.Mode -> N.Name -> Index.ZeroBased -> Int -> Code
257generateCtor mode name index arity =
252generateCtor mode name index arity =
258 let
253 let
259 argNames =
254 argNames =
@@ -261,8 +256,8 @@ generateCtor mode name index arity =
261
256
262 ctorTag =
257 ctorTag =
263 case mode of
258 case mode of
264− Name.Dev _ _ -> JS.String (N.toBuilder name)
259+ Mode.Dev _ _ -> JS.String (N.toBuilder name)
265− Name.Prod _ _ -> JS.Int (Index.toMachine index)
260+ Mode.Prod _ _ -> JS.Int (Index.toMachine index)
266 in
261 in
267 generateFunction argNames $ JsExpr $ JS.Object $
262 generateFunction argNames $ JsExpr $ JS.Object $
268 (Name.dollar, ctorTag) : map (\n -> (n, JS.Ref n)) argNames
263 (Name.dollar, ctorTag) : map (\n -> (n, JS.Ref n)) argNames
@@ -272,15 +267,26 @@ generateCtor mode name index arity =
272-- RECORDS
267-- RECORDS
273
268
274
269
275−generateRecord :: Mode -> Map.Map N.Name Opt.Expr -> JS.Expr
270+generateRecord :: Mode.Mode -> Map.Map N.Name Opt.Expr -> JS.Expr
276generateRecord mode fields =
271generateRecord mode fields =
277 let
272 let
278 toPair (field, value) =
273 toPair (field, value) =
279− (Name.fromField mode field, generateJsExpr mode value)
274+ (generateField mode field, generateJsExpr mode value)
280 in
275 in
281 JS.Object (map toPair (Map.toList fields))
276 JS.Object (map toPair (Map.toList fields))
282
277
283
278
279+generateField :: Mode.Mode -> N.Name -> Name.Name
280+generateField mode name =
281+ case mode of
282+ Mode.Dev _ _ ->
283+ Name.fromLocal name
284+
285+ Mode.Prod _ fields ->
286+ fields ! name
287+
288+
289+
284
290
285-- DEBUG
291-- DEBUG
286
292
@@ -355,7 +361,7 @@ funcHelpers =
355-- CALLS
361-- CALLS
356
362
357
363
358−generateCall :: Mode -> Opt.Expr -> [Opt.Expr] -> JS.Expr
364+generateCall :: Mode.Mode -> Opt.Expr -> [Opt.Expr] -> JS.Expr
359generateCall mode func args =
365generateCall mode func args =
360 case func of
366 case func of
361 Opt.VarGlobal global@(Opt.Global (ModuleName.Canonical pkg _) _) | pkg == Pkg.core ->
367 Opt.VarGlobal global@(Opt.Global (ModuleName.Canonical pkg _) _) | pkg == Pkg.core ->
@@ -363,10 +369,10 @@ generateCall mode func args =
363
369
364 Opt.VarBox _ ->
370 Opt.VarBox _ ->
365 case mode of
371 case mode of
366− Name.Dev _ _ ->
372+ Mode.Dev _ _ ->
367 generateCallHelp mode func args
373 generateCallHelp mode func args
368
374
369− Name.Prod _ _ ->
375+ Mode.Prod _ _ ->
370 case args of
376 case args of
371 [arg] ->
377 [arg] ->
372 generateJsExpr mode arg
378 generateJsExpr mode arg
@@ -378,7 +384,7 @@ generateCall mode func args =
378 generateCallHelp mode func args
384 generateCallHelp mode func args
379
385
380
386
381−generateCallHelp :: Mode -> Opt.Expr -> [Opt.Expr] -> JS.Expr
387+generateCallHelp :: Mode.Mode -> Opt.Expr -> [Opt.Expr] -> JS.Expr
382generateCallHelp mode func args =
388generateCallHelp mode func args =
383 generateNormalCall
389 generateNormalCall
384 (generateJsExpr mode func)
390 (generateJsExpr mode func)
@@ -411,7 +417,7 @@ callHelpers =
411-- CORE CALLS
417-- CORE CALLS
412
418
413
419
414−generateCoreCall :: Mode -> Opt.Global -> [Opt.Expr] -> JS.Expr
420+generateCoreCall :: Mode.Mode -> Opt.Global -> [Opt.Expr] -> JS.Expr
415generateCoreCall mode (Opt.Global home@(ModuleName.Canonical _ moduleName) name) args =
421generateCoreCall mode (Opt.Global home@(ModuleName.Canonical _ moduleName) name) args =
416 if moduleName == N.basics then
422 if moduleName == N.basics then
417 generateBasicsCall mode home name args
423 generateBasicsCall mode home name args
@@ -472,7 +478,7 @@ generateBitwiseCall home name args =
472 generateGlobalCall home name args
478 generateGlobalCall home name args
473
479
474
480
475−generateBasicsCall :: Mode -> ModuleName.Canonical -> N.Name -> [Opt.Expr] -> JS.Expr
481+generateBasicsCall :: Mode.Mode -> ModuleName.Canonical -> N.Name -> [Opt.Expr] -> JS.Expr
476generateBasicsCall mode home name args =
482generateBasicsCall mode home name args =
477 case args of
483 case args of
478 [elmArg] ->
484 [elmArg] ->
@@ -564,7 +570,7 @@ isLiteral expr =
564 False
570 False
565
571
566
572
567−decomposeL :: Mode -> Opt.Expr -> [Opt.Expr] -> JS.Expr
573+decomposeL :: Mode.Mode -> Opt.Expr -> [Opt.Expr] -> JS.Expr
568decomposeL mode expr funcs =
574decomposeL mode expr funcs =
569 case expr of
575 case expr of
570 Opt.Call (Opt.VarGlobal (Opt.Global home "composeL")) [left, func]
576 Opt.Call (Opt.VarGlobal (Opt.Global home "composeL")) [left, func]
@@ -576,7 +582,7 @@ decomposeL mode expr funcs =
576 Opt.Function [N.dollar] (foldr apply (Opt.VarLocal N.dollar) (expr:funcs))
582 Opt.Function [N.dollar] (foldr apply (Opt.VarLocal N.dollar) (expr:funcs))
577
583
578
584
579−decomposeR :: Mode -> [Opt.Expr] -> Opt.Expr -> JS.Expr
585+decomposeR :: Mode.Mode -> [Opt.Expr] -> Opt.Expr -> JS.Expr
580decomposeR mode funcs expr =
586decomposeR mode funcs expr =
581 case expr of
587 case expr of
582 Opt.Call (Opt.VarGlobal (Opt.Global home "composeR")) [func, right]
588 Opt.Call (Opt.VarGlobal (Opt.Global home "composeR")) [func, right]
@@ -601,7 +607,7 @@ apply func value =
601 Opt.Call func [value]
607 Opt.Call func [value]
602
608
603
609
604−append :: Mode -> Opt.Expr -> Opt.Expr -> JS.Expr
610+append :: Mode.Mode -> Opt.Expr -> Opt.Expr -> JS.Expr
605append mode left right =
611append mode left right =
606 let seqs = generateJsExpr mode left : toSeqs mode right in
612 let seqs = generateJsExpr mode left : toSeqs mode right in
607 if any isStringLiteral seqs then
613 if any isStringLiteral seqs then
@@ -615,7 +621,7 @@ jsAppend a b =
615 JS.Call (JS.Ref (Name.fromKernel N.utils "ap")) [a, b]
621 JS.Call (JS.Ref (Name.fromKernel N.utils "ap")) [a, b]
616
622
617
623
618−toSeqs :: Mode -> Opt.Expr -> [JS.Expr]
624+toSeqs :: Mode.Mode -> Opt.Expr -> [JS.Expr]
619toSeqs mode expr =
625toSeqs mode expr =
620 case expr of
626 case expr of
621 Opt.Call (Opt.VarGlobal (Opt.Global home "append")) [left, right]
627 Opt.Call (Opt.VarGlobal (Opt.Global home "append")) [left, right]
@@ -688,7 +694,7 @@ strictNEq left right =
688
694
689-- TODO check if JS minifiers collapse unnecessary temporary variables
695-- TODO check if JS minifiers collapse unnecessary temporary variables
690--
696--
691−generateTailCall :: Mode -> N.Name -> [(N.Name, Opt.Expr)] -> [JS.Stmt]
697+generateTailCall :: Mode.Mode -> N.Name -> [(N.Name, Opt.Expr)] -> [JS.Stmt]
692generateTailCall mode name args =
698generateTailCall mode name args =
693 let
699 let
694 toTempVars (argName, arg) =
700 toTempVars (argName, arg) =
@@ -707,7 +713,7 @@ generateTailCall mode name args =
707-- DEFINITIONS
713-- DEFINITIONS
708
714
709
715
710−generateDef :: Mode -> Opt.Def -> JS.Stmt
716+generateDef :: Mode.Mode -> Opt.Def -> JS.Stmt
711generateDef mode def =
717generateDef mode def =
712 case def of
718 case def of
713 Opt.Def name body ->
719 Opt.Def name body ->
@@ -717,7 +723,7 @@ generateDef mode def =
717 JS.Var [ (Name.fromLocal name, Just (codeToExpr (generateTailDef mode name argNames body))) ]
723 JS.Var [ (Name.fromLocal name, Just (codeToExpr (generateTailDef mode name argNames body))) ]
718
724
719
725
720−generateTailDef :: Mode -> N.Name -> [N.Name] -> Opt.Expr -> Code
726+generateTailDef :: Mode.Mode -> N.Name -> [N.Name] -> Opt.Expr -> Code
721generateTailDef mode name argNames body =
727generateTailDef mode name argNames body =
722 generateFunction (map Name.fromLocal argNames) $ JsBlock $
728 generateFunction (map Name.fromLocal argNames) $ JsBlock $
723 [ JS.Labelled (Name.fromLocal name) $
729 [ JS.Labelled (Name.fromLocal name) $
@@ -730,7 +736,7 @@ generateTailDef mode name argNames body =
730-- PATHS
736-- PATHS
731
737
732
738
733−generatePath :: Mode -> Opt.Path -> JS.Expr
739+generatePath :: Mode.Mode -> Opt.Path -> JS.Expr
734generatePath mode path =
740generatePath mode path =
735 case path of
741 case path of
736 Opt.Index index subPath ->
742 Opt.Index index subPath ->
@@ -740,14 +746,14 @@ generatePath mode path =
740 JS.Ref (Name.fromLocal name)
746 JS.Ref (Name.fromLocal name)
741
747
742 Opt.Field field subPath ->
748 Opt.Field field subPath ->
743− JS.Access (generatePath mode subPath) (Name.fromField mode field)
749+ JS.Access (generatePath mode subPath) (generateField mode field)
744
750
745 Opt.Unbox subPath ->
751 Opt.Unbox subPath ->
746 case mode of
752 case mode of
747− Name.Dev _ _ ->
753+ Mode.Dev _ _ ->
748 JS.Access (generatePath mode subPath) (Name.fromIndex Index.first)
754 JS.Access (generatePath mode subPath) (Name.fromIndex Index.first)
749
755
750− Name.Prod _ _ ->
756+ Mode.Prod _ _ ->
751 generatePath mode subPath
757 generatePath mode subPath
752
758
753
759
@@ -755,7 +761,7 @@ generatePath mode path =
755-- GENERATE IFS
761-- GENERATE IFS
756
762
757
763
758−generateIf :: Mode -> [(Opt.Expr, Opt.Expr)] -> Opt.Expr -> Code
764+generateIf :: Mode.Mode -> [(Opt.Expr, Opt.Expr)] -> Opt.Expr -> Code
759generateIf mode givenBranches givenFinal =
765generateIf mode givenBranches givenFinal =
760 let
766 let
761 (branches, final) =
767 (branches, final) =
@@ -820,12 +826,12 @@ crushIfsHelp visitedBranches unvisitedBranches final =
820-- CASE EXPRESSIONS
826-- CASE EXPRESSIONS
821
827
822
828
823−generateCase :: Mode -> N.Name -> N.Name -> Opt.Decider Opt.Choice -> [(Int, Opt.Expr)] -> [JS.Stmt]
829+generateCase :: Mode.Mode -> N.Name -> N.Name -> Opt.Decider Opt.Choice -> [(Int, Opt.Expr)] -> [JS.Stmt]
824generateCase mode label root decider jumps =
830generateCase mode label root decider jumps =
825 foldr (goto mode label) (generateDecider mode label root decider) jumps
831 foldr (goto mode label) (generateDecider mode label root decider) jumps
826
832
827
833
828−goto :: Mode -> N.Name -> (Int, Opt.Expr) -> [JS.Stmt] -> [JS.Stmt]
834+goto :: Mode.Mode -> N.Name -> (Int, Opt.Expr) -> [JS.Stmt] -> [JS.Stmt]
829goto mode label (index, branch) stmts =
835goto mode label (index, branch) stmts =
830 let
836 let
831 labeledDeciderStmt =
837 labeledDeciderStmt =
@@ -836,7 +842,7 @@ goto mode label (index, branch) stmts =
836 labeledDeciderStmt : codeToStmtList (generate mode branch)
842 labeledDeciderStmt : codeToStmtList (generate mode branch)
837
843
838
844
839−generateDecider :: Mode -> N.Name -> N.Name -> Opt.Decider Opt.Choice -> [JS.Stmt]
845+generateDecider :: Mode.Mode -> N.Name -> N.Name -> Opt.Decider Opt.Choice -> [JS.Stmt]
840generateDecider mode label root decisionTree =
846generateDecider mode label root decisionTree =
841 case decisionTree of
847 case decisionTree of
842 Opt.Leaf (Opt.Inline branch) ->
848 Opt.Leaf (Opt.Inline branch) ->
@@ -863,7 +869,7 @@ generateDecider mode label root decisionTree =
863 ]
869 ]
864
870
865
871
866−generateIfTest :: Mode -> N.Name -> (DT.Path, DT.Test) -> JS.Expr
872+generateIfTest :: Mode.Mode -> N.Name -> (DT.Path, DT.Test) -> JS.Expr
867generateIfTest mode root (path, test) =
873generateIfTest mode root (path, test) =
868 let
874 let
869 value = pathToJsExpr mode root path
875 value = pathToJsExpr mode root path
@@ -872,8 +878,8 @@ generateIfTest mode root (path, test) =
872 DT.IsCtor name index _ _ ->
878 DT.IsCtor name index _ _ ->
873 strictEq (JS.Access value Name.dollar) $
879 strictEq (JS.Access value Name.dollar) $
874 case mode of
880 case mode of
875− Name.Dev _ _ -> JS.String (N.toBuilder name)
881+ Mode.Dev _ _ -> JS.String (N.toBuilder name)
876− Name.Prod _ _ -> JS.Int (Index.toMachine index)
882+ Mode.Prod _ _ -> JS.Int (Index.toMachine index)
877
883
878 DT.IsInt int ->
884 DT.IsInt int ->
879 strictEq value (JS.Int int)
885 strictEq value (JS.Int int)
@@ -881,8 +887,8 @@ generateIfTest mode root (path, test) =
881 DT.IsChr char ->
887 DT.IsChr char ->
882 strictEq (JS.String (Text.encodeUtf8Builder char)) $
888 strictEq (JS.String (Text.encodeUtf8Builder char)) $
883 case mode of
889 case mode of
884− Name.Dev _ _ -> JS.Call (JS.Access value (Name.fromLocal "valueOf")) []
890+ Mode.Dev _ _ -> JS.Call (JS.Access value (Name.fromLocal "valueOf")) []
885− Name.Prod _ _ -> value
891+ Mode.Prod _ _ -> value
886
892
887 DT.IsStr string ->
893 DT.IsStr string ->
888 strictEq value (JS.String (Text.encodeUtf8Builder string))
894 strictEq value (JS.String (Text.encodeUtf8Builder string))
@@ -899,20 +905,20 @@ generateIfTest mode root (path, test) =
899
905
900
906
901
907
902−generateCaseBranch :: Mode -> N.Name -> N.Name -> (DT.Test, Opt.Decider Opt.Choice) -> JS.Case
908+generateCaseBranch :: Mode.Mode -> N.Name -> N.Name -> (DT.Test, Opt.Decider Opt.Choice) -> JS.Case
903generateCaseBranch mode label root (test, subTree) =
909generateCaseBranch mode label root (test, subTree) =
904 JS.Case
910 JS.Case
905 (generateCaseValue mode test)
911 (generateCaseValue mode test)
906 (generateDecider mode label root subTree)
912 (generateDecider mode label root subTree)
907
913
908
914
909−generateCaseValue :: Mode -> DT.Test -> JS.Expr
915+generateCaseValue :: Mode.Mode -> DT.Test -> JS.Expr
910generateCaseValue mode test =
916generateCaseValue mode test =
911 case test of
917 case test of
912 DT.IsCtor name index _ _ ->
918 DT.IsCtor name index _ _ ->
913 case mode of
919 case mode of
914− Name.Dev _ _ -> JS.String (N.toBuilder name)
920+ Mode.Dev _ _ -> JS.String (N.toBuilder name)
915− Name.Prod _ _ -> JS.Int (Index.toMachine index)
921+ Mode.Prod _ _ -> JS.Int (Index.toMachine index)
916
922
917 DT.IsInt int ->
923 DT.IsInt int ->
918 JS.Int int
924 JS.Int int
@@ -933,7 +939,7 @@ generateCaseValue mode test =
933 error "COMPILER BUG - there should never be three tests on a tuple"
939 error "COMPILER BUG - there should never be three tests on a tuple"
934
940
935
941
936−generateCaseTest :: Mode -> N.Name -> DT.Path -> DT.Test -> JS.Expr
942+generateCaseTest :: Mode.Mode -> N.Name -> DT.Path -> DT.Test -> JS.Expr
937generateCaseTest mode root path exampleTest =
943generateCaseTest mode root path exampleTest =
938 let
944 let
939 value = pathToJsExpr mode root path
945 value = pathToJsExpr mode root path
@@ -941,10 +947,10 @@ generateCaseTest mode root path exampleTest =
941 case exampleTest of
947 case exampleTest of
942 DT.IsCtor _ _ _ opts ->
948 DT.IsCtor _ _ _ opts ->
943 case mode of
949 case mode of
944− Name.Dev _ _ ->
950+ Mode.Dev _ _ ->
945 JS.Access value Name.dollar
951 JS.Access value Name.dollar
946
952
947− Name.Prod _ _ ->
953+ Mode.Prod _ _ ->
948 case opts of
954 case opts of
949 Can.Normal ->
955 Can.Normal ->
950 JS.Access value Name.dollar
956 JS.Access value Name.dollar
@@ -963,10 +969,10 @@ generateCaseTest mode root path exampleTest =
963
969
964 DT.IsChr _ ->
970 DT.IsChr _ ->
965 case mode of
971 case mode of
966− Name.Dev _ _ ->
972+ Mode.Dev _ _ ->
967 JS.Call (JS.Access value (Name.fromLocal "valueOf")) []
973 JS.Call (JS.Access value (Name.fromLocal "valueOf")) []
968
974
969− Name.Prod _ _ ->
975+ Mode.Prod _ _ ->
970 value
976 value
971
977
972 DT.IsCons ->
978 DT.IsCons ->
@@ -983,7 +989,7 @@ generateCaseTest mode root path exampleTest =
983-- PATTERN PATHS
989-- PATTERN PATHS
984
990
985
991
986−pathToJsExpr :: Mode -> N.Name -> DT.Path -> JS.Expr
992+pathToJsExpr :: Mode.Mode -> N.Name -> DT.Path -> JS.Expr
987pathToJsExpr mode root path =
993pathToJsExpr mode root path =
988 case path of
994 case path of
989 DT.Index index subPath ->
995 DT.Index index subPath ->
@@ -991,10 +997,10 @@ pathToJsExpr mode root path =
991
997
992 DT.Unbox subPath ->
998 DT.Unbox subPath ->
993 case mode of
999 case mode of
994− Name.Dev _ _ ->
1000+ Mode.Dev _ _ ->
995 JS.Access (pathToJsExpr mode root subPath) (Name.fromIndex Index.first)
1001 JS.Access (pathToJsExpr mode root subPath) (Name.fromIndex Index.first)
996
1002
997− Name.Prod _ _ ->
1003+ Mode.Prod _ _ ->
998 pathToJsExpr mode root subPath
1004 pathToJsExpr mode root subPath
999
1005
1000 DT.Empty ->
1006 DT.Empty ->
@@ -1005,8 +1011,8 @@ pathToJsExpr mode root path =
1005-- GENERATE MAIN
1011-- GENERATE MAIN
1006
1012
1007
1013
1008−generateMain :: Mode -> I.Interfaces -> ModuleName.Canonical -> Opt.Main -> JS.Expr
1014+generateMain :: Mode.Mode -> ModuleName.Canonical -> Opt.Main -> JS.Expr
1009−generateMain mode interfaces home main =
1015+generateMain mode home main =
1010 case main of
1016 case main of
1011 Opt.Static ->
1017 Opt.Static ->
1012 JS.Ref (Name.fromKernel N.virtualDom "init")
1018 JS.Ref (Name.fromKernel N.virtualDom "init")
@@ -1017,7 +1023,7 @@ generateMain mode interfaces home main =
1017 Opt.Dynamic msgType decoder ->
1023 Opt.Dynamic msgType decoder ->
1018 JS.Ref (Name.fromGlobal home "main")
1024 JS.Ref (Name.fromGlobal home "main")
1019 # generateJsExpr mode decoder
1025 # generateJsExpr mode decoder
1020− # toDebugMetadata mode interfaces msgType
1026+ # toDebugMetadata mode msgType
1021
1027
1022
1028
1023(#) :: JS.Expr -> JS.Expr -> JS.Expr
1029(#) :: JS.Expr -> JS.Expr -> JS.Expr
@@ -1025,19 +1031,17 @@ generateMain mode interfaces home main =
1025 JS.Call func [arg]
1031 JS.Call func [arg]
1026
1032
1027
1033
1028−toDebugMetadata :: Mode -> I.Interfaces -> Can.Type -> JS.Expr
1034+toDebugMetadata :: Mode.Mode -> Can.Type -> JS.Expr
1029−toDebugMetadata mode interfaces msgType =
1035+toDebugMetadata mode msgType =
1030 case mode of
1036 case mode of
1031− Name.Prod _ _ ->
1037+ Mode.Prod _ _ ->
1032 JS.Int 0
1038 JS.Int 0
1033
1039
1034− Name.Dev _ debugger ->
1040+ Mode.Dev _ Nothing ->
1035− case debugger of
1036− Name.DebuggerOff ->
1037− JS.Int 0
1041+ JS.Int 0
1038
1042
1039− Name.DebuggerOn ->
1043+ Mode.Dev _ (Just interfaces) ->
1040− JS.Json $ Encode.object $
1044+ JS.Json $ Encode.object $
1041− [ ("versions", Encode.object [ ("elm", Pkg.encodeVersion Version.version) ])
1045+ [ ("versions", Encode.object [ ("elm", Pkg.encodeVersion Version.version) ])
1042− , ("types", Type.encodeMetadata (Extract.fromMsg interfaces msgType))
1046+ , ("types", Type.encodeMetadata (Extract.fromMsg interfaces msgType))
1043− ]
1047+ ]