static void RuntimeFormatElementType (TypeReference tr, StringBuilder builder)
{
var ts = tr as TypeSpecification;
if (ts != null) {
if (ts.IsByReference) {
RuntimeFormatElementType (ts.ElementType, builder);
builder.Append ("&");
return;
}
}
switch (tr.MetadataType) {
case MetadataType.Void:
builder.Append ("void");
break;
case MetadataType.Boolean:
builder.Append ("bool");
break;
case MetadataType.Char:
builder.Append ("char");
break;
case MetadataType.SByte:
builder.Append ("sbyte");
break;
case MetadataType.Byte:
builder.Append ("byte");
break;
case MetadataType.Int16:
builder.Append ("int16");
break;
case MetadataType.UInt16:
builder.Append ("uint16");
break;
case MetadataType.Int32:
builder.Append ("int");
break;
case MetadataType.UInt32:
builder.Append ("uint");
break;
case MetadataType.Int64:
builder.Append ("long");
break;
case MetadataType.UInt64:
builder.Append ("ulong");
break;
case MetadataType.Single:
builder.Append ("single");
break;
case MetadataType.Double:
builder.Append ("double");
break;
case MetadataType.String:
builder.Append ("string");
break;
case MetadataType.Pointer:
builder.Append (((TypeSpecification)tr).ElementType);
builder.Append ("*");
break;
case MetadataType.ValueType:
case MetadataType.Class:
case MetadataType.GenericInstance: {
FormatName (tr, builder, '/');
break;
}
case MetadataType.Var:
case MetadataType.MVar:
builder.Append (tr.Name);
builder.Append ("_REF");
break;
case MetadataType.Array: {
var array = (ArrayType)tr;
RuntimeFormatElementType (array.ElementType, builder);
builder.Append ("[");
for (int i = 0; i < array.Rank - 1; ++i)
builder.Append (",");
builder.Append ("]");
break;
}
case MetadataType.TypedByReference:
builder.Append ("typedbyref");
break;
case MetadataType.IntPtr:
builder.Append ("intptr");
break;
case MetadataType.UIntPtr:
builder.Append ("uintptr");
break;
case MetadataType.FunctionPointer:
builder.Append ("*()");
break;
case MetadataType.Object:
builder.Append ("object");
break;
default:
builder.Append ("-unknown-");
break;
}
}