Skip to content

Commit 4fbb1cb

Browse files
committed
FavourStaticEmptyFields: simplified expression processing
To not have duplicate code.
1 parent f84ead9 commit 4fbb1cb

File tree

1 file changed

+31
-20
lines changed

1 file changed

+31
-20
lines changed

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

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -38,30 +38,41 @@ let private generateError (fileContents: string) (range:FSharp.Compiler.Text.Ran
3838
SuggestedFix = Some suggestedFix
3939
TypeChecks = List.Empty }
4040

41-
let private runner (args: AstNodeRuleParams) =
42-
match args.AstNode with
43-
| AstNode.Expression(SynExpr.Const (SynConst.String ("", _, range), _)) ->
44-
generateError args.FileContent range EmptyStringLiteral
45-
| AstNode.Expression(SynExpr.ArrayOrList (isArray, [], range)) ->
41+
[<TailCall>]
42+
let rec private processExpressions (errorsSoFar: array<WarningDetails>) (args: AstNodeRuleParams) (expressions: list<SynExpr>) =
43+
match expressions with
44+
| SynExpr.Const(SynConst.String ("", _, range), _) :: tail ->
45+
let errors =
46+
Array.append
47+
errorsSoFar
48+
(generateError args.FileContent range EmptyStringLiteral)
49+
processExpressions errors args tail
50+
| SynExpr.ArrayOrList (isArray, [], range) :: tail ->
4651
let emptyLiteralType =
4752
if isArray then EmptyArrayLiteral else EmptyListLiteral
48-
generateError args.FileContent range emptyLiteralType
49-
| AstNode.Expression(SynExpr.Record(_, _, synExprRecordField, _)) ->
53+
let errors =
54+
Array.append
55+
errorsSoFar
56+
(generateError args.FileContent range emptyLiteralType)
57+
processExpressions errors args tail
58+
| SynExpr.App(_, _, _, argExpr, _) :: tail ->
59+
processExpressions errorsSoFar args (argExpr :: tail)
60+
| SynExpr.Record(_, _, synExprRecordFields, _) :: tail ->
5061
let mapping =
5162
function
52-
| SynExprRecordField(_, _, expr, _) ->
53-
match expr with
54-
| Some(SynExpr.ArrayOrList(isArray, [], range)) ->
55-
let emptyLiteralType = if isArray then EmptyArrayLiteral else EmptyListLiteral
56-
generateError args.FileContent range emptyLiteralType
57-
| Some(SynExpr.Const (SynConst.String ("", _, range), _)) ->
58-
generateError args.FileContent range EmptyStringLiteral
59-
| Some(SynExpr.App(_, _, _, SynExpr.Const (SynConst.String ("", _, range), _), _)) ->
60-
generateError args.FileContent range EmptyStringLiteral
61-
| _ -> Array.empty
62-
synExprRecordField
63-
|> List.map mapping
64-
|> Array.concat
63+
| SynExprRecordField(_, _, expr, _) -> expr
64+
let fieldExpressions =
65+
synExprRecordFields
66+
|> List.choose mapping
67+
processExpressions errorsSoFar args (List.append fieldExpressions tail)
68+
| _ :: tail ->
69+
processExpressions errorsSoFar args tail
70+
| [] -> errorsSoFar
71+
72+
let private runner (args: AstNodeRuleParams) =
73+
match args.AstNode with
74+
| AstNode.Expression(expr) ->
75+
processExpressions Array.empty args (List.singleton expr)
6576
| _ -> Array.empty
6677

6778

0 commit comments

Comments
 (0)