diff --git a/src/Compiler/pars.fsy b/src/Compiler/pars.fsy index 5a77927d9d5093bc059a17f868152f6c34db52d5..111765fbbba590931bfdf53d3b76c56c7fe8cd67 100644 --- a/src/Compiler/pars.fsy +++ b/src/Compiler/pars.fsy @@ -4176,34 +4176,34 @@ ifExprElifs: | ELIF declExpr recover { None, Some (exprFromParseError $2) } -tupleExpr: - | tupleExpr COMMA declExpr - { let exprs, commas = $1 in ($3 :: exprs), ((rhs parseState 2) :: commas) } +tupleExpr: + | tupleExpr COMMA declExpr + { let exprs, commas = $1 + $3 :: exprs, (rhs parseState 2 :: commas) } | tupleExpr COMMA ends_coming_soon_or_recover - { if not $3 then reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsExpectedExpressionAfterToken()) - let exprs, commas = $1 - let zeroWidthAtNextToken = (rhs parseState 3).StartRange - ((arbExpr("tupleExpr1", zeroWidthAtNextToken)) :: exprs), (rhs parseState 2) :: commas } + { let commaRange = rhs parseState 2 + if not $3 then reportParseErrorAt commaRange (FSComp.SR.parsExpectedExpressionAfterToken ()) + let exprs, commas = $1 + arbExpr ("tupleExpr1", commaRange.EndRange) :: exprs, commaRange :: commas } | declExpr COMMA ends_coming_soon_or_recover - { if not $3 then reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsExpectedExpressionAfterToken()) - let zeroWidthAtNextToken = (rhs parseState 3).StartRange - ((arbExpr("tupleExpr2", zeroWidthAtNextToken)) :: [$1]), [rhs parseState 2] } + { let commaRange = rhs parseState 2 + if not $3 then reportParseErrorAt commaRange (FSComp.SR.parsExpectedExpressionAfterToken ()) + [arbExpr ("tupleExpr2", commaRange.EndRange); $1], [commaRange] } - | declExpr COMMA declExpr - { [$3 ; $1], [rhs parseState 2] } + | declExpr COMMA declExpr + { [$3; $1], [rhs parseState 2] } | COMMA declExpr { let commaRange = rhs parseState 1 - reportParseErrorAt commaRange (FSComp.SR.parsExpectingExpressionInTuple()) + reportParseErrorAt commaRange (FSComp.SR.parsExpectingExpressionInTuple ()) [$2; arbExpr ("tupleExpr3", commaRange.StartRange)], [commaRange] } | COMMA ends_coming_soon_or_recover - { if not $2 then reportParseErrorAt (rhs parseState 2) (FSComp.SR.parsExpectedExpressionAfterToken()) - let commaRange = rhs parseState 1 - let zeroWidthAtNextToken = (rhs parseState 2).StartRange - [(arbExpr("tupleExpr4", zeroWidthAtNextToken)); arbExpr ("tupleExpr5", commaRange.StartRange)], [commaRange] } + { let commaRange = rhs parseState 1 + if not $2 then reportParseErrorAt commaRange (FSComp.SR.parsExpectedExpressionAfterToken ()) + [arbExpr ("tupleExpr4", commaRange.EndRange); arbExpr ("tupleExpr5", commaRange.StartRange)], [commaRange] } minusExpr: | MINUS minusExpr %prec expr_prefix_plus_minus diff --git a/tests/service/ParserTests.fs b/tests/service/ParserTests.fs index f493fc76816482d9f5e3d2baa1aebb6c3eb4d232..b96083b77e7392ca911a926cc73faca52d717ed5 100644 --- a/tests/service/ParserTests.fs +++ b/tests/service/ParserTests.fs @@ -322,3 +322,14 @@ let ``Expr - Tuple 06`` () = SynExpr.ArbitraryAfterError _ SynExpr.Const _ ], _, _) ] -> () | _ -> failwith "Unexpected tree" + +[] +let ``Expr - Tuple 07`` () = + let parseResults = getParseResults """ +let x = 1, +""" + match getSingleModuleMemberDecls parseResults with + | [ SynModuleDecl.Let(_, [ (SynBinding(expr = expr)) ], range) ] -> + shouldEqual expr.Range.StartLine expr.Range.EndLine + shouldEqual range.StartLine range.EndLine + | _ -> failwith "Unexpected tree"