Skip to content

Commit e7aced4

Browse files
Mershowebwarrior-ws
andcommitted
FavourIgnoreOverLetWild: implement suggestions
Co-authored-by: webwarrior <reg@webwarrior.ws>
1 parent 6fecc9a commit e7aced4

File tree

1 file changed

+25
-11
lines changed

1 file changed

+25
-11
lines changed

src/FSharpLint.Core/Rules/Conventions/Binding/FavourIgnoreOverLetWild.fs

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,39 @@ open FSharp.Compiler.Syntax
77
open FSharpLint.Framework.Ast
88
open FSharpLint.Framework.Rules
99

10-
let private checkForBindingToAWildcard pattern range =
10+
let private checkForBindingToAWildcard pattern range fileContent (expr: SynExpr) letBindingRange =
1111
let rec findWildAndIgnoreParens = function
1212
| SynPat.Paren(pattern, _) -> findWildAndIgnoreParens pattern
1313
| SynPat.Wild(_) -> true
1414
| _ -> false
1515

16-
if findWildAndIgnoreParens pattern then
17-
{ Range = range
18-
Message = Resources.GetString("RulesFavourIgnoreOverLetWildError")
19-
SuggestedFix = None
20-
TypeChecks = [] } |> Array.singleton
21-
else
22-
Array.empty
16+
match ExpressionUtilities.tryFindTextOfRange expr.Range fileContent with
17+
| Some exprText ->
18+
if findWildAndIgnoreParens pattern then
19+
{ Range = range
20+
Message = Resources.GetString("RulesFavourIgnoreOverLetWildError")
21+
SuggestedFix = Some (lazy (Some({ FromRange = letBindingRange
22+
FromText = fileContent
23+
ToText = sprintf "(%s) |> ignore" exprText })))
24+
TypeChecks = [] } |> Array.singleton
25+
else
26+
Array.empty
27+
| None -> Array.empty
2328

2429
let private runner (args:AstNodeRuleParams) =
2530
match args.AstNode with
26-
| AstNode.Binding(SynBinding(_, _, _, _, _, _, _, pattern, _, _, range, _, _))
27-
when Helper.Binding.isLetBinding args.NodeIndex args.SyntaxArray ->
28-
checkForBindingToAWildcard pattern range
31+
| AstNode.Binding(SynBinding(_, _, _, _, _, _, _, pattern, _, expr, range, _, _)) ->
32+
let bindingRange =
33+
match args.GetParents(args.NodeIndex) with
34+
| AstNode.ModuleDeclaration(SynModuleDecl.Let(_, _, range)) :: _
35+
| AstNode.Expression(SynExpr.LetOrUse(_, false, _, _, range, _)) :: _ ->
36+
Some(range)
37+
| _ -> None
38+
39+
match bindingRange with
40+
| Some letBindingRange ->
41+
checkForBindingToAWildcard pattern range args.FileContent expr letBindingRange
42+
| None -> Array.empty
2943
| _ -> Array.empty
3044

3145
/// Checks if any code uses 'let _ = ...' and suggests to use the ignore function.

0 commit comments

Comments
 (0)