Skip to content

Commit 4685904

Browse files
committed
FavourStaticEmptyFields: made function tail-recursive
Made recursive function that processes expressions tail-recursive.
1 parent 37aed11 commit 4685904

File tree

1 file changed

+42
-37
lines changed

1 file changed

+42
-37
lines changed

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

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

41-
let rec private processExpression (args: AstNodeRuleParams) (expression: SynExpr) =
42-
match expression with
43-
| SynExpr.Const(SynConst.String ("", _, range), _) ->
44-
generateError args.FileContent range EmptyStringLiteral
45-
| SynExpr.DotIndexedGet(_, indexArgs, _ , _) ->
46-
processExpression args indexArgs
47-
| SynExpr.DotIndexedSet(_, indexArgs, _ , _, _, _) ->
48-
processExpression args indexArgs
49-
| SynExpr.Paren(expr, _, _, _) ->
50-
processExpression args expr
51-
| SynExpr.Tuple(_, expressions, _, _) ->
52-
expressions
53-
|> List.map (processExpression args)
54-
|> Array.concat
55-
| 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.DotIndexedGet(_, indexArgs, _ , _) :: tail ->
51+
processExpressions errorsSoFar args (indexArgs :: tail)
52+
| SynExpr.DotIndexedSet(_, indexArgs, _ , _, _, _) :: tail ->
53+
processExpressions errorsSoFar args (indexArgs :: tail)
54+
| SynExpr.Paren(expr, _, _, _) :: tail ->
55+
processExpressions errorsSoFar args (expr :: tail)
56+
| SynExpr.Tuple(_, expressions, _, _) :: tail ->
57+
processExpressions errorsSoFar args (List.append expressions tail)
58+
| SynExpr.ArrayOrList(isArray, [], range) :: tail ->
5659
let emptyLiteralType =
5760
if isArray then EmptyArrayLiteral else EmptyListLiteral
58-
generateError args.FileContent range emptyLiteralType
59-
| SynExpr.ArrayOrListComputed(_, expr, _) ->
60-
processExpression args expr
61-
| SynExpr.App(_, _, funcExpr, argExpr, _) ->
62-
Array.append
63-
(processExpression args funcExpr)
64-
(processExpression args argExpr)
65-
| SynExpr.AnonRecd(_, _, recordFields, _, _) ->
66-
recordFields
67-
|> List.map (fun (_, _, expr) -> processExpression args expr)
68-
|> Array.concat
69-
| SynExpr.Record(_, _, synExprRecordFields, _) ->
61+
let errors =
62+
Array.append
63+
errorsSoFar
64+
(generateError args.FileContent range emptyLiteralType)
65+
processExpressions errors args tail
66+
| SynExpr.ArrayOrListComputed(_, expr, _) :: tail ->
67+
processExpressions errorsSoFar args (expr :: tail)
68+
| SynExpr.App(_, _, funcExpr, argExpr, _) :: tail ->
69+
processExpressions errorsSoFar args (List.append [ funcExpr; argExpr ] tail)
70+
| SynExpr.AnonRecd(_, _, recordFields, _, _) :: tail ->
71+
let fieldExpressions =
72+
recordFields
73+
|> List.map (fun (_, _, expr) -> expr)
74+
processExpressions errorsSoFar args (List.append fieldExpressions tail)
75+
| SynExpr.Record(_, _, synExprRecordFields, _) :: tail ->
7076
let mapping =
7177
function
72-
| SynExprRecordField(_, _, expr, _) ->
73-
match expr with
74-
| Some innerExpression ->
75-
processExpression args innerExpression
76-
| _ -> Array.empty
77-
synExprRecordFields
78-
|> List.map mapping
79-
|> Array.concat
80-
| _ -> Array.empty
78+
| SynExprRecordField(_, _, expr, _) -> expr
79+
let fieldExpressions =
80+
synExprRecordFields
81+
|> List.choose mapping
82+
processExpressions errorsSoFar args (List.append fieldExpressions tail)
83+
| _ :: tail ->
84+
processExpressions errorsSoFar args tail
85+
| [] -> errorsSoFar
8186

8287
let private runner (args: AstNodeRuleParams) =
8388
match args.AstNode with
8489
| AstNode.Expression(expr) ->
85-
processExpression args expr
90+
processExpressions Array.empty args (List.singleton expr)
8691
| _ -> Array.empty
8792

8893

0 commit comments

Comments
 (0)