on master help sign in
Switch Generate/* off Data.Text and update for data structure changes
628904cEvan Czaplicki
compiler/src/Generate/JavaScript.hs+27−29
@@ -15,19 +15,18 @@ import Data.Map ((!))
15import qualified Data.Map as Map
15import qualified Data.Map as Map
16import qualified Data.Name as Name
16import qualified Data.Name as Name
17import qualified Data.Set as Set
17import qualified Data.Set as Set
18−import qualified Data.Text as Text
18+import qualified Data.Utf8 as Utf8
19−import qualified Data.Text.Encoding as Text
20
19
21import qualified AST.Canonical as Can
20import qualified AST.Canonical as Can
22import qualified AST.Optimized as Opt
21import qualified AST.Optimized as Opt
23import qualified Data.Index as Index
22import qualified Data.Index as Index
24import qualified Elm.Interface as I
23import qualified Elm.Interface as I
24+import qualified Elm.Kernel as K
25import qualified Elm.ModuleName as ModuleName
25import 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
29import qualified Generate.JavaScript.Mode as Mode
29import qualified Generate.JavaScript.Mode as Mode
30−import qualified Reporting.Doc as D
31import qualified Reporting.Render.Type as RT
30import qualified Reporting.Render.Type as RT
32import qualified Reporting.Render.Type.Localizer as L
31import qualified Reporting.Render.Type.Localizer as L
33
32
@@ -192,16 +191,11 @@ addGlobalHelp mode graph global state =
192 Opt.Manager effectsType ->
191 Opt.Manager effectsType ->
193 generateManager mode graph global effectsType state
192 generateManager mode graph global effectsType state
194
193
195− Opt.Kernel (Opt.KContent clientChunks clientDeps) maybeServer ->
194+ Opt.Kernel chunks deps ->
196 if isDebugger global && not (Mode.isDebug mode) then
195 if isDebugger global && not (Mode.isDebug mode) then
197 state
196 state
198 else
197 else
199− case maybeServer of
200− Just (Opt.KContent serverChunks serverDeps) | Mode.isServer mode ->
201− addKernel (addDeps serverDeps state) (generateKernel mode serverChunks)
202−
203− _ ->
204− addKernel (addDeps clientDeps state) (generateKernel mode clientChunks)
198+ addKernel (addDeps deps state) (generateKernel mode chunks)
205
199
206 Opt.Enum index ->
200 Opt.Enum index ->
207 addStmt state (
201 addStmt state (
@@ -321,33 +315,33 @@ drawCycle names =
321-- GENERATE KERNEL
315-- GENERATE KERNEL
322
316
323
317
324−generateKernel :: Mode.Mode -> [Opt.KChunk] -> B.Builder
318+generateKernel :: Mode.Mode -> [K.Chunk] -> B.Builder
325generateKernel mode chunks =
319generateKernel mode chunks =
326− List.foldl' (addChunk mode) mempty chunks
320+ List.foldr (addChunk mode) mempty chunks
327
321
328
322
329−addChunk :: Mode.Mode -> B.Builder -> Opt.KChunk -> B.Builder
323+addChunk :: Mode.Mode -> K.Chunk -> B.Builder -> B.Builder
330−addChunk mode builder chunk =
324+addChunk mode chunk builder =
331 case chunk of
325 case chunk of
332− Opt.JS javascript ->
326+ K.JS javascript ->
333− B.byteString javascript <> builder
327+ Utf8.toBuilder javascript <> builder
334
328
335− Opt.ElmVar home name ->
329+ K.ElmVar home name ->
336 JsName.toBuilder (JsName.fromGlobal home name) <> builder
330 JsName.toBuilder (JsName.fromGlobal home name) <> builder
337
331
338− Opt.JsVar home name ->
332+ K.JsVar home name ->
339 JsName.toBuilder (JsName.fromKernel home name) <> builder
333 JsName.toBuilder (JsName.fromKernel home name) <> builder
340
334
341− Opt.ElmField name ->
335+ K.ElmField name ->
342 JsName.toBuilder (Expr.generateField mode name) <> builder
336 JsName.toBuilder (Expr.generateField mode name) <> builder
343
337
344− Opt.JsField int ->
338+ K.JsField int ->
345 JsName.toBuilder (JsName.fromInt int) <> builder
339 JsName.toBuilder (JsName.fromInt int) <> builder
346
340
347− Opt.JsEnum int ->
341+ K.JsEnum int ->
348 B.intDec int <> builder
342 B.intDec int <> builder
349
343
350− Opt.Debug ->
344+ K.Debug ->
351 case mode of
345 case mode of
352 Mode.Dev _ _ ->
346 Mode.Dev _ _ ->
353 builder
347 builder
@@ -355,7 +349,7 @@ addChunk mode builder chunk =
355 Mode.Prod _ _ ->
349 Mode.Prod _ _ ->
356 "_UNUSED" <> builder
350 "_UNUSED" <> builder
357
351
358− Opt.Prod ->
352+ K.Prod ->
359 case mode of
353 case mode of
360 Mode.Dev _ _ ->
354 Mode.Dev _ _ ->
361 "_UNUSED" <> builder
355 "_UNUSED" <> builder
@@ -520,14 +514,14 @@ generateExports mode (Trie maybeMain subs) =
520
514
521 (name, subTrie) : otherSubTries ->
515 (name, subTrie) : otherSubTries ->
522 starter "," <>
516 starter "," <>
523− "'" <> Text.encodeUtf8Builder name <> "':"
517+ "'" <> Utf8.toBuilder name <> "':"
524 <> generateExports mode subTrie
518 <> generateExports mode subTrie
525 <> List.foldl' (addSubTrie mode) "}" otherSubTries
519 <> List.foldl' (addSubTrie mode) "}" otherSubTries
526
520
527
521
528−addSubTrie :: Mode.Mode -> B.Builder -> (Text.Text, Trie) -> B.Builder
522+addSubTrie :: Mode.Mode -> B.Builder -> (Utf8.String, Trie) -> B.Builder
529addSubTrie mode end (name, trie) =
523addSubTrie mode end (name, trie) =
530− ",'" <> Text.encodeUtf8Builder name <> "':" <> generateExports mode trie <> end
524+ ",'" <> Utf8.toBuilder name <> "':" <> generateExports mode trie <> end
531
525
532
526
533
527
@@ -537,7 +531,7 @@ addSubTrie mode end (name, trie) =
537data Trie =
531data Trie =
538 Trie
532 Trie
539 { _main :: Maybe (ModuleName.Canonical, Opt.Main)
533 { _main :: Maybe (ModuleName.Canonical, Opt.Main)
540− , _subs :: Map.Map Text.Text Trie
534+ , _subs :: Map.Map Utf8.String Trie
541 }
535 }
542
536
543
537
@@ -548,10 +542,14 @@ emptyTrie =
548
542
549addToTrie :: ModuleName.Canonical -> Opt.Main -> Trie -> Trie
543addToTrie :: ModuleName.Canonical -> Opt.Main -> Trie -> Trie
550addToTrie home@(ModuleName.Canonical _ moduleName) main trie =
544addToTrie home@(ModuleName.Canonical _ moduleName) main trie =
545+ let
546+ segments =
547+ Utf8.split 0x2E {-.-} (Name.toUtf8 moduleName)
548+ in
551− merge trie $ segmentsToTrie home (Text.splitOn "." (Name.toText moduleName)) main
549+ merge trie $ segmentsToTrie home segments main
552
550
553
551
554−segmentsToTrie :: ModuleName.Canonical -> [Text.Text] -> Opt.Main -> Trie
552+segmentsToTrie :: ModuleName.Canonical -> [Utf8.String] -> Opt.Main -> Trie
555segmentsToTrie home segments main =
553segmentsToTrie home segments main =
556 case segments of
554 case segments of
557 [] ->
555 [] ->
compiler/src/Generate/JavaScript/Builder.hs+3−3
@@ -29,7 +29,7 @@ import qualified Json.Encode as Json
29
29
30data Expr
30data Expr
31 = String Builder
31 = String Builder
32− | Float Double
32+ | Float Builder
33 | Int Int
33 | Int Int
34 | Bool Bool
34 | Bool Bool
35 | Null
35 | Null
@@ -316,8 +316,8 @@ fromExpr indent grouping expression =
316 String string ->
316 String string ->
317 (One, "'" <> string <> "'")
317 (One, "'" <> string <> "'")
318
318
319− Float n ->
319+ Float float ->
320− (One, B.doubleDec n)
320+ (One, float)
321
321
322 Int n ->
322 Int n ->
323 (One, B.intDec n)
323 (One, B.intDec n)
compiler/src/Generate/JavaScript/Expression.hs+12−13
@@ -18,7 +18,6 @@ import Data.Map ((!))
18import qualified Data.Map as Map
18import qualified Data.Map as Map
19import qualified Data.Name as Name
19import qualified Data.Name as Name
20import qualified Data.Set as Set
20import qualified Data.Set as Set
21−import qualified Data.Text.Encoding as Text
22import qualified Data.Utf8 as Utf8
21import qualified Data.Utf8 as Utf8
23
22
24import qualified AST.Canonical as Can
23import qualified AST.Canonical as Can
@@ -26,7 +25,7 @@ import qualified AST.Optimized as Opt
26import qualified Data.Index as Index
25import qualified Data.Index as Index
27import qualified Elm.Compiler.Type as Type
26import qualified Elm.Compiler.Type as Type
28import qualified Elm.Compiler.Type.Extract as Extract
27import qualified Elm.Compiler.Type.Extract as Extract
29−import qualified Elm.Compiler.Version as Version
28+import qualified Elm.Version as V
30import qualified Elm.ModuleName as ModuleName
29import qualified Elm.ModuleName as ModuleName
31import qualified Elm.Package as Pkg
30import qualified Elm.Package as Pkg
32import qualified Generate.JavaScript.Builder as JS
31import qualified Generate.JavaScript.Builder as JS
@@ -34,7 +33,7 @@ import qualified Generate.JavaScript.Mode as Mode
34import qualified Generate.JavaScript.Name as JsName
33import qualified Generate.JavaScript.Name as JsName
35import qualified Json.Encode as Encode
34import qualified Json.Encode as Encode
36import qualified Optimize.DecisionTree as DT
35import qualified Optimize.DecisionTree as DT
37−import qualified Reporting.Region as R
36+import qualified Reporting.Annotation as A
38
37
39
38
40
39
@@ -68,7 +67,7 @@ generate mode expression =
68 JsExpr $ JS.Int int
67 JsExpr $ JS.Int int
69
68
70 Opt.Float float ->
69 Opt.Float float ->
71− JsExpr $ JS.Float float
70+ JsExpr $ JS.Float (Utf8.toBuilder float)
72
71
73 Opt.VarLocal name ->
72 Opt.VarLocal name ->
74 JsExpr $ JS.Ref (JsName.fromLocal name)
73 JsExpr $ JS.Ref (JsName.fromLocal name)
@@ -191,7 +190,7 @@ generate mode expression =
191 JS.Object (map toTranlation (Set.toList fields))
190 JS.Object (map toTranlation (Set.toList fields))
192 in
191 in
193 JsExpr $ JS.Object $
192 JsExpr $ JS.Object $
194− [ ( JsName.fromLocal "src", JS.String (Text.encodeUtf8Builder src) )
193+ [ ( JsName.fromLocal "src", JS.String (Utf8.toBuilder src) )
195 , ( JsName.fromLocal "attributes", toTranslationObject attributes )
194 , ( JsName.fromLocal "attributes", toTranslationObject attributes )
196 , ( JsName.fromLocal "uniforms", toTranslationObject uniforms )
195 , ( JsName.fromLocal "uniforms", toTranslationObject uniforms )
197 ]
196 ]
@@ -313,7 +312,7 @@ generateField mode name =
313-- DEBUG
312-- DEBUG
314
313
315
314
316−generateDebug :: Name.Name -> ModuleName.Canonical -> R.Region -> Maybe Name.Name -> JS.Expr
315+generateDebug :: Name.Name -> ModuleName.Canonical -> A.Region -> Maybe Name.Name -> JS.Expr
317generateDebug name (ModuleName.Canonical _ home) region unhandledValueName =
316generateDebug name (ModuleName.Canonical _ home) region unhandledValueName =
318 if name /= "todo" then
317 if name /= "todo" then
319 JS.Ref (JsName.fromGlobal ModuleName.debug name)
318 JS.Ref (JsName.fromGlobal ModuleName.debug name)
@@ -333,19 +332,19 @@ generateDebug name (ModuleName.Canonical _ home) region unhandledValueName =
333 ]
332 ]
334
333
335
334
336−regionToJsExpr :: R.Region -> JS.Expr
335+regionToJsExpr :: A.Region -> JS.Expr
337−regionToJsExpr (R.Region start end) =
336+regionToJsExpr (A.Region start end) =
338 JS.Object
337 JS.Object
339 [ ( JsName.fromLocal "start", positionToJsExpr start )
338 [ ( JsName.fromLocal "start", positionToJsExpr start )
340 , ( JsName.fromLocal "end", positionToJsExpr end )
339 , ( JsName.fromLocal "end", positionToJsExpr end )
341 ]
340 ]
342
341
343
342
344−positionToJsExpr :: R.Position -> JS.Expr
343+positionToJsExpr :: A.Position -> JS.Expr
345−positionToJsExpr (R.Position line column) =
344+positionToJsExpr (A.Position line column) =
346 JS.Object
345 JS.Object
347− [ ( JsName.fromLocal "line", JS.Int line )
346+ [ ( JsName.fromLocal "line", JS.Int (fromIntegral line) )
348− , ( JsName.fromLocal "column", JS.Int column )
347+ , ( JsName.fromLocal "column", JS.Int (fromIntegral column) )
349 ]
348 ]
350
349
351
350
@@ -1065,6 +1064,6 @@ toDebugMetadata mode msgType =
1065
1064
1066 Mode.Dev _ (Just interfaces) ->
1065 Mode.Dev _ (Just interfaces) ->
1067 JS.Json $ Encode.object $
1066 JS.Json $ Encode.object $
1068− [ ("versions", Encode.object [ ("elm", Pkg.encodeVersion Version.version) ])
1067+ [ ("versions", Encode.object [ ("elm", V.encode V.compiler) ])
1069 , ("types", Type.encodeMetadata (Extract.fromMsg interfaces msgType))
1068 , ("types", Type.encodeMetadata (Extract.fromMsg interfaces msgType))
1070 ]
1069 ]
compiler/src/Generate/JavaScript/Name.hs+3−2
@@ -23,6 +23,7 @@ import Data.Monoid ((<>))
23import qualified Data.Map as Map
23import qualified Data.Map as Map
24import qualified Data.Name as Name
24import qualified Data.Name as Name
25import qualified Data.Set as Set
25import qualified Data.Set as Set
26+import qualified Data.Utf8 as Utf8
26import Data.Word (Word8)
27import Data.Word (Word8)
27
28
28import qualified Data.Index as Index
29import qualified Data.Index as Index
@@ -231,7 +232,7 @@ allBadFields :: [BadFields]
231allBadFields =
232allBadFields =
232 let
233 let
233 add keyword dict =
234 add keyword dict =
234− Map.alter (Just . addRenaming keyword) (Name.length keyword) dict
235+ Map.alter (Just . addRenaming keyword) (Utf8.size keyword) dict
235 in
236 in
236 Map.elems $ Set.foldr add Map.empty jsReservedWords
237 Map.elems $ Set.foldr add Map.empty jsReservedWords
237
238
@@ -239,7 +240,7 @@ allBadFields =
239addRenaming :: Name.Name -> Maybe BadFields -> BadFields
240addRenaming :: Name.Name -> Maybe BadFields -> BadFields
240addRenaming keyword maybeBadFields =
241addRenaming keyword maybeBadFields =
241 let
242 let
242− width = Name.length keyword
243+ width = Utf8.size keyword
243 maxName = numStartBytes * numInnerBytes ^ (width - 1) - 1
244 maxName = numStartBytes * numInnerBytes ^ (width - 1) - 1
244 in
245 in
245 case maybeBadFields of
246 case maybeBadFields of