@@ -19,6 +19,7 @@ import qualified AST.Kernel as Kernel
1919import qualified AST.Module as Module
2020import qualified AST.Module.Name as Module
2121import Generate.JavaScript.Helpers as Help (toFieldName)
22+import Generate.JavaScript.Variable as Var (intToAscii)
2223import Parse.Helpers (Parser)
2324import qualified Parse.Helpers as Parse
2425import qualified Parse.Module as Parse
@@ -31,18 +32,14 @@ import qualified Reporting.Annotation as A
3132
3233parser :: Parser Kernel.Info
3334parser =
34− do imports <- Parse.kernelHeader
35− let table = Map.unions (map importToTable imports)
36− chunks <- parserHelp table Map.empty []
37− return (Kernel.Info (Map.elems table) chunks)
35+ do header <- Parse.kernelHeader
36+ let imports = Map.unions (map headerToImport header)
37+ chunks <- parserHelp imports Map.empty Map.empty []
38+ return (Kernel.Info (Map.elems imports) chunks)
3839
3940
40−type Enums =
41− Map.Map Word8 (Map.Map Text BS.ByteString)
42−
43−
44−parserHelp :: Table -> Enums -> [Kernel.Chunk] -> Parser [Kernel.Chunk]
45−parserHelp table enums chunks =
41+parserHelp :: Imports -> Enums -> Fields -> [Kernel.Chunk] -> Parser [Kernel.Chunk]
42+parserHelp imports enums fields chunks =
4643 do (javascript, maybeTag) <- Parse.kernelChunk
4744 case maybeTag of
4845 Nothing ->
@@ -51,22 +48,62 @@ parserHelp table enums chunks =
5148 Just tag ->
5249 case tag of
5350 Parse.KernelProd isProd ->
54− parserHelp table enums (Kernel.Prod isProd : Kernel.JS javascript : chunks)
51+ parserHelp imports enums fields (Kernel.Prod isProd : Kernel.JS javascript : chunks)
5552
5653 Parse.KernelImport var ->
57− case Map.lookup var table of
54+ case Map.lookup var imports of
5855 Nothing ->
5956 error ("Bad kernel symbol: " ++ Text.unpack var)
6057
6158 Just (home, name) ->
62− parserHelp table enums (Kernel.Var home name : Kernel.JS javascript : chunks)
59+ parserHelp imports enums fields (Kernel.Var home name : Kernel.JS javascript : chunks)
6360
6461 Parse.KernelEnum n var ->
6562 let
6663 (bytes, newEnums) =
6764 lookupEnum n var enums
6865 in
69− parserHelp table newEnums (Kernel.JS bytes : Kernel.JS javascript : chunks)
66+ parserHelp imports newEnums fields (Kernel.JS bytes : Kernel.JS javascript : chunks)
67+
68+ Parse.KernelElmField name ->
69+ parserHelp imports enums fields (Kernel.Field name : Kernel.JS javascript : chunks)
70+
71+ Parse.KernelJsField name ->
72+ let
73+ (bytes, newFields) =
74+ lookupField name fields
75+ in
76+ parserHelp imports enums newFields (Kernel.JS bytes : Kernel.JS javascript : chunks)
77+
78+
79+
80+-- FIELDS
81+
82+
83+type Fields =
84+ Map.Map Text BS.ByteString
85+
86+
87+lookupField :: Text -> Fields -> (BS.ByteString, Fields)
88+lookupField longName fields =
89+ case Map.lookup longName fields of
90+ Just bytes ->
91+ ( bytes, fields )
92+
93+ Nothing ->
94+ let
95+ shortName =
96+ Var.intToAscii (Map.size fields)
97+ in
98+ ( shortName, Map.insert longName shortName fields )
99+
100+
101+
102+-- ENUMS
103+
104+
105+type Enums =
106+ Map.Map Word8 (Map.Map Text BS.ByteString)
70107
71108
72109lookupEnum :: Word8 -> Text -> Enums -> (BS.ByteString, Enums)
@@ -88,15 +125,15 @@ lookupEnum word var allEnums =
88125
89126
90127
91−-- SYMBOL TABLE
128+-- IMPORTS
92129
93130
94−type Table =
131+type Imports =
95132 Map.Map Text (Module.Raw, Text)
96133
97134
98−importToTable :: Module.UserImport -> Table
99−importToTable (A.A _ ( A.A _ fullName, Module.ImportMethod maybeAlias exposed )) =
135+headerToImport :: Module.UserImport -> Imports
136+headerToImport (A.A _ ( A.A _ fullName, Module.ImportMethod maybeAlias exposed )) =
100137 let
101138 shortName =
102139 case maybeAlias of