Skip to content

Commit ca8beff

Browse files
authored
Merge pull request #4457 from comintern/quickfixes
Quick quick-fix fixes
2 parents 711c55d + 80dadd4 commit ca8beff

File tree

4 files changed

+290
-25
lines changed

4 files changed

+290
-25
lines changed

Rubberduck.CodeAnalysis/QuickFixes/AccessSheetUsingCodeNameQuickFix.cs

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ public override void Fix(IInspectionResult result)
2727
var rewriter = _state.GetRewriter(referenceResult.QualifiedName);
2828

2929
var setStatement = referenceResult.Context.GetAncestor<VBAParser.SetStmtContext>();
30-
if (setStatement == null)
30+
var isArgument = referenceResult.Context.GetAncestor<VBAParser.ArgumentContext>() != null;
31+
if (setStatement == null || isArgument)
3132
{
3233
// Sheet accessed inline
3334

@@ -49,20 +50,23 @@ public override void Fix(IInspectionResult result)
4950
return moduleBodyElement != null && moduleBodyElement == referenceResult.Context.GetAncestor<VBAParser.ModuleBodyElementContext>();
5051
});
5152

52-
var variableListContext = (VBAParser.VariableListStmtContext)sheetDeclaration.Context.Parent;
53-
if (variableListContext.variableSubStmt().Length == 1)
53+
if (!sheetDeclaration.IsUndeclared)
5454
{
55-
rewriter.Remove(variableListContext.Parent as ParserRuleContext);
56-
}
57-
else if (sheetDeclaration.Context == variableListContext.variableSubStmt().Last())
58-
{
59-
rewriter.Remove(variableListContext.COMMA().Last());
60-
rewriter.Remove(sheetDeclaration);
61-
}
62-
else
63-
{
64-
rewriter.Remove(variableListContext.COMMA().First(comma => comma.Symbol.StartIndex > sheetDeclaration.Context.Start.StartIndex));
65-
rewriter.Remove(sheetDeclaration);
55+
var variableListContext = (VBAParser.VariableListStmtContext)sheetDeclaration.Context.Parent;
56+
if (variableListContext.variableSubStmt().Length == 1)
57+
{
58+
rewriter.Remove(variableListContext.Parent as ParserRuleContext);
59+
}
60+
else if (sheetDeclaration.Context == variableListContext.variableSubStmt().Last())
61+
{
62+
rewriter.Remove(variableListContext.COMMA().Last());
63+
rewriter.Remove(sheetDeclaration);
64+
}
65+
else
66+
{
67+
rewriter.Remove(variableListContext.COMMA().First(comma => comma.Symbol.StartIndex > sheetDeclaration.Context.Start.StartIndex));
68+
rewriter.Remove(sheetDeclaration);
69+
}
6670
}
6771

6872
foreach (var reference in sheetDeclaration.References)

Rubberduck.Refactorings/MoveCloserToUsage/MoveCloserToUsageRefactoring.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using Antlr4.Runtime.Misc;
66
using Rubberduck.Common;
77
using Rubberduck.Interaction;
8+
using Rubberduck.Parsing;
89
using Rubberduck.Parsing.Grammar;
910
using Rubberduck.Parsing.Rewriter;
1011
using Rubberduck.Parsing.Symbols;
@@ -152,7 +153,12 @@ private void UpdateOtherModules()
152153

153154
private void InsertNewDeclaration()
154155
{
155-
var newVariable = $"Dim {_target.IdentifierName} As {_target.AsTypeName}{Environment.NewLine}";
156+
var subscripts = _target.Context.GetDescendent<VBAParser.SubscriptsContext>()?.GetText() ?? string.Empty;
157+
var identifier = _target.IsArray ? $"{_target.IdentifierName}({subscripts})" : _target.IdentifierName;
158+
159+
var newVariable = _target.AsTypeContext is null
160+
? $"{Tokens.Dim} {identifier} {Tokens.As} {Tokens.Variant}{Environment.NewLine}"
161+
: $"{Tokens.Dim} {identifier} {Tokens.As} {(_target.IsSelfAssigned ? Tokens.New + " " : string.Empty)}{_target.AsTypeNameWithoutArrayDesignator}{Environment.NewLine}";
156162

157163
var firstReference = _target.References.OrderBy(r => r.Selection.StartLine).First();
158164

RubberduckTests/QuickFixes/AccessSheetUsingCodeNameQuickFixTests.cs

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,88 @@ Dim ws As Worksheet
276276
}
277277
}
278278

279+
[Test]
280+
[Category("QuickFixes")]
281+
public void SheetAccessedUsingString_QuickFixWorks_TransientReferenceSetStatement()
282+
{
283+
const string inputCode = @"
284+
Sub Test()
285+
Dim ws As Worksheet
286+
Set ws = Worksheets.Add(Worksheets(""Sheet1""))
287+
Debug.Print ws.Name
288+
End Sub";
289+
290+
const string expectedCode = @"
291+
Sub Test()
292+
Dim ws As Worksheet
293+
Set ws = Worksheets.Add(Sheet1)
294+
Debug.Print ws.Name
295+
End Sub";
296+
297+
using (var state = ArrangeParserAndParse(inputCode, out var component))
298+
{
299+
var inspection = new SheetAccessedUsingStringInspection(state);
300+
var inspectionResults = inspection.GetInspectionResults(CancellationToken.None);
301+
302+
new AccessSheetUsingCodeNameQuickFix(state).Fix(inspectionResults.First());
303+
Assert.AreEqual(expectedCode, state.GetRewriter(component).GetText());
304+
}
305+
}
306+
307+
[Test]
308+
[Category("QuickFixes")]
309+
public void SheetAccessedUsingString_QuickFixWorks_TransientReferenceNoSetStatement()
310+
{
311+
const string inputCode = @"
312+
Sub Test()
313+
If Not Worksheets.Add(Worksheets(""Sheet1"")) Is Nothing Then
314+
Debug.Print ""Added""
315+
End If
316+
End Sub";
317+
318+
const string expectedCode = @"
319+
Sub Test()
320+
If Not Worksheets.Add(Sheet1) Is Nothing Then
321+
Debug.Print ""Added""
322+
End If
323+
End Sub";
324+
325+
using (var state = ArrangeParserAndParse(inputCode, out var component))
326+
{
327+
var inspection = new SheetAccessedUsingStringInspection(state);
328+
var inspectionResults = inspection.GetInspectionResults(CancellationToken.None);
329+
330+
new AccessSheetUsingCodeNameQuickFix(state).Fix(inspectionResults.First());
331+
Assert.AreEqual(expectedCode, state.GetRewriter(component).GetText());
332+
}
333+
}
334+
335+
[Test]
336+
[Category("QuickFixes")]
337+
public void SheetAccessedUsingString_QuickFixWorks_ImplicitVariableAssignment()
338+
{
339+
const string inputCode = @"
340+
Sub Test()
341+
Set ws = Worksheets(""Sheet1"")
342+
ws.Name = ""Foo""
343+
End Sub";
344+
345+
const string expectedCode = @"
346+
Sub Test()
347+
348+
Sheet1.Name = ""Foo""
349+
End Sub";
350+
351+
using (var state = ArrangeParserAndParse(inputCode, out var component))
352+
{
353+
var inspection = new SheetAccessedUsingStringInspection(state);
354+
var inspectionResults = inspection.GetInspectionResults(CancellationToken.None);
355+
356+
new AccessSheetUsingCodeNameQuickFix(state).Fix(inspectionResults.First());
357+
Assert.AreEqual(expectedCode, state.GetRewriter(component).GetText());
358+
}
359+
}
360+
279361
private static RubberduckParserState ArrangeParserAndParse(string inputCode, out IVBComponent component)
280362
{
281363
var builder = new MockVbeBuilder();

0 commit comments

Comments
 (0)