@@ -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"