git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Allow string literal object accessors
ad5f482Phil Freeman
examples/passing/Objects.purs+4
@@ -14,5 +14,9 @@ module Main where
14
14
15 typed :: { foo :: Number }
15 typed :: { foo :: Number }
16 typed = { foo: 0 }
16 typed = { foo: 0 }
17+
18+ test2 = \x -> x."!@#"
19+
20+ test3 = typed."foo"
17
21
18 main = Debug.Trace.trace "Done"
22 main = Debug.Trace.trace "Done"
src/Language/PureScript/CodeGen/JS.hs+7−1
@@ -22,6 +22,7 @@ module Language.PureScript.CodeGen.JS (
22 wrapExportsContainer
22 wrapExportsContainer
23) where
23) where
24
24
25+import Data.Char (isAlpha, isAlphaNum)
25import Data.Maybe (fromMaybe, mapMaybe)
26import Data.Maybe (fromMaybe, mapMaybe)
26import Data.Function (on)
27import Data.Function (on)
27
28
@@ -132,7 +133,8 @@ valueToJs opts m e (ObjectUpdate o ps) = extendObj (valueToJs opts m e o) (map (
132valueToJs _ m _ (Constructor name) = qualifiedToJS m (Ident . runProperName) name
133valueToJs _ m _ (Constructor name) = qualifiedToJS m (Ident . runProperName) name
133valueToJs opts m e (Case values binders) = bindersToJs opts m e binders (map (valueToJs opts m e) values)
134valueToJs opts m e (Case values binders) = bindersToJs opts m e binders (map (valueToJs opts m e) values)
134valueToJs opts m e (IfThenElse cond th el) = JSConditional (valueToJs opts m e cond) (valueToJs opts m e th) (valueToJs opts m e el)
135valueToJs opts m e (IfThenElse cond th el) = JSConditional (valueToJs opts m e cond) (valueToJs opts m e th) (valueToJs opts m e el)
135−valueToJs opts m e (Accessor prop val) = JSAccessor prop (valueToJs opts m e val)
136+valueToJs opts m e (Accessor prop val) | isIdent prop = JSAccessor prop (valueToJs opts m e val)
137+ | otherwise = JSIndexer (JSStringLiteral prop) (valueToJs opts m e val)
136valueToJs opts m e (App val arg) = JSApp (valueToJs opts m e val) [valueToJs opts m e arg]
138valueToJs opts m e (App val arg) = JSApp (valueToJs opts m e val) [valueToJs opts m e arg]
137valueToJs opts m e (Let ds val) = JSApp (JSFunction Nothing [] (JSBlock (concat (mapMaybe (flip (declToJs opts m) e) ds) ++ [JSReturn $ valueToJs opts m e val]))) []
139valueToJs opts m e (Let ds val) = JSApp (JSFunction Nothing [] (JSBlock (concat (mapMaybe (flip (declToJs opts m) e) ds) ++ [JSReturn $ valueToJs opts m e val]))) []
138valueToJs opts m e (Abs (Left arg) val) = JSFunction Nothing [identToJs arg] (JSBlock [JSReturn (valueToJs opts m (bindName m arg e) val)])
140valueToJs opts m e (Abs (Left arg) val) = JSFunction Nothing [identToJs arg] (JSBlock [JSReturn (valueToJs opts m (bindName m arg e) val)])
@@ -143,6 +145,10 @@ valueToJs opts m e (PositionedValue _ val) = valueToJs opts m e val
143valueToJs _ _ _ (TypeClassDictionary _ _) = error "Type class dictionary was not replaced"
145valueToJs _ _ _ (TypeClassDictionary _ _) = error "Type class dictionary was not replaced"
144valueToJs _ _ _ _ = error "Invalid argument to valueToJs"
146valueToJs _ _ _ _ = error "Invalid argument to valueToJs"
145
147
148+isIdent :: String -> Bool
149+isIdent (first : rest) | isAlpha first && all isAlphaNum rest = True
150+isIdent _ = False
151+
146-- |
152-- |
147-- Shallow copy an object.
153-- Shallow copy an object.
148--
154--
src/Language/PureScript/Parser/Declarations.hs+1−1
@@ -297,7 +297,7 @@ parsePropertyUpdate = do
297
297
298parseAccessor :: Value -> P.Parsec String ParseState Value
298parseAccessor :: Value -> P.Parsec String ParseState Value
299parseAccessor (Constructor _) = P.unexpected "constructor"
299parseAccessor (Constructor _) = P.unexpected "constructor"
300−parseAccessor obj = P.try $ Accessor <$> (C.indented *> C.dot *> P.notFollowedBy C.opLetter *> C.indented *> C.identifier) <*> pure obj
300+parseAccessor obj = P.try $ Accessor <$> (C.indented *> C.dot *> P.notFollowedBy C.opLetter *> C.indented *> (C.identifier <|> C.stringLiteral)) <*> pure obj
301
301
302parseDo :: P.Parsec String ParseState Value
302parseDo :: P.Parsec String ParseState Value
303parseDo = do
303parseDo = do