Skip to content

Commit 9b2c82a

Browse files
Parens: only check for sensitive indentation when really needed (#16973)
1 parent 2e695a8 commit 9b2c82a

File tree

3 files changed

+70
-2
lines changed

3 files changed

+70
-2
lines changed

docs/release-notes/.FSharp.Compiler.Service/8.0.300.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Code generated files with > 64K methods and generated symbols crash when loaded. Use infered sequence points for debugging. ([Issue #16399](https://github.com/dotnet/fsharp/issues/16399), [#PR 16514](https://github.com/dotnet/fsharp/pull/16514))
88
* `nameof Module` expressions and patterns are processed to link files in `--test:GraphBasedChecking`. ([PR #16550](https://github.com/dotnet/fsharp/pull/16550), [PR #16743](https://github.com/dotnet/fsharp/pull/16743))
99
* Graph Based Checking doesn't throw on invalid parsed input so it can be used for IDE scenarios ([PR #16575](https://github.com/dotnet/fsharp/pull/16575), [PR #16588](https://github.com/dotnet/fsharp/pull/16588), [PR #16643](https://github.com/dotnet/fsharp/pull/16643))
10-
* Various parenthesization API fixes. ([PR #16578](https://github.com/dotnet/fsharp/pull/16578), [PR #16666](https://github.com/dotnet/fsharp/pull/16666), [PR #16901](https://github.com/dotnet/fsharp/pull/16901))
10+
* Various parenthesization API fixes. ([PR #16578](https://github.com/dotnet/fsharp/pull/16578), [PR #16666](https://github.com/dotnet/fsharp/pull/16666), [PR #16901](https://github.com/dotnet/fsharp/pull/16901), [PR #16973](https://github.com/dotnet/fsharp/pull/16973))
1111
* Keep parens for problematic exprs (`if`, `match`, etc.) in `$"{(…):N0}"`, `$"{(…),-3}"`, etc. ([PR #16578](https://github.com/dotnet/fsharp/pull/16578))
1212
* Fix crash in DOTNET_SYSTEM_GLOBALIZATION_INVARIANT mode [#PR 16471](https://github.com/dotnet/fsharp/pull/16471))
1313
* Fix16572 - Fixed the preview feature enabling Is properties for union case did not work correctly with let .rec and .fsi files ([PR #16657](https://github.com/dotnet/fsharp/pull/16657))

src/Compiler/Service/SynExpr.fs

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -657,7 +657,41 @@ module SynExpr =
657657
// return (
658658
// x
659659
// )
660-
| _, SyntaxNode.SynExpr outer :: _ when containsSensitiveIndentation outer.Range.StartColumn expr.Range -> true
660+
| _, SyntaxNode.SynExpr(SynExpr.YieldOrReturn _ as outer) :: _
661+
| _, SyntaxNode.SynExpr(SynExpr.YieldOrReturnFrom _ as outer) :: _
662+
| _, SyntaxNode.SynExpr(SynExpr.Assert _ as outer) :: _
663+
| _, SyntaxNode.SynExpr(SynExpr.Lazy _ as outer) :: _
664+
| _, SyntaxNode.SynExpr(SynExpr.App(argExpr = SynExpr.Paren(expr = Is expr)) as outer) :: _
665+
| _, SyntaxNode.SynExpr(SynExpr.LetOrUse _ as outer) :: _
666+
| _, SyntaxNode.SynExpr(SynExpr.LetOrUseBang _ as outer) :: _
667+
| _, SyntaxNode.SynExpr(SynExpr.TryWith _ as outer) :: _
668+
| _, SyntaxNode.SynExpr(SynExpr.TryFinally _ as outer) :: _
669+
| _, SyntaxNode.SynExpr(SynExpr.For _ as outer) :: _
670+
| _, SyntaxNode.SynExpr(SynExpr.ForEach _ as outer) :: _
671+
| _, SyntaxNode.SynExpr(SynExpr.IfThenElse _ as outer) :: _
672+
| _, SyntaxNode.SynExpr(SynExpr.New _ as outer) :: _
673+
| _, SyntaxNode.SynExpr(SynExpr.Set(rhsExpr = SynExpr.Paren(expr = Is expr)) as outer) :: _
674+
| _, SyntaxNode.SynExpr(SynExpr.DotIndexedSet(valueExpr = SynExpr.Paren(expr = Is expr)) as outer) :: _
675+
| _, SyntaxNode.SynExpr(SynExpr.DotNamedIndexedPropertySet(rhsExpr = SynExpr.Paren(expr = Is expr)) as outer) :: _
676+
| _, SyntaxNode.SynExpr(SynExpr.DotSet(rhsExpr = SynExpr.Paren(expr = Is expr)) as outer) :: _
677+
| _, SyntaxNode.SynExpr(SynExpr.LibraryOnlyUnionCaseFieldSet(rhsExpr = SynExpr.Paren(expr = Is expr)) as outer) :: _
678+
| _, SyntaxNode.SynExpr(SynExpr.LongIdentSet(expr = SynExpr.Paren(expr = Is expr)) as outer) :: _
679+
| _, SyntaxNode.SynExpr(SynExpr.NamedIndexedPropertySet(expr2 = SynExpr.Paren(expr = Is expr)) as outer) :: _
680+
| _, SyntaxNode.SynExpr(SynExpr.InferredUpcast _ as outer) :: _
681+
| _, SyntaxNode.SynExpr(SynExpr.InferredDowncast _ as outer) :: _
682+
| _, SyntaxNode.SynExpr(SynExpr.Match _ as outer) :: _
683+
| _, SyntaxNode.SynExpr(SynExpr.MatchBang _ as outer) :: _
684+
| _, SyntaxNode.SynExpr(SynExpr.While _ as outer) :: _
685+
| _, SyntaxNode.SynExpr(SynExpr.WhileBang _ as outer) :: _
686+
| _, SyntaxNode.SynExpr(SynExpr.Do _ as outer) :: _
687+
| _, SyntaxNode.SynExpr(SynExpr.DoBang _ as outer) :: _
688+
| _, SyntaxNode.SynExpr(SynExpr.Fixed _ as outer) :: _
689+
| _, SyntaxNode.SynExpr(SynExpr.Record _ as outer) :: _
690+
| _, SyntaxNode.SynExpr(SynExpr.AnonRecd _ as outer) :: _
691+
| _, SyntaxNode.SynExpr(SynExpr.InterpolatedString _ as outer) :: _ when
692+
containsSensitiveIndentation outer.Range.StartColumn expr.Range
693+
->
694+
true
661695

662696
// Check for nested matches, e.g.,
663697
//

tests/FSharp.Compiler.Service.Tests/SynExprTests.fs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,3 +86,37 @@ let shouldBeParenthesizedInContext (expected: Parenthesization list) src =
8686
| _ -> actual)
8787

8888
CollectionAssert.AreEqual(expected, actual)
89+
90+
[<Theory>]
91+
[<TestCase("9")>]
92+
[<TestCase("9 |> ignore")>]
93+
[<TestCase("
94+
let x =
95+
do ()
96+
9
97+
")>]
98+
[<TestCase("
99+
let x =
100+
do ()
101+
9 |> ignore
102+
")>]
103+
[<TestCase("
104+
for x in 1..10 do
105+
9 |> ignore
106+
")>]
107+
let ``shouldBeParenthesizedInContext handles an unparenthesized hypothetical`` src =
108+
let ast = getParseResults src
109+
110+
let getSourceLineStr =
111+
let lines = src.ReplaceLineEndings().Split '\n'
112+
Line.toZ >> Array.get lines
113+
114+
let expr, path =
115+
(None, ast)
116+
||> ParsedInput.foldWhile (fun acc path node ->
117+
match node with
118+
| SyntaxNode.SynExpr (SynExpr.Const(SynConst.Int32 9, _) as expr) -> Some(Some(expr, path))
119+
| _ -> Some acc)
120+
|> Option.defaultWith (fun () -> invalidOp "Expected a 9 but did not find one.")
121+
122+
Assert.False(SynExpr.shouldBeParenthesizedInContext getSourceLineStr path expr)

0 commit comments

Comments
 (0)