@@ -28,12 +28,6 @@ public class ElementOrderCodeFixProvider : CodeFixProvider
2828 SA1214StaticReadonlyElementsMustAppearBeforeStaticNonReadonlyElements . DiagnosticId ,
2929 SA1215InstanceReadonlyElementsMustAppearBeforeInstanceNonReadonlyElements . DiagnosticId ) ;
3030
31- private static bool checkElementType ;
32- private static bool checkAccessLevel ;
33- private static bool checkConst ;
34- private static bool checkStatic ;
35- private static bool checkReadonly ;
36-
3731 /// <inheritdoc/>
3832 public override ImmutableArray < string > FixableDiagnosticIds => FixableDiagnostics ;
3933
@@ -46,18 +40,6 @@ public override FixAllProvider GetFixAllProvider()
4640 /// <inheritdoc/>
4741 public override Task RegisterCodeFixesAsync ( CodeFixContext context )
4842 {
49- SemanticModel semanticModel ;
50- context . Document . TryGetSemanticModel ( out semanticModel ) ;
51- if ( semanticModel != null )
52- {
53- checkElementType = ! semanticModel . Compilation . IsAnalyzerSuppressed ( SA1201ElementsMustAppearInTheCorrectOrder . DiagnosticId ) ;
54- checkAccessLevel = ! semanticModel . Compilation . IsAnalyzerSuppressed ( SA1202ElementsMustBeOrderedByAccess . DiagnosticId ) ;
55- checkConst = ! semanticModel . Compilation . IsAnalyzerSuppressed ( SA1203ConstantsMustAppearBeforeFields . DiagnosticId ) ;
56- checkStatic = ! semanticModel . Compilation . IsAnalyzerSuppressed ( SA1204StaticElementsMustAppearBeforeInstanceElements . DiagnosticId ) ;
57- checkReadonly = ! semanticModel . Compilation . IsAnalyzerSuppressed ( SA1214StaticReadonlyElementsMustAppearBeforeStaticNonReadonlyElements . DiagnosticId )
58- || ! semanticModel . Compilation . IsAnalyzerSuppressed ( SA1215InstanceReadonlyElementsMustAppearBeforeInstanceNonReadonlyElements . DiagnosticId ) ;
59- }
60-
6143 foreach ( Diagnostic diagnostic in context . Diagnostics . Where ( d => FixableDiagnostics . Contains ( d . Id ) ) )
6244 {
6345 context . RegisterCodeFix ( CodeAction . Create ( OrderingResources . ElementOrderCodeFix , token => GetTransformedDocumentAsync ( context . Document , diagnostic , token ) , equivalenceKey : nameof ( ElementOrderCodeFixProvider ) ) , diagnostic ) ;
@@ -68,6 +50,7 @@ public override Task RegisterCodeFixesAsync(CodeFixContext context)
6850
6951 private static async Task < Document > GetTransformedDocumentAsync ( Document document , Diagnostic diagnostic , CancellationToken cancellationToken )
7052 {
53+ var orderingChecks = await GetEnabledRulesForDocumentAsync ( document , cancellationToken ) . ConfigureAwait ( false ) ;
7154 var syntaxRoot = await document . GetSyntaxRootAsync ( cancellationToken ) . ConfigureAwait ( false ) ;
7255
7356 var memberDeclaration = syntaxRoot . FindNode ( diagnostic . Location . SourceSpan ) . FirstAncestorOrSelf < MemberDeclarationSyntax > ( ) ;
@@ -76,54 +59,66 @@ private static async Task<Document> GetTransformedDocumentAsync(Document documen
7659 return document ;
7760 }
7861
79- syntaxRoot = UpdateSyntaxRoot ( memberDeclaration , syntaxRoot ) ;
62+ syntaxRoot = UpdateSyntaxRoot ( memberDeclaration , orderingChecks , syntaxRoot ) ;
8063
8164 return document . WithSyntaxRoot ( syntaxRoot ) ;
8265 }
8366
84- private static SyntaxNode UpdateSyntaxRoot ( MemberDeclarationSyntax memberDeclaration , SyntaxNode syntaxRoot )
67+ private static async Task < ElementOrderingChecks > GetEnabledRulesForDocumentAsync ( Document document , CancellationToken cancellationToken )
68+ {
69+ SemanticModel semanticModel ;
70+ document . TryGetSemanticModel ( out semanticModel ) ;
71+ if ( semanticModel == null )
72+ {
73+ semanticModel = await document . GetSemanticModelAsync ( cancellationToken ) . ConfigureAwait ( false ) ;
74+ }
75+
76+ return ElementOrderingChecks . GetElementOrderingChecksForSemanticModel ( semanticModel ) ;
77+ }
78+
79+ private static SyntaxNode UpdateSyntaxRoot ( MemberDeclarationSyntax memberDeclaration , ElementOrderingChecks checks , SyntaxNode syntaxRoot )
8580 {
8681 var parentDeclaration = memberDeclaration . Parent ;
87- var memberToMove = new MemberOrderHelper ( memberDeclaration , checkElementType , checkAccessLevel , checkConst , checkStatic , checkReadonly ) ;
82+ var memberToMove = new MemberOrderHelper ( memberDeclaration , checks ) ;
8883
8984 if ( parentDeclaration is TypeDeclarationSyntax )
9085 {
91- return HandleTypeDeclaration ( memberToMove , ( TypeDeclarationSyntax ) parentDeclaration , syntaxRoot ) ;
86+ return HandleTypeDeclaration ( memberToMove , ( TypeDeclarationSyntax ) parentDeclaration , checks , syntaxRoot ) ;
9287 }
9388
9489 if ( parentDeclaration is NamespaceDeclarationSyntax )
9590 {
96- return HandleNamespaceDeclaration ( memberToMove , ( NamespaceDeclarationSyntax ) parentDeclaration , syntaxRoot ) ;
91+ return HandleNamespaceDeclaration ( memberToMove , ( NamespaceDeclarationSyntax ) parentDeclaration , checks , syntaxRoot ) ;
9792 }
9893
9994 if ( parentDeclaration is CompilationUnitSyntax )
10095 {
101- return HandleCompilationUnitDeclaration ( memberToMove , ( CompilationUnitSyntax ) parentDeclaration , syntaxRoot ) ;
96+ return HandleCompilationUnitDeclaration ( memberToMove , ( CompilationUnitSyntax ) parentDeclaration , checks , syntaxRoot ) ;
10297 }
10398
10499 return syntaxRoot ;
105100 }
106101
107- private static SyntaxNode HandleTypeDeclaration ( MemberOrderHelper memberOrder , TypeDeclarationSyntax typeDeclarationNode , SyntaxNode syntaxRoot )
102+ private static SyntaxNode HandleTypeDeclaration ( MemberOrderHelper memberOrder , TypeDeclarationSyntax typeDeclarationNode , ElementOrderingChecks checks , SyntaxNode syntaxRoot )
108103 {
109- return MoveMember ( memberOrder , typeDeclarationNode . Members , syntaxRoot ) ;
104+ return MoveMember ( memberOrder , typeDeclarationNode . Members , checks , syntaxRoot ) ;
110105 }
111106
112- private static SyntaxNode HandleCompilationUnitDeclaration ( MemberOrderHelper memberOrder , CompilationUnitSyntax compilationUnitDeclaration , SyntaxNode syntaxRoot )
107+ private static SyntaxNode HandleCompilationUnitDeclaration ( MemberOrderHelper memberOrder , CompilationUnitSyntax compilationUnitDeclaration , ElementOrderingChecks checks , SyntaxNode syntaxRoot )
113108 {
114- return MoveMember ( memberOrder , compilationUnitDeclaration . Members , syntaxRoot ) ;
109+ return MoveMember ( memberOrder , compilationUnitDeclaration . Members , checks , syntaxRoot ) ;
115110 }
116111
117- private static SyntaxNode HandleNamespaceDeclaration ( MemberOrderHelper memberOrder , NamespaceDeclarationSyntax namespaceDeclaration , SyntaxNode syntaxRoot )
112+ private static SyntaxNode HandleNamespaceDeclaration ( MemberOrderHelper memberOrder , NamespaceDeclarationSyntax namespaceDeclaration , ElementOrderingChecks checks , SyntaxNode syntaxRoot )
118113 {
119- return MoveMember ( memberOrder , namespaceDeclaration . Members , syntaxRoot ) ;
114+ return MoveMember ( memberOrder , namespaceDeclaration . Members , checks , syntaxRoot ) ;
120115 }
121116
122- private static SyntaxNode MoveMember ( MemberOrderHelper memberOrder , SyntaxList < MemberDeclarationSyntax > members , SyntaxNode syntaxRoot )
117+ private static SyntaxNode MoveMember ( MemberOrderHelper memberOrder , SyntaxList < MemberDeclarationSyntax > members , ElementOrderingChecks checks , SyntaxNode syntaxRoot )
123118 {
124119 foreach ( var member in members )
125120 {
126- var orderHelper = new MemberOrderHelper ( member , checkElementType , checkAccessLevel , checkConst , checkStatic , checkReadonly ) ;
121+ var orderHelper = new MemberOrderHelper ( member , checks ) ;
127122
128123 if ( orderHelper . Priority < memberOrder . Priority )
129124 {
@@ -164,17 +159,7 @@ protected override async Task<SyntaxNode> FixAllInDocumentAsync(FixAllContext fi
164159 return null ;
165160 }
166161
167- SemanticModel semanticModel ;
168- document . TryGetSemanticModel ( out semanticModel ) ;
169- if ( semanticModel != null )
170- {
171- checkElementType = ! semanticModel . Compilation . IsAnalyzerSuppressed ( SA1201ElementsMustAppearInTheCorrectOrder . DiagnosticId ) ;
172- checkAccessLevel = ! semanticModel . Compilation . IsAnalyzerSuppressed ( SA1202ElementsMustBeOrderedByAccess . DiagnosticId ) ;
173- checkConst = ! semanticModel . Compilation . IsAnalyzerSuppressed ( SA1203ConstantsMustAppearBeforeFields . DiagnosticId ) ;
174- checkStatic = ! semanticModel . Compilation . IsAnalyzerSuppressed ( SA1204StaticElementsMustAppearBeforeInstanceElements . DiagnosticId ) ;
175- checkReadonly = ! semanticModel . Compilation . IsAnalyzerSuppressed ( SA1214StaticReadonlyElementsMustAppearBeforeStaticNonReadonlyElements . DiagnosticId )
176- || ! semanticModel . Compilation . IsAnalyzerSuppressed ( SA1215InstanceReadonlyElementsMustAppearBeforeInstanceNonReadonlyElements . DiagnosticId ) ;
177- }
162+ var orderingChecks = await GetEnabledRulesForDocumentAsync ( document , fixAllContext . CancellationToken ) . ConfigureAwait ( false ) ;
178163
179164 var syntaxRoot = await document . GetSyntaxRootAsync ( ) . ConfigureAwait ( false ) ;
180165
@@ -186,7 +171,7 @@ protected override async Task<SyntaxNode> FixAllInDocumentAsync(FixAllContext fi
186171 continue ;
187172 }
188173
189- syntaxRoot = UpdateSyntaxRoot ( memberDeclaration , syntaxRoot ) ;
174+ syntaxRoot = UpdateSyntaxRoot ( memberDeclaration , orderingChecks , syntaxRoot ) ;
190175 }
191176
192177 return syntaxRoot ;
0 commit comments