Skip to content

Commit c7e6ed8

Browse files
committed
Merge pull request #1812 from sharwell/fix-1745
Implement the 'elementOrder' configuration property
2 parents 2c33c5f + 6e55178 commit c7e6ed8

27 files changed

Lines changed: 1087 additions & 669 deletions

StyleCop.Analyzers/StyleCop.Analyzers.CodeFixes/OrderingRules/ElementOrderCodeFixProvider.cs

Lines changed: 21 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ namespace StyleCop.Analyzers.OrderingRules
1515
using Microsoft.CodeAnalysis.CodeFixes;
1616
using Microsoft.CodeAnalysis.CSharp;
1717
using Microsoft.CodeAnalysis.CSharp.Syntax;
18+
using Settings.ObjectModel;
1819

1920
/// <summary>
2021
/// Implements code fixes for element ordering rules.
@@ -30,8 +31,7 @@ internal class ElementOrderCodeFixProvider : CodeFixProvider
3031
SA1202ElementsMustBeOrderedByAccess.DiagnosticId,
3132
SA1203ConstantsMustAppearBeforeFields.DiagnosticId,
3233
SA1204StaticElementsMustAppearBeforeInstanceElements.DiagnosticId,
33-
SA1214StaticReadonlyElementsMustAppearBeforeStaticNonReadonlyElements.DiagnosticId,
34-
SA1215InstanceReadonlyElementsMustAppearBeforeInstanceNonReadonlyElements.DiagnosticId);
34+
SA1214ReadonlyElementsMustAppearBeforeNonReadonlyElements.DiagnosticId);
3535

3636
/// <inheritdoc/>
3737
public override FixAllProvider GetFixAllProvider()
@@ -57,7 +57,8 @@ public override Task RegisterCodeFixesAsync(CodeFixContext context)
5757

5858
private static async Task<Document> GetTransformedDocumentAsync(Document document, Diagnostic diagnostic, CancellationToken cancellationToken)
5959
{
60-
var orderingChecks = await GetEnabledRulesForDocumentAsync(document, cancellationToken).ConfigureAwait(false);
60+
var settings = SettingsHelper.GetStyleCopSettings(document.Project.AnalyzerOptions, cancellationToken);
61+
var elementOrder = settings.OrderingRules.ElementOrder;
6162
var syntaxRoot = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
6263
var indentationOptions = IndentationOptions.FromDocument(document);
6364

@@ -67,68 +68,57 @@ private static async Task<Document> GetTransformedDocumentAsync(Document documen
6768
return document;
6869
}
6970

70-
syntaxRoot = UpdateSyntaxRoot(memberDeclaration, orderingChecks, syntaxRoot, indentationOptions);
71+
syntaxRoot = UpdateSyntaxRoot(memberDeclaration, elementOrder, syntaxRoot, indentationOptions);
7172

7273
return document.WithSyntaxRoot(syntaxRoot);
7374
}
7475

75-
private static async Task<ElementOrderingChecks> GetEnabledRulesForDocumentAsync(Document document, CancellationToken cancellationToken)
76-
{
77-
SemanticModel semanticModel;
78-
if (!document.TryGetSemanticModel(out semanticModel))
79-
{
80-
semanticModel = await document.GetSemanticModelAsync(cancellationToken).ConfigureAwait(false);
81-
}
82-
83-
return ElementOrderingChecks.GetElementOrderingChecksForSemanticModel(semanticModel);
84-
}
85-
86-
private static SyntaxNode UpdateSyntaxRoot(MemberDeclarationSyntax memberDeclaration, ElementOrderingChecks checks, SyntaxNode syntaxRoot, IndentationOptions indentationOptions)
76+
private static SyntaxNode UpdateSyntaxRoot(MemberDeclarationSyntax memberDeclaration, ImmutableArray<OrderingTrait> elementOrder, SyntaxNode syntaxRoot, IndentationOptions indentationOptions)
8777
{
8878
var parentDeclaration = memberDeclaration.Parent;
89-
var memberToMove = new MemberOrderHelper(memberDeclaration, checks);
79+
var memberToMove = new MemberOrderHelper(memberDeclaration, elementOrder);
9080

9181
if (parentDeclaration is TypeDeclarationSyntax)
9282
{
93-
return HandleTypeDeclaration(memberToMove, (TypeDeclarationSyntax)parentDeclaration, checks, syntaxRoot, indentationOptions);
83+
return HandleTypeDeclaration(memberToMove, (TypeDeclarationSyntax)parentDeclaration, elementOrder, syntaxRoot, indentationOptions);
9484
}
9585

9686
if (parentDeclaration is NamespaceDeclarationSyntax)
9787
{
98-
return HandleNamespaceDeclaration(memberToMove, (NamespaceDeclarationSyntax)parentDeclaration, checks, syntaxRoot, indentationOptions);
88+
return HandleNamespaceDeclaration(memberToMove, (NamespaceDeclarationSyntax)parentDeclaration, elementOrder, syntaxRoot, indentationOptions);
9989
}
10090

10191
if (parentDeclaration is CompilationUnitSyntax)
10292
{
103-
return HandleCompilationUnitDeclaration(memberToMove, (CompilationUnitSyntax)parentDeclaration, checks, syntaxRoot, indentationOptions);
93+
return HandleCompilationUnitDeclaration(memberToMove, (CompilationUnitSyntax)parentDeclaration, elementOrder, syntaxRoot, indentationOptions);
10494
}
10595

10696
return syntaxRoot;
10797
}
10898

109-
private static SyntaxNode HandleTypeDeclaration(MemberOrderHelper memberOrder, TypeDeclarationSyntax typeDeclarationNode, ElementOrderingChecks checks, SyntaxNode syntaxRoot, IndentationOptions indentationOptions)
99+
private static SyntaxNode HandleTypeDeclaration(MemberOrderHelper memberOrder, TypeDeclarationSyntax typeDeclarationNode, ImmutableArray<OrderingTrait> elementOrder, SyntaxNode syntaxRoot, IndentationOptions indentationOptions)
110100
{
111-
return OrderMember(memberOrder, typeDeclarationNode.Members, checks, syntaxRoot, indentationOptions);
101+
return OrderMember(memberOrder, typeDeclarationNode.Members, elementOrder, syntaxRoot, indentationOptions);
112102
}
113103

114-
private static SyntaxNode HandleCompilationUnitDeclaration(MemberOrderHelper memberOrder, CompilationUnitSyntax compilationUnitDeclaration, ElementOrderingChecks checks, SyntaxNode syntaxRoot, IndentationOptions indentationOptions)
104+
private static SyntaxNode HandleCompilationUnitDeclaration(MemberOrderHelper memberOrder, CompilationUnitSyntax compilationUnitDeclaration, ImmutableArray<OrderingTrait> elementOrder, SyntaxNode syntaxRoot, IndentationOptions indentationOptions)
115105
{
116-
return OrderMember(memberOrder, compilationUnitDeclaration.Members, checks, syntaxRoot, indentationOptions);
106+
return OrderMember(memberOrder, compilationUnitDeclaration.Members, elementOrder, syntaxRoot, indentationOptions);
117107
}
118108

119-
private static SyntaxNode HandleNamespaceDeclaration(MemberOrderHelper memberOrder, NamespaceDeclarationSyntax namespaceDeclaration, ElementOrderingChecks checks, SyntaxNode syntaxRoot, IndentationOptions indentationOptions)
109+
private static SyntaxNode HandleNamespaceDeclaration(MemberOrderHelper memberOrder, NamespaceDeclarationSyntax namespaceDeclaration, ImmutableArray<OrderingTrait> elementOrder, SyntaxNode syntaxRoot, IndentationOptions indentationOptions)
120110
{
121-
return OrderMember(memberOrder, namespaceDeclaration.Members, checks, syntaxRoot, indentationOptions);
111+
return OrderMember(memberOrder, namespaceDeclaration.Members, elementOrder, syntaxRoot, indentationOptions);
122112
}
123113

124-
private static SyntaxNode OrderMember(MemberOrderHelper memberOrder, SyntaxList<MemberDeclarationSyntax> members, ElementOrderingChecks checks, SyntaxNode syntaxRoot, IndentationOptions indentationOptions)
114+
private static SyntaxNode OrderMember(MemberOrderHelper memberOrder, SyntaxList<MemberDeclarationSyntax> members, ImmutableArray<OrderingTrait> elementOrder, SyntaxNode syntaxRoot, IndentationOptions indentationOptions)
125115
{
126116
var memberIndex = members.IndexOf(memberOrder.Member);
127117
MemberOrderHelper target = default(MemberOrderHelper);
128118

129119
for (var i = memberIndex - 1; i >= 0; --i)
130120
{
131-
var orderHelper = new MemberOrderHelper(members[i], checks);
121+
var orderHelper = new MemberOrderHelper(members[i], elementOrder);
132122
if (orderHelper.Priority < memberOrder.Priority)
133123
{
134124
target = orderHelper;
@@ -276,7 +266,8 @@ protected override async Task<SyntaxNode> FixAllInDocumentAsync(FixAllContext fi
276266
}
277267

278268
var indentationOptions = IndentationOptions.FromDocument(document);
279-
var orderingChecks = await GetEnabledRulesForDocumentAsync(document, fixAllContext.CancellationToken).ConfigureAwait(false);
269+
var settings = SettingsHelper.GetStyleCopSettings(document.Project.AnalyzerOptions, fixAllContext.CancellationToken);
270+
var elementOrder = settings.OrderingRules.ElementOrder;
280271
var syntaxRoot = await document.GetSyntaxRootAsync().ConfigureAwait(false);
281272

282273
var trackedDiagnosticMembers = new List<MemberDeclarationSyntax>();
@@ -296,7 +287,7 @@ protected override async Task<SyntaxNode> FixAllInDocumentAsync(FixAllContext fi
296287
foreach (var member in trackedDiagnosticMembers)
297288
{
298289
var memberDeclaration = syntaxRoot.GetCurrentNode(member);
299-
syntaxRoot = UpdateSyntaxRoot(memberDeclaration, orderingChecks, syntaxRoot, indentationOptions);
290+
syntaxRoot = UpdateSyntaxRoot(memberDeclaration, elementOrder, syntaxRoot, indentationOptions);
300291
}
301292

302293
return syntaxRoot;

0 commit comments

Comments
 (0)