on master help sign in
Track custom kernel tokens more precisely

This makes it easier to delay decisions about how code should be generated.

commit022925acae99dfa01b027fdfe6b882d532bb8cd9 authorEvan Czaplicki <evancz@users.noreply.github.com> dateTue 5 Dec 2017, 14:30 (9 years ago) parent77f542d
3 files changed+46−49
src/AST/Utils/Kernel.hs+16−10 src/Parse/Kernel.hs+28−38 src/Parse/Primitives/Kernel.hs+2−1
src/AST/Utils/Kernel.hs+16−10
@@ -43,7 +43,9 @@ data Content =
4343data Chunk
4444 = JS BS.ByteString
4545 | Var N.Name N.Name
46− | Field N.Name
46+ | ElmField N.Name
47+ | JsField Int
48+ | Enum Int
4749 | Debug
4850 | Prod
4951
@@ -71,18 +73,22 @@ instance Binary Content where
7173instance Binary Chunk where
7274 put chunk =
7375 case chunk of
74− JS a -> putWord8 0 >> put a
75− Var a b -> putWord8 1 >> put a >> put b
76− Field a -> putWord8 2 >> put a
77− Debug -> putWord8 3
78− Prod -> putWord8 4
76+ JS a -> putWord8 0 >> put a
77+ Var a b -> putWord8 1 >> put a >> put b
78+ ElmField a -> putWord8 2 >> put a
79+ JsField a -> putWord8 3 >> put a
80+ Enum a -> putWord8 4 >> put a
81+ Debug -> putWord8 5
82+ Prod -> putWord8 6
7983
8084 get =
8185 do word <- getWord8
8286 case word of
83− 0 -> liftM JS get
87+ 0 -> liftM JS get
8488 1 -> liftM2 Var get get
85− 2 -> liftM Field get
86− 3 -> return Debug
87− 4 -> return Prod
89+ 2 -> liftM ElmField get
90+ 3 -> liftM JsField get
91+ 4 -> liftM Enum get
92+ 5 -> return Debug
93+ 6 -> return Prod
8894 _ -> error "problem deserializing Parse.Kernel.Chunk"
src/Parse/Kernel.hs+28−38
@@ -6,20 +6,16 @@ module Parse.Kernel
66 where
77
88
9−import qualified Data.ByteString as BS
109import qualified Data.Map as Map
1110import Data.Monoid ((<>))
1211import Data.Text (Text)
1312import qualified Data.Text as Text
14−import qualified Data.Text.Encoding as Text
1513import Data.Word (Word8)
1614
1715import qualified AST.Source as Src
1816import qualified AST.Utils.Kernel as Kernel
1917import qualified AST.Module.Name as ModuleName
2018import qualified Elm.Name as N
21−import Generate.JavaScript.Helpers as Help (toFieldName)
22−import Generate.JavaScript.Variable as Var (intToAscii)
2319import Parse.Primitives (Parser)
2420import qualified Parse.Primitives.Kernel as K
2521import qualified Parse.Primitives.Symbol as Symbol
@@ -52,10 +48,12 @@ parserHelp imports enums fields chunks =
5248 Just tag ->
5349 case tag of
5450 K.Prod ->
55− parserHelp imports enums fields (Kernel.Prod : Kernel.JS javascript : chunks)
51+ parserHelp imports enums fields $
52+ Kernel.Prod : Kernel.JS javascript : chunks
5653
5754 K.Debug ->
58− parserHelp imports enums fields (Kernel.Debug : Kernel.JS javascript : chunks)
55+ parserHelp imports enums fields $
56+ Kernel.Debug : Kernel.JS javascript : chunks
5957
6058 K.Import var ->
6159 case Map.lookup var imports of
@@ -63,24 +61,22 @@ parserHelp imports enums fields chunks =
6361 error ("Bad kernel symbol: " ++ Text.unpack var)
6462
6563 Just (home, name) ->
66− parserHelp imports enums fields (Kernel.Var home name : Kernel.JS javascript : chunks)
64+ parserHelp imports enums fields $
65+ Kernel.Var home name : Kernel.JS javascript : chunks
6766
6867 K.Enum n var ->
69− let
70− (bytes, newEnums) =
71− lookupEnum n var enums
72− in
73− parserHelp imports newEnums fields (Kernel.JS bytes : Kernel.JS javascript : chunks)
68+ let (enum, newEnums) = lookupEnum n var enums in
69+ parserHelp imports newEnums fields $
70+ Kernel.Enum enum : Kernel.JS javascript : chunks
7471
7572 K.ElmField name ->
76− parserHelp imports enums fields (Kernel.Field name : Kernel.JS javascript : chunks)
73+ parserHelp imports enums fields $
74+ Kernel.ElmField name : Kernel.JS javascript : chunks
7775
7876 K.JsField name ->
79− let
80− (bytes, newFields) =
81− lookupField name fields
82− in
83− parserHelp imports enums newFields (Kernel.JS bytes : Kernel.JS javascript : chunks)
77+ let (field, newFields) = lookupField name fields in
78+ parserHelp imports enums newFields $
79+ Kernel.JsField field : Kernel.JS javascript : chunks
8480
8581
8682
@@ -88,21 +84,18 @@ parserHelp imports enums fields chunks =
8884
8985
9086type Fields =
91− Map.Map Text BS.ByteString
87+ Map.Map Text Int
9288
9389
94−lookupField :: Text -> Fields -> (BS.ByteString, Fields)
95−lookupField longName fields =
96− case Map.lookup longName fields of
97− Just bytes ->
98− ( bytes, fields )
90+lookupField :: Text -> Fields -> (Int, Fields)
91+lookupField name fields =
92+ case Map.lookup name fields of
93+ Just n ->
94+ ( n, fields )
9995
10096 Nothing ->
101− let
102− shortName =
103− Var.intToAscii (Map.size fields)
104− in
105− ( shortName, Map.insert longName shortName fields )
97+ let n = Map.size fields in
98+ ( n, Map.insert name n fields )
10699
107100
108101
@@ -110,25 +103,22 @@ lookupField longName fields =
110103
111104
112105type Enums =
113− Map.Map Word8 (Map.Map Text BS.ByteString)
106+ Map.Map Word8 (Map.Map N.Name Int)
114107
115108
116−lookupEnum :: Word8 -> Text -> Enums -> (BS.ByteString, Enums)
109+lookupEnum :: Word8 -> N.Name -> Enums -> (Int, Enums)
117110lookupEnum word var allEnums =
118111 let
119112 enums =
120113 Map.findWithDefault Map.empty word allEnums
121114 in
122115 case Map.lookup var enums of
123− Just bytes ->
124− ( bytes, allEnums )
116+ Just n ->
117+ ( n, allEnums )
125118
126119 Nothing ->
127− let
128− identifier =
129− Text.encodeUtf8 ("'" <> Help.toFieldName (Map.size enums) <> "'")
130− in
131− ( identifier, Map.insert word (Map.insert var identifier enums) allEnums )
120+ let n = Map.size enums in
121+ ( n, Map.insert word (Map.insert var n enums) allEnums )
132122
133123
134124
src/Parse/Primitives/Kernel.hs+2−1
@@ -14,6 +14,7 @@ import Data.Text (Text)
1414import Data.Word (Word8)
1515import Foreign.ForeignPtr (ForeignPtr)
1616
17+import qualified Elm.Name as N
1718import Parse.Primitives.Internals (Parser(..), State(..), noError)
1819import qualified Parse.Primitives.Internals as I
1920import qualified Parse.Primitives.Variable as Var
@@ -29,7 +30,7 @@ data Special
2930 | Debug
3031 | Import Text
3132 | JsField Text
32− | ElmField Text
33+ | ElmField N.Name
3334
3435
3536