Skip to content
This repository was archived by the owner on Oct 16, 2020. It is now read-only.

Commit 92c3786

Browse files
committed
Simplify AddOptionalParameterToInvocationAction. This should fix UDC crash 5207.
1 parent 0e2cb73 commit 92c3786

1 file changed

Lines changed: 17 additions & 31 deletions

File tree

src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp.Refactoring/CodeActions/AddOptionalParameterToInvocationAction.cs

Lines changed: 17 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,11 @@
2323
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
2424
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
2525
// THE SOFTWARE.
26+
using System;
2627
using ICSharpCode.NRefactory.CSharp;
2728
using System.Collections.Generic;
2829
using System.Linq;
30+
using ICSharpCode.NRefactory.CSharp.Resolver;
2931
using ICSharpCode.NRefactory.Semantics;
3032
using ICSharpCode.NRefactory.Xml;
3133
using ICSharpCode.NRefactory.Documentation;
@@ -43,44 +45,28 @@ public override IEnumerable<CodeAction> GetActions(RefactoringContext context)
4345
if (invocationExpression == null)
4446
yield break;
4547

46-
var resolveResult = context.Resolve(invocationExpression) as InvocationResolveResult;
48+
var resolveResult = context.Resolve(invocationExpression) as CSharpInvocationResolveResult;
4749
if (resolveResult == null) {
4850
yield break;
4951
}
50-
52+
5153
var method = (IMethod)resolveResult.Member;
52-
53-
bool foundOptionalParameter = false;
54-
foreach (var parameter in method.Parameters) {
55-
if (parameter.IsParams) {
56-
yield break;
57-
}
58-
59-
if (parameter.IsOptional) {
60-
foundOptionalParameter = true;
61-
break;
54+
bool[] parameterIsSpecified = new bool[method.Parameters.Count];
55+
var argumentToParameterMap = resolveResult.GetArgumentToParameterMap();
56+
if (argumentToParameterMap != null) {
57+
foreach (int paramIndex in argumentToParameterMap)
58+
parameterIsSpecified[paramIndex] = true;
59+
} else {
60+
for (int i = 0; i < Math.Min(resolveResult.Arguments.Count, parameterIsSpecified.Length); i++) {
61+
parameterIsSpecified[i] = true;
6262
}
6363
}
64-
65-
if (!foundOptionalParameter) {
66-
yield break;
64+
var missingParameters = new List<IParameter>();
65+
for (int i = 0; i < method.Parameters.Count; i++) {
66+
if (!parameterIsSpecified[i] && method.Parameters[i].IsOptional)
67+
missingParameters.Add(method.Parameters[i]);
6768
}
68-
69-
//Basic sanity checks done, now see if there are any missing optional arguments
70-
var missingParameters = new List<IParameter>(method.Parameters);
71-
if (resolveResult.Arguments.Count != invocationExpression.Arguments.Count) {
72-
//Extension method
73-
missingParameters.RemoveAt (0);
74-
}
75-
foreach (var argument in invocationExpression.Arguments) {
76-
var namedArgument = argument as NamedArgumentExpression;
77-
if (namedArgument == null) {
78-
missingParameters.RemoveAt(0);
79-
} else {
80-
missingParameters.RemoveAll(parameter => parameter.Name == namedArgument.Name);
81-
}
82-
}
83-
69+
8470
foreach (var parameterToAdd in missingParameters) {
8571
//Add specific parameter
8672
yield return new CodeAction(string.Format(context.TranslateString("Add optional parameter \"{0}\""),

0 commit comments

Comments
 (0)