Skip to content

Commit 10d173f

Browse files
committed
Add QualifyWithMeQuickFix for ImplicitContainingWorkbook/WorksheetReferenceInspection
It does what the name suggests.
1 parent a5b115e commit 10d173f

File tree

5 files changed

+201
-1
lines changed

5 files changed

+201
-1
lines changed
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
using Rubberduck.CodeAnalysis.Inspections;
2+
using Rubberduck.CodeAnalysis.Inspections.Concrete;
3+
using Rubberduck.CodeAnalysis.QuickFixes.Abstract;
4+
using Rubberduck.Parsing.Grammar;
5+
using Rubberduck.Parsing.Rewriter;
6+
7+
namespace Rubberduck.CodeAnalysis.QuickFixes.Concrete
8+
{
9+
/// <summary>
10+
/// Qualifies an implicit reference with 'Me'.
11+
/// </summary>
12+
/// <inspections>
13+
/// <inspection name="ImplicitContainingWorksheetReferenceInspection" />
14+
/// <inspection name="ImplicitContainingWorkbookReferenceInspection" />
15+
/// </inspections>
16+
/// <canfix multiple="true" procedure="true" module="true" project="true" all="true" />
17+
/// <example>
18+
/// <before>
19+
/// <![CDATA[
20+
/// Private Sub Example()
21+
/// Dim foo As Range
22+
/// Set foo = Range("A1")
23+
/// End Sub
24+
/// ]]>
25+
/// </before>
26+
/// <after>
27+
/// <![CDATA[
28+
/// Private Sub Example()
29+
/// Dim foo As Range
30+
/// Set foo = Me.Range("A1")
31+
/// End Sub
32+
/// ]]>
33+
/// </after>
34+
/// </example>
35+
internal class QualifyWithMeQuickFix : QuickFixBase
36+
{
37+
public QualifyWithMeQuickFix()
38+
: base(typeof(ImplicitContainingWorkbookReferenceInspection),
39+
typeof(ImplicitContainingWorksheetReferenceInspection))
40+
{}
41+
42+
public override void Fix(IInspectionResult result, IRewriteSession rewriteSession)
43+
{
44+
var rewriter = rewriteSession.CheckOutModuleRewriter(result.QualifiedSelection.QualifiedName);
45+
46+
var context = result.Context;
47+
rewriter.InsertBefore(context.Start.TokenIndex, $"{Tokens.Me}.");
48+
}
49+
50+
public override string Description(IInspectionResult result)
51+
{
52+
return Resources.Inspections.QuickFixes.QualifyWithMeQuickFix;
53+
}
54+
55+
public override bool CanFixMultiple => true;
56+
public override bool CanFixInProcedure => true;
57+
public override bool CanFixInModule => true;
58+
public override bool CanFixInProject => true;
59+
public override bool CanFixAll => true;
60+
}
61+
}

Rubberduck.Resources/Inspections/QuickFixes.Designer.cs

Lines changed: 10 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Rubberduck.Resources/Inspections/QuickFixes.de.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,4 +300,7 @@
300300
<data name="IgnoreInModuleQuickFix" xml:space="preserve">
301301
<value>In Modul ignorieren</value>
302302
</data>
303+
<data name="QualifyWithMeQuickFix" xml:space="preserve">
304+
<value>Qualifiziere die Referenz mit 'Me'.</value>
305+
</data>
303306
</root>

Rubberduck.Resources/Inspections/QuickFixes.resx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,4 +300,7 @@
300300
<data name="IgnoreInModuleQuickFix" xml:space="preserve">
301301
<value>Ignore in module</value>
302302
</data>
303+
<data name="QualifyWithMeQuickFix" xml:space="preserve">
304+
<value>Qualify reference with 'Me'.</value>
305+
</data>
303306
</root>
Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
using System.Linq;
2+
using System.Threading;
3+
using NUnit.Framework;
4+
using Rubberduck.CodeAnalysis.Inspections.Concrete;
5+
using Rubberduck.CodeAnalysis.QuickFixes;
6+
using Rubberduck.CodeAnalysis.QuickFixes.Concrete;
7+
using Rubberduck.Parsing.Symbols;
8+
using Rubberduck.Parsing.VBA;
9+
using Rubberduck.VBEditor.SafeComWrappers;
10+
using RubberduckTests.Mocks;
11+
12+
namespace RubberduckTests.QuickFixes
13+
{
14+
[TestFixture]
15+
public class QualifyWithMeQuickFixTests : QuickFixTestBase
16+
{
17+
[Test]
18+
[Category("QuickFixes")]
19+
public void QualifiesImplicitWorkbookReferencesInWorkbooks()
20+
{
21+
const string inputCode =
22+
@"
23+
Sub foo()
24+
Dim sheet As Worksheet
25+
Set sheet = Worksheets(""Sheet1"")
26+
End Sub";
27+
28+
const string expectedCode =
29+
@"
30+
Sub foo()
31+
Dim sheet As Worksheet
32+
Set sheet = Me.Worksheets(""Sheet1"")
33+
End Sub";
34+
35+
var actualCode = ApplyQuickFixToFirstInspectionResultForImplicitWorkbookInspection(inputCode);
36+
Assert.AreEqual(expectedCode, actualCode);
37+
}
38+
39+
private string ApplyQuickFixToFirstInspectionResultForImplicitWorkbookInspection(string inputCode)
40+
{
41+
var inputModule = ("SomeWorkbook", inputCode, ComponentType.Document);
42+
var vbe = MockVbeBuilder.BuildFromModules(inputModule, ReferenceLibrary.Excel).Object;
43+
44+
var (state, rewriteManager) = MockParser.CreateAndParseWithRewritingManager(vbe);
45+
using (state)
46+
{
47+
var documentModule = state.DeclarationFinder.UserDeclarations(DeclarationType.Document)
48+
.OfType<DocumentModuleDeclaration>()
49+
.Single();
50+
documentModule.AddSupertypeName("Workbook");
51+
52+
var inspection = new ImplicitContainingWorkbookReferenceInspection(state);
53+
var inspectionResults = inspection.GetInspectionResults(CancellationToken.None);
54+
55+
var rewriteSession = rewriteManager.CheckOutCodePaneSession();
56+
57+
var quickFix = QuickFix(state);
58+
59+
var resultToFix = inspectionResults.First();
60+
quickFix.Fix(resultToFix, rewriteSession);
61+
62+
var module = state.DeclarationFinder.AllModules.First(qmn => qmn.ComponentName == "SomeWorkbook");
63+
64+
return rewriteSession.CheckOutModuleRewriter(module).GetText();
65+
}
66+
}
67+
68+
[Test]
69+
[Category("QuickFixes")]
70+
public void QualifiesImplicitWorksheetReferencesInWorksheets()
71+
{
72+
const string inputCode =
73+
@"
74+
Private Sub Example()
75+
Dim foo As Range
76+
Set foo = Range(""A1"")
77+
End Sub";
78+
79+
const string expectedCode =
80+
@"
81+
Private Sub Example()
82+
Dim foo As Range
83+
Set foo = Me.Range(""A1"")
84+
End Sub";
85+
86+
var actualCode = ApplyQuickFixToFirstInspectionResultForImplicitWorksheetInspection(inputCode);
87+
Assert.AreEqual(expectedCode, actualCode);
88+
}
89+
90+
private string ApplyQuickFixToFirstInspectionResultForImplicitWorksheetInspection(string inputCode)
91+
{
92+
var inputModule = ("Sheet1", inputCode, ComponentType.Document);
93+
var vbe = MockVbeBuilder.BuildFromModules(inputModule, ReferenceLibrary.Excel).Object;
94+
95+
var (state, rewriteManager) = MockParser.CreateAndParseWithRewritingManager(vbe);
96+
using (state)
97+
{
98+
var documentModule = state.DeclarationFinder.UserDeclarations(DeclarationType.Document)
99+
.OfType<DocumentModuleDeclaration>()
100+
.Single();
101+
documentModule.AddSupertypeName("Worksheet");
102+
103+
var inspection = new ImplicitContainingWorksheetReferenceInspection(state);
104+
var inspectionResults = inspection.GetInspectionResults(CancellationToken.None);
105+
106+
var rewriteSession = rewriteManager.CheckOutCodePaneSession();
107+
108+
var quickFix = QuickFix(state);
109+
110+
var resultToFix = inspectionResults.First();
111+
quickFix.Fix(resultToFix, rewriteSession);
112+
113+
var module = state.DeclarationFinder.AllModules.First(qmn => qmn.ComponentName == "Sheet1");
114+
115+
return rewriteSession.CheckOutModuleRewriter(module).GetText();
116+
}
117+
}
118+
119+
protected override IQuickFix QuickFix(RubberduckParserState state)
120+
{
121+
return new QualifyWithMeQuickFix();
122+
}
123+
}
124+
}

0 commit comments

Comments
 (0)