@@ -37,34 +37,49 @@ let private topologicallySortedOpenStatementsAnalyzer
3737 let allOpenStatements = ResizeArray< string list * range>()
3838
3939 let (| LongIdentAsString |) ( lid : SynLongIdent ) =
40- lid.LongIdent |> List.map ( fun ident -> ident.idText)
40+ lid.LongIdent
41+ |> List.map ( fun ident -> ident.idText)
4142
4243 let walker =
4344 { new SyntaxCollectorBase() with
4445 override _.WalkSynModuleSigDecl ( _ , decl : SynModuleSigDecl ) =
4546 match decl with
4647 | SynModuleSigDecl.Open(
47- target = SynOpenDeclTarget.ModuleOrNamespace( longId = LongIdentAsString value; range = mOpen)) ->
48+ target = SynOpenDeclTarget.ModuleOrNamespace(
49+ longId = LongIdentAsString value; range = mOpen)) ->
4850 allOpenStatements.Add( value, mOpen)
4951 | _ -> ()
5052
5153 override _.WalkSynModuleDecl ( _ , decl : SynModuleDecl ) =
5254 match decl with
5355 | SynModuleDecl.Open(
54- target = SynOpenDeclTarget.ModuleOrNamespace( longId = LongIdentAsString value; range = mOpen)) ->
56+ target = SynOpenDeclTarget.ModuleOrNamespace(
57+ longId = LongIdentAsString value; range = mOpen)) ->
5558 allOpenStatements.Add( value, mOpen)
5659 | _ -> ()
5760 }
5861
5962 ASTCollecting.walkAst walker untypedTree
6063
61- allOpenStatements |> Seq.toList
64+ allOpenStatements
65+ |> Seq.toList
6266
6367 let isSystemOpenStatement ( openStatement : string list , mOpen : range ) =
6468 let isFromBCL () =
65- let line = sourceText.GetLineString( mOpen.EndLine - 1 )
66-
67- match checkResults.GetSymbolUseAtLocation( mOpen.EndLine, mOpen.EndColumn, line, openStatement) with
69+ let line =
70+ sourceText.GetLineString(
71+ mOpen.EndLine
72+ - 1
73+ )
74+
75+ match
76+ checkResults.GetSymbolUseAtLocation(
77+ mOpen.EndLine,
78+ mOpen.EndColumn,
79+ line,
80+ openStatement
81+ )
82+ with
6883 | Some symbolUse ->
6984 match symbolUse.Symbol.Assembly.FileName with
7085 | None -> false
@@ -73,19 +88,25 @@ let private topologicallySortedOpenStatementsAnalyzer
7388 assemblyPath.ToLower() .Contains " microsoft.netcore.app.ref"
7489 | _ -> false
7590
76- openStatement.[ 0 ]. StartsWith( " System" ) && isFromBCL ()
91+ openStatement.[ 0 ]. StartsWith( " System" )
92+ && isFromBCL ()
7793
78- let nonSystemOpens = allOpenStatements |> List.skipWhile isSystemOpenStatement
94+ let nonSystemOpens =
95+ allOpenStatements
96+ |> List.skipWhile isSystemOpenStatement
7997
8098 return
8199 nonSystemOpens
82100 |> List.filter isSystemOpenStatement
83101 |> List.map ( fun ( openStatement , mOpen ) ->
84- let openStatementText = openStatement |> String.concat " ."
102+ let openStatementText =
103+ openStatement
104+ |> String.concat " ."
85105
86106 {
87107 Type = " Unsorted System open statement"
88- Message = $" %s {openStatementText} was found after non System namespaces where opened!"
108+ Message =
109+ $" %s {openStatementText} was found after non System namespaces where opened!"
89110 Code = " SOT001"
90111 Severity = Severity.Warning
91112 Range = mOpen
@@ -96,15 +117,21 @@ let private topologicallySortedOpenStatementsAnalyzer
96117
97118[<CliAnalyzer " Topologically sorted open statements" >]
98119let cliAnalyzer ( ctx : CliContext ) : Async < Message list > =
99- topologicallySortedOpenStatementsAnalyzer ctx.SourceText ctx.ParseFileResults.ParseTree ctx.CheckFileResults
120+ topologicallySortedOpenStatementsAnalyzer
121+ ctx.SourceText
122+ ctx.ParseFileResults.ParseTree
123+ ctx.CheckFileResults
100124
101125[<EditorAnalyzer " Topologically sorted open statements" >]
102126let editorAnalyzer ( ctx : EditorContext ) : Async < Message list > =
103127 match ctx.CheckFileResults with
104128 // The editor might not have any check results for a given file. So we don't return any messages.
105129 | None -> async.Return []
106130 | Some checkResults ->
107- topologicallySortedOpenStatementsAnalyzer ctx.SourceText ctx.ParseFileResults.ParseTree checkResults
131+ topologicallySortedOpenStatementsAnalyzer
132+ ctx.SourceText
133+ ctx.ParseFileResults.ParseTree
134+ checkResults
108135
109136(**
110137Both analyzers will follow the same code path: the console application will always have the required data, while the editor needs to be more careful.
0 commit comments