on master help sign in
Get rid of client/server distinction in Mode for now
390be8dEvan Czaplicki
compiler/src/Generate/JavaScript.hs+18−17
@@ -26,7 +26,8 @@ import qualified Elm.ModuleName as ModuleName
26import qualified Generate.JavaScript.Builder as JS
26import qualified Generate.JavaScript.Builder as JS
27import qualified Generate.JavaScript.Expression as Expr
27import qualified Generate.JavaScript.Expression as Expr
28import qualified Generate.JavaScript.Name as JsName
28import qualified Generate.JavaScript.Name as JsName
29−import qualified Generate.JavaScript.Mode as Mode
29+import qualified Generate.Mode as Mode
30+import qualified Reporting.Doc as D
30import qualified Reporting.Render.Type as RT
31import qualified Reporting.Render.Type as RT
31import qualified Reporting.Render.Type.Localizer as L
32import qualified Reporting.Render.Type.Localizer as L
32
33
@@ -41,7 +42,7 @@ data Output
41
42
42
43
43generate :: Mode.Mode -> Opt.Graph -> [ModuleName.Canonical] -> Output
44generate :: Mode.Mode -> Opt.Graph -> [ModuleName.Canonical] -> Output
44−generate mode (Opt.Graph mains graph _fields) roots =
45+generate mode (Opt.Graph mains graph _) roots =
45 let
46 let
46 rootSet = Set.fromList roots
47 rootSet = Set.fromList roots
47 rootMap = Map.restrictKeys mains rootSet
48 rootMap = Map.restrictKeys mains rootSet
@@ -66,15 +67,15 @@ addMain mode graph home _ state =
66perfNote :: Mode.Mode -> B.Builder
67perfNote :: Mode.Mode -> B.Builder
67perfNote mode =
68perfNote mode =
68 case mode of
69 case mode of
69− Mode.Prod _ _ ->
70+ Mode.Prod _ ->
70 ""
71 ""
71
72
72− Mode.Dev _ Nothing ->
73+ Mode.Dev Nothing ->
73 "console.warn('Compiled in DEV mode. Follow the advice at "
74 "console.warn('Compiled in DEV mode. Follow the advice at "
74 <> B.stringUtf8 (D.makeNakedLink "optimize")
75 <> B.stringUtf8 (D.makeNakedLink "optimize")
75 <> " for better performance and smaller assets.');"
76 <> " for better performance and smaller assets.');"
76
77
77− Mode.Dev _ (Just _) ->
78+ Mode.Dev (Just _) ->
78 "console.warn('Compiled in DEBUG mode. Follow the advice at "
79 "console.warn('Compiled in DEBUG mode. Follow the advice at "
79 <> B.stringUtf8 (D.makeNakedLink "optimize")
80 <> B.stringUtf8 (D.makeNakedLink "optimize")
80 <> " for better performance and smaller assets.');"
81 <> " for better performance and smaller assets.');"
@@ -87,13 +88,13 @@ perfNote mode =
87generateForRepl :: Bool -> L.Localizer -> Opt.Graph -> I.Interface -> ModuleName.Canonical -> Name.Name -> B.Builder
88generateForRepl :: Bool -> L.Localizer -> Opt.Graph -> I.Interface -> ModuleName.Canonical -> Name.Name -> B.Builder
88generateForRepl ansi localizer (Opt.Graph _ graph _) iface home name =
89generateForRepl ansi localizer (Opt.Graph _ graph _) iface home name =
89 let
90 let
90− mode = Mode.dev Mode.Client
91+ mode = Mode.Dev Nothing
91 debugState = addGlobal mode graph emptyState (Opt.Global ModuleName.debug "toString")
92 debugState = addGlobal mode graph emptyState (Opt.Global ModuleName.debug "toString")
92 evalState = addGlobal mode graph debugState (Opt.Global home name)
93 evalState = addGlobal mode graph debugState (Opt.Global home name)
93 in
94 in
94 stateToBuilder evalState
95 stateToBuilder evalState
95 <>
96 <>
96− print ansi localizer home name (I._types iface ! name)
97+ print ansi localizer home name (I._values iface ! name)
97
98
98
99
99print :: Bool -> L.Localizer -> ModuleName.Canonical -> Name.Name -> Can.Annotation -> B.Builder
100print :: Bool -> L.Localizer -> ModuleName.Canonical -> Name.Name -> Can.Annotation -> B.Builder
@@ -258,10 +259,10 @@ generateCycle mode (Opt.Global home _) names values functions =
258
259
259 realBlock@(_:_) ->
260 realBlock@(_:_) ->
260 case mode of
261 case mode of
261− Mode.Prod _ _ ->
262+ Mode.Prod _ ->
262 JS.Block realBlock
263 JS.Block realBlock
263
264
264− Mode.Dev _ _ ->
265+ Mode.Dev _ ->
265 JS.Try (JS.Block realBlock) JsName.dollar $ JS.Throw $ JS.String $
266 JS.Try (JS.Block realBlock) JsName.dollar $ JS.Throw $ JS.String $
266 "Some top-level definitions from `" <> Name.toBuilder (ModuleName._module home) <> "` are causing infinite recursion:\\n"
267 "Some top-level definitions from `" <> Name.toBuilder (ModuleName._module home) <> "` are causing infinite recursion:\\n"
267 <> drawCycle names
268 <> drawCycle names
@@ -343,18 +344,18 @@ addChunk mode chunk builder =
343
344
344 K.Debug ->
345 K.Debug ->
345 case mode of
346 case mode of
346− Mode.Dev _ _ ->
347+ Mode.Dev _ ->
347 builder
348 builder
348
349
349− Mode.Prod _ _ ->
350+ Mode.Prod _ ->
350 "_UNUSED" <> builder
351 "_UNUSED" <> builder
351
352
352 K.Prod ->
353 K.Prod ->
353 case mode of
354 case mode of
354− Mode.Dev _ _ ->
355+ Mode.Dev _ ->
355 "_UNUSED" <> builder
356 "_UNUSED" <> builder
356
357
357− Mode.Prod _ _ ->
358+ Mode.Prod _ ->
358 builder
359 builder
359
360
360
361
@@ -367,10 +368,10 @@ generateEnum mode global@(Opt.Global home name) index =
367 let
368 let
368 definition =
369 definition =
369 case mode of
370 case mode of
370− Mode.Dev _ _ ->
371+ Mode.Dev _ ->
371 Expr.codeToExpr (Expr.generateCtor mode global index 0)
372 Expr.codeToExpr (Expr.generateCtor mode global index 0)
372
373
373− Mode.Prod _ _ ->
374+ Mode.Prod _ ->
374 JS.Int (Index.toMachine index)
375 JS.Int (Index.toMachine index)
375 in
376 in
376 JS.Var [ (JsName.fromGlobal home name, Just definition) ]
377 JS.Var [ (JsName.fromGlobal home name, Just definition) ]
@@ -385,10 +386,10 @@ generateBox mode global@(Opt.Global home name) =
385 let
386 let
386 definition =
387 definition =
387 case mode of
388 case mode of
388− Mode.Dev _ _ ->
389+ Mode.Dev _ ->
389 Expr.codeToExpr (Expr.generateCtor mode global Index.first 1)
390 Expr.codeToExpr (Expr.generateCtor mode global Index.first 1)
390
391
391− Mode.Prod _ _ ->
392+ Mode.Prod _ ->
392 JS.Ref (JsName.fromGlobal ModuleName.basics Name.identity)
393 JS.Ref (JsName.fromGlobal ModuleName.basics Name.identity)
393 in
394 in
394 JS.Var [ (JsName.fromGlobal home name, Just definition) ]
395 JS.Var [ (JsName.fromGlobal home name, Just definition) ]
compiler/src/Generate/JavaScript/Expression.hs+34−34
@@ -29,8 +29,8 @@ import qualified Elm.Version as V
29import qualified Elm.ModuleName as ModuleName
29import qualified Elm.ModuleName as ModuleName
30import qualified Elm.Package as Pkg
30import qualified Elm.Package as Pkg
31import qualified Generate.JavaScript.Builder as JS
31import qualified Generate.JavaScript.Builder as JS
32−import qualified Generate.JavaScript.Mode as Mode
33import qualified Generate.JavaScript.Name as JsName
32import qualified Generate.JavaScript.Name as JsName
33+import qualified Generate.Mode as Mode
34import qualified Json.Encode as Encode
34import qualified Json.Encode as Encode
35import qualified Optimize.DecisionTree as DT
35import qualified Optimize.DecisionTree as DT
36import qualified Reporting.Annotation as A
36import qualified Reporting.Annotation as A
@@ -54,10 +54,10 @@ generate mode expression =
54 Opt.Chr char ->
54 Opt.Chr char ->
55 JsExpr $
55 JsExpr $
56 case mode of
56 case mode of
57− Mode.Dev _ _ ->
57+ Mode.Dev _ ->
58 JS.Call toChar [ JS.String (Utf8.toBuilder char) ]
58 JS.Call toChar [ JS.String (Utf8.toBuilder char) ]
59
59
60− Mode.Prod _ _ ->
60+ Mode.Prod _ ->
61 JS.String (Utf8.toBuilder char)
61 JS.String (Utf8.toBuilder char)
62
62
63 Opt.Str string ->
63 Opt.Str string ->
@@ -77,17 +77,17 @@ generate mode expression =
77
77
78 Opt.VarEnum (Opt.Global home name) index ->
78 Opt.VarEnum (Opt.Global home name) index ->
79 case mode of
79 case mode of
80− Mode.Dev _ _ ->
80+ Mode.Dev _ ->
81 JsExpr $ JS.Ref (JsName.fromGlobal home name)
81 JsExpr $ JS.Ref (JsName.fromGlobal home name)
82
82
83− Mode.Prod _ _ ->
83+ Mode.Prod _ ->
84 JsExpr $ JS.Int (Index.toMachine index)
84 JsExpr $ JS.Int (Index.toMachine index)
85
85
86 Opt.VarBox (Opt.Global home name) ->
86 Opt.VarBox (Opt.Global home name) ->
87 JsExpr $ JS.Ref $
87 JsExpr $ JS.Ref $
88 case mode of
88 case mode of
89− Mode.Dev _ _ -> JsName.fromGlobal home name
89+ Mode.Dev _ -> JsName.fromGlobal home name
90− Mode.Prod _ _ -> JsName.fromGlobal ModuleName.basics Name.identity
90+ Mode.Prod _ -> JsName.fromGlobal ModuleName.basics Name.identity
91
91
92 Opt.VarCycle home name ->
92 Opt.VarCycle home name ->
93 JsExpr $ JS.Call (JS.Ref (JsName.fromCycle home name)) []
93 JsExpr $ JS.Call (JS.Ref (JsName.fromCycle home name)) []
@@ -157,10 +157,10 @@ generate mode expression =
157
157
158 Opt.Unit ->
158 Opt.Unit ->
159 case mode of
159 case mode of
160− Mode.Dev _ _ ->
160+ Mode.Dev _ ->
161 JsExpr $ JS.Ref (JsName.fromKernel Name.utils "Tuple0")
161 JsExpr $ JS.Ref (JsName.fromKernel Name.utils "Tuple0")
162
162
163− Mode.Prod _ _ ->
163+ Mode.Prod _ ->
164 JsExpr $ JS.Int 0
164 JsExpr $ JS.Int 0
165
165
166 Opt.Tuple a b maybeC ->
166 Opt.Tuple a b maybeC ->
@@ -269,8 +269,8 @@ generateCtor mode (Opt.Global home name) index arity =
269
269
270 ctorTag =
270 ctorTag =
271 case mode of
271 case mode of
272− Mode.Dev _ _ -> JS.String (Name.toBuilder name)
272+ Mode.Dev _ -> JS.String (Name.toBuilder name)
273− Mode.Prod _ _ -> JS.Int (ctorToInt home name index)
273+ Mode.Prod _ -> JS.Int (ctorToInt home name index)
274 in
274 in
275 generateFunction argNames $ JsExpr $ JS.Object $
275 generateFunction argNames $ JsExpr $ JS.Object $
276 (JsName.dollar, ctorTag) : map (\n -> (n, JS.Ref n)) argNames
276 (JsName.dollar, ctorTag) : map (\n -> (n, JS.Ref n)) argNames
@@ -300,10 +300,10 @@ generateRecord mode fields =
300generateField :: Mode.Mode -> Name.Name -> JsName.Name
300generateField :: Mode.Mode -> Name.Name -> JsName.Name
301generateField mode name =
301generateField mode name =
302 case mode of
302 case mode of
303− Mode.Dev _ _ ->
303+ Mode.Dev _ ->
304 JsName.fromLocal name
304 JsName.fromLocal name
305
305
306− Mode.Prod _ fields ->
306+ Mode.Prod fields ->
307 fields ! name
307 fields ! name
308
308
309
309
@@ -390,10 +390,10 @@ generateCall mode func args =
390
390
391 Opt.VarBox _ ->
391 Opt.VarBox _ ->
392 case mode of
392 case mode of
393− Mode.Dev _ _ ->
393+ Mode.Dev _ ->
394 generateCallHelp mode func args
394 generateCallHelp mode func args
395
395
396− Mode.Prod _ _ ->
396+ Mode.Prod _ ->
397 case args of
397 case args of
398 [arg] ->
398 [arg] ->
399 generateJsExpr mode arg
399 generateJsExpr mode arg
@@ -747,10 +747,10 @@ generatePath mode path =
747
747
748 Opt.Unbox subPath ->
748 Opt.Unbox subPath ->
749 case mode of
749 case mode of
750− Mode.Dev _ _ ->
750+ Mode.Dev _ ->
751 JS.Access (generatePath mode subPath) (JsName.fromIndex Index.first)
751 JS.Access (generatePath mode subPath) (JsName.fromIndex Index.first)
752
752
753− Mode.Prod _ _ ->
753+ Mode.Prod _ ->
754 generatePath mode subPath
754 generatePath mode subPath
755
755
756
756
@@ -876,8 +876,8 @@ generateIfTest mode root (path, test) =
876 let
876 let
877 tag =
877 tag =
878 case mode of
878 case mode of
879− Mode.Dev _ _ -> JS.Access value JsName.dollar
879+ Mode.Dev _ -> JS.Access value JsName.dollar
880− Mode.Prod _ _ ->
880+ Mode.Prod _ ->
881 case opts of
881 case opts of
882 Can.Normal -> JS.Access value JsName.dollar
882 Can.Normal -> JS.Access value JsName.dollar
883 Can.Enum -> value
883 Can.Enum -> value
@@ -885,8 +885,8 @@ generateIfTest mode root (path, test) =
885 in
885 in
886 strictEq tag $
886 strictEq tag $
887 case mode of
887 case mode of
888− Mode.Dev _ _ -> JS.String (Name.toBuilder name)
888+ Mode.Dev _ -> JS.String (Name.toBuilder name)
889− Mode.Prod _ _ -> JS.Int (ctorToInt home name index)
889+ Mode.Prod _ -> JS.Int (ctorToInt home name index)
890
890
891 DT.IsBool True ->
891 DT.IsBool True ->
892 value
892 value
@@ -900,8 +900,8 @@ generateIfTest mode root (path, test) =
900 DT.IsChr char ->
900 DT.IsChr char ->
901 strictEq (JS.String (Utf8.toBuilder char)) $
901 strictEq (JS.String (Utf8.toBuilder char)) $
902 case mode of
902 case mode of
903− Mode.Dev _ _ -> JS.Call (JS.Access value (JsName.fromLocal "valueOf")) []
903+ Mode.Dev _ -> JS.Call (JS.Access value (JsName.fromLocal "valueOf")) []
904− Mode.Prod _ _ -> value
904+ Mode.Prod _ -> value
905
905
906 DT.IsStr string ->
906 DT.IsStr string ->
907 strictEq value (JS.String (Utf8.toBuilder string))
907 strictEq value (JS.String (Utf8.toBuilder string))
@@ -930,8 +930,8 @@ generateCaseValue mode test =
930 case test of
930 case test of
931 DT.IsCtor home name index _ _ ->
931 DT.IsCtor home name index _ _ ->
932 case mode of
932 case mode of
933− Mode.Dev _ _ -> JS.String (Name.toBuilder name)
933+ Mode.Dev _ -> JS.String (Name.toBuilder name)
934− Mode.Prod _ _ -> JS.Int (ctorToInt home name index)
934+ Mode.Prod _ -> JS.Int (ctorToInt home name index)
935
935
936 DT.IsInt int ->
936 DT.IsInt int ->
937 JS.Int int
937 JS.Int int
@@ -966,10 +966,10 @@ generateCaseTest mode root path exampleTest =
966 value
966 value
967 else
967 else
968 case mode of
968 case mode of
969− Mode.Dev _ _ ->
969+ Mode.Dev _ ->
970 JS.Access value JsName.dollar
970 JS.Access value JsName.dollar
971
971
972− Mode.Prod _ _ ->
972+ Mode.Prod _ ->
973 case opts of
973 case opts of
974 Can.Normal ->
974 Can.Normal ->
975 JS.Access value JsName.dollar
975 JS.Access value JsName.dollar
@@ -988,10 +988,10 @@ generateCaseTest mode root path exampleTest =
988
988
989 DT.IsChr _ ->
989 DT.IsChr _ ->
990 case mode of
990 case mode of
991− Mode.Dev _ _ ->
991+ Mode.Dev _ ->
992 JS.Call (JS.Access value (JsName.fromLocal "valueOf")) []
992 JS.Call (JS.Access value (JsName.fromLocal "valueOf")) []
993
993
994− Mode.Prod _ _ ->
994+ Mode.Prod _ ->
995 value
995 value
996
996
997 DT.IsBool _ ->
997 DT.IsBool _ ->
@@ -1019,10 +1019,10 @@ pathToJsExpr mode root path =
1019
1019
1020 DT.Unbox subPath ->
1020 DT.Unbox subPath ->
1021 case mode of
1021 case mode of
1022− Mode.Dev _ _ ->
1022+ Mode.Dev _ ->
1023 JS.Access (pathToJsExpr mode root subPath) (JsName.fromIndex Index.first)
1023 JS.Access (pathToJsExpr mode root subPath) (JsName.fromIndex Index.first)
1024
1024
1025− Mode.Prod _ _ ->
1025+ Mode.Prod _ ->
1026 pathToJsExpr mode root subPath
1026 pathToJsExpr mode root subPath
1027
1027
1028 DT.Empty ->
1028 DT.Empty ->
@@ -1056,13 +1056,13 @@ generateMain mode home main =
1056toDebugMetadata :: Mode.Mode -> Can.Type -> JS.Expr
1056toDebugMetadata :: Mode.Mode -> Can.Type -> JS.Expr
1057toDebugMetadata mode msgType =
1057toDebugMetadata mode msgType =
1058 case mode of
1058 case mode of
1059− Mode.Prod _ _ ->
1059+ Mode.Prod _ ->
1060 JS.Int 0
1060 JS.Int 0
1061
1061
1062− Mode.Dev _ Nothing ->
1062+ Mode.Dev Nothing ->
1063 JS.Int 0
1063 JS.Int 0
1064
1064
1065− Mode.Dev _ (Just interfaces) ->
1065+ Mode.Dev (Just interfaces) ->
1066 JS.Json $ Encode.object $
1066 JS.Json $ Encode.object $
1067 [ ("versions", Encode.object [ ("elm", V.encode V.compiler) ])
1067 [ ("versions", Encode.object [ ("elm", V.encode V.compiler) ])
1068 , ("types", Type.encodeMetadata (Extract.fromMsg interfaces msgType))
1068 , ("types", Type.encodeMetadata (Extract.fromMsg interfaces msgType))
compiler/src/Generate/JavaScript/Mode.hs → compiler/src/Generate/Mode.hsrenamed+10−52
@@ -1,11 +1,8 @@
1−module Generate.JavaScript.Mode
1+module Generate.Mode
2 ( Mode(..)
2 ( Mode(..)
3− , Target(..)
4− , debug
5− , dev
6− , prod
7 , isDebug
3 , isDebug
8− , isServer
4+ , ShortFieldNames
5+ , shortenFieldNames
9 )
6 )
10 where
7 where
11
8
@@ -16,7 +13,7 @@ import qualified Data.Maybe as Maybe
16import qualified Data.Name as Name
13import qualified Data.Name as Name
17
14
18import qualified AST.Optimized as Opt
15import qualified AST.Optimized as Opt
19−import qualified Elm.Interface as I
16+import qualified Elm.Compiler.Type.Extract as Extract
20import qualified Generate.JavaScript.Name as JsName
17import qualified Generate.JavaScript.Name as JsName
21
18
22
19
@@ -25,54 +22,15 @@ import qualified Generate.JavaScript.Name as JsName
25
22
26
23
27data Mode
24data Mode
28− = Dev Target (Maybe I.Interfaces)
25+ = Dev (Maybe Extract.Types)
29− | Prod Target ShortFieldNames
26+ | Prod ShortFieldNames
30−
31−
32−data Target = Client | Server
33−
34−
35−debug :: Target -> I.Interfaces -> Mode
36−debug target interfaces =
37− Dev target (Just interfaces)
38−
39−
40−dev :: Target -> Mode
41−dev target =
42− Dev target Nothing
43−
44−
45−prod :: Target -> Opt.Graph -> Mode
46−prod target (Opt.Graph _ _ fieldCounts) =
47− Prod target (shortenFieldNames fieldCounts)
48−
49−
50−
51−-- IS DEBUG?
52
27
53
28
54isDebug :: Mode -> Bool
29isDebug :: Mode -> Bool
55isDebug mode =
30isDebug mode =
56 case mode of
31 case mode of
57− Dev _ mi -> Maybe.isJust mi
32+ Dev mi -> Maybe.isJust mi
58− Prod _ _ -> False
33+ Prod _ -> False
59−
60−
61−-- IS SERVER?
62−
63−
64−isServer :: Mode -> Bool
65−isServer mode =
66− case mode of
67− Dev target _ -> isServerHelp target
68− Prod target _ -> isServerHelp target
69−
70−
71−isServerHelp :: Target -> Bool
72−isServerHelp target =
73− case target of
74− Client -> False
75− Server -> True
76
34
77
35
78
36
@@ -83,8 +41,8 @@ type ShortFieldNames =
83 Map.Map Name.Name JsName.Name
41 Map.Map Name.Name JsName.Name
84
42
85
43
86−shortenFieldNames :: Map.Map Name.Name Int -> ShortFieldNames
44+shortenFieldNames :: Opt.Graph -> ShortFieldNames
87−shortenFieldNames frequencies =
45+shortenFieldNames (Opt.Graph _ _ frequencies) =
88 Map.foldr addToShortNames Map.empty $
46 Map.foldr addToShortNames Map.empty $
89 Map.foldrWithKey addToBuckets Map.empty frequencies
47 Map.foldrWithKey addToBuckets Map.empty frequencies
90
48