Skip to content

Commit c72dcd6

Browse files
janusknocte
authored andcommitted
AvoidTooShortNames: fix some false negatives
Also, add unit test for these false negatives.
1 parent 0daea9c commit c72dcd6

File tree

2 files changed

+49
-8
lines changed

2 files changed

+49
-8
lines changed

src/FSharpLint.Core/Rules/Conventions/AvoidTooShortNames.fs

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,17 @@ open FSharpLint.Framework.Rules
77
open FSharpLint.Framework
88
open FSharpLint.Framework.Suggestion
99

10+
let private isIdentifierTooShort (identifier: string) =
11+
identifier.Length < 2 && not (identifier.StartsWith '_')
12+
1013
let private checkIdentifierPart (identifier:Ident) (idText:string) =
1114
let formatError errorName =
1215
String.Format(Resources.GetString errorName, idText)
1316

1417
"RulesAvoidTooShortNamesError" |> formatError |> Array.singleton
1518

1619
let private checkIdentifier (identifier:Ident) (idText:string) =
17-
if idText.Length = 1 && not (idText.StartsWith '_') then
20+
if isIdentifierTooShort idText then
1821
checkIdentifierPart identifier idText
1922
|> Array.map (fun message ->
2023
{ Range = identifier.idRange
@@ -28,7 +31,7 @@ let private getParameterWithBelowMinimumLength (pats: SynPat list): (Ident * str
2831
let rec loop patArray acc =
2932
match patArray with
3033
| SynPat.Named(_, ident, _, _, _)::tail ->
31-
if ident.idText.Length = 1 then
34+
if isIdentifierTooShort ident.idText then
3235
Array.singleton (ident, ident.idText, None) |> Array.append acc |> loop tail
3336
else
3437
loop tail acc
@@ -43,21 +46,31 @@ let private getIdentifiers (args:AstNodeRuleParams) =
4346
match identifiers with
4447
| head::_ ->
4548
let result: (Ident * string * (unit -> bool) option) array = getParameterWithBelowMinimumLength names
46-
if head.idText.Length = 1 then
49+
if isIdentifierTooShort head.idText then
4750
Array.append result (Array.singleton (head, head.idText, None))
4851
else
4952
result
5053
| _ -> Array.empty
51-
| SynPat.Named(_, identifier, _, _, _) when identifier.idText.Length = 1 ->
54+
| SynPat.Named(_, identifier, _, _, _) when isIdentifierTooShort identifier.idText ->
5255
(identifier, identifier.idText, None) |> Array.singleton
5356
| _ -> Array.empty
57+
| AstNode.Field(SynField(_, _, Some identifier, _, _, _, _, _)) when isIdentifierTooShort identifier.idText ->
58+
(identifier, identifier.idText, None) |> Array.singleton
5459
| _ -> Array.empty
5560

5661
let runner (args:AstNodeRuleParams) =
57-
getIdentifiers args
58-
|> Array.collect (fun (identifier, idText, typeCheck) ->
59-
let suggestions = checkIdentifier identifier idText
60-
suggestions |> Array.map (fun suggestion -> { suggestion with TypeChecks = Option.toList typeCheck }))
62+
match args.AstNode with
63+
| AstNode.Identifier([identifier], range) when isIdentifierTooShort identifier ->
64+
{ Range = range
65+
Message = Resources.GetString "RulesAvoidTooShortNamesError"
66+
SuggestedFix = None
67+
TypeChecks = List.empty }
68+
|> Array.singleton
69+
| _ ->
70+
getIdentifiers args
71+
|> Array.collect (fun (identifier, idText, typeCheck) ->
72+
let suggestions = checkIdentifier identifier idText
73+
suggestions |> Array.map (fun suggestion -> { suggestion with TypeChecks = Option.toList typeCheck }))
6174

6275
let rule =
6376
{ Name = "AvoidTooShortNames"

tests/FSharpLint.Core.Tests/Rules/Conventions/AvoidTooShortNames.fs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,31 @@ let bar baz =
6767
x """
6868

6969
Assert.IsTrue this.ErrorsExist
70+
71+
[<Test>]
72+
member this.AvoidTooShortNamesShouldProduceError_5() =
73+
this.Parse """
74+
type CellCreatedFast =
75+
private
76+
{
77+
Y: array<byte>
78+
DerivativeKeyData: array<byte>
79+
}
80+
"""
81+
82+
Assert.IsTrue this.ErrorsExist
83+
84+
[<Test>]
85+
member this.AvoidTooShortNamesShouldProduceError_6() =
86+
this.Parse """
87+
type TorStreamCipher(keyBytes: array<byte>, ivOpt: Option<array<byte>>) =
88+
member self.Encrypt(data: array<byte>) : array<byte> =
89+
let rec innerEncrypt (x: int) (state: array<byte>) =
90+
if x >= data.Length then
91+
state
92+
else
93+
Array.empty
94+
innerEncrypt 3 keyBytes
95+
"""
96+
97+
Assert.IsTrue this.ErrorsExist

0 commit comments

Comments
 (0)