ErrorHandling
using Microsoft.CSharp.RuntimeBinder.Semantics;
using System;
using System.Globalization;
namespace Microsoft.CSharp.RuntimeBinder.Errors
{
internal static class ErrorHandling
{
public static RuntimeBinderException Error(ErrorCode id, params ErrArg[] args)
{
string[] array = new string[args.Length];
int[] array2 = new int[args.Length];
int num = 0;
int num2 = 0;
int num3 = 0;
UserStringBuilder userStringBuilder = default(UserStringBuilder);
for (int i = 0; i < args.Length; i++) {
ErrArg errArg = args[i];
if ((errArg.eaf & ErrArgFlags.NoStr) == ErrArgFlags.None) {
if (!userStringBuilder.ErrArgToString(out array[num], errArg, out bool fUserStrings) && errArg.eak == ErrArgKind.Int)
array[num] = errArg.n.ToString(CultureInfo.InvariantCulture);
num++;
int num4;
if (!fUserStrings || (errArg.eaf & ErrArgFlags.Unique) == ErrArgFlags.None)
num4 = -1;
else {
num4 = i;
num3++;
}
array2[num2] = num4;
num2++;
}
}
int num5 = num;
if (num3 > 1) {
string[] array3 = new string[num5];
Array.Copy(array, 0, array3, 0, num5);
for (int j = 0; j < num5; j++) {
if (array2[j] >= 0 && !(array3[j] != array[j])) {
ErrArg errArg2 = args[array2[j]];
Symbol symbol = null;
CType cType = null;
bool flag;
switch (errArg2.eak) {
case ErrArgKind.Sym:
symbol = errArg2.sym;
goto IL_0156;
case ErrArgKind.Type:
cType = errArg2.pType;
goto IL_0156;
case ErrArgKind.SymWithType:
symbol = errArg2.swtMemo.sym;
goto IL_0156;
case ErrArgKind.MethWithInst:
{
symbol = errArg2.mpwiMemo.sym;
goto IL_0156;
}
IL_0156:
flag = false;
for (int k = j + 1; k < num5; k++) {
if (array2[k] >= 0 && !(array[j] != array[k])) {
if (array3[k] != array[k])
flag = true;
else {
ErrArg errArg3 = args[array2[k]];
Symbol symbol2 = null;
CType cType2 = null;
switch (errArg3.eak) {
case ErrArgKind.Sym:
symbol2 = errArg3.sym;
goto IL_0206;
case ErrArgKind.Type:
cType2 = errArg3.pType;
goto IL_0206;
case ErrArgKind.SymWithType:
symbol2 = errArg3.swtMemo.sym;
goto IL_0206;
case ErrArgKind.MethWithInst:
{
symbol2 = errArg3.mpwiMemo.sym;
goto IL_0206;
}
IL_0206:
if (symbol2 != symbol || cType2 != cType || flag) {
array3[k] = array[k];
flag = true;
}
break;
}
}
}
}
if (flag)
array3[j] = array[j];
break;
}
}
}
array = array3;
}
CultureInfo invariantCulture = CultureInfo.InvariantCulture;
string message = ErrorFacts.GetMessage(id);
object[] args2 = array;
return new RuntimeBinderException(string.Format(invariantCulture, message, args2));
}
}
}