Skip to content

Commit 0787e31

Browse files
authored
Merge pull request #5734 from BZngr/5719_RemoveUnusedDeclarationQF_Formatting
Introduce DeleteDeclarationsRefactoringAction replacing IModuleRewritingExtensions.cs
2 parents 5a0ac77 + c106c80 commit 0787e31

File tree

67 files changed

+8444
-458
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+8444
-458
lines changed

Rubberduck.CodeAnalysis/QuickFixes/Abstract/QuickFixBase.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,22 @@ public void RemoveInspections(params Type[] inspections)
5555
public virtual CodeKind TargetCodeKind => CodeKind.CodePaneCode;
5656

5757
public abstract void Fix(IInspectionResult result, IRewriteSession rewriteSession);
58+
59+
/// <summary>
60+
/// FixMany defers the enumeration of inspection results to the QuickFix
61+
/// </summary>
62+
/// <remarks>
63+
/// The default implementation enumerates the results collection calling Fix() for each result.
64+
/// Override this funcion when a QuickFix needs operate on results as a group (e.g., RemoveUnusedDeclarationQuickFix)
65+
/// </remarks>
66+
public virtual void Fix(IReadOnlyCollection<IInspectionResult> results, IRewriteSession rewriteSession)
67+
{
68+
foreach (var result in results)
69+
{
70+
Fix(result, rewriteSession);
71+
}
72+
}
73+
5874
public abstract string Description(IInspectionResult result);
5975

6076
public abstract bool CanFixMultiple { get; }

Rubberduck.CodeAnalysis/QuickFixes/Concrete/RemoveUnassignedIdentifierQuickFix.cs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
using Rubberduck.CodeAnalysis.Inspections.Concrete;
33
using Rubberduck.CodeAnalysis.QuickFixes.Abstract;
44
using Rubberduck.Parsing.Rewriter;
5+
using Rubberduck.Refactorings;
6+
using Rubberduck.Refactorings.DeleteDeclarations;
7+
using System.Collections.Generic;
8+
using System.Linq;
59

610
namespace Rubberduck.CodeAnalysis.QuickFixes.Concrete
711
{
@@ -35,14 +39,25 @@ namespace Rubberduck.CodeAnalysis.QuickFixes.Concrete
3539
/// </example>
3640
internal sealed class RemoveUnassignedIdentifierQuickFix : QuickFixBase
3741
{
38-
public RemoveUnassignedIdentifierQuickFix()
42+
private readonly ICodeOnlyRefactoringAction<DeleteDeclarationsModel> _refactoring;
43+
public RemoveUnassignedIdentifierQuickFix(DeleteDeclarationsRefactoringAction refactoringAction)
3944
: base(typeof(VariableNotAssignedInspection))
40-
{}
45+
{
46+
_refactoring = refactoringAction;
47+
}
4148

4249
public override void Fix(IInspectionResult result, IRewriteSession rewriteSession)
4350
{
44-
var rewriter = rewriteSession.CheckOutModuleRewriter(result.Target.QualifiedModuleName);
45-
rewriter.Remove(result.Target);
51+
var model = new DeleteDeclarationsModel(result.Target);
52+
53+
_refactoring.Refactor(model, rewriteSession);
54+
}
55+
56+
public override void Fix(IReadOnlyCollection<IInspectionResult> results, IRewriteSession rewriteSession)
57+
{
58+
var model = new DeleteDeclarationsModel(results.Select(r => r.Target));
59+
60+
_refactoring.Refactor(model, rewriteSession);
4661
}
4762

4863
public override string Description(IInspectionResult result) => Resources.Inspections.QuickFixes.RemoveUnassignedIdentifierQuickFix;

Rubberduck.CodeAnalysis/QuickFixes/Concrete/RemoveUnusedDeclarationQuickFix.cs

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22
using Rubberduck.CodeAnalysis.Inspections.Concrete;
33
using Rubberduck.CodeAnalysis.QuickFixes.Abstract;
44
using Rubberduck.Parsing.Rewriter;
5+
using Rubberduck.Parsing.Symbols;
6+
using Rubberduck.Refactorings;
7+
using Rubberduck.Refactorings.Common;
8+
using Rubberduck.Refactorings.DeleteDeclarations;
9+
using System.Collections.Generic;
10+
using System.Linq;
511

612
namespace Rubberduck.CodeAnalysis.QuickFixes.Concrete
713
{
@@ -31,25 +37,36 @@ namespace Rubberduck.CodeAnalysis.QuickFixes.Concrete
3137
/// Option Explicit
3238
///
3339
/// Public Sub DoSomething()
34-
///
3540
/// Debug.Print 42
3641
/// End Sub
3742
/// ]]>
3843
/// </after>
3944
/// </example>
4045
internal sealed class RemoveUnusedDeclarationQuickFix : QuickFixBase
4146
{
42-
public RemoveUnusedDeclarationQuickFix()
47+
private readonly ICodeOnlyRefactoringAction<DeleteDeclarationsModel> _refactoring;
48+
49+
public RemoveUnusedDeclarationQuickFix(DeleteDeclarationsRefactoringAction refactoringAction)
4350
: base(typeof(ConstantNotUsedInspection),
4451
typeof(ProcedureNotUsedInspection),
4552
typeof(VariableNotUsedInspection),
4653
typeof(LineLabelNotUsedInspection))
47-
{}
54+
{
55+
_refactoring = refactoringAction;
56+
}
4857

4958
public override void Fix(IInspectionResult result, IRewriteSession rewriteSession)
5059
{
51-
var rewriter = rewriteSession.CheckOutModuleRewriter(result.Target.QualifiedModuleName);
52-
rewriter.Remove(result.Target);
60+
var model = new DeleteDeclarationsModel(result.Target);
61+
62+
_refactoring.Refactor(model, rewriteSession);
63+
}
64+
65+
public override void Fix(IReadOnlyCollection<IInspectionResult> results, IRewriteSession rewriteSession)
66+
{
67+
var model = new DeleteDeclarationsModel(results.Select(r => r.Target));
68+
69+
_refactoring.Refactor(model, rewriteSession);
5370
}
5471

5572
public override string Description(IInspectionResult result) => Resources.Inspections.QuickFixes.RemoveUnusedDeclarationQuickFix;

Rubberduck.CodeAnalysis/QuickFixes/IQuickFix.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ namespace Rubberduck.CodeAnalysis.QuickFixes
99
public interface IQuickFix
1010
{
1111
void Fix(IInspectionResult result, IRewriteSession rewriteSession);
12+
void Fix(IReadOnlyCollection<IInspectionResult> results, IRewriteSession rewriteSession);
1213
string Description(IInspectionResult result);
1314

1415
bool CanFixMultiple { get; }

Rubberduck.CodeAnalysis/QuickFixes/Logistics/QuickFixProvider.cs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -59,17 +59,17 @@ public bool CanFix(IQuickFix fix, IInspectionResult result)
5959
&& !result.DisabledQuickFixes.Contains(fix.GetType().Name);
6060
}
6161

62-
public void Fix(IQuickFix fix, IInspectionResult result)
62+
public void Fix(IQuickFix quickFix, IInspectionResult result)
6363
{
64-
if (!CanFix(fix, result))
64+
if (!CanFix(quickFix, result))
6565
{
6666
return;
6767
}
6868

69-
var rewriteSession = RewriteSession(fix.TargetCodeKind);
69+
var rewriteSession = RewriteSession(quickFix.TargetCodeKind);
7070
try
7171
{
72-
fix.Fix(result, rewriteSession);
72+
quickFix.Fix(result, rewriteSession);
7373
}
7474
catch (RewriteFailedException)
7575
{
@@ -78,24 +78,24 @@ public void Fix(IQuickFix fix, IInspectionResult result)
7878
Apply(rewriteSession);
7979
}
8080

81-
public void Fix(IQuickFix fix, IEnumerable<IInspectionResult> resultsToFix)
81+
public void Fix(IQuickFix quickFix, IEnumerable<IInspectionResult> resultsToFix)
8282
{
83-
var results = resultsToFix.ToList();
83+
var fixableResults = resultsToFix.Where(r => CanFix(quickFix, r)).ToList();
8484

85-
if (!results.Any())
85+
if (!fixableResults.Any())
8686
{
8787
return;
8888
}
8989

90-
var rewriteSession = RewriteSession(fix.TargetCodeKind);
91-
foreach (var result in results)
92-
{
93-
if (!CanFix(fix, result))
94-
{
95-
continue;
96-
}
90+
var rewriteSession = RewriteSession(quickFix.TargetCodeKind);
9791

98-
fix.Fix(result, rewriteSession);
92+
try
93+
{
94+
quickFix.Fix(fixableResults, rewriteSession);
95+
}
96+
catch (RewriteFailedException)
97+
{
98+
_failureNotifier.NotifyQuickFixExecutionFailure(rewriteSession.Status);
9999
}
100100
Apply(rewriteSession);
101101
}

Rubberduck.Main/Root/RubberduckIoCInstaller.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,8 @@ private void RegisterSpecialFactories(IWindsorContainer container)
394394
RegisterUnreachableCaseFactories(container);
395395

396396
RegisterEncapsulateFieldRefactoringFactories(container);
397+
398+
RegisterDeleteDeclarationsRefactoringActionFactories(container);
397399
}
398400

399401
private void RegisterUnreachableCaseFactories(IWindsorContainer container)
@@ -422,6 +424,22 @@ private void RegisterEncapsulateFieldRefactoringFactories(IWindsorContainer cont
422424
.LifestyleSingleton());
423425
}
424426

427+
private void RegisterDeleteDeclarationsRefactoringActionFactories(IWindsorContainer container)
428+
{
429+
container.Kernel.Register(Component.For<IDeclarationDeletionTargetFactory>()
430+
.ImplementedBy<DeclarationDeletionTargetFactory>());
431+
432+
container.Kernel.Register(
433+
Component.For<IDeclarationDeletionGroup>()
434+
.ImplementedBy<DeclarationDeletionGroup>().LifestyleTransient(),
435+
Component.For<IDeclarationDeletionGroupFactory>().AsFactory().LifestyleSingleton());
436+
437+
container.Kernel.Register(
438+
Component.For<IDeclarationDeletionGroupsGenerator>()
439+
.ImplementedBy<DeletionGroupsGenerator>().LifestyleTransient(),
440+
Component.For<IDeclarationDeletionGroupsGeneratorFactory>().AsFactory().LifestyleSingleton());
441+
}
442+
425443
private void RegisterQuickFixes(IWindsorContainer container, Assembly[] assembliesToRegister)
426444
{
427445
foreach (var assembly in assembliesToRegister)

Rubberduck.Refactorings/Common/IModuleRewriterExtensions.cs

Lines changed: 0 additions & 108 deletions
This file was deleted.

0 commit comments

Comments
 (0)