Skip to content

Commit c1bbbe2

Browse files
authored
Merge branch 'next' into ninjectMemoryLeaks
2 parents 968632d + 15b9aea commit c1bbbe2

25 files changed

+2265
-366
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
}

RetailCoder.VBE/Refactorings/ReorderParameters/ReorderParametersRefactoring.cs

Lines changed: 54 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using Rubberduck.Parsing;
55
using Rubberduck.Parsing.Grammar;
66
using Rubberduck.Parsing.Symbols;
7-
using Rubberduck.Parsing.VBA;
87
using Rubberduck.UI;
98
using Rubberduck.VBEditor;
109
using Rubberduck.VBEditor.Extensions;
@@ -106,70 +105,76 @@ private void AdjustReferences(IEnumerable<IdentifierReference> references)
106105
{
107106
foreach (var reference in references.Where(item => item.Context != _model.TargetDeclaration.Context))
108107
{
109-
dynamic proc = reference.Context;
110108
var module = reference.QualifiedModuleName.Component.CodeModule;
111109
VBAParser.ArgumentListContext argumentList = null;
112110
var callStmt = ParserRuleContextHelper.GetParent<VBAParser.CallStmtContext>(reference.Context);
113111
if (callStmt != null)
114112
{
115113
argumentList = CallStatement.GetArgumentList(callStmt);
116114
}
115+
116+
if (argumentList == null)
117+
{
118+
var indexExpression = ParserRuleContextHelper.GetParent<VBAParser.IndexExprContext>(reference.Context);
119+
if (indexExpression != null)
120+
{
121+
argumentList = ParserRuleContextHelper.GetChild<VBAParser.ArgumentListContext>(indexExpression);
122+
}
123+
}
124+
117125
if (argumentList == null) { continue; }
118126
RewriteCall(argumentList, module);
119127
}
120128
}
121129

122130
private void RewriteCall(VBAParser.ArgumentListContext paramList, CodeModule module)
123131
{
124-
List<string> paramNames = new List<string>();
132+
var argValues = new List<string>();
125133
if (paramList.positionalOrNamedArgumentList().positionalArgumentOrMissing() != null)
126134
{
127-
paramNames.AddRange(paramList.positionalOrNamedArgumentList().positionalArgumentOrMissing().Select(p =>
135+
argValues.AddRange(paramList.positionalOrNamedArgumentList().positionalArgumentOrMissing().Select(p =>
128136
{
129137
if (p is VBAParser.SpecifiedPositionalArgumentContext)
130138
{
131139
return ((VBAParser.SpecifiedPositionalArgumentContext)p).positionalArgument().GetText();
132140
}
133-
else
134-
{
135-
return string.Empty;
136-
}
141+
142+
return string.Empty;
137143
}).ToList());
138144
}
139145
if (paramList.positionalOrNamedArgumentList().namedArgumentList() != null)
140146
{
141-
paramNames.AddRange(paramList.positionalOrNamedArgumentList().namedArgumentList().namedArgument().Select(p => p.GetText()).ToList());
147+
argValues.AddRange(paramList.positionalOrNamedArgumentList().namedArgumentList().namedArgument().Select(p => p.GetText()).ToList());
142148
}
143149
if (paramList.positionalOrNamedArgumentList().requiredPositionalArgument() != null)
144150
{
145-
paramNames.Add(paramList.positionalOrNamedArgumentList().requiredPositionalArgument().GetText());
151+
argValues.Add(paramList.positionalOrNamedArgumentList().requiredPositionalArgument().GetText());
146152
}
147153

148154
var lineCount = paramList.Stop.Line - paramList.Start.Line + 1; // adjust for total line count
149155

150-
var newContent = module.Lines[paramList.Start.Line, lineCount].Replace(" _" + Environment.NewLine, string.Empty).RemoveExtraSpacesLeavingIndentation();
156+
var newContent = module.Lines[paramList.Start.Line, lineCount];
157+
newContent = newContent.Remove(paramList.Start.Column, paramList.GetText().Length);
151158

152-
var parameterIndex = 0;
153-
var currentStringIndex = 0;
154-
155-
for (var i = 0; i < paramNames.Count && parameterIndex < _model.Parameters.Count; i++)
159+
var reorderedArgValues = new List<string>();
160+
foreach (var param in _model.Parameters)
156161
{
157-
var parameterStringIndex = newContent.IndexOf(paramNames.ElementAt(i), currentStringIndex, StringComparison.Ordinal);
158-
159-
if (parameterStringIndex <= -1) { continue; }
160-
161-
var oldParameterString = paramNames.ElementAt(i);
162-
var newParameterString = paramNames.ElementAt(_model.Parameters.ElementAt(parameterIndex).Index);
163-
var beginningSub = newContent.Substring(0, parameterStringIndex);
164-
var replaceSub = newContent.Substring(parameterStringIndex).Replace(oldParameterString, newParameterString);
165-
166-
newContent = beginningSub + replaceSub;
162+
var argAtIndex = argValues.ElementAtOrDefault(param.Index);
163+
if (argAtIndex != null)
164+
{
165+
reorderedArgValues.Add(argAtIndex);
166+
}
167+
}
167168

168-
parameterIndex++;
169-
currentStringIndex = beginningSub.Length + newParameterString.Length;
169+
// property let/set and paramarrays
170+
for (var index = reorderedArgValues.Count; index < argValues.Count; index++)
171+
{
172+
reorderedArgValues.Add(argValues[index]);
170173
}
171174

172-
module.ReplaceLine(paramList.Start.Line, newContent);
175+
newContent = newContent.Insert(paramList.Start.Column, string.Join(", ", reorderedArgValues));
176+
177+
module.ReplaceLine(paramList.Start.Line, newContent.Replace(" _" + Environment.NewLine, string.Empty));
173178
module.DeleteLines(paramList.Start.Line + 1, lineCount - 1);
174179
}
175180

@@ -244,34 +249,33 @@ private void AdjustSignatures(Declaration declaration)
244249

245250
private void RewriteSignature(Declaration target, VBAParser.ArgListContext paramList, CodeModule module)
246251
{
247-
var argList = paramList.arg();
248-
249-
var newContent = GetOldSignature(target);
250-
var lineNum = paramList.GetSelection().LineCount;
252+
var parameters = paramList.arg().Select((s, i) => new {Index = i, Text = s.GetText()}).ToList();
251253

252-
var parameterIndex = 0;
253-
var currentStringIndex = 0;
254-
255-
for (var i = parameterIndex; i < _model.Parameters.Count; i++)
254+
var reorderedParams = new List<string>();
255+
foreach (var param in _model.Parameters)
256256
{
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)
257+
var parameterAtIndex = parameters.SingleOrDefault(s => s.Index == param.Index);
258+
if (parameterAtIndex != null)
262259
{
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;
260+
reorderedParams.Add(parameterAtIndex.Text);
270261
}
271262
}
272263

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

277281
private string GetOldSignature(Declaration target)

RetailCoder.VBE/UI/Command/Refactorings/RefactorExtractInterfaceCommand.cs

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -21,22 +21,9 @@ public RefactorExtractInterfaceCommand(VBE vbe, RubberduckParserState state, IMe
2121
_messageBox = messageBox;
2222
}
2323

24-
private static readonly vbext_ComponentType[] ModuleTypes =
25-
{
26-
vbext_ComponentType.vbext_ct_ClassModule,
27-
vbext_ComponentType.vbext_ct_Document,
28-
vbext_ComponentType.vbext_ct_MSForm,
29-
};
30-
3124
protected override bool CanExecuteImpl(object parameter)
3225
{
33-
var activePane = Vbe.ActiveCodePane;
34-
if (activePane == null)
35-
{
36-
return false;
37-
}
38-
39-
var selection = activePane.GetQualifiedSelection();
26+
var selection = Vbe.ActiveCodePane.GetQualifiedSelection();
4027
if (!selection.HasValue)
4128
{
4229
return false;
@@ -49,9 +36,7 @@ protected override bool CanExecuteImpl(object parameter)
4936
var hasMembers = _state.AllUserDeclarations.Any(item => item.DeclarationType.HasFlag(DeclarationType.Member) && item.ParentDeclaration != null && item.ParentDeclaration.Equals(target));
5037

5138
// true if active code pane is for a class/document/form module
52-
var canExecute = ModuleTypes.Contains(Vbe.ActiveCodePane.CodeModule.Parent.Type) && target != null && hasMembers;
53-
54-
return canExecute;
39+
return target != null && hasMembers;
5540
}
5641

5742
protected override void ExecuteImpl(object parameter)

0 commit comments

Comments
 (0)