-
Notifications
You must be signed in to change notification settings - Fork 789
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Parser: rewrite tuple expr recovery to allow better items recovery #15227
Conversation
Yay, all is green! I wasn't expecting that 😅 |
What do we now get in the "regressed" scenario? I did not see it in the tests (or missed it)
|
It's covered here: Not a good output, but I consider it to be a much less critical case than the ones that got working now, like these: M(a = 1, b = , c = 3)
M(a =, b = 2) We can probably add more ad-hoc rules in some contexts like it was done for parens in The removed rule was also made by me, and now I think it wasn't the best way to do it, despite fixing the parsing. Why not? Because its precedence is too high, and it would try to parse things as tuples too aggressively when seeing The problem with the outer nodes recovery was that in this case: a =, b = 2 // from M(a =, b = 2) it would be parsed as
instead of more expected
This is the main kind of cases that this PR fixes. |
That makes sense, thanks. |
This is ready. |
* LexFilter: cleanup whitespaces (#15250) * Parser: rewrite tuple expr recovery to allow better items recovery (#15227) * Checker: recover on unknown record fields (#15214) * Make anycpu work correctly on Arm64 (#15234) * Makeanuycpu work correctly on arm64 * Update Microsoft.FSharp.Targets * Fix15254 (#15257) * Deploy only compressed metadata for dotnet sdk implementation (#15230) * compress fsharp for sdk * Update FSharp.DependencyManager.Nuget.fsproj * Parser: more binary expressions recovery (#15255) * Use background CancellableTask in VS instead of async & asyncMaybe (#15187) * wip * iteration * iteration: quickinfo, help context * fantomas * todo * moved tasks to editor project, fixed comment colouring bug * fantomas * Fantomas + PR feedback * Update vsintegration/src/FSharp.Editor/Hints/HintService.fs Co-authored-by: Andrii Chebukin <xperiandri@live.ru> * Revert "Update vsintegration/src/FSharp.Editor/Hints/HintService.fs" This reverts commit bf51b31. --------- Co-authored-by: Andrii Chebukin <xperiandri@live.ru> * Name resolution: actually add reported item when trying to replace (#14772) Co-authored-by: Tomas Grosup <tomasgrosup@microsoft.com> * Move flatErrors tests from fsharpqa (#15251) * temp * tests * flaterrors * update tests * preserve ranges in result of UnsolvedTyparsOfModuleDef to help with warnings (#15243) * preserve ranges in result of UnsolvedTyparsOfModuleDef to help with warnings * use fallback range only for range0 * pattern match instead of Option.isSome * Add test * Revert "Add test" This reverts commit e05e808. * Make `FSharpReferencedProject` representation public (#15266) * Make FSharpReferencedProject representation public * Update surface area * Fantomas * Fantomas --------- Co-authored-by: Tomas Grosup <tomasgrosup@microsoft.com> * Fix navigation for external enums, DUs and name resultion for members (#15270) * Update FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl * Add warning when compiler selects among multiple record type candidates, fslang-suggestion 1091 (#15256) * Protect assembly exploration for C# extension members (#15271) * Compute ValInline.Never for externs (#15274) * Compute ValInline.Never for externs --------- Co-authored-by: Eugene Auduchinok <eugene.auduchinok@jetbrains.com> Co-authored-by: Kevin Ransom (msft) <codecutter@hotmail.com> Co-authored-by: Vlad Zarytovskii <vzaritovsky@hotmail.com> Co-authored-by: Andrii Chebukin <xperiandri@live.ru> Co-authored-by: Tomas Grosup <tomasgrosup@microsoft.com> Co-authored-by: dawe <dawedawe@posteo.de>
Rewrites tuple expression recovery in a way that allows having better recovery for tuple item expressions. It also changes recovery for
=
binary expressions, which allows a significantly better recovery for named arguments analysis (and improved Parameter Info feature quality), if the type checker is also updated later.Due to how precedences between tuple and binary expressions are aligned in F# (and how there's no separate parser rules for things like argument lists), it's difficult to have great recovery for both at the same time. This PR worsens the tuple recovery a bit, by removing rules for missing first item in the most cases:
but adds a special rule to still allow that recovery inside parens, e.g. in a method call:
This rule implementation is more ad-hoc than other rules, but it may be a good compromise in this particular situation.
Recovery for missing items between and after other items is unchanged and is still good.
At the same time it adds recovery for previously failed cases like this:
The balance seems to be good, since it's probably more common to write an additional named arg in an existing argument list, than to prepend an expression with a comma and then with another expression.
This PR also makes tuple expr recovery tests use the newer tree dumps checks instead of manually checking parts of the tree.
If this PR works out well, I'll likely try to expand the change into tuple patterns and other binary expressions, as it currently covers only
=
expressions and tuple expressions to make it more manageable.