|
| 1 | +module FSharpLint.Rules.FavourReRaise |
| 2 | + |
| 3 | +open System |
| 4 | +open FSharpLint.Framework |
| 5 | +open FSharpLint.Framework.Suggestion |
| 6 | +open FSharp.Compiler.Syntax |
| 7 | +open FSharpLint.Framework.Ast |
| 8 | +open FSharpLint.Framework.Rules |
| 9 | + |
| 10 | +let private runner (args: AstNodeRuleParams) = |
| 11 | + let generateError range = |
| 12 | + { Range = range |
| 13 | + Message = Resources.GetString "RulesFavourReRaise" |
| 14 | + SuggestedFix = None |
| 15 | + TypeChecks = List.empty } |
| 16 | + |> Array.singleton |
| 17 | + |
| 18 | + let rec checkExpr (expr) maybeIdent = |
| 19 | + match expr with |
| 20 | + | SynExpr.App (_, _, SynExpr.Ident raiseId, expression, range) when raiseId.idText = "raise" -> |
| 21 | + match expression with |
| 22 | + | SynExpr.Ident ident -> |
| 23 | + match maybeIdent with |
| 24 | + | Some id when id = ident.idText -> |
| 25 | + generateError range |
| 26 | + | _ -> Array.empty |
| 27 | + | SynExpr.LongIdent (_, LongIdentWithDots (id, _), _, range) -> generateError range |
| 28 | + | _ -> Array.empty |
| 29 | + | SynExpr.TryWith (expressions, _, clauseList, _expression, _range, _, _) as expr -> |
| 30 | + clauseList |
| 31 | + |> List.toArray |
| 32 | + |> Array.collect (fun clause -> |
| 33 | + match clause with |
| 34 | + | SynMatchClause (pat, _, app, _, _) -> |
| 35 | + match pat with |
| 36 | + | SynPat.Named (_, id, _, _, _) -> checkExpr app (Some id.idText) |
| 37 | + | _ -> checkExpr app None) |
| 38 | + | SynExpr.IfThenElse (_, expr, _, _, _, _, _) -> checkExpr expr maybeIdent |
| 39 | + | _ -> Array.empty |
| 40 | + |
| 41 | + match args.AstNode with |
| 42 | + | AstNode.Expression expr -> checkExpr expr None |
| 43 | + | _ -> Array.empty |
| 44 | + |
| 45 | +let rule = |
| 46 | + { Name = "FavourReRaise" |
| 47 | + Identifier = Identifiers.FavourReRaise |
| 48 | + RuleConfig = |
| 49 | + { AstNodeRuleConfig.Runner = runner |
| 50 | + Cleanup = ignore } } |
| 51 | + |> AstNodeRule |
0 commit comments