on master help sign in
Handle new tokens in kernel code for field renaming
ca0d6e0Evan Czaplicki
src/AST/Kernel.hs+9−4
@@ -28,6 +28,7 @@ data Info =
28data Chunk
28data Chunk
29 = JS BS.ByteString
29 = JS BS.ByteString
30 | Var ModuleName.Raw Text.Text
30 | Var ModuleName.Raw Text.Text
31+ | Field Text.Text
31 | Prod Bool
32 | Prod Bool
32
33
33
34
@@ -52,17 +53,21 @@ instance Binary Chunk where
52 Var home name ->
53 Var home name ->
53 putWord8 1 >> put home >> put name
54 putWord8 1 >> put home >> put name
54
55
56+ Field field ->
57+ putWord8 2 >> put field
58+
55 Prod True ->
59 Prod True ->
56− putWord8 2
60+ putWord8 3
57
61
58 Prod False ->
62 Prod False ->
59− putWord8 3
63+ putWord8 4
60
64
61 get =
65 get =
62 do word <- getWord8
66 do word <- getWord8
63 case word of
67 case word of
64 0 -> liftM JS get
68 0 -> liftM JS get
65 1 -> liftM2 Var get get
69 1 -> liftM2 Var get get
66− 2 -> return (Prod True)
70+ 2 -> liftM Field get
67− 3 -> return (Prod False)
71+ 3 -> return (Prod True)
72+ 4 -> return (Prod False)
68 _ -> error "problem deserializing Parse.Kernel.Chunk"
73 _ -> error "problem deserializing Parse.Kernel.Chunk"
src/Generate/JavaScript.hs+4
@@ -8,6 +8,7 @@ import qualified Data.List as List
8import qualified Data.Map as Map
8import qualified Data.Map as Map
9import qualified Data.Set as Set
9import qualified Data.Set as Set
10import qualified Data.Text as Text
10import qualified Data.Text as Text
11+import qualified Data.Text.Encoding as Text
11import qualified Data.ByteString.Builder as BS
12import qualified Data.ByteString.Builder as BS
12
13
13import qualified AST.Effects as Effects
14import qualified AST.Effects as Effects
@@ -156,6 +157,9 @@ chunkToBuilder builder chunk =
156 do expr <- JS.global (Var.Global (ModuleName.inCore home) name)
157 do expr <- JS.global (Var.Global (ModuleName.inCore home) name)
157 return $ JsBuilder.exprToBuilder expr <> builder
158 return $ JsBuilder.exprToBuilder expr <> builder
158
159
160+ Kernel.Field name ->
161+ return $ Text.encodeUtf8Builder name
162+
159 Kernel.Prod isProd ->
163 Kernel.Prod isProd ->
160 if isProd then
164 if isProd then
161 return "_UNUSED"
165 return "_UNUSED"
src/Parse/Kernel.hs+55−18
@@ -19,6 +19,7 @@ import qualified AST.Kernel as Kernel
19import qualified AST.Module as Module
19import qualified AST.Module as Module
20import qualified AST.Module.Name as Module
20import qualified AST.Module.Name as Module
21import Generate.JavaScript.Helpers as Help (toFieldName)
21import Generate.JavaScript.Helpers as Help (toFieldName)
22+import Generate.JavaScript.Variable as Var (intToAscii)
22import Parse.Helpers (Parser)
23import Parse.Helpers (Parser)
23import qualified Parse.Helpers as Parse
24import qualified Parse.Helpers as Parse
24import qualified Parse.Module as Parse
25import qualified Parse.Module as Parse
@@ -31,18 +32,14 @@ import qualified Reporting.Annotation as A
31
32
32parser :: Parser Kernel.Info
33parser :: Parser Kernel.Info
33parser =
34parser =
34− do imports <- Parse.kernelHeader
35+ do header <- Parse.kernelHeader
35− let table = Map.unions (map importToTable imports)
36+ let imports = Map.unions (map headerToImport header)
36− chunks <- parserHelp table Map.empty []
37+ chunks <- parserHelp imports Map.empty Map.empty []
37− return (Kernel.Info (Map.elems table) chunks)
38+ return (Kernel.Info (Map.elems imports) chunks)
38
39
39
40
40−type Enums =
41− Map.Map Word8 (Map.Map Text BS.ByteString)
42−
43−
44−parserHelp :: Table -> Enums -> [Kernel.Chunk] -> Parser [Kernel.Chunk]
41+parserHelp :: Imports -> Enums -> Fields -> [Kernel.Chunk] -> Parser [Kernel.Chunk]
45−parserHelp table enums chunks =
42+parserHelp imports enums fields chunks =
46 do (javascript, maybeTag) <- Parse.kernelChunk
43 do (javascript, maybeTag) <- Parse.kernelChunk
47 case maybeTag of
44 case maybeTag of
48 Nothing ->
45 Nothing ->
@@ -51,22 +48,62 @@ parserHelp table enums chunks =
51 Just tag ->
48 Just tag ->
52 case tag of
49 case tag of
53 Parse.KernelProd isProd ->
50 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)
55
52
56 Parse.KernelImport var ->
53 Parse.KernelImport var ->
57− case Map.lookup var table of
54+ case Map.lookup var imports of
58 Nothing ->
55 Nothing ->
59 error ("Bad kernel symbol: " ++ Text.unpack var)
56 error ("Bad kernel symbol: " ++ Text.unpack var)
60
57
61 Just (home, name) ->
58 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)
63
60
64 Parse.KernelEnum n var ->
61 Parse.KernelEnum n var ->
65 let
62 let
66 (bytes, newEnums) =
63 (bytes, newEnums) =
67 lookupEnum n var enums
64 lookupEnum n var enums
68 in
65 in
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
69− parserHelp table newEnums (Kernel.JS bytes : Kernel.JS javascript : chunks)
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)
70
107
71
108
72lookupEnum :: Word8 -> Text -> Enums -> (BS.ByteString, Enums)
109lookupEnum :: Word8 -> Text -> Enums -> (BS.ByteString, Enums)
@@ -88,15 +125,15 @@ lookupEnum word var allEnums =
88
125
89
126
90
127
91−-- SYMBOL TABLE
128+-- IMPORTS
92
129
93
130
94−type Table =
131+type Imports =
95 Map.Map Text (Module.Raw, Text)
132 Map.Map Text (Module.Raw, Text)
96
133
97
134
98−importToTable :: Module.UserImport -> Table
135+headerToImport :: Module.UserImport -> Imports
99−importToTable (A.A _ ( A.A _ fullName, Module.ImportMethod maybeAlias exposed )) =
136+headerToImport (A.A _ ( A.A _ fullName, Module.ImportMethod maybeAlias exposed )) =
100 let
137 let
101 shortName =
138 shortName =
102 case maybeAlias of
139 case maybeAlias of
src/Parse/Primitives.hs+21−11
@@ -1311,6 +1311,8 @@ data ChunkTag
1311 = KernelEnum Word8 Text
1311 = KernelEnum Word8 Text
1312 | KernelProd Bool
1312 | KernelProd Bool
1313 | KernelImport Text
1313 | KernelImport Text
1314+ | KernelJsField Text
1315+ | KernelElmField Text
1314
1316
1315
1317
1316kernelChunk :: Parser (BS.ByteString, Maybe ChunkTag)
1318kernelChunk :: Parser (BS.ByteString, Maybe ChunkTag)
@@ -1355,22 +1357,30 @@ chompChunkTag :: Text.Array -> Int -> Int -> Int -> Int -> Int -> (# Maybe Chunk
1355chompChunkTag array jsOffset offset length row col =
1357chompChunkTag array jsOffset offset length row col =
1356 let
1358 let
1357 (# newOffset, newLength, newCol #) =
1359 (# newOffset, newLength, newCol #) =
1358− varPrimHelp array offset length col
1360+ varPrimHelp array (offset + 1) (length - 1) (col + 1)
1359
1361
1360 !word =
1362 !word =
1361 Text.unsafeIndex array offset
1363 Text.unsafeIndex array offset
1362
1364
1363− !kernelSymbol =
1364− Text.Text array offset (newOffset - offset)
1365−
1366 !chunkTag =
1365 !chunkTag =
1367− if isDigit word then
1366+ if word == 0x0024 {- $ -} then
1368− KernelEnum (fromIntegral (word - 0x0030 {- 0 -})) kernelSymbol
1367+ KernelElmField (Text.Text array (offset + 1) (newOffset - offset - 1))
1369− else if kernelSymbol == "DEV" then
1368+
1370− KernelProd False
1371− else if kernelSymbol == "PROD" then
1372− KernelProd True
1373 else
1369 else
1370+ let !chunk = Text.Text array offset (newOffset - offset) in
1371+ if isDigit word then
1372+ KernelEnum (fromIntegral (word - 0x0030 {- 0 -})) chunk
1373+
1374+ else if 0x0061 {- a -} <= word && word <= 0x007A {- z -} then
1375+ KernelJsField chunk
1376+
1377+ else if chunk == "DEV" then
1378+ KernelProd False
1379+
1380+ else if chunk == "PROD" then
1381+ KernelProd True
1382+
1383+ else
1374− KernelImport kernelSymbol
1384+ KernelImport chunk
1375 in
1385 in
1376 (# Just chunkTag, jsOffset, newOffset, newLength, row, newCol #)
1386 (# Just chunkTag, jsOffset, newOffset, newLength, row, newCol #)