Browse Source

Simplify AddOptionalParameterToInvocationAction. This should fix UDC crash 5207.

pull/522/merge
Daniel Grunwald 12 years ago
parent
commit
92c3786ab5
  1. 48
      src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp.Refactoring/CodeActions/AddOptionalParameterToInvocationAction.cs

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

@ -23,9 +23,11 @@ @@ -23,9 +23,11 @@
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
using System;
using ICSharpCode.NRefactory.CSharp;
using System.Collections.Generic;
using System.Linq;
using ICSharpCode.NRefactory.CSharp.Resolver;
using ICSharpCode.NRefactory.Semantics;
using ICSharpCode.NRefactory.Xml;
using ICSharpCode.NRefactory.Documentation;
@ -43,44 +45,28 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring @@ -43,44 +45,28 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
if (invocationExpression == null)
yield break;
var resolveResult = context.Resolve(invocationExpression) as InvocationResolveResult;
var resolveResult = context.Resolve(invocationExpression) as CSharpInvocationResolveResult;
if (resolveResult == null) {
yield break;
}
var method = (IMethod)resolveResult.Member;
bool foundOptionalParameter = false;
foreach (var parameter in method.Parameters) {
if (parameter.IsParams) {
yield break;
}
if (parameter.IsOptional) {
foundOptionalParameter = true;
break;
bool[] parameterIsSpecified = new bool[method.Parameters.Count];
var argumentToParameterMap = resolveResult.GetArgumentToParameterMap();
if (argumentToParameterMap != null) {
foreach (int paramIndex in argumentToParameterMap)
parameterIsSpecified[paramIndex] = true;
} else {
for (int i = 0; i < Math.Min(resolveResult.Arguments.Count, parameterIsSpecified.Length); i++) {
parameterIsSpecified[i] = true;
}
}
if (!foundOptionalParameter) {
yield break;
var missingParameters = new List<IParameter>();
for (int i = 0; i < method.Parameters.Count; i++) {
if (!parameterIsSpecified[i] && method.Parameters[i].IsOptional)
missingParameters.Add(method.Parameters[i]);
}
//Basic sanity checks done, now see if there are any missing optional arguments
var missingParameters = new List<IParameter>(method.Parameters);
if (resolveResult.Arguments.Count != invocationExpression.Arguments.Count) {
//Extension method
missingParameters.RemoveAt (0);
}
foreach (var argument in invocationExpression.Arguments) {
var namedArgument = argument as NamedArgumentExpression;
if (namedArgument == null) {
missingParameters.RemoveAt(0);
} else {
missingParameters.RemoveAll(parameter => parameter.Name == namedArgument.Name);
}
}
foreach (var parameterToAdd in missingParameters) {
//Add specific parameter
yield return new CodeAction(string.Format(context.TranslateString("Add optional parameter \"{0}\""),

Loading…
Cancel
Save