private static ActualArguments/*!*/ CreateActualArguments(List<DynamicMetaObject>/*!*/ normalized, MetaObjectBuilder/*!*/ metaBuilder,
CallArguments/*!*/ args, int hidden, int preSplatLimit, int postSplatLimit, out int lastSplattedArg, out IList list, out ParameterExpression listVariable) {
int firstSplattedArg, splatIndex, collapsedArgCount;
// simple arguments:
for (int i = 0; i < args.SimpleArgumentCount; i++) {
normalized.Add(args.GetSimpleMetaArgument(i));
}
// splat argument:
list = null;
listVariable = null;
if (args.Signature.HasSplattedArgument) {
firstSplattedArg = normalized.Count;
int listLength;
var splatted = args.GetSplattedMetaArgument();
list = (IList)splatted.Value;
metaBuilder.AddSplattedArgumentTest(list, splatted.Expression, out listLength, out listVariable);
int i = 0;
while (i < Math.Min(listLength, preSplatLimit - firstSplattedArg)) {
normalized.Add(MakeSplattedItem(list, listVariable, i));
i++;
}
// skip items that are not needed for overload resolution
splatIndex = normalized.Count;
i = Math.Max(i, listLength - (postSplatLimit - (args.Signature.HasRhsArgument ? 1 : 0)));
while (i < listLength) {
normalized.Add(MakeSplattedItem(list, listVariable, i));
i++;
}
collapsedArgCount = listLength - (normalized.Count - firstSplattedArg);
lastSplattedArg = normalized.Count - 1;
} else {
splatIndex = firstSplattedArg = lastSplattedArg = -1;
collapsedArgCount = 0;
}
Debug.Assert(collapsedArgCount >= 0);
// rhs argument:
if (args.Signature.HasRhsArgument) {
normalized.Add(args.GetRhsMetaArgument());
}
return new ActualArguments(
normalized.ToArray(),
DynamicMetaObject.EmptyMetaObjects,
ArrayUtils.EmptyStrings,
hidden,
collapsedArgCount,
firstSplattedArg,
splatIndex
);
}