internal static void Decode(ref DecodeWellKnownAttributeArguments <TAttributeSyntax, TAttributeData, TAttributeLocation> arguments, AttributeTargets target, CommonMessageProvider messageProvider) { Debug.Assert((object)arguments.AttributeSyntaxOpt != null); UnmanagedType unmanagedType = DecodeMarshalAsType(arguments.Attribute); switch (unmanagedType) { case Cci.Constants.UnmanagedType_CustomMarshaler: DecodeMarshalAsCustom(ref arguments, messageProvider); break; case UnmanagedType.Interface: case Cci.Constants.UnmanagedType_IDispatch: case UnmanagedType.IUnknown: DecodeMarshalAsComInterface(ref arguments, unmanagedType, messageProvider); break; case UnmanagedType.LPArray: DecodeMarshalAsArray(ref arguments, messageProvider, isFixed: false); break; case UnmanagedType.ByValArray: if (target != AttributeTargets.Field) { messageProvider.ReportMarshalUnmanagedTypeOnlyValidForFields(arguments.Diagnostics, arguments.AttributeSyntaxOpt, 0, "ByValArray", arguments.Attribute); } else { DecodeMarshalAsArray(ref arguments, messageProvider, isFixed: true); } break; case Cci.Constants.UnmanagedType_SafeArray: DecodeMarshalAsSafeArray(ref arguments, messageProvider); break; case UnmanagedType.ByValTStr: if (target != AttributeTargets.Field) { messageProvider.ReportMarshalUnmanagedTypeOnlyValidForFields(arguments.Diagnostics, arguments.AttributeSyntaxOpt, 0, "ByValTStr", arguments.Attribute); } else { DecodeMarshalAsFixedString(ref arguments, messageProvider); } break; case Cci.Constants.UnmanagedType_VBByRefStr: if (target == AttributeTargets.Field) { messageProvider.ReportMarshalUnmanagedTypeNotValidForFields(arguments.Diagnostics, arguments.AttributeSyntaxOpt, 0, "VBByRefStr", arguments.Attribute); } else { // named parameters ignored with no error arguments.GetOrCreateData <TWellKnownAttributeData>().GetOrCreateData().SetMarshalAsSimpleType(unmanagedType); } break; default: if ((int)unmanagedType < 0 || (int)unmanagedType > MarshalPseudoCustomAttributeData.MaxMarshalInteger) { // Dev10 reports CS0647: "Error emitting attribute ..." messageProvider.ReportInvalidAttributeArgument(arguments.Diagnostics, arguments.AttributeSyntaxOpt, 0, arguments.Attribute); } else { // named parameters ignored with no error arguments.GetOrCreateData <TWellKnownAttributeData>().GetOrCreateData().SetMarshalAsSimpleType(unmanagedType); } break; } }