@@ -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
8287let 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