static void AppendTypeSpecification(TypeSpecification type, StringBuilder name) { if (type.ElementType.IsTypeSpecification()) { AppendTypeSpecification((TypeSpecification)type.ElementType, name); } switch (type.etype) { case ElementType.Ptr: name.Append('*'); break; case ElementType.ByRef: name.Append('&'); break; case ElementType.SzArray: case ElementType.Array: var array = (ArrayType)type; if (array.IsVector) { name.Append("[]"); } else { name.Append('['); for (int i = 1; i < array.Rank; i++) { name.Append(','); } name.Append(']'); } break; case ElementType.GenericInst: var instance = (GenericInstanceType)type; var arguments = instance.GenericArguments; name.Append('['); for (int i = 0; i < arguments.Count; i++) { if (i > 0) { name.Append(','); } var argument = arguments [i]; var requires_fqname = argument.Scope != argument.Module; if (requires_fqname) { name.Append('['); } AppendType(argument, name, true, false); if (requires_fqname) { name.Append(']'); } } name.Append(']'); break; default: return; } }