Skip to content

Commit e5c3cda

Browse files
committed
Fix reorder params signature bugs.
1 parent cb279a5 commit e5c3cda

File tree

2 files changed

+65
-23
lines changed

2 files changed

+65
-23
lines changed

RetailCoder.VBE/Refactorings/ReorderParameters/ReorderParametersRefactoring.cs

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -244,34 +244,33 @@ private void AdjustSignatures(Declaration declaration)
244244

245245
private void RewriteSignature(Declaration target, VBAParser.ArgListContext paramList, CodeModule module)
246246
{
247-
var argList = paramList.arg();
247+
var parameters = paramList.arg().Select((s, i) => new {Index = i, Text = s.GetText()}).ToList();
248248

249-
var newContent = GetOldSignature(target);
250-
var lineNum = paramList.GetSelection().LineCount;
251-
252-
var parameterIndex = 0;
253-
var currentStringIndex = 0;
254-
255-
for (var i = parameterIndex; i < _model.Parameters.Count; i++)
249+
var reorderedParams = new List<string>();
250+
foreach (var param in _model.Parameters)
256251
{
257-
var oldParam = argList.ElementAt(parameterIndex).GetText();
258-
var newParam = argList.ElementAt(_model.Parameters.ElementAt(parameterIndex).Index).GetText();
259-
var parameterStringIndex = newContent.IndexOf(oldParam, currentStringIndex, StringComparison.Ordinal);
260-
261-
if (parameterStringIndex > -1)
252+
var parameterAtIndex = parameters.SingleOrDefault(s => s.Index == param.Index);
253+
if (parameterAtIndex != null)
262254
{
263-
var beginningSub = newContent.Substring(0, parameterStringIndex);
264-
var replaceSub = newContent.Substring(parameterStringIndex).Replace(oldParam, newParam);
265-
266-
newContent = beginningSub + replaceSub;
267-
268-
parameterIndex++;
269-
currentStringIndex = beginningSub.Length + newParam.Length;
255+
reorderedParams.Add(parameterAtIndex.Text);
270256
}
271257
}
272258

273-
module.ReplaceLine(paramList.Start.Line, newContent.Replace(" _" + Environment.NewLine, string.Empty));
274-
module.DeleteLines(paramList.Start.Line + 1, lineNum - 1);
259+
// property let/set and paramarrays
260+
for (var index = reorderedParams.Count; index < parameters.Count; index++)
261+
{
262+
reorderedParams.Add(parameters[index].Text);
263+
}
264+
265+
var signature = GetOldSignature(target);
266+
signature = signature.Remove(signature.IndexOf('('));
267+
268+
var asTypeText = target.AsTypeContext == null ? string.Empty : " " + target.AsTypeContext.GetText();
269+
signature += '(' + string.Join(", ", reorderedParams) + ")" + (asTypeText == " " ? string.Empty : asTypeText);
270+
271+
var lineCount = paramList.GetSelection().LineCount;
272+
module.ReplaceLine(paramList.Start.Line, signature.Replace(" _" + Environment.NewLine, string.Empty));
273+
module.DeleteLines(paramList.Start.Line + 1, lineCount - 1);
275274
}
276275

277276
private string GetOldSignature(Declaration target)

RubberduckTests/Refactoring/ReorderParametersTests.cs

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,49 @@ public void ReorderParams_SwapPositions()
6565
Assert.AreEqual(expectedCode, module.Lines());
6666
}
6767

68+
[TestMethod]
69+
public void ReorderParams_SwapPositions_SignatureContainsParamName()
70+
{
71+
//Input
72+
const string inputCode =
73+
@"Private Sub Foo(a, ba)
74+
End Sub";
75+
var selection = new Selection(1, 16, 1, 16);
76+
77+
//Expectation
78+
const string expectedCode =
79+
@"Private Sub Foo(ba, a)
80+
End Sub";
81+
82+
//Arrange
83+
var builder = new MockVbeBuilder();
84+
VBComponent component;
85+
var vbe = builder.BuildFromSingleStandardModule(inputCode, out component, selection);
86+
var project = vbe.Object.VBProjects.Item(0);
87+
var module = project.VBComponents.Item(0).CodeModule;
88+
var mockHost = new Mock<IHostApplication>();
89+
mockHost.SetupAllProperties();
90+
var parser = MockParser.Create(vbe.Object, new RubberduckParserState(new Mock<ISinks>().Object));
91+
92+
parser.Parse(new CancellationTokenSource());
93+
if (parser.State.Status >= ParserState.Error) { Assert.Inconclusive("Parser Error"); }
94+
95+
var qualifiedSelection = new QualifiedSelection(new QualifiedModuleName(component), selection);
96+
97+
//set up model
98+
var model = new ReorderParametersModel(parser.State, qualifiedSelection, null);
99+
model.Parameters.Reverse();
100+
101+
var factory = SetupFactory(model);
102+
103+
//act
104+
var refactoring = new ReorderParametersRefactoring(vbe.Object, factory.Object, null);
105+
refactoring.Refactor(qualifiedSelection);
106+
107+
//assert
108+
Assert.AreEqual(expectedCode, module.Lines());
109+
}
110+
68111
[TestMethod]
69112
public void ReorderParams_RefactorDeclaration()
70113
{
@@ -634,7 +677,7 @@ public void ReorderParametersRefactoring_SignatureOnMultipleLines()
634677

635678
//Expectation
636679
const string expectedCode =
637-
@"Private Sub Foo(ByVal arg3 As Date, ByVal arg2 As String, ByVal arg1 As Integer)
680+
@"Private Sub Foo(ByVal arg3 As Date, ByVal arg2 As String, ByVal arg1 As Integer)
638681
End Sub"; // note: IDE removes excess spaces
639682

640683
//Arrange

0 commit comments

Comments
 (0)