1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
3module Generate.JavaScript (generate) where
5import Prelude hiding (init)
6import Data.Monoid ((<>))
7import qualified Data.List as List
8import qualified Data.Map as Map
9import qualified Data.Set as Set
10import qualified Data.Text as Text
11import qualified Data.ByteString.Builder as BS
13import qualified AST.Effects as Effects
14import qualified AST.Expression.Optimized as Opt
15import qualified AST.Module.Name as ModuleName
16import qualified AST.Variable as Var
17import qualified Elm.Package as Pkg
18import qualified Elm.Compiler.Objects.Internal as Obj
19import qualified Generate.JavaScript.Builder as JS
20import qualified Generate.JavaScript.Effects as Effects
21import qualified Generate.JavaScript.Expression as JS
22import qualified Generate.JavaScript.Variable as JS
29generate :: Obj.SymbolTable -> Obj.Graph -> Obj.Roots -> (Set.Set ModuleName.Canonical, BS.Builder)
30generate symbols (Obj.Graph graph) roots =
32 (State builders _ kernels effects table) =
33 List.foldl' (crawl graph) (init symbols) (Obj.toGlobals roots)
36 fst $ JS.run table (Effects.generate effects)
39 List.foldl' (\rest stmt -> JS.encodeUtf8 stmt <> rest) managers builders
51 , _seen :: Set.Set Var.Global
52 , _kernels :: Set.Set ModuleName.Canonical
53 , _effects :: Map.Map ModuleName.Canonical Effects.ManagerType
58init :: Obj.SymbolTable -> State
60 State [] Set.empty Set.empty Map.empty (JS.init symbols)
64-- DEAD CODE ELIMINATION
67type Graph = Map.Map Var.Global Opt.Decl
70crawl :: Graph -> State -> Var.Global -> State
71crawl graph state@(State js seen kernels effects table) name@(Var.Global home _) =
72 if Set.member name seen then
75 else if home == virtualDomDebug then
79 case Map.lookup name graph of
81 crawlDecl graph name decl state
84 if ModuleName.canonicalIsKernel home then
85 State js seen (Set.insert home kernels) effects table
87 error (crawlError name)
90crawlDecl :: Graph -> Var.Global -> Opt.Decl -> State -> State
91crawlDecl graph var@(Var.Global home name) (Opt.Decl deps fx body) state =
94 state { _seen = Set.insert var (_seen state) }
96 (State stmts seen kernels effects table) =
97 Set.foldl' (crawl graph) newState deps
100 JS.run table (JS.generateDecl home name body)
103 { _stmts = stmt : stmts
106 , _effects = maybe id (Map.insert home) fx effects
111crawlError :: Var.Global -> String
112crawlError (Var.Global (ModuleName.Canonical pkg home) name) =
114 "compiler bug manifesting in Generate.JavaScript\n"
115 <> "could not find " <> Pkg.toText pkg <> " " <> ModuleName.toText home <> "." <> name <> "\n"
116 <> "please report at <https://github.com/elm-lang/elm-compiler/issues>\n"
117 <> "try to make an <http://sscce.org/> that demonstrates the issue!"
120virtualDomDebug :: ModuleName.Canonical
122 ModuleName.inVirtualDom "VirtualDom.Debug"
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list