on master help sign in
Properly handle apostrophes and reserved words in record fields

Should fix https://github.com/elm-lang/elm-lang.org/issues/203

commit68fc853388accf845e445ce8561143f58dd8598e authorEvan Czaplicki <info@elm-lang.org> dateThu 18 Dec 2014, 21:57 (12 years ago) parentdc0d221
1 file changed+30−19
src/Generate/JavaScript.hs+30−19
src/Generate/JavaScript.hs+30−19
@@ -71,36 +71,47 @@ expression (A region expr) =
7171 hi' <- expression hi
7272 return $ _List "range" `call` [lo',hi']
7373
74− Access e x ->
74+ Access e field ->
7575 do e' <- expression e
76− return $ DotRef () e' (var x)
76+ return $ DotRef () e' (var (varName field))
7777
78− Remove e x ->
78+ Remove e field ->
7979 do e' <- expression e
80− return $ _Utils "remove" `call` [string x, e']
80+ return $ _Utils "remove" `call` [ string (varName field), e' ]
8181
82− Insert e x v ->
83− do v' <- expression v
82+ Insert e field value ->
83+ do value' <- expression value
8484 e' <- expression e
85− return $ _Utils "insert" `call` [string x, v', e']
85+ return $ _Utils "insert" `call` [ string (varName field), value', e' ]
8686
87− Modify e fs ->
87+ Modify e fields ->
8888 do e' <- expression e
89− fs' <- forM fs $ \(f,v) -> do
90− v' <- expression v
91− return $ ArrayLit () [string f, v']
92− return $ _Utils "replace" `call` [ArrayLit () fs', e']
89+ fields' <-
90+ forM fields $ \(field, value) ->
91+ do value' <- expression value
92+ return $ ArrayLit () [ string (varName field), value' ]
93+
94+ return $ _Utils "replace" `call` [ArrayLit () fields', e']
9395
9496 Record fields ->
95− do fields' <- forM fields $ \(f,e) -> do
96− (,) f <$> expression e
97− let fieldMap = List.foldl' combine Map.empty fields'
97+ do fields' <-
98+ forM fields $ \(field, e) ->
99+ (,) (varName field) <$> expression e
100+
101+ let fieldMap =
102+ List.foldl' combine Map.empty fields'
103+
98104 return $ ObjectLit () $ (prop "_", hidden fieldMap) : visible fieldMap
99105 where
100− combine r (k,v) = Map.insertWith (++) k [v] r
101− hidden fs = ObjectLit () . map (prop *** ArrayLit ()) .
102− Map.toList . Map.filter (not . null) $ Map.map tail fs
103− visible fs = map (first prop) . Map.toList $ Map.map head fs
106+ combine record (field, value) =
107+ Map.insertWith (++) field [value] record
108+
109+ hidden fs =
110+ ObjectLit () . map (prop *** ArrayLit ()) $
111+ Map.toList (Map.filter (not . null) (Map.map tail fs))
112+
113+ visible fs =
114+ map (first prop) (Map.toList (Map.map head fs))
104115
105116 Binop op e1 e2 -> binop region op e1 e2
106117