@@ -28,6 +28,12 @@ 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+
3137 /// <inheritdoc/>
3238 public override ImmutableArray < string > FixableDiagnosticIds => FixableDiagnostics ;
3339
@@ -40,6 +46,18 @@ public override FixAllProvider GetFixAllProvider()
4046 /// <inheritdoc/>
4147 public override Task RegisterCodeFixesAsync ( CodeFixContext context )
4248 {
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+
4361 foreach ( Diagnostic diagnostic in context . Diagnostics . Where ( d => FixableDiagnostics . Contains ( d . Id ) ) )
4462 {
4563 context . RegisterCodeFix ( CodeAction . Create ( OrderingResources . ElementOrderCodeFix , token => GetTransformedDocumentAsync ( context . Document , diagnostic , token ) , equivalenceKey : nameof ( ElementOrderCodeFixProvider ) ) , diagnostic ) ;
@@ -66,48 +84,47 @@ private static async Task<Document> GetTransformedDocumentAsync(Document documen
6684 private static SyntaxNode UpdateSyntaxRoot ( MemberDeclarationSyntax memberDeclaration , SyntaxNode syntaxRoot )
6785 {
6886 var parentDeclaration = memberDeclaration . Parent ;
87+ var memberToMove = new MemberOrderHelper ( memberDeclaration , checkElementType , checkAccessLevel , checkConst , checkStatic , checkReadonly ) ;
6988
7089 if ( parentDeclaration is TypeDeclarationSyntax )
7190 {
72- return HandleTypeDeclaration ( memberDeclaration , ( TypeDeclarationSyntax ) parentDeclaration , syntaxRoot ) ;
91+ return HandleTypeDeclaration ( memberToMove , ( TypeDeclarationSyntax ) parentDeclaration , syntaxRoot ) ;
7392 }
7493
7594 if ( parentDeclaration is NamespaceDeclarationSyntax )
7695 {
77- return HandleNamespaceDeclaration ( memberDeclaration , ( NamespaceDeclarationSyntax ) parentDeclaration , syntaxRoot ) ;
96+ return HandleNamespaceDeclaration ( memberToMove , ( NamespaceDeclarationSyntax ) parentDeclaration , syntaxRoot ) ;
7897 }
7998
8099 if ( parentDeclaration is CompilationUnitSyntax )
81100 {
82- return HandleCompilationUnitDeclaration ( memberDeclaration , ( CompilationUnitSyntax ) parentDeclaration , syntaxRoot ) ;
101+ return HandleCompilationUnitDeclaration ( memberToMove , ( CompilationUnitSyntax ) parentDeclaration , syntaxRoot ) ;
83102 }
84103
85104 return syntaxRoot ;
86105 }
87106
88- private static SyntaxNode HandleTypeDeclaration ( MemberDeclarationSyntax memberDeclaration , TypeDeclarationSyntax typeDeclarationNode , SyntaxNode syntaxRoot )
107+ private static SyntaxNode HandleTypeDeclaration ( MemberOrderHelper memberOrder , TypeDeclarationSyntax typeDeclarationNode , SyntaxNode syntaxRoot )
89108 {
90- var memberToMove = new MemberOrderHelper ( memberDeclaration ) ;
91- return MoveMember ( memberToMove , typeDeclarationNode . Members , syntaxRoot ) ;
109+ return MoveMember ( memberOrder , typeDeclarationNode . Members , syntaxRoot ) ;
92110 }
93111
94- private static SyntaxNode HandleCompilationUnitDeclaration ( MemberDeclarationSyntax memberDeclaration , CompilationUnitSyntax compilationUnitDeclaration , SyntaxNode syntaxRoot )
112+ private static SyntaxNode HandleCompilationUnitDeclaration ( MemberOrderHelper memberOrder , CompilationUnitSyntax compilationUnitDeclaration , SyntaxNode syntaxRoot )
95113 {
96- var memberToMove = new MemberOrderHelper ( memberDeclaration ) ;
97- return MoveMember ( memberToMove , compilationUnitDeclaration . Members , syntaxRoot ) ;
114+ return MoveMember ( memberOrder , compilationUnitDeclaration . Members , syntaxRoot ) ;
98115 }
99116
100- private static SyntaxNode HandleNamespaceDeclaration ( MemberDeclarationSyntax memberDeclaration , NamespaceDeclarationSyntax namespaceDeclaration , SyntaxNode syntaxRoot )
117+ private static SyntaxNode HandleNamespaceDeclaration ( MemberOrderHelper memberOrder , NamespaceDeclarationSyntax namespaceDeclaration , SyntaxNode syntaxRoot )
101118 {
102- var memberToMove = new MemberOrderHelper ( memberDeclaration ) ;
103- return MoveMember ( memberToMove , namespaceDeclaration . Members , syntaxRoot ) ;
119+ return MoveMember ( memberOrder , namespaceDeclaration . Members , syntaxRoot ) ;
104120 }
105121
106122 private static SyntaxNode MoveMember ( MemberOrderHelper memberOrder , SyntaxList < MemberDeclarationSyntax > members , SyntaxNode syntaxRoot )
107123 {
108124 foreach ( var member in members )
109125 {
110- var orderHelper = new MemberOrderHelper ( member ) ;
126+ var orderHelper = new MemberOrderHelper ( member , checkElementType , checkAccessLevel , checkConst , checkStatic , checkReadonly ) ;
127+
111128 if ( orderHelper . Priority < memberOrder . Priority )
112129 {
113130 syntaxRoot = MoveMember ( syntaxRoot , memberOrder . Member , member ) ;
@@ -142,6 +159,23 @@ private class FixAll : DocumentBasedFixAllProvider
142159 protected override async Task < SyntaxNode > FixAllInDocumentAsync ( FixAllContext fixAllContext , Document document )
143160 {
144161 var diagnostics = await fixAllContext . GetDocumentDiagnosticsAsync ( document ) . ConfigureAwait ( false ) ;
162+ if ( diagnostics . IsEmpty )
163+ {
164+ return null ;
165+ }
166+
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+ }
178+
145179 var syntaxRoot = await document . GetSyntaxRootAsync ( ) . ConfigureAwait ( false ) ;
146180
147181 foreach ( var diagnostic in diagnostics )
0 commit comments