Skip to content

Commit eb5e546

Browse files
authored
Group refactorings 'Wrap in ...' (#1317)
1 parent 4f816f1 commit eb5e546

File tree

7 files changed

+35
-47
lines changed

7 files changed

+35
-47
lines changed

ChangeLog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2323
- Rename analyzers ([PR](https://github.com/dotnet/roslynator/pull/1314))
2424
- "Add new line before embedded statement" -> "Put embedded statement on its own line" ([RCS0030](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS0030))
2525
- "Add new line before statement" -> "Put statement on its own line" ([RCS0033](https://josefpihrt.github.io/docs/roslynator/analyzers/RCS0033))
26+
- Group refactoring "Wrap in ..." ([PR](https://github.com/dotnet/roslynator/pull/1317))
2627

2728
### Fixed
2829

src/Refactorings/CSharp/Refactorings/EmbeddedStatementRefactoring.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,15 @@ public static void ComputeRefactoring(RefactoringContext context, StatementSynta
1414

1515
if (context.IsRefactoringEnabled(RefactoringDescriptors.WrapStatementsInCondition))
1616
{
17-
context.RegisterRefactoring(
17+
context.AddNestedCodeAction(
1818
WrapInIfStatementRefactoring.Title,
1919
ct => WrapInIfStatementRefactoring.Instance.RefactorAsync(context.Document, statement, ct),
2020
RefactoringDescriptors.WrapStatementsInCondition);
2121
}
2222

2323
if (context.IsRefactoringEnabled(RefactoringDescriptors.WrapLinesInTryCatch))
2424
{
25-
context.RegisterRefactoring(
25+
context.AddNestedCodeAction(
2626
WrapLinesInTryCatchRefactoring.Title,
2727
ct => WrapLinesInTryCatchRefactoring.Instance.RefactorAsync(context.Document, statement, ct),
2828
RefactoringDescriptors.WrapLinesInTryCatch);

src/Refactorings/CSharp/Refactorings/RefactoringContext.cs

Lines changed: 22 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ public RefactoringContext(CodeRefactoringContext underlyingContext, SyntaxNode r
3838

3939
public SyntaxNode Root { get; }
4040

41+
public ImmutableArray<CodeAction>.Builder NestedCodeActions { get; private set; }
42+
4143
public CancellationToken CancellationToken
4244
{
4345
get { return UnderlyingContext.CancellationToken; }
@@ -77,50 +79,33 @@ public bool SupportsCSharp6
7779
{
7880
get
7981
{
80-
if (Project.Language == LanguageNames.CSharp)
81-
{
82-
switch (((CSharpParseOptions)Project.ParseOptions).LanguageVersion)
83-
{
84-
case LanguageVersion.CSharp1:
85-
case LanguageVersion.CSharp2:
86-
case LanguageVersion.CSharp3:
87-
case LanguageVersion.CSharp4:
88-
case LanguageVersion.CSharp5:
89-
return false;
90-
default:
91-
return true;
92-
}
93-
}
94-
95-
return false;
82+
return Project.Language == LanguageNames.CSharp
83+
&& ((CSharpParseOptions)Project.ParseOptions).LanguageVersion >= LanguageVersion.CSharp6;
9684
}
9785
}
9886

99-
public bool SupportsCSharp7
87+
public bool PrefixFieldIdentifierWithUnderscore => (_configOptions ??= Document.GetConfigOptions(Root.SyntaxTree)).GetPrefixFieldIdentifierWithUnderscore();
88+
89+
public void AddNestedCodeAction(
90+
string title,
91+
Func<CancellationToken, Task<Document>> createChangedDocument,
92+
RefactoringDescriptor descriptor,
93+
string additionalEquivalenceKey1 = null,
94+
string additionalEquivalenceKey2 = null)
10095
{
101-
get
102-
{
103-
if (Project.Language == LanguageNames.CSharp)
104-
{
105-
switch (((CSharpParseOptions)Project.ParseOptions).LanguageVersion)
106-
{
107-
case LanguageVersion.CSharp1:
108-
case LanguageVersion.CSharp2:
109-
case LanguageVersion.CSharp3:
110-
case LanguageVersion.CSharp4:
111-
case LanguageVersion.CSharp5:
112-
case LanguageVersion.CSharp6:
113-
return false;
114-
default:
115-
return true;
116-
}
117-
}
96+
NestedCodeActions ??= ImmutableArray.CreateBuilder<CodeAction>();
11897

119-
return false;
120-
}
98+
NestedCodeActions.Add(CodeAction.Create(
99+
title,
100+
createChangedDocument,
101+
EquivalenceKey.Create(descriptor, additionalEquivalenceKey1, additionalEquivalenceKey2)));
121102
}
122103

123-
public bool PrefixFieldIdentifierWithUnderscore => (_configOptions ??= Document.GetConfigOptions(Root.SyntaxTree)).GetPrefixFieldIdentifierWithUnderscore();
104+
public void RegisterNestedCodeActions(string title)
105+
{
106+
if (NestedCodeActions is not null)
107+
UnderlyingContext.RegisterRefactoring(CodeAction.Create(title, NestedCodeActions.ToImmutable(), isInlinable: false));
108+
}
124109

125110
public void ThrowIfCancellationRequested()
126111
{

src/Refactorings/CSharp/Refactorings/SelectedLinesRefactoring.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,19 +54,21 @@ public static async Task ComputeRefactoringsAsync(RefactoringContext context, Sy
5454
{
5555
if (context.IsRefactoringEnabled(RefactoringDescriptors.WrapLinesInRegion))
5656
{
57-
context.RegisterRefactoring(
58-
"Wrap in #region",
57+
context.AddNestedCodeAction(
58+
"#region",
5959
ct => WrapLinesInRegionRefactoring.Instance.RefactorAsync(document, selectedLines, ct),
6060
RefactoringDescriptors.WrapLinesInRegion);
6161
}
6262

6363
if (context.IsRefactoringEnabled(RefactoringDescriptors.WrapLinesInPreprocessorDirective))
6464
{
65-
context.RegisterRefactoring(
66-
"Wrap in #if",
65+
context.AddNestedCodeAction(
66+
"#if",
6767
ct => WrapLinesInPreprocessorDirectiveRefactoring.Instance.RefactorAsync(document, selectedLines, ct),
6868
RefactoringDescriptors.WrapLinesInPreprocessorDirective);
6969
}
70+
71+
context.RegisterNestedCodeActions("Wrap in");
7072
}
7173

7274
if (context.IsRefactoringEnabled(RefactoringDescriptors.RemoveEmptyLines))

src/Refactorings/CSharp/Refactorings/SelectedStatementsRefactoring.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,15 +79,15 @@ public static async Task ComputeRefactoringAsync(RefactoringContext context, Sta
7979

8080
if (context.IsRefactoringEnabled(RefactoringDescriptors.WrapStatementsInCondition))
8181
{
82-
context.RegisterRefactoring(
82+
context.AddNestedCodeAction(
8383
WrapInIfStatementRefactoring.Title,
8484
ct => WrapInIfStatementRefactoring.Instance.RefactorAsync(context.Document, selectedStatements, ct),
8585
RefactoringDescriptors.WrapStatementsInCondition);
8686
}
8787

8888
if (context.IsRefactoringEnabled(RefactoringDescriptors.WrapLinesInTryCatch))
8989
{
90-
context.RegisterRefactoring(
90+
context.AddNestedCodeAction(
9191
WrapLinesInTryCatchRefactoring.Title,
9292
ct => WrapLinesInTryCatchRefactoring.Instance.RefactorAsync(context.Document, selectedStatements, ct),
9393
RefactoringDescriptors.WrapLinesInTryCatch);

src/Refactorings/CSharp/Refactorings/WrapStatements/WrapInIfStatementRefactoring.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ private WrapInIfStatementRefactoring()
1616

1717
public static WrapInIfStatementRefactoring Instance { get; } = new();
1818

19-
public const string Title = "Wrap in condition";
19+
public const string Title = "'if' statement";
2020

2121
public override IfStatementSyntax CreateStatement(ImmutableArray<StatementSyntax> statements)
2222
{

src/Refactorings/CSharp/Refactorings/WrapStatements/WrapLinesInTryCatchRefactoring.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ namespace Roslynator.CSharp.Refactorings.WrapStatements;
99

1010
internal sealed class WrapLinesInTryCatchRefactoring : WrapStatementsRefactoring<TryStatementSyntax>
1111
{
12-
public const string Title = "Wrap in try-catch";
12+
public const string Title = "try-catch";
1313

1414
private WrapLinesInTryCatchRefactoring()
1515
{

0 commit comments

Comments
 (0)