@@ -334,9 +334,14 @@ parseObjectLiteral :: TokenParser Expr
334parseObjectLiteral = ObjectConstructor <$> braces (commaSep parseIdentifierAndValue)
334parseObjectLiteral = ObjectConstructor <$> braces (commaSep parseIdentifierAndValue)
336parseIdentifierAndValue :: TokenParser (String, Maybe Expr)
336parseIdentifierAndValue :: TokenParser (String, Maybe Expr)
337โparseIdentifierAndValue = (,) <$> (C.indented *> (lname <|> stringLiteral) <* C.indented <* colon)
337+parseIdentifierAndValue =
338โ <*> (C.indented *> val)
338+ do
339+ name <- C.indented *> lname
340+ b <- P.option (Just $ Var $ Qualified Nothing (Ident name)) rest
342+ <|> (,) <$> (C.indented *> stringLiteral) <*> rest
344+ rest = C.indented *> colon *> C.indented *> val
340 val = (Just <$> parseValue) <|> (underscore *> pure Nothing)
345 val = (Just <$> parseValue) <|> (underscore *> pure Nothing)
342parseAbs :: TokenParser Expr
347parseAbs :: TokenParser Expr
@@ -414,8 +419,8 @@ parseInfixExpr = P.between tick tick parseValue
414parseOperatorSection :: TokenParser Expr
419parseOperatorSection :: TokenParser Expr
415parseOperatorSection = parens $ left <|> right
420parseOperatorSection = parens $ left <|> right
417โ right = OperatorSection <$> parseInfixExpr <* indented <*> (Right <$> parseValueAtom)
422+ right = OperatorSection <$> parseInfixExpr <* indented <*> (Right <$> indexersAndAccessors)
418โ left = flip OperatorSection <$> (Left <$> parseValueAtom) <* indented <*> parseInfixExpr
423+ left = flip OperatorSection <$> (Left <$> indexersAndAccessors) <* indented <*> parseInfixExpr
420parsePropertyUpdate :: TokenParser (String, Maybe Expr)
425parsePropertyUpdate :: TokenParser (String, Maybe Expr)
421parsePropertyUpdate = do
426parsePropertyUpdate = do
@@ -449,21 +454,25 @@ parseDoNotationElement = P.choice
449parseObjectGetter :: TokenParser Expr
454parseObjectGetter :: TokenParser Expr
450parseObjectGetter = ObjectGetter <$> (underscore *> C.indented *> dot *> C.indented *> (lname <|> stringLiteral))
455parseObjectGetter = ObjectGetter <$> (underscore *> C.indented *> dot *> C.indented *> (lname <|> stringLiteral))
457+-- | Expressions including indexers and record updates
458+indexersAndAccessors :: TokenParser Expr
459+indexersAndAccessors = C.buildPostfixParser postfixTable parseValueAtom
461+ postfixTable = [ parseAccessor
462+ , P.try . parseUpdaterBody . Just ]
453-- Parse a value
465-- Parse a value
455parseValue :: TokenParser Expr
467parseValue :: TokenParser Expr
456parseValue = withSourceSpan PositionedValue
468parseValue = withSourceSpan PositionedValue
457 (P.buildExpressionParser operators
469 (P.buildExpressionParser operators
458โ . C.buildPostfixParser postfixTable2
470+ . C.buildPostfixParser postfixTable
459 $ indexersAndAccessors) P.<?> "expression"
471 $ indexersAndAccessors) P.<?> "expression"
461โ indexersAndAccessors = C.buildPostfixParser postfixTable1 parseValueAtom
462โ postfixTable1 = [ parseAccessor
463โ , P.try . parseUpdaterBody . Just ]
464โ postfixTable2 = [ \v -> P.try (flip App <$> (C.indented *> indexersAndAccessors)) <*> pure v
473+ postfixTable = [ \v -> P.try (flip App <$> (C.indented *> indexersAndAccessors)) <*> pure v
465โ , \v -> flip (TypedValue True) <$> (P.try (C.indented *> doubleColon) *> parsePolyType) <*> pure v
474+ , \v -> flip (TypedValue True) <$> (P.try (C.indented *> doubleColon) *> parsePolyType) <*> pure v
467 operators = [ [ P.Prefix (P.try (C.indented *> symbol' "-") >> return UnaryMinus)
476 operators = [ [ P.Prefix (P.try (C.indented *> symbol' "-") >> return UnaryMinus)
469 , [ P.Infix (P.try (C.indented *> parseInfixExpr P.<?> "infix expression") >>= \ident ->
478 , [ P.Infix (P.try (C.indented *> parseInfixExpr P.<?> "infix expression") >>= \ident ->