Skip to content

Commit 1847ab1

Browse files
authored
Merge pull request #2146 from Hosch250/Issue2135
Adjust tab orders for refactoring dialogs. Fix severe bugs in Remove Parameters refactoring
2 parents 6230fa4 + cb279a5 commit 1847ab1

15 files changed

+526
-280
lines changed

RetailCoder.VBE/Refactorings/RemoveParameters/RemoveParametersRefactoring.cs

Lines changed: 52 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Linq;
4+
using Antlr4.Runtime;
45
using Antlr4.Runtime.Misc;
56
using Microsoft.Vbe.Interop;
67
using Rubberduck.Common;
@@ -96,22 +97,31 @@ private void AdjustReferences(IEnumerable<IdentifierReference> references, Decla
9697
{
9798
foreach (var reference in references.Where(item => item.Context != method.Context))
9899
{
99-
var proc = (dynamic)reference.Context;
100100
var module = reference.QualifiedModuleName.Component.CodeModule;
101101
VBAParser.ArgumentListContext argumentList = null;
102102
var callStmt = ParserRuleContextHelper.GetParent<VBAParser.CallStmtContext>(reference.Context);
103103
if (callStmt != null)
104104
{
105105
argumentList = CallStatement.GetArgumentList(callStmt);
106106
}
107+
108+
if (argumentList == null)
109+
{
110+
var indexExpression = ParserRuleContextHelper.GetParent<VBAParser.IndexExprContext>(reference.Context);
111+
if (indexExpression != null)
112+
{
113+
argumentList = ParserRuleContextHelper.GetChild<VBAParser.ArgumentListContext>(indexExpression);
114+
}
115+
}
116+
107117
if (argumentList == null) { continue; }
108118
RemoveCallParameter(argumentList, module);
109119
}
110120
}
111121

112122
private void RemoveCallParameter(VBAParser.ArgumentListContext paramList, CodeModule module)
113123
{
114-
List<string> paramNames = new List<string>();
124+
var paramNames = new List<string>();
115125
if (paramList.positionalOrNamedArgumentList().positionalArgumentOrMissing() != null)
116126
{
117127
paramNames.AddRange(paramList.positionalOrNamedArgumentList().positionalArgumentOrMissing().Select(p =>
@@ -120,10 +130,8 @@ private void RemoveCallParameter(VBAParser.ArgumentListContext paramList, CodeMo
120130
{
121131
return ((VBAParser.SpecifiedPositionalArgumentContext)p).positionalArgument().GetText();
122132
}
123-
else
124-
{
125-
return string.Empty;
126-
}
133+
134+
return string.Empty;
127135
}).ToList());
128136
}
129137
if (paramList.positionalOrNamedArgumentList().namedArgumentList() != null)
@@ -136,48 +144,46 @@ private void RemoveCallParameter(VBAParser.ArgumentListContext paramList, CodeMo
136144
}
137145
var lineCount = paramList.Stop.Line - paramList.Start.Line + 1; // adjust for total line count
138146

139-
var newContent = module.Lines[paramList.Start.Line, lineCount].Replace(" _" + Environment.NewLine, string.Empty).RemoveExtraSpacesLeavingIndentation();
140-
var currentStringIndex = 0;
147+
var newContent = module.Lines[paramList.Start.Line, lineCount];
148+
newContent = newContent.Remove(paramList.Start.Column, paramList.GetText().Length);
141149

142-
foreach (
143-
var param in
144-
_model.Parameters.Where(item => item.IsRemoved && item.Index < paramNames.Count)
145-
.Select(item => item.Declaration))
150+
var savedParamNames = paramNames;
151+
for (var index = _model.Parameters.Count - 1; index >= 0; index--)
146152
{
147-
var paramIndex = _model.Parameters.FindIndex(item => item.Declaration.Context.GetText() == param.Context.GetText());
148-
if (paramIndex >= paramNames.Count) { return; }
149-
150-
do
153+
var param = _model.Parameters[index];
154+
if (!param.IsRemoved)
151155
{
152-
var paramToRemoveName = paramNames.ElementAt(0).Contains(":=")
153-
? paramNames.Find(item => item.Contains(param.IdentifierName + ":="))
154-
: paramNames.ElementAt(paramIndex);
156+
continue;
157+
}
155158

156-
if (paramToRemoveName == null || !newContent.Contains(paramToRemoveName))
159+
if (param.Name.Contains("ParamArray"))
160+
{
161+
// handle param arrays
162+
while (savedParamNames.Count > index)
157163
{
158-
continue;
164+
savedParamNames.RemoveAt(index);
159165
}
160-
161-
var valueToRemove = paramToRemoveName != paramNames.Last()
162-
? paramToRemoveName + ","
163-
: paramToRemoveName;
164-
165-
var parameterStringIndex = newContent.IndexOf(valueToRemove, currentStringIndex, StringComparison.Ordinal);
166-
if (parameterStringIndex <= -1) { continue; }
167-
168-
newContent = newContent.Remove(parameterStringIndex, valueToRemove.Length);
169-
170-
currentStringIndex = parameterStringIndex;
171-
172-
if (paramToRemoveName == paramNames.Last() && newContent.LastIndexOf(',') != -1)
166+
}
167+
else
168+
{
169+
if (index < savedParamNames.Count && !savedParamNames[index].StripStringLiterals().Contains(":="))
170+
{
171+
savedParamNames.RemoveAt(index);
172+
}
173+
else
173174
{
174-
newContent = newContent.Remove(newContent.LastIndexOf(','), 1);
175+
var paramIndex = savedParamNames.FindIndex(s => s.StartsWith(param.Declaration.IdentifierName + ":="));
176+
if (paramIndex != -1 && paramIndex < savedParamNames.Count)
177+
{
178+
savedParamNames.RemoveAt(paramIndex);
179+
}
175180
}
176-
} while (paramIndex >= _model.Parameters.Count - 1 && ++paramIndex < paramNames.Count &&
177-
newContent.Contains(paramNames.ElementAt(paramIndex)));
181+
}
178182
}
179183

180-
module.ReplaceLine(paramList.Start.Line, newContent);
184+
newContent = newContent.Insert(paramList.Start.Column, string.Join(", ", savedParamNames));
185+
186+
module.ReplaceLine(paramList.Start.Line, newContent.Replace(" _" + Environment.NewLine, string.Empty));
181187
module.DeleteLines(paramList.Start.Line + 1, lineCount - 1);
182188
}
183189

@@ -251,26 +257,6 @@ private string GetOldSignature(Declaration target)
251257
return rewriter.GetText(new Interval(firstTokenIndex, lastTokenIndex));
252258
}
253259

254-
private string ReplaceCommas(string signature, int indexParamRemoved)
255-
{
256-
if (signature.Count(c => c == ',') > indexParamRemoved) { indexParamRemoved++; }
257-
258-
for (int i = 0, commaCounter = 0; i < signature.Length && indexParamRemoved != 0; i++)
259-
{
260-
if (signature.ElementAt(i) == ',')
261-
{
262-
commaCounter++;
263-
}
264-
265-
if (commaCounter == indexParamRemoved)
266-
{
267-
return signature.Remove(i, 1);
268-
}
269-
}
270-
271-
return signature;
272-
}
273-
274260
private void AdjustSignatures()
275261
{
276262
var proc = (dynamic)_model.TargetDeclaration.Context;
@@ -345,25 +331,17 @@ private void AdjustSignatures(Declaration declaration)
345331

346332
private void RemoveSignatureParameters(Declaration target, VBAParser.ArgListContext paramList, CodeModule module)
347333
{
348-
var paramNames = paramList.arg();
349-
350-
var paramsRemoved = _model.Parameters.Where(item => item.IsRemoved).ToList();
334+
// property set/let have one more parameter than is listed in the getter parameters
335+
var nonRemovedParamNames = paramList.arg().Where((a, s) => s >= _model.Parameters.Count || !_model.Parameters[s].IsRemoved).Select(s => s.GetText());
351336
var signature = GetOldSignature(target);
337+
signature = signature.Remove(signature.IndexOf('('));
338+
339+
var asTypeText = target.AsTypeContext == null ? string.Empty : " " + target.AsTypeContext.GetText();
340+
signature += '(' + string.Join(", ", nonRemovedParamNames) + ")" + (asTypeText == " " ? string.Empty : asTypeText);
352341

353-
foreach (var param in paramsRemoved)
354-
{
355-
try
356-
{
357-
signature = ReplaceCommas(signature.Replace(paramNames.ElementAt(param.Index).GetText(), string.Empty), _model.Parameters.FindIndex(item => item == param) - paramsRemoved.FindIndex(item => item == param));
358-
}
359-
catch (ArgumentOutOfRangeException)
360-
{
361-
}
362-
}
363-
var lineNum = paramList.GetSelection().LineCount;
364-
342+
var lineCount = paramList.GetSelection().LineCount;
365343
module.ReplaceLine(paramList.Start.Line, signature.Replace(" _" + Environment.NewLine, string.Empty));
366-
module.DeleteLines(paramList.Start.Line + 1, lineNum - 1);
344+
module.DeleteLines(paramList.Start.Line + 1, lineCount - 1);
367345
}
368346
}
369347
}

0 commit comments

Comments
 (0)