Browse Source

Only transform params if it's the last parameter + Refactoring of variable names.

pull/863/head
Siegfried Pammer 8 years ago
parent
commit
0226b5a832
  1. 18
      ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs
  2. 1
      ICSharpCode.Decompiler/Util/CollectionExtensions.cs

18
ICSharpCode.Decompiler/CSharp/ExpressionBuilder.cs

@ -1134,7 +1134,7 @@ namespace ICSharpCode.Decompiler.CSharp
for (int i = 0; i < method.Parameters.Count; i++) { for (int i = 0; i < method.Parameters.Count; i++) {
var parameter = expectedParameters[i]; var parameter = expectedParameters[i];
var arg = Translate(inst.Arguments[firstParamIndex + i]); var arg = Translate(inst.Arguments[firstParamIndex + i]);
if (parameter.IsParams) { if (parameter.IsParams && i + 1 == method.Parameters.Count) {
// Parameter is marked params // Parameter is marked params
// If the argument is an array creation, inline all elements into the call and add missing default values. // If the argument is an array creation, inline all elements into the call and add missing default values.
// Otherwise handle it normally. // Otherwise handle it normally.
@ -1142,22 +1142,22 @@ namespace ICSharpCode.Decompiler.CSharp
acrr.SizeArguments.Count == 1 && acrr.SizeArguments.Count == 1 &&
acrr.SizeArguments[0].IsCompileTimeConstant && acrr.SizeArguments[0].IsCompileTimeConstant &&
acrr.SizeArguments[0].ConstantValue is int length) { acrr.SizeArguments[0].ConstantValue is int length) {
var expectedParametersCopy = expectedParameters.Take(expectedParameters.Count - 1).ToList(); var expandedParameters = expectedParameters.Take(expectedParameters.Count - 1).ToList();
var argumentsCopy = new List<TranslatedExpression>(arguments); var expandedArguments = new List<TranslatedExpression>(arguments);
if (length > 0) { if (length > 0) {
var arrayElements = ((ArrayCreateExpression)arg.Expression).Initializer.Elements.ToArray(); var arrayElements = ((ArrayCreateExpression)arg.Expression).Initializer.Elements.ToArray();
var elementType = ((ArrayType)acrr.Type).ElementType; var elementType = ((ArrayType)acrr.Type).ElementType;
for (int j = 0; j < length; j++) { for (int j = 0; j < length; j++) {
expectedParametersCopy.Add(new DefaultParameter(elementType, parameter.Name + j)); expandedParameters.Add(new DefaultParameter(elementType, parameter.Name + j));
if (j < arrayElements.Length) if (j < arrayElements.Length)
argumentsCopy.Add(new TranslatedExpression(arrayElements[j])); expandedArguments.Add(new TranslatedExpression(arrayElements[j]));
else else
argumentsCopy.Add(GetDefaultValueExpression(elementType).WithoutILInstruction()); expandedArguments.Add(GetDefaultValueExpression(elementType).WithoutILInstruction());
} }
} }
if (IsUnambiguousCall(inst, target, method, Array.Empty<IType>(), argumentsCopy) == OverloadResolutionErrors.None) { if (IsUnambiguousCall(inst, target, method, Array.Empty<IType>(), expandedArguments) == OverloadResolutionErrors.None) {
expectedParameters = expectedParametersCopy; expectedParameters = expandedParameters;
arguments = argumentsCopy.SelectList(a => new TranslatedExpression(a.Expression.Detach())); arguments = expandedArguments.SelectList(a => new TranslatedExpression(a.Expression.Detach()));
continue; continue;
} }
} }

1
ICSharpCode.Decompiler/Util/CollectionExtensions.cs

@ -74,7 +74,6 @@ namespace ICSharpCode.Decompiler.Util
public static List<U> SelectList<T, U>(this ICollection<T> collection, Func<T, U> func) public static List<U> SelectList<T, U>(this ICollection<T> collection, Func<T, U> func)
{ {
List<U> result = new List<U>(collection.Count); List<U> result = new List<U>(collection.Count);
int index = 0;
foreach (var element in collection) { foreach (var element in collection) {
result.Add(func(element)); result.Add(func(element));
} }

Loading…
Cancel
Save