on master help sign in
Make public API for generating JS nicer
commit3f20280a21093a918264e39ea8983a15d7ecad4c authorEvan Czaplicki <evancz@users.noreply.github.com> dateFri 15 Dec 2017, 15:08 (9 years ago) parentdc81293
3 files changed+51−43
src/Elm/Compiler/Module.hs+1−13 src/Elm/Compiler/Objects.hs+13−2 src/Generate/JavaScript.hs+37−28
src/Elm/Compiler/Module.hs+1−13
@@ -4,7 +4,6 @@ module Elm.Compiler.Module
44 -- interfaces
55 ( I.Interface
66 , I.Interfaces
7− , interfaceAliasedTypes
87
98 -- module names
109 , Raw
@@ -21,15 +20,13 @@ module Elm.Compiler.Module
2120 )
2221 where
2322
23+
2424import qualified Data.Char as Char
2525import qualified Data.List as List
26−import qualified Data.Map as Map
2726import qualified Data.Text as Text
2827import System.FilePath ((</>))
2928
3029import qualified AST.Module.Name as ModuleName
31−import qualified Elm.Compiler.Type as Type
32−import qualified Elm.Compiler.Type.Extract as Extract
3330import qualified Elm.Interface as I
3431import qualified Elm.Name as N
3532import qualified Json.Decode as Decode
@@ -37,15 +34,6 @@ import qualified Json.Encode as Encode
3734
3835
3936
40−-- INTERFACES
41−
42−
43−interfaceAliasedTypes :: I.Interface -> Map.Map N.Name Type.Type
44−interfaceAliasedTypes interface =
45− Map.map Extract.fromAnnotation (I._types interface)
46−
47−
48−
4937-- NAMES
5038
5139
src/Elm/Compiler/Objects.hs+13−2
@@ -1,19 +1,20 @@
11{-# OPTIONS_GHC -Wall #-}
22module Elm.Compiler.Objects
33 ( Name.Target(..)
4− , JS.ReplBuilder(..)
5− , JS.generateForRepl
64 , JS.Mode(..)
75 , JS.generate
6+ , JS.generateForRepl
87 , Opt.Graph
98 , empty
109 , union
10+ , unions
1111 , Kernel(..)
1212 , fromKernels
1313 )
1414 where
1515
1616
17+import qualified Data.List as List
1718import qualified Data.Map as Map
1819
1920import qualified AST.Optimized as Opt
@@ -42,6 +43,16 @@ union (Opt.Graph mains1 graph1 fields1) (Opt.Graph mains2 graph2 fields2) =
4243 (Map.union fields1 fields2)
4344
4445
46+unions :: [Opt.Graph] -> Opt.Graph
47+unions graphs =
48+ case graphs of
49+ [] ->
50+ empty
51+
52+ g:gs ->
53+ List.foldl' union g gs
54+
55+
4556
4657-- KERNEL GRAPHS
4758
src/Generate/JavaScript.hs+37−28
@@ -1,15 +1,14 @@
11{-# OPTIONS_GHC -Wall #-}
22{-# LANGUAGE OverloadedStrings #-}
33module Generate.JavaScript
4− ( ReplBuilder(..)
5− , generateForRepl
6− , Mode(..)
4+ ( Mode(..)
75 , generate
6+ , generateForRepl
87 )
98 where
109
1110
12−import Prelude hiding (cycle)
11+import Prelude hiding (cycle, print)
1312import qualified Data.ByteString.Builder as B
1413import Data.Monoid ((<>))
1514import qualified Data.List as List
@@ -20,6 +19,8 @@ import qualified Data.Text as Text
2019
2120import qualified AST.Optimized as Opt
2221import qualified AST.Module.Name as ModuleName
22+import qualified Elm.Compiler.Type as Type
23+import qualified Elm.Compiler.Type.Extract as Extract
2324import qualified Elm.Interface as I
2425import qualified Elm.Name as N
2526import qualified Generate.JavaScript.Builder as JS
@@ -28,36 +29,14 @@ import qualified Generate.JavaScript.Name as Name
2829
2930
3031
31−-- GENERATE FOR REPL
32−
33−
34−data ReplBuilder =
35− ReplBuilder
36− { _repl_code :: B.Builder
37− , _repl_name :: B.Builder
38− }
39−
40−
41−generateForRepl :: Opt.Graph -> ModuleName.Canonical -> N.Name -> ReplBuilder
42−generateForRepl (Opt.Graph _ graph _) home name =
43− ReplBuilder
44− { _repl_code =
45− stateToBuilder $
46− addGlobal (Name.Debug Name.Client) graph emptyState (Opt.Global home name)
47− , _repl_name =
48− Name.toBuilder (Name.fromGlobal home name)
49− }
50−
51−
52−
5332-- GENERATE MAINS
5433
5534
5635data Mode = Debug | Prod
5736
5837
59−generate :: Mode -> Name.Target -> Opt.Graph -> I.Interfaces -> [ModuleName.Canonical] -> Either [ModuleName.Canonical] B.Builder
60−generate mode target (Opt.Graph mains graph fields) interfaces roots =
38+generate :: Mode -> Name.Target -> I.Interfaces -> Opt.Graph -> [ModuleName.Canonical] -> Either [ModuleName.Canonical] B.Builder
39+generate mode target interfaces (Opt.Graph mains graph fields) roots =
6140 let
6241 rootSet = Set.fromList roots
6342 rootMap = Map.restrictKeys mains rootSet
@@ -90,6 +69,36 @@ toRealMode mode target fields =
9069
9170
9271
72+-- GENERATE FOR REPL
73+
74+
75+generateForRepl :: I.Interfaces -> Opt.Graph -> ModuleName.Canonical -> N.Name -> B.Builder
76+generateForRepl interfaces (Opt.Graph _ graph _) home name =
77+ let
78+ mode = Name.Debug Name.Server
79+ eval = addGlobal mode graph emptyState (Opt.Global home name)
80+ in
81+ stateToBuilder eval <> print interfaces home name
82+
83+
84+print :: I.Interfaces -> ModuleName.Canonical -> N.Name -> B.Builder
85+print interfaces home name =
86+ let
87+ value = Name.toBuilder (Name.fromGlobal home name)
88+ toString = Name.toBuilder (Name.fromKernel N.debug "toString")
89+ annotation = I._types (interfaces ! home) ! name
90+ tipe = Type.toString Type.MultiLine $ Extract.fromAnnotation annotation
91+ in
92+ "var _value = " <> toString <> "(" <> value <> ");\n" <>
93+ "var _type = '" <> B.stringUtf8 (show tipe) <> "';\n\
94+ \if (_value.length + 3 + _type.length >= 80 || _type.indexOf('\\n') >= 0) {\n\
95+ \ console.log(_value + '\\n : ' + _type.split('\\n').join('\\n '));\n\
96+ \} else {\n\
97+ \ console.log(_value + ' : ' + _type);\n\
98+ \}\n"
99+
100+
101+
93102-- GRAPH TRAVERSAL STATE
94103
95104