on master help sign in
Flow Generate.JavaScript.Mode through other Generate modules

This likely resolves a bug in the old way of generating record fields. Before we just took what the programmer said, but now we use Name.fromLocal which will make sure it is not a reserved word. Probably need a corresponding thing in Debug.toString to remove the _ before these names. Added note about it to my todo list.

commite4797db8096918b6be8f045cbceaa479d2d8e2e2 authorEvan Czaplicki <evancz@users.noreply.github.com> dateTue 10 Apr 2018, 16:26 (9 years ago) parent6d686c5
2 files changed+124−143
compiler/src/Generate/JavaScript.hs+42−65 compiler/src/Generate/JavaScript/Expression.hs+82−78
compiler/src/Generate/JavaScript.hs+42−65
@@ -1,7 +1,6 @@
11{-# LANGUAGE OverloadedStrings #-}
22module Generate.JavaScript
3− ( Mode(..)
4− , Output(..)
3+ ( Output(..)
54 , generate
65 , generateForRepl
76 )
@@ -29,6 +28,7 @@ import qualified Elm.Name as N
2928import qualified Generate.JavaScript.Builder as JS
3029import qualified Generate.JavaScript.Expression as Expr
3130import qualified Generate.JavaScript.Name as Name
31+import qualified Generate.JavaScript.Mode as Mode
3232import qualified Reporting.Doc as D
3333
3434
@@ -36,16 +36,13 @@ import qualified Reporting.Doc as D
3636-- GENERATE MAINS
3737
3838
39−data Mode = Prod | Dev | Debug
40−
41−
4239data Output
4340 = None
4441 | Some N.Name [N.Name] B.Builder
4542
4643
47−generate :: Mode -> Name.Target -> I.Interfaces -> Opt.Graph -> [ModuleName.Canonical] -> Output
48−generate mode target interfaces (Opt.Graph mains graph fields) roots =
44+generate :: Mode.Mode -> Opt.Graph -> [ModuleName.Canonical] -> Output
45+generate mode (Opt.Graph mains graph _fields) roots =
4946 let
5047 rootSet = Set.fromList roots
5148 rootMap = Map.restrictKeys mains rootSet
@@ -56,31 +53,17 @@ generate mode target interfaces (Opt.Graph mains graph fields) roots =
5653
5754 name:names ->
5855 let
59− realMode = toRealMode mode target fields
60− state = Map.foldrWithKey (addMain realMode graph) emptyState rootMap
61− builder = stateToBuilder state <> toMainExports realMode interfaces rootMap
56+ state = Map.foldrWithKey (addMain mode graph) emptyState rootMap
57+ builder = stateToBuilder state <> toMainExports mode rootMap
6258 in
6359 Some name names builder
6460
6561
66−addMain :: Name.Mode -> Graph -> ModuleName.Canonical -> main -> State -> State
62+addMain :: Mode.Mode -> Graph -> ModuleName.Canonical -> main -> State -> State
6763addMain mode graph home _ state =
6864 addGlobal mode graph state (Opt.Global home "main")
6965
7066
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−
8467
8568-- GENERATE FOR REPL
8669
@@ -88,7 +71,7 @@ toRealMode mode target fields =
8871generateForRepl :: Opt.Graph -> I.Interface -> ModuleName.Canonical -> N.Name -> B.Builder
8972generateForRepl (Opt.Graph _ graph _) iface home name =
9073 let
91− mode = Name.Dev Name.Server Name.DebuggerOff
74+ mode = Mode.dev Mode.Server
9275 debugState = addGlobal mode graph emptyState (Opt.Global ModuleName.debug "toString")
9376 evalState = addGlobal mode graph debugState (Opt.Global home name)
9477 in
@@ -139,7 +122,7 @@ stateToBuilder (State revBuilders _) =
139122type Graph = Map.Map Opt.Global Opt.Node
140123
141124
142−addGlobal :: Name.Mode -> Graph -> State -> Opt.Global -> State
125+addGlobal :: Mode.Mode -> Graph -> State -> Opt.Global -> State
143126addGlobal mode graph state@(State builders seen) global =
144127 if Set.member global seen then
145128 state
@@ -148,7 +131,7 @@ addGlobal mode graph state@(State builders seen) global =
148131 State builders (Set.insert global seen)
149132
150133
151−addGlobalHelp :: Name.Mode -> Graph -> Opt.Global -> State -> State
134+addGlobalHelp :: Mode.Mode -> Graph -> Opt.Global -> State -> State
152135addGlobalHelp mode graph global state =
153136 let
154137 addDeps deps someState =
@@ -184,7 +167,7 @@ addGlobalHelp mode graph global state =
184167
185168 Opt.Kernel (Opt.KContent clientChunks clientDeps) maybeServer ->
186169 case maybeServer of
187− Just (Opt.KContent serverChunks serverDeps) | Name.isServer mode ->
170+ Just (Opt.KContent serverChunks serverDeps) | Mode.isServer mode ->
188171 addBuilder (addDeps serverDeps state) (generateKernel mode serverChunks)
189172
190173 _ ->
@@ -230,7 +213,7 @@ var (Opt.Global home name) code =
230213-- GENERATE CYCLES
231214
232215
233−generateCycle :: Name.Mode -> Opt.Global -> [(N.Name, Opt.Expr)] -> JS.Stmt
216+generateCycle :: Mode.Mode -> Opt.Global -> [(N.Name, Opt.Expr)] -> JS.Stmt
234217generateCycle mode (Opt.Global home _) cycle =
235218 let
236219 safeDefs = map (generateSafeCycle mode home) cycle
@@ -238,10 +221,10 @@ generateCycle mode (Opt.Global home _) cycle =
238221 block = JS.Block (safeDefs ++ realDefs)
239222 in
240223 case mode of
241− Name.Prod _ _ ->
224+ Mode.Prod _ _ ->
242225 block
243226
244− Name.Dev _ _ ->
227+ Mode.Dev _ _ ->
245228 JS.Try block Name.dollar $ JS.Throw $ JS.String $
246229 "The following top-level definitions are causing infinite recursion:\\n"
247230 <> drawCycle (map fst cycle)
@@ -250,7 +233,7 @@ generateCycle mode (Opt.Global home _) cycle =
250233 <> " to learn how to fix it!"
251234
252235
253−generateSafeCycle :: Name.Mode -> ModuleName.Canonical -> (N.Name, Opt.Expr) -> JS.Stmt
236+generateSafeCycle :: Mode.Mode -> ModuleName.Canonical -> (N.Name, Opt.Expr) -> JS.Stmt
254237generateSafeCycle mode home (name, expr) =
255238 JS.FunctionStmt (Name.fromCycle home name) [] $
256239 Expr.codeToStmtList (Expr.generate mode expr)
@@ -285,12 +268,12 @@ drawCycle names =
285268-- GENERATE KERNEL
286269
287270
288−generateKernel :: Name.Mode -> [Opt.KChunk] -> B.Builder
271+generateKernel :: Mode.Mode -> [Opt.KChunk] -> B.Builder
289272generateKernel mode chunks =
290273 List.foldl' (addChunk mode) mempty chunks
291274
292275
293−addChunk :: Name.Mode -> B.Builder -> Opt.KChunk -> B.Builder
276+addChunk :: Mode.Mode -> B.Builder -> Opt.KChunk -> B.Builder
294277addChunk mode builder chunk =
295278 case chunk of
296279 Opt.JS javascript ->
@@ -303,7 +286,7 @@ addChunk mode builder chunk =
303286 Name.toBuilder (Name.fromKernel home name) <> builder
304287
305288 Opt.ElmField name ->
306− Name.toBuilder (Name.fromField mode name) <> builder
289+ Name.toBuilder (Expr.generateField mode name) <> builder
307290
308291 Opt.JsField int ->
309292 Name.toBuilder (Name.fromInt int) <> builder
@@ -313,18 +296,18 @@ addChunk mode builder chunk =
313296
314297 Opt.Debug ->
315298 case mode of
316− Name.Dev _ _ ->
299+ Mode.Dev _ _ ->
317300 builder
318301
319− Name.Prod _ _ ->
302+ Mode.Prod _ _ ->
320303 "_UNUSED" <> builder
321304
322305 Opt.Prod ->
323306 case mode of
324− Name.Dev _ _ ->
307+ Mode.Dev _ _ ->
325308 "_UNUSED" <> builder
326309
327− Name.Prod _ _ ->
310+ Mode.Prod _ _ ->
328311 builder
329312
330313
@@ -332,15 +315,15 @@ addChunk mode builder chunk =
332315-- GENERATE ENUM
333316
334317
335−generateEnum :: Name.Mode -> Opt.Global -> N.Name -> Index.ZeroBased -> JS.Stmt
318+generateEnum :: Mode.Mode -> Opt.Global -> N.Name -> Index.ZeroBased -> JS.Stmt
336319generateEnum mode (Opt.Global home name) ctorName index =
337320 let
338321 definition =
339322 case mode of
340− Name.Dev _ _ ->
323+ Mode.Dev _ _ ->
341324 Expr.codeToExpr (Expr.generateCtor mode ctorName index 0)
342325
343− Name.Prod _ _ ->
326+ Mode.Prod _ _ ->
344327 JS.Int (Index.toMachine index)
345328 in
346329 JS.Var [ (Name.fromGlobal home name, Just definition) ]
@@ -350,15 +333,15 @@ generateEnum mode (Opt.Global home name) ctorName index =
350333-- GENERATE BOX
351334
352335
353−generateBox :: Name.Mode -> Opt.Global -> N.Name -> JS.Stmt
336+generateBox :: Mode.Mode -> Opt.Global -> N.Name -> JS.Stmt
354337generateBox mode (Opt.Global home name) ctorName =
355338 let
356339 definition =
357340 case mode of
358− Name.Dev _ _ ->
341+ Mode.Dev _ _ ->
359342 Expr.codeToExpr (Expr.generateCtor mode ctorName Index.first 1)
360343
361− Name.Prod _ _ ->
344+ Mode.Prod _ _ ->
362345 JS.Ref (Name.fromGlobal ModuleName.basics N.identity)
363346 in
364347 JS.Var [ (Name.fromGlobal home name, Just definition) ]
@@ -368,7 +351,7 @@ generateBox mode (Opt.Global home name) ctorName =
368351-- GENERATE PORTS
369352
370353
371−generatePort :: Name.Mode -> Opt.Global -> N.Name -> Opt.Expr -> JS.Stmt
354+generatePort :: Mode.Mode -> Opt.Global -> N.Name -> Opt.Expr -> JS.Stmt
372355generatePort mode (Opt.Global home name) makePort converter =
373356 let
374357 definition =
@@ -384,7 +367,7 @@ generatePort mode (Opt.Global home name) makePort converter =
384367-- GENERATE MANAGER
385368
386369
387−generateManager :: Name.Mode -> Graph -> Opt.Global -> Opt.EffectsType -> State -> State
370+generateManager :: Mode.Mode -> Graph -> Opt.Global -> Opt.EffectsType -> State -> State
388371generateManager mode graph (Opt.Global home@(ModuleName.Canonical _ moduleName) _) effectsType state =
389372 let
390373 managerLVar =
@@ -450,21 +433,17 @@ generateManagerHelp home effectsType =
450433-- MAIN EXPORTS
451434
452435
453−toMainExports :: Name.Mode -> I.Interfaces -> Map.Map ModuleName.Canonical Opt.Main -> B.Builder
454−toMainExports mode interfaces mains =
436+toMainExports :: Mode.Mode -> Map.Map ModuleName.Canonical Opt.Main -> B.Builder
437+toMainExports mode mains =
455438 let
456− export =
457− Name.fromKernel N.platform "export"
458−
459− exports =
460− generateExports mode interfaces $
461− Map.foldrWithKey addToTrie emptyTrie mains
439+ export = Name.fromKernel N.platform "export"
440+ exports = generateExports mode (Map.foldrWithKey addToTrie emptyTrie mains)
462441 in
463442 Name.toBuilder export <> "(" <> exports <> ");"
464443
465444
466−generateExports :: Name.Mode -> I.Interfaces -> Trie -> B.Builder
467−generateExports mode interfaces (Trie maybeMain subs) =
445+generateExports :: Mode.Mode -> Trie -> B.Builder
446+generateExports mode (Trie maybeMain subs) =
468447 let
469448 object =
470449 case Map.toList subs of
@@ -473,23 +452,21 @@ generateExports mode interfaces (Trie maybeMain subs) =
473452
474453 (name, subTrie) : otherSubTries ->
475454 "{'" <> Text.encodeUtf8Builder name <> "':"
476− <> generateExports mode interfaces subTrie
477− <> List.foldl' (addSubTrie mode interfaces) "}" otherSubTries
455+ <> generateExports mode subTrie
456+ <> List.foldl' (addSubTrie mode) "}" otherSubTries
478457 in
479458 case maybeMain of
480459 Nothing ->
481460 object
482461
483462 Just (home, main) ->
484− let initialize = Expr.generateMain mode interfaces home main in
463+ let initialize = Expr.generateMain mode home main in
485464 JS.exprToBuilder initialize <> "(" <> object <> ")"
486465
487466
488−addSubTrie :: Name.Mode -> I.Interfaces -> B.Builder -> (Text.Text, Trie) -> B.Builder
489−addSubTrie mode interfaces end (name, trie) =
490− ",'" <> Text.encodeUtf8Builder name <> "':"
491− <> generateExports mode interfaces trie
492− <> end
467+addSubTrie :: Mode.Mode -> B.Builder -> (Text.Text, Trie) -> B.Builder
468+addSubTrie mode end (name, trie) =
469+ ",'" <> Text.encodeUtf8Builder name <> "':" <> generateExports mode trie <> end
493470
494471
495472
compiler/src/Generate/JavaScript/Expression.hs+82−78
@@ -2,6 +2,7 @@
22module Generate.JavaScript.Expression
33 ( generate
44 , generateCtor
5+ , generateField
56 , generateTailDef
67 , generateMain
78 , Code
@@ -13,6 +14,7 @@ module Generate.JavaScript.Expression
1314
1415import qualified Data.IntMap as IntMap
1516import qualified Data.List as List
17+import Data.Map ((!))
1618import qualified Data.Map as Map
1719import qualified Data.Text.Encoding as Text
1820
@@ -22,11 +24,11 @@ import qualified AST.Module.Name as ModuleName
2224import qualified Data.Index as Index
2325import qualified Elm.Compiler.Type as Type
2426import qualified Elm.Compiler.Type.Extract as Extract
25−import qualified Elm.Interface as I
2627import qualified Elm.Name as N
2728import qualified Elm.Package as Pkg
2829import qualified Elm.Compiler.Version as Version
2930import qualified Generate.JavaScript.Builder as JS
31+import qualified Generate.JavaScript.Mode as Mode
3032import qualified Generate.JavaScript.Name as Name
3133import qualified Json.Encode as Encode
3234import qualified Optimize.DecisionTree as DT
@@ -34,22 +36,15 @@ import qualified Reporting.Region as R
3436
3537
3638
37−-- ENVIRONMENT
38−
39−
40−type Mode = Name.Mode
41−
42−
43−
4439-- EXPRESSIONS
4540
4641
47−generateJsExpr :: Mode -> Opt.Expr -> JS.Expr
42+generateJsExpr :: Mode.Mode -> Opt.Expr -> JS.Expr
4843generateJsExpr mode expression =
4944 codeToExpr (generate mode expression)
5045
5146
52−generate :: Mode -> Opt.Expr -> Code
47+generate :: Mode.Mode -> Opt.Expr -> Code
5348generate mode expression =
5449 case expression of
5550 Opt.Bool bool ->
@@ -58,10 +53,10 @@ generate mode expression =
5853 Opt.Chr char ->
5954 JsExpr $
6055 case mode of
61− Name.Dev _ _ ->
56+ Mode.Dev _ _ ->
6257 JS.Call toChar [ JS.String (Text.encodeUtf8Builder char) ]
6358
64− Name.Prod _ _ ->
59+ Mode.Prod _ _ ->
6560 JS.String (Text.encodeUtf8Builder char)
6661
6762 Opt.Str string ->
@@ -81,17 +76,17 @@ generate mode expression =
8176
8277 Opt.VarEnum (Opt.Global home name) index ->
8378 case mode of
84− Name.Dev _ _ ->
79+ Mode.Dev _ _ ->
8580 JsExpr $ JS.Ref (Name.fromGlobal home name)
8681
87− Name.Prod _ _ ->
82+ Mode.Prod _ _ ->
8883 JsExpr $ JS.Int (Index.toMachine index)
8984
9085 Opt.VarBox (Opt.Global home name) ->
9186 JsExpr $ JS.Ref $
9287 case mode of
93− Name.Dev _ _ -> Name.fromGlobal home name
94− Name.Prod _ _ -> Name.fromGlobal ModuleName.basics N.identity
88+ Mode.Dev _ _ -> Name.fromGlobal home name
89+ Mode.Prod _ _ -> Name.fromGlobal ModuleName.basics N.identity
9590
9691 Opt.VarCycle home name ->
9792 JsExpr $ JS.Call (JS.Ref (Name.fromCycle home name)) []
@@ -143,11 +138,11 @@ generate mode expression =
143138 Opt.Accessor field ->
144139 JsExpr $ JS.Function Nothing [Name.dollar]
145140 [ JS.Return $ Just $
146− JS.Access (JS.Ref Name.dollar) (Name.fromField mode field)
141+ JS.Access (JS.Ref Name.dollar) (generateField mode field)
147142 ]
148143
149144 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)
151146
152147 Opt.Update record fields ->
153148 JsExpr $
@@ -161,10 +156,10 @@ generate mode expression =
161156
162157 Opt.Unit ->
163158 case mode of
164− Name.Dev _ _ ->
159+ Mode.Dev _ _ ->
165160 JsExpr $ JS.Ref (Name.fromKernel N.utils "Tuple0")
166161
167− Name.Prod _ _ ->
162+ Mode.Prod _ _ ->
168163 JsExpr $ JS.Int 0
169164
170165 Opt.Tuple a b maybeC ->
@@ -253,7 +248,7 @@ toChar =
253248-- CTOR
254249
255250
256−generateCtor :: Mode -> N.Name -> Index.ZeroBased -> Int -> Code
251+generateCtor :: Mode.Mode -> N.Name -> Index.ZeroBased -> Int -> Code
257252generateCtor mode name index arity =
258253 let
259254 argNames =
@@ -261,8 +256,8 @@ generateCtor mode name index arity =
261256
262257 ctorTag =
263258 case mode of
264− Name.Dev _ _ -> JS.String (N.toBuilder name)
265− Name.Prod _ _ -> JS.Int (Index.toMachine index)
259+ Mode.Dev _ _ -> JS.String (N.toBuilder name)
260+ Mode.Prod _ _ -> JS.Int (Index.toMachine index)
266261 in
267262 generateFunction argNames $ JsExpr $ JS.Object $
268263 (Name.dollar, ctorTag) : map (\n -> (n, JS.Ref n)) argNames
@@ -272,15 +267,26 @@ generateCtor mode name index arity =
272267-- RECORDS
273268
274269
275−generateRecord :: Mode -> Map.Map N.Name Opt.Expr -> JS.Expr
270+generateRecord :: Mode.Mode -> Map.Map N.Name Opt.Expr -> JS.Expr
276271generateRecord mode fields =
277272 let
278273 toPair (field, value) =
279− (Name.fromField mode field, generateJsExpr mode value)
274+ (generateField mode field, generateJsExpr mode value)
280275 in
281276 JS.Object (map toPair (Map.toList fields))
282277
283278
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+
284290
285291-- DEBUG
286292
@@ -355,7 +361,7 @@ funcHelpers =
355361-- CALLS
356362
357363
358−generateCall :: Mode -> Opt.Expr -> [Opt.Expr] -> JS.Expr
364+generateCall :: Mode.Mode -> Opt.Expr -> [Opt.Expr] -> JS.Expr
359365generateCall mode func args =
360366 case func of
361367 Opt.VarGlobal global@(Opt.Global (ModuleName.Canonical pkg _) _) | pkg == Pkg.core ->
@@ -363,10 +369,10 @@ generateCall mode func args =
363369
364370 Opt.VarBox _ ->
365371 case mode of
366− Name.Dev _ _ ->
372+ Mode.Dev _ _ ->
367373 generateCallHelp mode func args
368374
369− Name.Prod _ _ ->
375+ Mode.Prod _ _ ->
370376 case args of
371377 [arg] ->
372378 generateJsExpr mode arg
@@ -378,7 +384,7 @@ generateCall mode func args =
378384 generateCallHelp mode func args
379385
380386
381−generateCallHelp :: Mode -> Opt.Expr -> [Opt.Expr] -> JS.Expr
387+generateCallHelp :: Mode.Mode -> Opt.Expr -> [Opt.Expr] -> JS.Expr
382388generateCallHelp mode func args =
383389 generateNormalCall
384390 (generateJsExpr mode func)
@@ -411,7 +417,7 @@ callHelpers =
411417-- CORE CALLS
412418
413419
414−generateCoreCall :: Mode -> Opt.Global -> [Opt.Expr] -> JS.Expr
420+generateCoreCall :: Mode.Mode -> Opt.Global -> [Opt.Expr] -> JS.Expr
415421generateCoreCall mode (Opt.Global home@(ModuleName.Canonical _ moduleName) name) args =
416422 if moduleName == N.basics then
417423 generateBasicsCall mode home name args
@@ -472,7 +478,7 @@ generateBitwiseCall home name args =
472478 generateGlobalCall home name args
473479
474480
475−generateBasicsCall :: Mode -> ModuleName.Canonical -> N.Name -> [Opt.Expr] -> JS.Expr
481+generateBasicsCall :: Mode.Mode -> ModuleName.Canonical -> N.Name -> [Opt.Expr] -> JS.Expr
476482generateBasicsCall mode home name args =
477483 case args of
478484 [elmArg] ->
@@ -564,7 +570,7 @@ isLiteral expr =
564570 False
565571
566572
567−decomposeL :: Mode -> Opt.Expr -> [Opt.Expr] -> JS.Expr
573+decomposeL :: Mode.Mode -> Opt.Expr -> [Opt.Expr] -> JS.Expr
568574decomposeL mode expr funcs =
569575 case expr of
570576 Opt.Call (Opt.VarGlobal (Opt.Global home "composeL")) [left, func]
@@ -576,7 +582,7 @@ decomposeL mode expr funcs =
576582 Opt.Function [N.dollar] (foldr apply (Opt.VarLocal N.dollar) (expr:funcs))
577583
578584
579−decomposeR :: Mode -> [Opt.Expr] -> Opt.Expr -> JS.Expr
585+decomposeR :: Mode.Mode -> [Opt.Expr] -> Opt.Expr -> JS.Expr
580586decomposeR mode funcs expr =
581587 case expr of
582588 Opt.Call (Opt.VarGlobal (Opt.Global home "composeR")) [func, right]
@@ -601,7 +607,7 @@ apply func value =
601607 Opt.Call func [value]
602608
603609
604−append :: Mode -> Opt.Expr -> Opt.Expr -> JS.Expr
610+append :: Mode.Mode -> Opt.Expr -> Opt.Expr -> JS.Expr
605611append mode left right =
606612 let seqs = generateJsExpr mode left : toSeqs mode right in
607613 if any isStringLiteral seqs then
@@ -615,7 +621,7 @@ jsAppend a b =
615621 JS.Call (JS.Ref (Name.fromKernel N.utils "ap")) [a, b]
616622
617623
618−toSeqs :: Mode -> Opt.Expr -> [JS.Expr]
624+toSeqs :: Mode.Mode -> Opt.Expr -> [JS.Expr]
619625toSeqs mode expr =
620626 case expr of
621627 Opt.Call (Opt.VarGlobal (Opt.Global home "append")) [left, right]
@@ -688,7 +694,7 @@ strictNEq left right =
688694
689695-- TODO check if JS minifiers collapse unnecessary temporary variables
690696--
691−generateTailCall :: Mode -> N.Name -> [(N.Name, Opt.Expr)] -> [JS.Stmt]
697+generateTailCall :: Mode.Mode -> N.Name -> [(N.Name, Opt.Expr)] -> [JS.Stmt]
692698generateTailCall mode name args =
693699 let
694700 toTempVars (argName, arg) =
@@ -707,7 +713,7 @@ generateTailCall mode name args =
707713-- DEFINITIONS
708714
709715
710−generateDef :: Mode -> Opt.Def -> JS.Stmt
716+generateDef :: Mode.Mode -> Opt.Def -> JS.Stmt
711717generateDef mode def =
712718 case def of
713719 Opt.Def name body ->
@@ -717,7 +723,7 @@ generateDef mode def =
717723 JS.Var [ (Name.fromLocal name, Just (codeToExpr (generateTailDef mode name argNames body))) ]
718724
719725
720−generateTailDef :: Mode -> N.Name -> [N.Name] -> Opt.Expr -> Code
726+generateTailDef :: Mode.Mode -> N.Name -> [N.Name] -> Opt.Expr -> Code
721727generateTailDef mode name argNames body =
722728 generateFunction (map Name.fromLocal argNames) $ JsBlock $
723729 [ JS.Labelled (Name.fromLocal name) $
@@ -730,7 +736,7 @@ generateTailDef mode name argNames body =
730736-- PATHS
731737
732738
733−generatePath :: Mode -> Opt.Path -> JS.Expr
739+generatePath :: Mode.Mode -> Opt.Path -> JS.Expr
734740generatePath mode path =
735741 case path of
736742 Opt.Index index subPath ->
@@ -740,14 +746,14 @@ generatePath mode path =
740746 JS.Ref (Name.fromLocal name)
741747
742748 Opt.Field field subPath ->
743− JS.Access (generatePath mode subPath) (Name.fromField mode field)
749+ JS.Access (generatePath mode subPath) (generateField mode field)
744750
745751 Opt.Unbox subPath ->
746752 case mode of
747− Name.Dev _ _ ->
753+ Mode.Dev _ _ ->
748754 JS.Access (generatePath mode subPath) (Name.fromIndex Index.first)
749755
750− Name.Prod _ _ ->
756+ Mode.Prod _ _ ->
751757 generatePath mode subPath
752758
753759
@@ -755,7 +761,7 @@ generatePath mode path =
755761-- GENERATE IFS
756762
757763
758−generateIf :: Mode -> [(Opt.Expr, Opt.Expr)] -> Opt.Expr -> Code
764+generateIf :: Mode.Mode -> [(Opt.Expr, Opt.Expr)] -> Opt.Expr -> Code
759765generateIf mode givenBranches givenFinal =
760766 let
761767 (branches, final) =
@@ -820,12 +826,12 @@ crushIfsHelp visitedBranches unvisitedBranches final =
820826-- CASE EXPRESSIONS
821827
822828
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]
824830generateCase mode label root decider jumps =
825831 foldr (goto mode label) (generateDecider mode label root decider) jumps
826832
827833
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]
829835goto mode label (index, branch) stmts =
830836 let
831837 labeledDeciderStmt =
@@ -836,7 +842,7 @@ goto mode label (index, branch) stmts =
836842 labeledDeciderStmt : codeToStmtList (generate mode branch)
837843
838844
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]
840846generateDecider mode label root decisionTree =
841847 case decisionTree of
842848 Opt.Leaf (Opt.Inline branch) ->
@@ -863,7 +869,7 @@ generateDecider mode label root decisionTree =
863869 ]
864870
865871
866−generateIfTest :: Mode -> N.Name -> (DT.Path, DT.Test) -> JS.Expr
872+generateIfTest :: Mode.Mode -> N.Name -> (DT.Path, DT.Test) -> JS.Expr
867873generateIfTest mode root (path, test) =
868874 let
869875 value = pathToJsExpr mode root path
@@ -872,8 +878,8 @@ generateIfTest mode root (path, test) =
872878 DT.IsCtor name index _ _ ->
873879 strictEq (JS.Access value Name.dollar) $
874880 case mode of
875− Name.Dev _ _ -> JS.String (N.toBuilder name)
876− Name.Prod _ _ -> JS.Int (Index.toMachine index)
881+ Mode.Dev _ _ -> JS.String (N.toBuilder name)
882+ Mode.Prod _ _ -> JS.Int (Index.toMachine index)
877883
878884 DT.IsInt int ->
879885 strictEq value (JS.Int int)
@@ -881,8 +887,8 @@ generateIfTest mode root (path, test) =
881887 DT.IsChr char ->
882888 strictEq (JS.String (Text.encodeUtf8Builder char)) $
883889 case mode of
884− Name.Dev _ _ -> JS.Call (JS.Access value (Name.fromLocal "valueOf")) []
885− Name.Prod _ _ -> value
890+ Mode.Dev _ _ -> JS.Call (JS.Access value (Name.fromLocal "valueOf")) []
891+ Mode.Prod _ _ -> value
886892
887893 DT.IsStr string ->
888894 strictEq value (JS.String (Text.encodeUtf8Builder string))
@@ -899,20 +905,20 @@ generateIfTest mode root (path, test) =
899905
900906
901907
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
903909generateCaseBranch mode label root (test, subTree) =
904910 JS.Case
905911 (generateCaseValue mode test)
906912 (generateDecider mode label root subTree)
907913
908914
909−generateCaseValue :: Mode -> DT.Test -> JS.Expr
915+generateCaseValue :: Mode.Mode -> DT.Test -> JS.Expr
910916generateCaseValue mode test =
911917 case test of
912918 DT.IsCtor name index _ _ ->
913919 case mode of
914− Name.Dev _ _ -> JS.String (N.toBuilder name)
915− Name.Prod _ _ -> JS.Int (Index.toMachine index)
920+ Mode.Dev _ _ -> JS.String (N.toBuilder name)
921+ Mode.Prod _ _ -> JS.Int (Index.toMachine index)
916922
917923 DT.IsInt int ->
918924 JS.Int int
@@ -933,7 +939,7 @@ generateCaseValue mode test =
933939 error "COMPILER BUG - there should never be three tests on a tuple"
934940
935941
936−generateCaseTest :: Mode -> N.Name -> DT.Path -> DT.Test -> JS.Expr
942+generateCaseTest :: Mode.Mode -> N.Name -> DT.Path -> DT.Test -> JS.Expr
937943generateCaseTest mode root path exampleTest =
938944 let
939945 value = pathToJsExpr mode root path
@@ -941,10 +947,10 @@ generateCaseTest mode root path exampleTest =
941947 case exampleTest of
942948 DT.IsCtor _ _ _ opts ->
943949 case mode of
944− Name.Dev _ _ ->
950+ Mode.Dev _ _ ->
945951 JS.Access value Name.dollar
946952
947− Name.Prod _ _ ->
953+ Mode.Prod _ _ ->
948954 case opts of
949955 Can.Normal ->
950956 JS.Access value Name.dollar
@@ -963,10 +969,10 @@ generateCaseTest mode root path exampleTest =
963969
964970 DT.IsChr _ ->
965971 case mode of
966− Name.Dev _ _ ->
972+ Mode.Dev _ _ ->
967973 JS.Call (JS.Access value (Name.fromLocal "valueOf")) []
968974
969− Name.Prod _ _ ->
975+ Mode.Prod _ _ ->
970976 value
971977
972978 DT.IsCons ->
@@ -983,7 +989,7 @@ generateCaseTest mode root path exampleTest =
983989-- PATTERN PATHS
984990
985991
986−pathToJsExpr :: Mode -> N.Name -> DT.Path -> JS.Expr
992+pathToJsExpr :: Mode.Mode -> N.Name -> DT.Path -> JS.Expr
987993pathToJsExpr mode root path =
988994 case path of
989995 DT.Index index subPath ->
@@ -991,10 +997,10 @@ pathToJsExpr mode root path =
991997
992998 DT.Unbox subPath ->
993999 case mode of
994− Name.Dev _ _ ->
1000+ Mode.Dev _ _ ->
9951001 JS.Access (pathToJsExpr mode root subPath) (Name.fromIndex Index.first)
9961002
997− Name.Prod _ _ ->
1003+ Mode.Prod _ _ ->
9981004 pathToJsExpr mode root subPath
9991005
10001006 DT.Empty ->
@@ -1005,8 +1011,8 @@ pathToJsExpr mode root path =
10051011-- GENERATE MAIN
10061012
10071013
1008−generateMain :: Mode -> I.Interfaces -> ModuleName.Canonical -> Opt.Main -> JS.Expr
1009−generateMain mode interfaces home main =
1014+generateMain :: Mode.Mode -> ModuleName.Canonical -> Opt.Main -> JS.Expr
1015+generateMain mode home main =
10101016 case main of
10111017 Opt.Static ->
10121018 JS.Ref (Name.fromKernel N.virtualDom "init")
@@ -1017,7 +1023,7 @@ generateMain mode interfaces home main =
10171023 Opt.Dynamic msgType decoder ->
10181024 JS.Ref (Name.fromGlobal home "main")
10191025 # generateJsExpr mode decoder
1020− # toDebugMetadata mode interfaces msgType
1026+ # toDebugMetadata mode msgType
10211027
10221028
10231029(#) :: JS.Expr -> JS.Expr -> JS.Expr
@@ -1025,19 +1031,17 @@ generateMain mode interfaces home main =
10251031 JS.Call func [arg]
10261032
10271033
1028−toDebugMetadata :: Mode -> I.Interfaces -> Can.Type -> JS.Expr
1029−toDebugMetadata mode interfaces msgType =
1034+toDebugMetadata :: Mode.Mode -> Can.Type -> JS.Expr
1035+toDebugMetadata mode msgType =
10301036 case mode of
1031− Name.Prod _ _ ->
1037+ Mode.Prod _ _ ->
10321038 JS.Int 0
10331039
1034− Name.Dev _ debugger ->
1035− case debugger of
1036− Name.DebuggerOff ->
1037− JS.Int 0
1040+ Mode.Dev _ Nothing ->
1041+ JS.Int 0
10381042
1039− Name.DebuggerOn ->
1040− JS.Json $ Encode.object $
1041− [ ("versions", Encode.object [ ("elm", Pkg.encodeVersion Version.version) ])
1042− , ("types", Type.encodeMetadata (Extract.fromMsg interfaces msgType))
1043− ]
1043+ Mode.Dev _ (Just interfaces) ->
1044+ JS.Json $ Encode.object $
1045+ [ ("versions", Encode.object [ ("elm", Pkg.encodeVersion Version.version) ])
1046+ , ("types", Type.encodeMetadata (Extract.fromMsg interfaces msgType))
1047+ ]