Skip to content

Commit 8d7913b

Browse files
Add support for newobj ROS(in arg) to TransformParamsArgument.
1 parent 057b4b2 commit 8d7913b

File tree

1 file changed

+42
-37
lines changed

1 file changed

+42
-37
lines changed

ICSharpCode.Decompiler/CSharp/CallBuilder.cs

Lines changed: 42 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1026,25 +1026,14 @@ private bool IsPrimitiveValueThatShouldBeNamedArgument(TranslatedExpression arg,
10261026
}
10271027

10281028
private bool TransformParamsArgument(ExpectedTargetDetails expectedTargetDetails, ResolveResult targetResolveResult,
1029-
IMethod method, IParameter parameter, TranslatedExpression arg, ref List<IParameter> expectedParameters,
1029+
IMethod method, IParameter parameter, TranslatedExpression paramsArgument, ref List<IParameter> expectedParameters,
10301030
ref List<TranslatedExpression> arguments)
10311031
{
1032-
if (CheckArgument(out int length, out IType elementType))
1032+
var expressionBuilder = this.expressionBuilder;
1033+
if (ExtractArguments(out IType elementType, out var expandedParameters, out var expandedArguments))
10331034
{
1034-
var expandedParameters = new List<IParameter>(expectedParameters);
1035-
var expandedArguments = new List<TranslatedExpression>(arguments);
1036-
if (length > 0)
1037-
{
1038-
var arrayElements = ((ArrayCreateExpression)arg.Expression).Initializer.Elements.ToArray();
1039-
for (int j = 0; j < length; j++)
1040-
{
1041-
expandedParameters.Add(new DefaultParameter(elementType, parameter.Name + j));
1042-
if (j < arrayElements.Length)
1043-
expandedArguments.Add(new TranslatedExpression(arrayElements[j]));
1044-
else
1045-
expandedArguments.Add(expressionBuilder.GetDefaultValueExpression(elementType).WithoutILInstruction());
1046-
}
1047-
}
1035+
expandedParameters.InsertRange(0, expectedParameters);
1036+
expandedArguments.InsertRange(0, arguments);
10481037
if (IsUnambiguousCall(expectedTargetDetails, method, targetResolveResult, Empty<IType>.Array,
10491038
expandedArguments.SelectArray(a => a.ResolveResult), argumentNames: null,
10501039
firstOptionalArgumentIndex: -1, out _,
@@ -1057,30 +1046,46 @@ private bool TransformParamsArgument(ExpectedTargetDetails expectedTargetDetails
10571046
}
10581047
return false;
10591048

1060-
bool CheckArgument(out int len, out IType t)
1049+
bool ExtractArguments(out IType elementType, out List<IParameter> parameters, out List<TranslatedExpression> arguments)
10611050
{
1062-
len = 0;
1063-
t = null;
1064-
if (arg.ResolveResult is CSharpInvocationResolveResult csirr &&
1065-
csirr.Arguments.Count == 0 && csirr.Member is IMethod emptyMethod &&
1066-
emptyMethod.IsStatic &&
1067-
"System.Array.Empty" == emptyMethod.FullName &&
1068-
emptyMethod.TypeArguments.Count == 1)
1051+
elementType = null;
1052+
parameters = null;
1053+
arguments = null;
1054+
switch (paramsArgument.ResolveResult)
10691055
{
1070-
t = emptyMethod.TypeArguments[0];
1071-
return true;
1072-
}
1073-
1074-
if (arg.ResolveResult is ArrayCreateResolveResult acrr &&
1075-
acrr.SizeArguments.Count == 1 &&
1076-
acrr.SizeArguments[0].IsCompileTimeConstant &&
1077-
acrr.SizeArguments[0].ConstantValue is int l)
1078-
{
1079-
len = l;
1080-
t = ((ArrayType)acrr.Type).ElementType;
1081-
return true;
1056+
case CSharpInvocationResolveResult { Member: IMethod method, Arguments: var args }:
1057+
// match System.Array.Empty<T>()
1058+
if (args is [] && method is { IsStatic: true, FullName: "System.Array.Empty", TypeArguments: [var type] })
1059+
{
1060+
elementType = type;
1061+
arguments = new();
1062+
parameters = new();
1063+
return true;
1064+
}
1065+
if (paramsArgument.Expression is ObjectCreateExpression oce
1066+
&& method is { IsConstructor: true, DeclaringType: { TypeArguments: [var type2] } declaringType }
1067+
&& declaringType.IsKnownType(KnownTypeCode.ReadOnlySpanOfT))
1068+
{
1069+
elementType = type2;
1070+
arguments = new() { new TranslatedExpression(oce.Arguments.Single()) };
1071+
parameters = new() { new DefaultParameter(type2, string.Empty) };
1072+
return true;
1073+
}
1074+
return false;
1075+
case ArrayCreateResolveResult { Type: ArrayType { ElementType: var type3 }, SizeArguments: [{ ConstantValue: int arrayLength }] }:
1076+
elementType = type3;
1077+
arguments = new(((ArrayCreateExpression)paramsArgument.Expression).Initializer.Elements.Select(e => new TranslatedExpression(e)));
1078+
parameters = new List<IParameter>(arrayLength);
1079+
for (int i = 0; i < arrayLength; i++)
1080+
{
1081+
parameters.Add(new DefaultParameter(type3, string.Empty));
1082+
if (arguments.Count <= i)
1083+
arguments.Add(new TranslatedExpression(expressionBuilder.GetDefaultValueExpression(type3).WithoutILInstruction()));
1084+
}
1085+
return true;
1086+
default:
1087+
return false;
10821088
}
1083-
return false;
10841089
}
10851090
}
10861091

0 commit comments

Comments
 (0)