on master help sign in
Make sure all kernel code is at the very top
665d3d9Evan Czaplicki
compiler/src/Generate/JavaScript.hs+21−10
@@ -104,19 +104,25 @@ print ansi localizer home name (Can.Forall _ tipe) =
104
104
105data State =
105data State =
106 State
106 State
107+ { _kernel :: B.Builder
107− { _revBuilders :: [B.Builder]
108+ , _revBuilders :: [B.Builder]
108 , _seenGlobals :: Set.Set Opt.Global
109 , _seenGlobals :: Set.Set Opt.Global
109 }
110 }
110
111
111
112
112emptyState :: State
113emptyState :: State
113emptyState =
114emptyState =
114− State [] Set.empty
115+ State mempty [] Set.empty
115
116
116
117
117stateToBuilder :: State -> B.Builder
118stateToBuilder :: State -> B.Builder
118−stateToBuilder (State revBuilders _) =
119+stateToBuilder (State kernel revBuilders _) =
119− List.foldl1' (\builder b -> b <> builder) revBuilders
120+ case revBuilders of
121+ [] ->
122+ kernel
123+
124+ b:bs ->
125+ kernel <> List.foldl' (\code decl -> decl <> code) b bs
120
126
121
127
122
128
@@ -127,12 +133,12 @@ type Graph = Map.Map Opt.Global Opt.Node
127
133
128
134
129addGlobal :: Mode.Mode -> Graph -> State -> Opt.Global -> State
135addGlobal :: Mode.Mode -> Graph -> State -> Opt.Global -> State
130−addGlobal mode graph state@(State builders seen) global =
136+addGlobal mode graph state@(State kernel builders seen) global =
131 if Set.member global seen then
137 if Set.member global seen then
132 state
138 state
133 else
139 else
134 addGlobalHelp mode graph global $
140 addGlobalHelp mode graph global $
135− State builders (Set.insert global seen)
141+ State kernel builders (Set.insert global seen)
136
142
137
143
138addGlobalHelp :: Mode.Mode -> Graph -> Opt.Global -> State -> State
144addGlobalHelp :: Mode.Mode -> Graph -> Opt.Global -> State -> State
@@ -175,10 +181,10 @@ addGlobalHelp mode graph global state =
175 else
181 else
176 case maybeServer of
182 case maybeServer of
177 Just (Opt.KContent serverChunks serverDeps) | Mode.isServer mode ->
183 Just (Opt.KContent serverChunks serverDeps) | Mode.isServer mode ->
178− addBuilder (addDeps serverDeps state) (generateKernel mode serverChunks)
184+ addKernel (addDeps serverDeps state) (generateKernel mode serverChunks)
179
185
180 _ ->
186 _ ->
181− addBuilder (addDeps clientDeps state) (generateKernel mode clientChunks)
187+ addKernel (addDeps clientDeps state) (generateKernel mode clientChunks)
182
188
183 Opt.Enum index ->
189 Opt.Enum index ->
184 addStmt state (
190 addStmt state (
@@ -207,8 +213,13 @@ addStmt state stmt =
207
213
208
214
209addBuilder :: State -> B.Builder -> State
215addBuilder :: State -> B.Builder -> State
210−addBuilder (State revBuilders seen) builder =
216+addBuilder (State kernel revBuilders seen) builder =
211− State (builder:revBuilders) seen
217+ State kernel (builder:revBuilders) seen
218+
219+
220+addKernel :: State -> B.Builder -> State
221+addKernel (State kernel revBuilders seen) moreKernel =
222+ State (moreKernel <> kernel) revBuilders seen
212
223
213
224
214var :: Opt.Global -> Expr.Code -> JS.Stmt
225var :: Opt.Global -> Expr.Code -> JS.Stmt