on master help sign in
Generate.JavaScript.generate just gives a Builder now

The decision whether to generate JS used to be spread across a couple different modules, some information here, calling some function there, putting all back together. The new setup means that decision is made in Make.hs, keeping track of how many mains there are and the implications of that. It calls this function only when all that is good and it definitely wants a Builder.

commitf106fd0ffc8e459a765c6ded85ed6a1b0a92a8d4 authorEvan Czaplicki <evancz@users.noreply.github.com> dateSun 24 Mar 2019, 15:42 (8 years ago) parent467f823
1 file changed+21−32
compiler/src/Generate/JavaScript.hs+21−32
compiler/src/Generate/JavaScript.hs+21−32
@@ -1,7 +1,6 @@
11{-# LANGUAGE OverloadedStrings #-}
22module Generate.JavaScript
3− ( Output(..)
4− , generate
3+ ( generate
54 , generateForRepl
65 )
76 where
@@ -20,11 +19,11 @@ import qualified Data.Utf8 as Utf8
2019import qualified AST.Canonical as Can
2120import qualified AST.Optimized as Opt
2221import qualified Data.Index as Index
23−import qualified Elm.Interface as I
2422import qualified Elm.Kernel as K
2523import qualified Elm.ModuleName as ModuleName
2624import qualified Generate.JavaScript.Builder as JS
2725import qualified Generate.JavaScript.Expression as Expr
26+import qualified Generate.JavaScript.Functions as Functions
2827import qualified Generate.JavaScript.Name as JsName
2928import qualified Generate.Mode as Mode
3029import qualified Reporting.Doc as D
@@ -33,33 +32,27 @@ import qualified Reporting.Render.Type.Localizer as L
3332
3433
3534
36−-- GENERATE MAINS
35+-- GENERATE
3736
3837
39−data Output
40− = None
41− | Some Name.Name [Name.Name] B.Builder
38+type Graph = Map.Map Opt.Global Opt.Node
39+type Mains = Map.Map ModuleName.Canonical Opt.Main
4240
4341
44−generate :: Mode.Mode -> Opt.Graph -> [ModuleName.Canonical] -> Output
45−generate mode (Opt.Graph mains graph _) roots =
42+generate :: Mode.Mode -> Opt.GlobalGraph -> Mains -> B.Builder
43+generate mode (Opt.GlobalGraph graph _) mains =
4644 let
47− rootSet = Set.fromList roots
48− rootMap = Map.restrictKeys mains rootSet
45+ state = Map.foldrWithKey (addMain mode graph) emptyState mains
4946 in
50− case map ModuleName._module (Map.keys rootMap) of
51− [] ->
52− None
53−
54− name:names ->
55− let
56− state = Map.foldrWithKey (addMain mode graph) emptyState rootMap
57− builder = perfNote mode <> stateToBuilder state <> toMainExports mode rootMap
58− in
59− Some name names builder
47+ "(function(scope){\n'use strict';"
48+ <> Functions.functions
49+ <> perfNote mode
50+ <> stateToBuilder state
51+ <> toMainExports mode mains
52+ <> "}(this));"
6053
6154
62−addMain :: Mode.Mode -> Graph -> ModuleName.Canonical -> main -> State -> State
55+addMain :: Mode.Mode -> Graph -> ModuleName.Canonical -> Opt.Main -> State -> State
6356addMain mode graph home _ state =
6457 addGlobal mode graph state (Opt.Global home "main")
6558
@@ -85,20 +78,19 @@ perfNote mode =
8578-- GENERATE FOR REPL
8679
8780
88−generateForRepl :: Bool -> L.Localizer -> Opt.Graph -> I.Interface -> ModuleName.Canonical -> Name.Name -> B.Builder
89−generateForRepl ansi localizer (Opt.Graph _ graph _) iface home name =
81+generateForRepl :: Bool -> L.Localizer -> Opt.GlobalGraph -> ModuleName.Canonical -> Name.Name -> Can.Annotation -> B.Builder
82+generateForRepl ansi localizer (Opt.GlobalGraph graph _) home name (Can.Forall _ tipe) =
9083 let
9184 mode = Mode.Dev Nothing
9285 debugState = addGlobal mode graph emptyState (Opt.Global ModuleName.debug "toString")
9386 evalState = addGlobal mode graph debugState (Opt.Global home name)
9487 in
9588 stateToBuilder evalState
96− <>
97− print ansi localizer home name (I._values iface ! name)
89+ <> print ansi localizer home name tipe
9890
9991
100−print :: Bool -> L.Localizer -> ModuleName.Canonical -> Name.Name -> Can.Annotation -> B.Builder
101−print ansi localizer home name (Can.Forall _ tipe) =
92+print :: Bool -> L.Localizer -> ModuleName.Canonical -> Name.Name -> Can.Type -> B.Builder
93+print ansi localizer home name tipe =
10294 let
10395 value = JsName.toBuilder (JsName.fromGlobal home name)
10496 toString = JsName.toBuilder (JsName.fromKernel Name.debug "toAnsiString")
@@ -146,9 +138,6 @@ prependBuilders revBuilders monolith =
146138-- ADD DEPENDENCIES
147139
148140
149−type Graph = Map.Map Opt.Global Opt.Node
150−
151−
152141addGlobal :: Mode.Mode -> Graph -> State -> Opt.Global -> State
153142addGlobal mode graph state@(State revKernels builders seen) global =
154143 if Set.member global seen then
@@ -487,7 +476,7 @@ generateManagerHelp home effectsType =
487476-- MAIN EXPORTS
488477
489478
490−toMainExports :: Mode.Mode -> Map.Map ModuleName.Canonical Opt.Main -> B.Builder
479+toMainExports :: Mode.Mode -> Mains -> B.Builder
491480toMainExports mode mains =
492481 let
493482 export = JsName.fromKernel Name.platform "export"