Skip to content

Commit 1a031e1

Browse files
committed
Extend ExpandDefaultMember to indexed default member access inspections
Specifically, IndexedDefaultMemberAccessInspection and IndexedRecursiveDefaultMemberAccessInspection can be fixed using this quick fix now.
1 parent 159e089 commit 1a031e1

File tree

3 files changed

+263
-1
lines changed

3 files changed

+263
-1
lines changed

Rubberduck.CodeAnalysis/QuickFixes/ExpandDefaultMemberQuickFix.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class ExpandDefaultMemberQuickFix : QuickFixBase
1515
private readonly IDeclarationFinderProvider _declarationFinderProvider;
1616

1717
public ExpandDefaultMemberQuickFix(IDeclarationFinderProvider declarationFinderProvider)
18-
: base(typeof(ObjectWhereProcedureIsRequiredInspection))
18+
: base(typeof(ObjectWhereProcedureIsRequiredInspection), typeof(IndexedDefaultMemberAccessInspection), typeof(IndexedRecursiveDefaultMemberAccessInspection))
1919
{
2020
_declarationFinderProvider = declarationFinderProvider;
2121
}

RubberduckTests/QuickFixes/ExpandDefaultMemberQuickFixTests.cs

Lines changed: 248 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,254 @@ End Function
172172
Assert.AreEqual(expectedModuleCode, actualModuleCode);
173173
}
174174

175+
[Test]
176+
[Category("QuickFixes")]
177+
public void OrdinaryIndexedDefaultMemberAccessExpression_QuickFixWorks()
178+
{
179+
var class1Code = @"
180+
Public Function Foo(bar As String) As Class2
181+
Attribute Foo.VB_UserMemId = 0
182+
End Function
183+
";
184+
185+
var class2Code = @"
186+
Public Function Baz(bar As String) As Class2
187+
Attribute Baz.VB_UserMemId = 0
188+
End Function
189+
";
190+
191+
var moduleCode = @"
192+
Private Function Foo() As Class2
193+
Dim cls As New Class1
194+
Set Foo = cls(""newClassObject"")
195+
End Function
196+
";
197+
198+
var expectedModuleCode = @"
199+
Private Function Foo() As Class2
200+
Dim cls As New Class1
201+
Set Foo = cls.Foo(""newClassObject"")
202+
End Function
203+
";
204+
205+
var vbe = MockVbeBuilder.BuildFromModules(
206+
("Class1", class1Code, ComponentType.ClassModule),
207+
("Class2", class2Code, ComponentType.ClassModule),
208+
("Module1", moduleCode, ComponentType.StandardModule));
209+
210+
var actualModuleCode = ApplyQuickFixToAllInspectionResults(vbe.Object, "Module1", state => new IndexedDefaultMemberAccessInspection(state), CodeKind.AttributesCode);
211+
Assert.AreEqual(expectedModuleCode, actualModuleCode);
212+
}
213+
214+
[Test]
215+
[Category("QuickFixes")]
216+
public void RecursiveIndexedDefaultMemberAccessExpression_QuickFixWorks()
217+
{
218+
var class1Code = @"
219+
Public Function Foo() As Class2
220+
Attribute Foo.VB_UserMemId = 0
221+
End Function
222+
";
223+
224+
var class2Code = @"
225+
Public Function Baz(bar As String) As Class2
226+
Attribute Baz.VB_UserMemId = 0
227+
End Function
228+
";
229+
230+
var moduleCode = @"
231+
Private Function Foo() As Class2
232+
Dim cls As New Class1
233+
Set Foo = cls(""newClassObject"")
234+
End Function
235+
";
236+
237+
var expectedModuleCode = @"
238+
Private Function Foo() As Class2
239+
Dim cls As New Class1
240+
Set Foo = cls.Foo().Baz(""newClassObject"")
241+
End Function
242+
";
243+
244+
var vbe = MockVbeBuilder.BuildFromModules(
245+
("Class1", class1Code, ComponentType.ClassModule),
246+
("Class2", class2Code, ComponentType.ClassModule),
247+
("Module1", moduleCode, ComponentType.StandardModule));
248+
249+
var actualModuleCode = ApplyQuickFixToAllInspectionResults(vbe.Object, "Module1", state => new IndexedRecursiveDefaultMemberAccessInspection(state), CodeKind.AttributesCode);
250+
Assert.AreEqual(expectedModuleCode, actualModuleCode);
251+
}
252+
253+
[Test]
254+
[Category("QuickFixes")]
255+
public void DoubleOrdinaryIndexedDefaultMemberAccessExpression_QuickFixWorks()
256+
{
257+
var class1Code = @"
258+
Public Function Foo(bar As String) As Class2
259+
Attribute Foo.VB_UserMemId = 0
260+
End Function
261+
";
262+
263+
var class2Code = @"
264+
Public Function Baz(bar As String) As Class2
265+
Attribute Baz.VB_UserMemId = 0
266+
End Function
267+
";
268+
269+
var moduleCode = @"
270+
Private Function Foo() As Class2
271+
Dim cls As New Class1
272+
Set Foo = cls(""newClassObject"")(""whatever"")
273+
End Function
274+
";
275+
276+
var expectedModuleCode = @"
277+
Private Function Foo() As Class2
278+
Dim cls As New Class1
279+
Set Foo = cls.Foo(""newClassObject"").Baz(""whatever"")
280+
End Function
281+
";
282+
283+
var vbe = MockVbeBuilder.BuildFromModules(
284+
("Class1", class1Code, ComponentType.ClassModule),
285+
("Class2", class2Code, ComponentType.ClassModule),
286+
("Module1", moduleCode, ComponentType.StandardModule));
287+
288+
var actualModuleCode = ApplyQuickFixToAllInspectionResults(vbe.Object, "Module1", state => new IndexedDefaultMemberAccessInspection(state), CodeKind.AttributesCode);
289+
Assert.AreEqual(expectedModuleCode, actualModuleCode);
290+
}
291+
292+
[Test]
293+
[Category("Inspections")]
294+
public void DoubleRecursiveIndexedDefaultMemberAccessExpression_QuickFixWorks()
295+
{
296+
var class1Code = @"
297+
Public Function Foo() As Class2
298+
Attribute Foo.VB_UserMemId = 0
299+
End Function
300+
";
301+
302+
var class2Code = @"
303+
Public Function Baz(bar As String) As Class1
304+
Attribute Baz.VB_UserMemId = 0
305+
End Function
306+
";
307+
308+
var moduleCode = @"
309+
Private Function Foo() As Class2
310+
Dim cls As New Class1
311+
Set Foo = cls(""newClassObject"")(""whatever"")
312+
End Function
313+
";
314+
315+
var expectedModuleCode = @"
316+
Private Function Foo() As Class2
317+
Dim cls As New Class1
318+
Set Foo = cls.Foo().Baz(""newClassObject"").Foo().Baz(""whatever"")
319+
End Function
320+
";
321+
322+
var vbe = MockVbeBuilder.BuildFromModules(
323+
("Class1", class1Code, ComponentType.ClassModule),
324+
("Class2", class2Code, ComponentType.ClassModule),
325+
("Module1", moduleCode, ComponentType.StandardModule));
326+
327+
var actualModuleCode = ApplyQuickFixToAllInspectionResults(vbe.Object, "Module1", state => new IndexedRecursiveDefaultMemberAccessInspection(state), CodeKind.AttributesCode);
328+
Assert.AreEqual(expectedModuleCode, actualModuleCode);
329+
}
330+
331+
[Test]
332+
[Category("QuickFixes")]
333+
public void OrdinaryIndexedDefaultMemberAccessOnDefaultMemberArrayAccess_QuickFixWorks()
334+
{
335+
var class1Code = @"
336+
Public Function Foo() As Class2()
337+
Attribute Foo.VB_UserMemId = 0
338+
End Function
339+
";
340+
341+
var class2Code = @"
342+
Public Function Baz(bar As String) As Class2
343+
Attribute Baz.VB_UserMemId = 0
344+
End Function
345+
";
346+
347+
var class3Code = @"
348+
Public Function Baz() As Class2
349+
Attribute Baz.VB_UserMemId = 0
350+
End Function
351+
";
352+
353+
var moduleCode = @"
354+
Private Function Foo() As Class2
355+
Dim cls As New Class1
356+
Set Foo = cls(0)(""newClassObject"")
357+
End Function
358+
";
359+
360+
var expectedModuleCode = @"
361+
Private Function Foo() As Class2
362+
Dim cls As New Class1
363+
Set Foo = cls(0).Baz(""newClassObject"")
364+
End Function
365+
";
366+
367+
var vbe = MockVbeBuilder.BuildFromModules(
368+
("Class1", class1Code, ComponentType.ClassModule),
369+
("Class2", class2Code, ComponentType.ClassModule),
370+
("Class3", class3Code, ComponentType.ClassModule),
371+
("Module1", moduleCode, ComponentType.StandardModule));
372+
373+
var actualModuleCode = ApplyQuickFixToAllInspectionResults(vbe.Object, "Module1", state => new IndexedDefaultMemberAccessInspection(state), CodeKind.AttributesCode);
374+
Assert.AreEqual(expectedModuleCode, actualModuleCode);
375+
}
376+
377+
[Test]
378+
[Category("Inspections")]
379+
public void RecursiveIndexedDefaultMemberAccessOnDefaultMemberArrayAccess_QuickFixWorks()
380+
{
381+
var class1Code = @"
382+
Public Function Foo() As Class3()
383+
Attribute Foo.VB_UserMemId = 0
384+
End Function
385+
";
386+
387+
var class2Code = @"
388+
Public Function Baz(bar As String) As Class2
389+
Attribute Baz.VB_UserMemId = 0
390+
End Function
391+
";
392+
393+
var class3Code = @"
394+
Public Function Bar() As Class2
395+
Attribute Bar.VB_UserMemId = 0
396+
End Function
397+
";
398+
399+
var moduleCode = @"
400+
Private Function Foo() As Class2
401+
Dim cls As New Class1
402+
Set Foo = cls(0)(""newClassObject"")
403+
End Function
404+
";
405+
406+
var expectedModuleCode = @"
407+
Private Function Foo() As Class2
408+
Dim cls As New Class1
409+
Set Foo = cls(0).Bar().Baz(""newClassObject"")
410+
End Function
411+
";
412+
413+
var vbe = MockVbeBuilder.BuildFromModules(
414+
("Class1", class1Code, ComponentType.ClassModule),
415+
("Class2", class2Code, ComponentType.ClassModule),
416+
("Class3", class3Code, ComponentType.ClassModule),
417+
("Module1", moduleCode, ComponentType.StandardModule));
418+
419+
var actualModuleCode = ApplyQuickFixToAllInspectionResults(vbe.Object, "Module1", state => new IndexedRecursiveDefaultMemberAccessInspection(state), CodeKind.AttributesCode);
420+
Assert.AreEqual(expectedModuleCode, actualModuleCode);
421+
}
422+
175423
protected override IQuickFix QuickFix(RubberduckParserState state)
176424
{
177425
return new ExpandDefaultMemberQuickFix(state);

RubberduckTests/QuickFixes/QuickFixTestBase.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,20 @@ private void ApplyToFirstResult(IQuickFix quickFix, IEnumerable<IInspectionResul
105105
quickFix.Fix(resultToFix, rewriteSession);
106106
}
107107

108+
protected string ApplyQuickFixToAllInspectionResults(
109+
IVBE vbe,
110+
string componentName,
111+
Func<RubberduckParserState, IInspection> inspectionFactory,
112+
CodeKind codeKind = CodeKind.CodePaneCode)
113+
{
114+
return ApplyQuickFixToAppropriateInspectionResults(
115+
vbe,
116+
componentName,
117+
inspectionFactory,
118+
ApplyToAllResults,
119+
codeKind);
120+
}
121+
108122
protected string ApplyQuickFixToAllInspectionResults(string inputCode,
109123
Func<RubberduckParserState, IInspection> inspectionFactory,
110124
CodeKind codeKind = CodeKind.CodePaneCode)

0 commit comments

Comments
 (0)