Skip to content

Commit

Permalink
UsedUnderscorePrefixedElements: fix rule
Browse files Browse the repository at this point in the history
Fix rule so that it identifies all usages of identifiers that
start with `_`.
  • Loading branch information
webwarrior-ws committed Dec 21, 2023
1 parent dc7fefa commit 06fb857
Showing 1 changed file with 32 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,51 +5,45 @@ open System
open FSharpLint.Framework
open FSharpLint.Framework.Suggestion
open FSharp.Compiler.Syntax
open FSharp.Compiler.Text
open FSharp.Compiler.CodeAnalysis
open FSharpLint.Framework.Ast
open FSharpLint.Framework.Rules

let private checkUsedIdent (previousIdent: Ident) (body: SynExpr) =
match body with
| SynExpr.Sequential(_debugPointAtSequential, _isTrueSeq, synExpr, _expr2, _range) ->
match synExpr with
| SynExpr.App(_exprAtomicFlag, _isInfix, _funcExpr, argExpr, range) ->
match argExpr with
| SynExpr.Ident ident ->
if previousIdent.idText = ident.idText then
{
Range = range
let private checkUsedIdent (identifier: Ident) (usages: array<FSharpSymbolUse>) (scopeRange: Range) =
usages
|> Array.collect (fun usage ->
if not usage.IsFromDefinition && usage.Symbol.FullName = identifier.idText
&& ExpressionUtilities.rangeContainsOtherRange scopeRange usage.Range then
{
Range = usage.Range
Message = String.Format(Resources.GetString ("RulesUsedUnderscorePrefixedElements"))
SuggestedFix = None
TypeChecks = List.Empty
} |> Array.singleton
else
Array.empty)

let runner (args: AstNodeRuleParams) =
// hack to only run rule once
if args.NodeIndex = 0 then
match args.CheckInfo with
| Some checkResults ->
checkResults.GetAllUsesOfAllSymbolsInFile()
|> Seq.choose (fun usage ->
if not usage.IsFromDefinition && usage.Symbol.FullName.StartsWith "_" then
Some {
Range = usage.Range
Message = String.Format(Resources.GetString ("RulesUsedUnderscorePrefixedElements"))
SuggestedFix = None
TypeChecks = List.Empty
} |> Array.singleton
}
else
Array.empty
| _ ->
Array.empty
| _ ->
Array.empty
| _ ->
Array.empty

let runner (args: AstNodeRuleParams) =

let error =
match args.AstNode with
| AstNode.Expression (SynExpr.LetOrUse (_isRecursive, _isUse, bindings, body, _range)) ->
match List.tryHead bindings with
| Some(SynBinding(_synAccessOption, _synBindingKind, _mustInline, _isMutable, _synAttributeLists, _preXmlDoc, _synValData, headPat, _synBindingReturnInfoOption, _synExpr, _range, _debugPointAtBinding)) ->
match headPat with
| SynPat.Named(_synPat, ident, _isSelfIdentifier, _synAccessOption, _range) ->
if ident.idText.StartsWith "_" then
checkUsedIdent ident body
else
Array.empty
| _ ->
Array.empty
| _ -> Array.empty
| _ -> Array.empty

error
None)
|> Seq.toArray
| None -> Array.empty
else
Array.empty

let rule =
{ Name = "UsedUnderscorePrefixedElements"
Expand Down

0 comments on commit 06fb857

Please sign in to comment.