on master help sign in
Generate.JavaScript.generate just gives a Builder now
f106fd0Evan Czaplicki
compiler/src/Generate/JavaScript.hs+21−32
@@ -1,7 +1,6 @@
1{-# LANGUAGE OverloadedStrings #-}
1{-# LANGUAGE OverloadedStrings #-}
2module Generate.JavaScript
2module Generate.JavaScript
3− ( Output(..)
4− , generate
3+ ( generate
5 , generateForRepl
4 , generateForRepl
6 )
5 )
7 where
6 where
@@ -20,11 +19,11 @@ import qualified Data.Utf8 as Utf8
20import qualified AST.Canonical as Can
19import qualified AST.Canonical as Can
21import qualified AST.Optimized as Opt
20import qualified AST.Optimized as Opt
22import qualified Data.Index as Index
21import qualified Data.Index as Index
23−import qualified Elm.Interface as I
24import qualified Elm.Kernel as K
22import qualified Elm.Kernel as K
25import qualified Elm.ModuleName as ModuleName
23import qualified Elm.ModuleName as ModuleName
26import qualified Generate.JavaScript.Builder as JS
24import qualified Generate.JavaScript.Builder as JS
27import qualified Generate.JavaScript.Expression as Expr
25import qualified Generate.JavaScript.Expression as Expr
26+import qualified Generate.JavaScript.Functions as Functions
28import qualified Generate.JavaScript.Name as JsName
27import qualified Generate.JavaScript.Name as JsName
29import qualified Generate.Mode as Mode
28import qualified Generate.Mode as Mode
30import qualified Reporting.Doc as D
29import qualified Reporting.Doc as D
@@ -33,33 +32,27 @@ import qualified Reporting.Render.Type.Localizer as L
33
32
34
33
35
34
36−-- GENERATE MAINS
35+-- GENERATE
37
36
38
37
39−data Output
38+type Graph = Map.Map Opt.Global Opt.Node
40− = None
39+type Mains = Map.Map ModuleName.Canonical Opt.Main
41− | Some Name.Name [Name.Name] B.Builder
42
40
43
41
44−generate :: Mode.Mode -> Opt.Graph -> [ModuleName.Canonical] -> Output
42+generate :: Mode.Mode -> Opt.GlobalGraph -> Mains -> B.Builder
45−generate mode (Opt.Graph mains graph _) roots =
43+generate mode (Opt.GlobalGraph graph _) mains =
46 let
44 let
47− rootSet = Set.fromList roots
45+ state = Map.foldrWithKey (addMain mode graph) emptyState mains
48− rootMap = Map.restrictKeys mains rootSet
49 in
46 in
50− case map ModuleName._module (Map.keys rootMap) of
47+ "(function(scope){\n'use strict';"
51− [] ->
48+ <> Functions.functions
52− None
49+ <> perfNote mode
53−
54− name:names ->
55− let
56− state = Map.foldrWithKey (addMain mode graph) emptyState rootMap
57− builder = perfNote mode <> stateToBuilder state <> toMainExports mode rootMap
50+ <> stateToBuilder state
58− in
51+ <> toMainExports mode mains
59− Some name names builder
52+ <> "}(this));"
60
53
61
54
62−addMain :: Mode.Mode -> Graph -> ModuleName.Canonical -> main -> State -> State
55+addMain :: Mode.Mode -> Graph -> ModuleName.Canonical -> Opt.Main -> State -> State
63addMain mode graph home _ state =
56addMain mode graph home _ state =
64 addGlobal mode graph state (Opt.Global home "main")
57 addGlobal mode graph state (Opt.Global home "main")
65
58
@@ -85,20 +78,19 @@ perfNote mode =
85-- GENERATE FOR REPL
78-- GENERATE FOR REPL
86
79
87
80
88−generateForRepl :: Bool -> L.Localizer -> Opt.Graph -> I.Interface -> ModuleName.Canonical -> Name.Name -> B.Builder
81+generateForRepl :: Bool -> L.Localizer -> Opt.GlobalGraph -> ModuleName.Canonical -> Name.Name -> Can.Annotation -> B.Builder
89−generateForRepl ansi localizer (Opt.Graph _ graph _) iface home name =
82+generateForRepl ansi localizer (Opt.GlobalGraph graph _) home name (Can.Forall _ tipe) =
90 let
83 let
91 mode = Mode.Dev Nothing
84 mode = Mode.Dev Nothing
92 debugState = addGlobal mode graph emptyState (Opt.Global ModuleName.debug "toString")
85 debugState = addGlobal mode graph emptyState (Opt.Global ModuleName.debug "toString")
93 evalState = addGlobal mode graph debugState (Opt.Global home name)
86 evalState = addGlobal mode graph debugState (Opt.Global home name)
94 in
87 in
95 stateToBuilder evalState
88 stateToBuilder evalState
96− <>
97− print ansi localizer home name (I._values iface ! name)
89+ <> print ansi localizer home name tipe
98
90
99
91
100−print :: Bool -> L.Localizer -> ModuleName.Canonical -> Name.Name -> Can.Annotation -> B.Builder
92+print :: Bool -> L.Localizer -> ModuleName.Canonical -> Name.Name -> Can.Type -> B.Builder
101−print ansi localizer home name (Can.Forall _ tipe) =
93+print ansi localizer home name tipe =
102 let
94 let
103 value = JsName.toBuilder (JsName.fromGlobal home name)
95 value = JsName.toBuilder (JsName.fromGlobal home name)
104 toString = JsName.toBuilder (JsName.fromKernel Name.debug "toAnsiString")
96 toString = JsName.toBuilder (JsName.fromKernel Name.debug "toAnsiString")
@@ -146,9 +138,6 @@ prependBuilders revBuilders monolith =
146-- ADD DEPENDENCIES
138-- ADD DEPENDENCIES
147
139
148
140
149−type Graph = Map.Map Opt.Global Opt.Node
150−
151−
152addGlobal :: Mode.Mode -> Graph -> State -> Opt.Global -> State
141addGlobal :: Mode.Mode -> Graph -> State -> Opt.Global -> State
153addGlobal mode graph state@(State revKernels builders seen) global =
142addGlobal mode graph state@(State revKernels builders seen) global =
154 if Set.member global seen then
143 if Set.member global seen then
@@ -487,7 +476,7 @@ generateManagerHelp home effectsType =
487-- MAIN EXPORTS
476-- MAIN EXPORTS
488
477
489
478
490−toMainExports :: Mode.Mode -> Map.Map ModuleName.Canonical Opt.Main -> B.Builder
479+toMainExports :: Mode.Mode -> Mains -> B.Builder
491toMainExports mode mains =
480toMainExports mode mains =
492 let
481 let
493 export = JsName.fromKernel Name.platform "export"
482 export = JsName.fromKernel Name.platform "export"