Skip to content

Commit 6a1b2e1

Browse files
committed
Core,Console,Tests: fix selfCheck
1 parent 70e7616 commit 6a1b2e1

22 files changed

+392
-380
lines changed

src/FSharpLint.Console/Program.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,10 @@ with
5454
| Lint_Config _ -> "Path to the config for the lint."
5555
// fsharplint:enable UnionCasesNames
5656

57-
let private validTargetFileExtensions = [ ".fs"; ".fsx"; ".fsproj"; ".sln"; ".slnx" ]
5857
/// Expands a wildcard pattern to a list of matching files.
5958
/// Supports recursive search using ** (e.g., "**/*.fs" or "src/**/*.fs")
6059
let internal expandWildcard (pattern:string) =
60+
let validTargetFileExtensions = [ ".fs"; ".fsx"; ".fsproj"; ".sln"; ".slnx" ]
6161
let isValidTargetFile (filePath:string) =
6262
validTargetFileExtensions |> List.exists filePath.EndsWith
6363

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

Lines changed: 35 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -8,48 +8,48 @@ open FSharp.Compiler.Text
88
open FSharpLint.Framework.Ast
99
open FSharpLint.Framework.Rules
1010

11-
let private runner (args:AstNodeRuleParams) =
12-
let checkForNamedPatternEqualsConstant pattern whenExpr (range:Range) =
13-
let patternIdent =
14-
match pattern with
15-
| SynPat.Named(SynIdent.SynIdent(ident, _), _, _, _) -> Some(ident.idText)
16-
| _ -> None
17-
18-
19-
match whenExpr with
20-
| SynExpr.App(_, _, funcExpr, SynExpr.Const(_, constRange), _) ->
21-
match funcExpr with
22-
| SynExpr.App(_, _, ExpressionUtilities.Identifier([opIdent], _), SynExpr.Ident(ident), _)
23-
when opIdent.idText = "op_Equality" && Option.contains ident.idText patternIdent ->
24-
25-
let fromRange = Range.mkRange String.Empty range.Start constRange.End
26-
27-
let suggestedFix =
28-
ExpressionUtilities.tryFindTextOfRange fromRange args.FileContent
29-
|> Option.bind (fun text ->
30-
31-
ExpressionUtilities.tryFindTextOfRange constRange args.FileContent
32-
|> Option.bind (fun constText ->
33-
Some (lazy (Some { FromText = text; FromRange = fromRange; ToText = $"{constText} as {ident.idText}"}))
11+
let rule =
12+
let runner (args:AstNodeRuleParams) =
13+
let checkForNamedPatternEqualsConstant pattern whenExpr (range:Range) =
14+
let patternIdent =
15+
match pattern with
16+
| SynPat.Named(SynIdent.SynIdent(ident, _), _, _, _) -> Some(ident.idText)
17+
| _ -> None
18+
19+
20+
match whenExpr with
21+
| SynExpr.App(_, _, funcExpr, SynExpr.Const(_, constRange), _) ->
22+
match funcExpr with
23+
| SynExpr.App(_, _, ExpressionUtilities.Identifier([opIdent], _), SynExpr.Ident(ident), _)
24+
when opIdent.idText = "op_Equality" && Option.contains ident.idText patternIdent ->
25+
26+
let fromRange = Range.mkRange String.Empty range.Start constRange.End
27+
28+
let suggestedFix =
29+
ExpressionUtilities.tryFindTextOfRange fromRange args.FileContent
30+
|> Option.bind (fun text ->
31+
32+
ExpressionUtilities.tryFindTextOfRange constRange args.FileContent
33+
|> Option.bind (fun constText ->
34+
Some (lazy (Some { FromText = text; FromRange = fromRange; ToText = $"{constText} as {ident.idText}"}))
35+
)
3436
)
35-
)
3637

37-
Array.singleton
38-
{ Range = fromRange
39-
Message = Resources.GetString("RulesFavourAsKeyword")
40-
SuggestedFix = suggestedFix
41-
TypeChecks = List.Empty }
38+
Array.singleton
39+
{ Range = fromRange
40+
Message = Resources.GetString("RulesFavourAsKeyword")
41+
SuggestedFix = suggestedFix
42+
TypeChecks = List.Empty }
4243

44+
| _ -> Array.empty
4345
| _ -> Array.empty
44-
| _ -> Array.empty
4546

46-
match args.AstNode with
47-
| AstNode.Match(SynMatchClause.SynMatchClause(pat, Some(whenExpr), _, range, _, _)) ->
48-
checkForNamedPatternEqualsConstant pat whenExpr range
47+
match args.AstNode with
48+
| AstNode.Match(SynMatchClause.SynMatchClause(pat, Some(whenExpr), _, range, _, _)) ->
49+
checkForNamedPatternEqualsConstant pat whenExpr range
4950

50-
| _ -> Array.empty
51+
| _ -> Array.empty
5152

52-
let rule =
5353
AstNodeRule
5454
{ Name = "FavourAsKeyword"
5555
Identifier = Identifiers.FavourAsKeyword

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

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

10-
let private runner (args:AstNodeRuleParams) =
11-
let checkForBindingToAWildcard pattern range fileContent (expr: SynExpr) letBindingRange =
12-
let rec findWildAndIgnoreParens = function
13-
| SynPat.Paren(pat, _) -> findWildAndIgnoreParens pat
14-
| SynPat.Wild(_) -> true
15-
| _ -> false
10+
/// Checks if any code uses 'let _ = ...' and suggests to use the ignore function.
11+
let rule =
12+
let runner (args:AstNodeRuleParams) =
13+
let checkForBindingToAWildcard pattern range fileContent (expr: SynExpr) letBindingRange =
14+
let rec findWildAndIgnoreParens = function
15+
| SynPat.Paren(pat, _) -> findWildAndIgnoreParens pat
16+
| SynPat.Wild(_) -> true
17+
| _ -> false
1618

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

31-
match args.AstNode with
32-
| AstNode.Binding(SynBinding(_, _, _, _, _, _, _, pattern, _, expr, range, _, _)) ->
33-
let bindingRange =
34-
match args.GetParents(args.NodeIndex) with
35-
| AstNode.ModuleDeclaration(SynModuleDecl.Let(_, _, range)) :: _
36-
| AstNode.Expression(SynExpr.LetOrUse(_, false, _, _, range, _)) :: _ ->
37-
Some(range)
38-
| _ -> None
33+
match args.AstNode with
34+
| AstNode.Binding(SynBinding(_, _, _, _, _, _, _, pattern, _, expr, range, _, _)) ->
35+
let bindingRange =
36+
match args.GetParents(args.NodeIndex) with
37+
| AstNode.ModuleDeclaration(SynModuleDecl.Let(_, _, range)) :: _
38+
| AstNode.Expression(SynExpr.LetOrUse(_, false, _, _, range, _)) :: _ ->
39+
Some(range)
40+
| _ -> None
3941

40-
match bindingRange with
41-
| Some letBindingRange ->
42-
checkForBindingToAWildcard pattern range args.FileContent expr letBindingRange
43-
| None -> Array.empty
44-
| _ -> Array.empty
42+
match bindingRange with
43+
| Some letBindingRange ->
44+
checkForBindingToAWildcard pattern range args.FileContent expr letBindingRange
45+
| None -> Array.empty
46+
| _ -> Array.empty
4547

46-
/// Checks if any code uses 'let _ = ...' and suggests to use the ignore function.
47-
let rule =
4848
AstNodeRule
4949
{
5050
Name = "FavourIgnoreOverLetWild"

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

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

10-
let private runner (args: AstNodeRuleParams) =
11-
let generateError identifier range text =
10+
/// Checks if any code uses untyped ignore
11+
let rule =
12+
let runner (args: AstNodeRuleParams) =
13+
let generateError identifier range text =
1214

13-
let suggestedFix =
14-
lazy
15-
(ExpressionUtilities.tryFindTextOfRange range text
16-
|> Option.map
17-
(fun fromText ->
18-
{ FromText = fromText
19-
FromRange = range
20-
ToText = identifier }))
15+
let suggestedFix =
16+
lazy
17+
(ExpressionUtilities.tryFindTextOfRange range text
18+
|> Option.map
19+
(fun fromText ->
20+
{ FromText = fromText
21+
FromRange = range
22+
ToText = identifier }))
2123

22-
{
23-
Range = range
24-
Message = String.Format(Resources.GetString "RulesFavourTypedIgnore", identifier)
25-
SuggestedFix = Some suggestedFix
26-
TypeChecks = List.Empty
27-
}
24+
{
25+
Range = range
26+
Message = String.Format(Resources.GetString "RulesFavourTypedIgnore", identifier)
27+
SuggestedFix = Some suggestedFix
28+
TypeChecks = List.Empty
29+
}
2830

29-
let isTyped expression identifier range text =
30-
match expression with
31-
| SynExpr.Typed (_id, _synType, _range) -> Array.empty
32-
| _ ->
33-
generateError identifier range text
34-
|> Array.singleton
31+
let isTyped expression identifier range text =
32+
match expression with
33+
| SynExpr.Typed (_id, _synType, _range) -> Array.empty
34+
| _ ->
35+
generateError identifier range text
36+
|> Array.singleton
3537

36-
let ignoreFunc = "ignore"
38+
let ignoreFunc = "ignore"
3739

38-
match args.AstNode with
39-
| AstNode.Expression (SynExpr.App (_, _, expression, SynExpr.Ident identifier, range)) when
40-
identifier.idText = ignoreFunc
41-
->
42-
isTyped expression identifier.idText range identifier.idText
43-
| AstNode.Expression (SynExpr.App (_, _, SynExpr.Ident identifier, expression, range)) when
44-
identifier.idText = ignoreFunc
45-
->
46-
match expression with
47-
| SynExpr.Paren (expr, _, _, _) -> isTyped expr identifier.idText range identifier.idText
48-
| _ ->
49-
generateError identifier.idText range identifier.idText
50-
|> Array.singleton
51-
| _ -> Array.empty
40+
match args.AstNode with
41+
| AstNode.Expression (SynExpr.App (_, _, expression, SynExpr.Ident identifier, range)) when
42+
identifier.idText = ignoreFunc
43+
->
44+
isTyped expression identifier.idText range identifier.idText
45+
| AstNode.Expression (SynExpr.App (_, _, SynExpr.Ident identifier, expression, range)) when
46+
identifier.idText = ignoreFunc
47+
->
48+
match expression with
49+
| SynExpr.Paren (expr, _, _, _) -> isTyped expr identifier.idText range identifier.idText
50+
| _ ->
51+
generateError identifier.idText range identifier.idText
52+
|> Array.singleton
53+
| _ -> Array.empty
5254

53-
/// Checks if any code uses untyped ignore
54-
let rule =
5555
AstNodeRule
5656
{
5757
Name = "FavourTypedIgnore"

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

Lines changed: 51 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -7,64 +7,64 @@ open FSharpLint.Framework.Suggestion
77
open FSharpLint.Framework.Ast
88
open FSharpLint.Framework.Rules
99

10-
let private runner (args:AstNodeRuleParams) =
11-
let checkTupleOfWildcards fileContents pattern identifier identifierRange =
12-
let rec isWildcard = function
13-
| SynPat.Paren(innerPattern, _) -> isWildcard innerPattern
14-
| SynPat.Wild(_) -> true
15-
| _ -> false
10+
let rule =
11+
let runner (args:AstNodeRuleParams) =
12+
let checkTupleOfWildcards fileContents pattern identifier identifierRange =
13+
let rec isWildcard = function
14+
| SynPat.Paren(innerPattern, _) -> isWildcard innerPattern
15+
| SynPat.Wild(_) -> true
16+
| _ -> false
1617

17-
let constructorString numberOfWildcards =
18-
let constructorName = String.concat "." identifier
19-
let arguments = Array.create numberOfWildcards "_" |> String.concat ", "
20-
if numberOfWildcards = 1 then
21-
$"%s{constructorName} _"
22-
else
23-
$"%s{constructorName}(%s{arguments})"
18+
let constructorString numberOfWildcards =
19+
let constructorName = String.concat "." identifier
20+
let arguments = Array.create numberOfWildcards "_" |> String.concat ", "
21+
if numberOfWildcards = 1 then
22+
$"%s{constructorName} _"
23+
else
24+
$"%s{constructorName}(%s{arguments})"
2425

25-
match pattern with
26-
| SynPat.Tuple(_isStruct, patterns, _, range) when List.length patterns > 1 && patterns |> List.forall isWildcard ->
27-
let errorFormat = Resources.GetString("RulesTupleOfWildcardsError")
28-
let refactorFrom = constructorString (List.length patterns)
29-
let refactorTo = constructorString 1
30-
let error = String.Format(errorFormat, refactorFrom, refactorTo)
31-
let suggestedFix = lazy(
32-
Some { SuggestedFix.FromRange = identifierRange; FromText = fileContents; ToText = refactorTo })
33-
Array.singleton
34-
{
35-
Range = range
36-
Message = error
37-
SuggestedFix = Some suggestedFix
38-
TypeChecks = List.Empty
39-
}
40-
| _ -> Array.empty
26+
match pattern with
27+
| SynPat.Tuple(_isStruct, patterns, _, range) when List.length patterns > 1 && patterns |> List.forall isWildcard ->
28+
let errorFormat = Resources.GetString("RulesTupleOfWildcardsError")
29+
let refactorFrom = constructorString (List.length patterns)
30+
let refactorTo = constructorString 1
31+
let error = String.Format(errorFormat, refactorFrom, refactorTo)
32+
let suggestedFix = lazy(
33+
Some { SuggestedFix.FromRange = identifierRange; FromText = fileContents; ToText = refactorTo })
34+
Array.singleton
35+
{
36+
Range = range
37+
Message = error
38+
SuggestedFix = Some suggestedFix
39+
TypeChecks = List.Empty
40+
}
41+
| _ -> Array.empty
4142

42-
let isTupleMemberArgs breadcrumbs tupleRange =
43-
let (|MemberBindingArgs|_|) bindingPattern =
44-
match bindingPattern with
45-
| SynBinding(_, _, _, _, _, _, _, SynPat.LongIdent(_, _, _, argPats, _, _), _, _, _, _, _) ->
46-
match argPats with
47-
| SynArgPats.Pats([SynPat.Paren(SynPat.Tuple(_) as tuple, _)]) -> Some(tuple)
43+
let isTupleMemberArgs breadcrumbs tupleRange =
44+
let (|MemberBindingArgs|_|) bindingPattern =
45+
match bindingPattern with
46+
| SynBinding(_, _, _, _, _, _, _, SynPat.LongIdent(_, _, _, argPats, _, _), _, _, _, _, _) ->
47+
match argPats with
48+
| SynArgPats.Pats([SynPat.Paren(SynPat.Tuple(_) as tuple, _)]) -> Some(tuple)
49+
| _ -> None
4850
| _ -> None
49-
| _ -> None
5051

51-
match breadcrumbs with
52-
| AstNode.Binding(MemberBindingArgs(SynPat.Tuple(_, _, _, range)))::AstNode.Expression(SynExpr.ObjExpr(_))::_
53-
| AstNode.Binding(MemberBindingArgs(SynPat.Tuple(_, _, _, range)))::AstNode.MemberDefinition(_)::_ ->
54-
tupleRange = range
55-
| _ -> false
52+
match breadcrumbs with
53+
| AstNode.Binding(MemberBindingArgs(SynPat.Tuple(_, _, _, range)))::AstNode.Expression(SynExpr.ObjExpr(_))::_
54+
| AstNode.Binding(MemberBindingArgs(SynPat.Tuple(_, _, _, range)))::AstNode.MemberDefinition(_)::_ ->
55+
tupleRange = range
56+
| _ -> false
5657

57-
match args.AstNode with
58-
| AstNode.Pattern(SynPat.LongIdent(identifier, _, _, SynArgPats.Pats([SynPat.Paren(SynPat.Tuple(_, _, _, range) as pattern, _)]), _, identRange)) ->
59-
let breadcrumbs = args.GetParents 2
60-
if (not << isTupleMemberArgs breadcrumbs) range then
61-
let identifier = identifier.LongIdent |> List.map (fun ident -> ident.idText)
62-
checkTupleOfWildcards args.FileContent pattern identifier identRange
63-
else
64-
Array.empty
65-
| _ -> Array.empty
58+
match args.AstNode with
59+
| AstNode.Pattern(SynPat.LongIdent(identifier, _, _, SynArgPats.Pats([SynPat.Paren(SynPat.Tuple(_, _, _, range) as pattern, _)]), _, identRange)) ->
60+
let breadcrumbs = args.GetParents 2
61+
if (not << isTupleMemberArgs breadcrumbs) range then
62+
let identifier = identifier.LongIdent |> List.map (fun ident -> ident.idText)
63+
checkTupleOfWildcards args.FileContent pattern identifier identRange
64+
else
65+
Array.empty
66+
| _ -> Array.empty
6667

67-
let rule =
6868
AstNodeRule
6969
{
7070
Name = "TupleOfWildcards"

0 commit comments

Comments
 (0)