on master help sign in
Track custom kernel tokens more precisely
022925aEvan Czaplicki
src/AST/Utils/Kernel.hs+16−10
@@ -43,7 +43,9 @@ data Content =
43data Chunk
43data Chunk
44 = JS BS.ByteString
44 = JS BS.ByteString
45 | Var N.Name N.Name
45 | Var N.Name N.Name
46− | Field N.Name
46+ | ElmField N.Name
47+ | JsField Int
48+ | Enum Int
47 | Debug
49 | Debug
48 | Prod
50 | Prod
49
51
@@ -71,18 +73,22 @@ instance Binary Content where
71instance Binary Chunk where
73instance Binary Chunk where
72 put chunk =
74 put chunk =
73 case chunk of
75 case chunk of
74− JS a -> putWord8 0 >> put a
76+ JS a -> putWord8 0 >> put a
75− Var a b -> putWord8 1 >> put a >> put b
77+ Var a b -> putWord8 1 >> put a >> put b
76− Field a -> putWord8 2 >> put a
78+ ElmField a -> putWord8 2 >> put a
79+ JsField a -> putWord8 3 >> put a
80+ Enum a -> putWord8 4 >> put a
77− Debug -> putWord8 3
81+ Debug -> putWord8 5
78− Prod -> putWord8 4
82+ Prod -> putWord8 6
79
83
80 get =
84 get =
81 do word <- getWord8
85 do word <- getWord8
82 case word of
86 case word of
83− 0 -> liftM JS get
87+ 0 -> liftM JS get
84 1 -> liftM2 Var get get
88 1 -> liftM2 Var get get
85− 2 -> liftM Field get
89+ 2 -> liftM ElmField get
86− 3 -> return Debug
90+ 3 -> liftM JsField get
91+ 4 -> liftM Enum get
92+ 5 -> return Debug
87− 4 -> return Prod
93+ 6 -> return Prod
88 _ -> error "problem deserializing Parse.Kernel.Chunk"
94 _ -> error "problem deserializing Parse.Kernel.Chunk"
src/Parse/Kernel.hs+28−38
@@ -6,20 +6,16 @@ module Parse.Kernel
6 where
6 where
7
7
8
8
9−import qualified Data.ByteString as BS
10import qualified Data.Map as Map
9import qualified Data.Map as Map
11import Data.Monoid ((<>))
10import Data.Monoid ((<>))
12import Data.Text (Text)
11import Data.Text (Text)
13import qualified Data.Text as Text
12import qualified Data.Text as Text
14−import qualified Data.Text.Encoding as Text
15import Data.Word (Word8)
13import Data.Word (Word8)
16
14
17import qualified AST.Source as Src
15import qualified AST.Source as Src
18import qualified AST.Utils.Kernel as Kernel
16import qualified AST.Utils.Kernel as Kernel
19import qualified AST.Module.Name as ModuleName
17import qualified AST.Module.Name as ModuleName
20import qualified Elm.Name as N
18import qualified Elm.Name as N
21−import Generate.JavaScript.Helpers as Help (toFieldName)
22−import Generate.JavaScript.Variable as Var (intToAscii)
23import Parse.Primitives (Parser)
19import Parse.Primitives (Parser)
24import qualified Parse.Primitives.Kernel as K
20import qualified Parse.Primitives.Kernel as K
25import qualified Parse.Primitives.Symbol as Symbol
21import qualified Parse.Primitives.Symbol as Symbol
@@ -52,10 +48,12 @@ parserHelp imports enums fields chunks =
52 Just tag ->
48 Just tag ->
53 case tag of
49 case tag of
54 K.Prod ->
50 K.Prod ->
51+ parserHelp imports enums fields $
55− parserHelp imports enums fields (Kernel.Prod : Kernel.JS javascript : chunks)
52+ Kernel.Prod : Kernel.JS javascript : chunks
56
53
57 K.Debug ->
54 K.Debug ->
55+ parserHelp imports enums fields $
58− parserHelp imports enums fields (Kernel.Debug : Kernel.JS javascript : chunks)
56+ Kernel.Debug : Kernel.JS javascript : chunks
59
57
60 K.Import var ->
58 K.Import var ->
61 case Map.lookup var imports of
59 case Map.lookup var imports of
@@ -63,24 +61,22 @@ parserHelp imports enums fields chunks =
63 error ("Bad kernel symbol: " ++ Text.unpack var)
61 error ("Bad kernel symbol: " ++ Text.unpack var)
64
62
65 Just (home, name) ->
63 Just (home, name) ->
64+ parserHelp imports enums fields $
66− parserHelp imports enums fields (Kernel.Var home name : Kernel.JS javascript : chunks)
65+ Kernel.Var home name : Kernel.JS javascript : chunks
67
66
68 K.Enum n var ->
67 K.Enum n var ->
69− let
70− (bytes, newEnums) =
71− lookupEnum n var enums
68+ let (enum, newEnums) = lookupEnum n var enums in
72− in
73− parserHelp imports newEnums fields (Kernel.JS bytes : Kernel.JS javascript : chunks)
69+ parserHelp imports newEnums fields $
70+ Kernel.Enum enum : Kernel.JS javascript : chunks
74
71
75 K.ElmField name ->
72 K.ElmField name ->
73+ parserHelp imports enums fields $
76− parserHelp imports enums fields (Kernel.Field name : Kernel.JS javascript : chunks)
74+ Kernel.ElmField name : Kernel.JS javascript : chunks
77
75
78 K.JsField name ->
76 K.JsField name ->
79− let
80− (bytes, newFields) =
81− lookupField name fields
77+ let (field, newFields) = lookupField name fields in
82− in
83− parserHelp imports enums newFields (Kernel.JS bytes : Kernel.JS javascript : chunks)
78+ parserHelp imports enums newFields $
79+ Kernel.JsField field : Kernel.JS javascript : chunks
84
80
85
81
86
82
@@ -88,21 +84,18 @@ parserHelp imports enums fields chunks =
88
84
89
85
90type Fields =
86type Fields =
91− Map.Map Text BS.ByteString
87+ Map.Map Text Int
92
88
93
89
94−lookupField :: Text -> Fields -> (BS.ByteString, Fields)
90+lookupField :: Text -> Fields -> (Int, Fields)
95−lookupField longName fields =
91+lookupField name fields =
96− case Map.lookup longName fields of
92+ case Map.lookup name fields of
97− Just bytes ->
93+ Just n ->
98− ( bytes, fields )
94+ ( n, fields )
99
95
100 Nothing ->
96 Nothing ->
101− let
102− shortName =
103− Var.intToAscii (Map.size fields)
97+ let n = Map.size fields in
104− in
105− ( shortName, Map.insert longName shortName fields )
98+ ( n, Map.insert name n fields )
106
99
107
100
108
101
@@ -110,25 +103,22 @@ lookupField longName fields =
110
103
111
104
112type Enums =
105type Enums =
113− Map.Map Word8 (Map.Map Text BS.ByteString)
106+ Map.Map Word8 (Map.Map N.Name Int)
114
107
115
108
116−lookupEnum :: Word8 -> Text -> Enums -> (BS.ByteString, Enums)
109+lookupEnum :: Word8 -> N.Name -> Enums -> (Int, Enums)
117lookupEnum word var allEnums =
110lookupEnum word var allEnums =
118 let
111 let
119 enums =
112 enums =
120 Map.findWithDefault Map.empty word allEnums
113 Map.findWithDefault Map.empty word allEnums
121 in
114 in
122 case Map.lookup var enums of
115 case Map.lookup var enums of
123− Just bytes ->
116+ Just n ->
124− ( bytes, allEnums )
117+ ( n, allEnums )
125
118
126 Nothing ->
119 Nothing ->
127− let
128− identifier =
129− Text.encodeUtf8 ("'" <> Help.toFieldName (Map.size enums) <> "'")
120+ let n = Map.size enums in
130− in
131− ( identifier, Map.insert word (Map.insert var identifier enums) allEnums )
121+ ( n, Map.insert word (Map.insert var n enums) allEnums )
132
122
133
123
134
124
src/Parse/Primitives/Kernel.hs+2−1
@@ -14,6 +14,7 @@ import Data.Text (Text)
14import Data.Word (Word8)
14import Data.Word (Word8)
15import Foreign.ForeignPtr (ForeignPtr)
15import Foreign.ForeignPtr (ForeignPtr)
16
16
17+import qualified Elm.Name as N
17import Parse.Primitives.Internals (Parser(..), State(..), noError)
18import Parse.Primitives.Internals (Parser(..), State(..), noError)
18import qualified Parse.Primitives.Internals as I
19import qualified Parse.Primitives.Internals as I
19import qualified Parse.Primitives.Variable as Var
20import qualified Parse.Primitives.Variable as Var
@@ -29,7 +30,7 @@ data Special
29 | Debug
30 | Debug
30 | Import Text
31 | Import Text
31 | JsField Text
32 | JsField Text
32− | ElmField Text
33+ | ElmField N.Name
33
34
34
35
35
36