Annotate System.ComponentModel.EventBasedAsync for nullable reference types (#466)
authorStephen Toub <stoub@microsoft.com>
Thu, 5 Dec 2019 03:11:25 +0000 (22:11 -0500)
committerGitHub <noreply@github.com>
Thu, 5 Dec 2019 03:11:25 +0000 (22:11 -0500)
* Annotate System.ComponentModel.EventBasedAsync for nullable reference types

* Address PR feedback

src/libraries/System.ComponentModel.EventBasedAsync/ref/System.ComponentModel.EventBasedAsync.cs
src/libraries/System.ComponentModel.EventBasedAsync/ref/System.ComponentModel.EventBasedAsync.csproj
src/libraries/System.ComponentModel.EventBasedAsync/src/System.ComponentModel.EventBasedAsync.csproj
src/libraries/System.ComponentModel.EventBasedAsync/src/System/ComponentModel/AsyncCompletedEvent.cs
src/libraries/System.ComponentModel.EventBasedAsync/src/System/ComponentModel/AsyncOperation.cs
src/libraries/System.ComponentModel.EventBasedAsync/src/System/ComponentModel/AsyncOperationManager.cs
src/libraries/System.ComponentModel.EventBasedAsync/src/System/ComponentModel/BackgroundWorker.cs
src/libraries/System.ComponentModel.EventBasedAsync/src/System/ComponentModel/DoWorkEvent.cs
src/libraries/System.ComponentModel.EventBasedAsync/src/System/ComponentModel/ProgressChangedEvent.cs
src/libraries/System.ComponentModel.EventBasedAsync/src/System/ComponentModel/RunWorkerCompletedEvent.cs

index 4534484..e84d180 100644 (file)
@@ -9,28 +9,28 @@ namespace System.ComponentModel
 {
     public partial class AsyncCompletedEventArgs : System.EventArgs
     {
-        public AsyncCompletedEventArgs(System.Exception error, bool cancelled, object userState) { }
+        public AsyncCompletedEventArgs(System.Exception? error, bool cancelled, object? userState) { }
         public bool Cancelled { get { throw null; } }
-        public System.Exception Error { get { throw null; } }
-        public object UserState { get { throw null; } }
+        public System.Exception? Error { get { throw null; } }
+        public object? UserState { get { throw null; } }
         protected void RaiseExceptionIfNecessary() { }
     }
-    public delegate void AsyncCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e);
+    public delegate void AsyncCompletedEventHandler(object? sender, System.ComponentModel.AsyncCompletedEventArgs e);
     public sealed partial class AsyncOperation
     {
         internal AsyncOperation() { }
         public System.Threading.SynchronizationContext SynchronizationContext { get { throw null; } }
-        public object UserSuppliedState { get { throw null; } }
+        public object? UserSuppliedState { get { throw null; } }
         ~AsyncOperation() { }
         public void OperationCompleted() { }
-        public void Post(System.Threading.SendOrPostCallback d, object arg) { }
-        public void PostOperationCompleted(System.Threading.SendOrPostCallback d, object arg) { }
+        public void Post(System.Threading.SendOrPostCallback d, object? arg) { }
+        public void PostOperationCompleted(System.Threading.SendOrPostCallback d, object? arg) { }
     }
     public static partial class AsyncOperationManager
     {
         [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
         public static System.Threading.SynchronizationContext SynchronizationContext { get { throw null; } set { } }
-        public static System.ComponentModel.AsyncOperation CreateOperation(object userSuppliedState) { throw null; }
+        public static System.ComponentModel.AsyncOperation CreateOperation(object? userSuppliedState) { throw null; }
     }
     public partial class BackgroundWorker : System.ComponentModel.Component
     {
@@ -39,39 +39,39 @@ namespace System.ComponentModel
         public bool IsBusy { get { throw null; } }
         public bool WorkerReportsProgress { get { throw null; } set { } }
         public bool WorkerSupportsCancellation { get { throw null; } set { } }
-        public event System.ComponentModel.DoWorkEventHandler DoWork { add { } remove { } }
-        public event System.ComponentModel.ProgressChangedEventHandler ProgressChanged { add { } remove { } }
-        public event System.ComponentModel.RunWorkerCompletedEventHandler RunWorkerCompleted { add { } remove { } }
+        public event System.ComponentModel.DoWorkEventHandler? DoWork { add { } remove { } }
+        public event System.ComponentModel.ProgressChangedEventHandler? ProgressChanged { add { } remove { } }
+        public event System.ComponentModel.RunWorkerCompletedEventHandler? RunWorkerCompleted { add { } remove { } }
         public void CancelAsync() { }
         protected override void Dispose(bool disposing) { }
         protected virtual void OnDoWork(System.ComponentModel.DoWorkEventArgs e) { }
         protected virtual void OnProgressChanged(System.ComponentModel.ProgressChangedEventArgs e) { }
         protected virtual void OnRunWorkerCompleted(System.ComponentModel.RunWorkerCompletedEventArgs e) { }
         public void ReportProgress(int percentProgress) { }
-        public void ReportProgress(int percentProgress, object userState) { }
+        public void ReportProgress(int percentProgress, object? userState) { }
         public void RunWorkerAsync() { }
-        public void RunWorkerAsync(object argument) { }
+        public void RunWorkerAsync(object? argument) { }
     }
     public partial class DoWorkEventArgs : System.ComponentModel.CancelEventArgs
     {
-        public DoWorkEventArgs(object argument) { }
-        public object Argument { get { throw null; } }
-        public object Result { get { throw null; } set { } }
+        public DoWorkEventArgs(object? argument) { }
+        public object? Argument { get { throw null; } }
+        public object? Result { get { throw null; } set { } }
     }
-    public delegate void DoWorkEventHandler(object sender, System.ComponentModel.DoWorkEventArgs e);
+    public delegate void DoWorkEventHandler(object? sender, System.ComponentModel.DoWorkEventArgs e);
     public partial class ProgressChangedEventArgs : System.EventArgs
     {
-        public ProgressChangedEventArgs(int progressPercentage, object userState) { }
+        public ProgressChangedEventArgs(int progressPercentage, object? userState) { }
         public int ProgressPercentage { get { throw null; } }
-        public object UserState { get { throw null; } }
+        public object? UserState { get { throw null; } }
     }
-    public delegate void ProgressChangedEventHandler(object sender, System.ComponentModel.ProgressChangedEventArgs e);
+    public delegate void ProgressChangedEventHandler(object? sender, System.ComponentModel.ProgressChangedEventArgs e);
     public partial class RunWorkerCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs
     {
-        public RunWorkerCompletedEventArgs(object result, System.Exception error, bool cancelled) : base (default(System.Exception), default(bool), default(object)) { }
-        public object Result { get { throw null; } }
+        public RunWorkerCompletedEventArgs(object? result, System.Exception? error, bool cancelled) : base (default(System.Exception), default(bool), default(object)) { }
+        public object? Result { get { throw null; } }
         [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Never)]
-        public new object UserState { get { throw null; } }
+        public new object? UserState { get { throw null; } }
     }
-    public delegate void RunWorkerCompletedEventHandler(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e);
+    public delegate void RunWorkerCompletedEventHandler(object? sender, System.ComponentModel.RunWorkerCompletedEventArgs e);
 }
index b73b180..0faacb2 100644 (file)
@@ -2,6 +2,7 @@
   <PropertyGroup>
     <RootNamespace>System.ComponentModel.EventBasedAsync</RootNamespace>
     <AssemblyName>System.ComponentModel.EventBasedAsync</AssemblyName>
+    <Nullable>enable</Nullable>
     <Configurations>netcoreapp-Debug;netcoreapp-Release</Configurations>
   </PropertyGroup>
   <ItemGroup>
index 2d99927..b032894 100644 (file)
@@ -2,20 +2,19 @@
 // The .NET Foundation licenses this file to you under the MIT license.
 // See the LICENSE file in the project root for more information.
 
-using System;
 using System.Reflection;
 
 namespace System.ComponentModel
 {
-    public delegate void AsyncCompletedEventHandler(object sender, AsyncCompletedEventArgs e);
+    public delegate void AsyncCompletedEventHandler(object? sender, AsyncCompletedEventArgs e);
 
     public class AsyncCompletedEventArgs : EventArgs
     {
-        public AsyncCompletedEventArgs(Exception error, bool cancelled, object userState)
+        public AsyncCompletedEventArgs(Exception? error, bool cancelled, object? userState)
         {
-            _cancelled = cancelled;
-            _error = error;
-            _state = userState;
+            Cancelled = cancelled;
+            Error = error;
+            UserState = userState;
         }
 
         protected void RaiseExceptionIfNecessary()
@@ -30,13 +29,8 @@ namespace System.ComponentModel
             }
         }
 
-        public bool Cancelled { get { return _cancelled; } }
-        public Exception Error { get { return _error; } }
-        public object UserState { get { return _state; } }
-
-        private readonly bool _cancelled;
-        private readonly Exception _error;
-        private readonly object _state;
-
+        public bool Cancelled { get; }
+        public Exception? Error { get; }
+        public object? UserState { get; }
     }
 }
index fed8021..345f632 100644 (file)
@@ -9,16 +9,15 @@ namespace System.ComponentModel
     public sealed class AsyncOperation
     {
         private readonly SynchronizationContext _syncContext;
-        private readonly object _userSuppliedState;
         private bool _alreadyCompleted;
 
         /// <summary>
         ///     Constructor. Protected to avoid unwitting usage - AsyncOperation objects
         ///     are typically created by AsyncOperationManager calling CreateOperation.
         /// </summary>
-        private AsyncOperation(object userSuppliedState, SynchronizationContext syncContext)
+        private AsyncOperation(object? userSuppliedState, SynchronizationContext syncContext)
         {
-            _userSuppliedState = userSuppliedState;
+            UserSuppliedState = userSuppliedState;
             _syncContext = syncContext;
             _alreadyCompleted = false;
             _syncContext.OperationStarted();
@@ -35,13 +34,7 @@ namespace System.ComponentModel
             }
         }
 
-        public object UserSuppliedState
-        {
-            get
-            {
-                return _userSuppliedState;
-            }
-        }
+        public object? UserSuppliedState { get; }
 
         public SynchronizationContext SynchronizationContext
         {
@@ -51,12 +44,12 @@ namespace System.ComponentModel
             }
         }
 
-        public void Post(SendOrPostCallback d, object arg)
+        public void Post(SendOrPostCallback d, object? arg)
         {
             PostCore(d, arg, markCompleted: false);
         }
 
-        public void PostOperationCompleted(SendOrPostCallback d, object arg)
+        public void PostOperationCompleted(SendOrPostCallback d, object? arg)
         {
             PostCore(d, arg, markCompleted: true);
             OperationCompletedCore();
@@ -69,7 +62,7 @@ namespace System.ComponentModel
             OperationCompletedCore();
         }
 
-        private void PostCore(SendOrPostCallback d, object arg, bool markCompleted)
+        private void PostCore(SendOrPostCallback d, object? arg, bool markCompleted)
         {
             VerifyNotCompleted();
             VerifyDelegateNotNull(d);
@@ -115,7 +108,7 @@ namespace System.ComponentModel
         /// <summary>
         ///     Only for use by AsyncOperationManager to create new AsyncOperation objects
         /// </summary>
-        internal static AsyncOperation CreateOperation(object userSuppliedState, SynchronizationContext syncContext)
+        internal static AsyncOperation CreateOperation(object? userSuppliedState, SynchronizationContext syncContext)
         {
             AsyncOperation newOp = new AsyncOperation(userSuppliedState, syncContext);
             return newOp;
index 55cd3c3..f4ee4d4 100644 (file)
@@ -10,7 +10,7 @@ namespace System.ComponentModel
 {
     public static class AsyncOperationManager
     {
-        public static AsyncOperation CreateOperation(object userSuppliedState)
+        public static AsyncOperation CreateOperation(object? userSuppliedState)
         {
             return AsyncOperation.CreateOperation(userSuppliedState, SynchronizationContext);
         }
@@ -25,7 +25,7 @@ namespace System.ComponentModel
                     SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
                 }
 
-                return SynchronizationContext.Current;
+                return SynchronizationContext.Current!;
             }
 
             // a thread should set this to null  when it is done, else the context will never be disposed/GC'd
index 2524fae..c482516 100644 (file)
@@ -12,18 +12,18 @@ namespace System.ComponentModel
     public class BackgroundWorker : Component
     {
         // Private instance members
-        private bool _canCancelWorker = false;
-        private bool _workerReportsProgress = false;
-        private bool _cancellationPending = false;
-        private bool _isRunning = false;
-        private AsyncOperation _asyncOperation = null;
+        private bool _canCancelWorker;
+        private bool _workerReportsProgress;
+        private bool _cancellationPending;
+        private bool _isRunning;
+        private AsyncOperation? _asyncOperation;
         private readonly SendOrPostCallback _operationCompleted;
         private readonly SendOrPostCallback _progressReporter;
 
         public BackgroundWorker()
         {
-            _operationCompleted = new SendOrPostCallback(AsyncOperationCompleted);
-            _progressReporter = new SendOrPostCallback(ProgressReporter);
+            _operationCompleted = new SendOrPostCallback(AsyncOperationCompleted!);
+            _progressReporter = new SendOrPostCallback(ProgressReporter!);
         }
 
         private void AsyncOperationCompleted(object arg)
@@ -51,7 +51,7 @@ namespace System.ComponentModel
             _cancellationPending = true;
         }
 
-        public event DoWorkEventHandler DoWork;
+        public event DoWorkEventHandler? DoWork;
 
         public bool IsBusy
         {
@@ -63,32 +63,20 @@ namespace System.ComponentModel
 
         protected virtual void OnDoWork(DoWorkEventArgs e)
         {
-            DoWorkEventHandler handler = DoWork;
-            if (handler != null)
-            {
-                handler(this, e);
-            }
+            DoWork?.Invoke(this, e);
         }
 
         protected virtual void OnRunWorkerCompleted(RunWorkerCompletedEventArgs e)
         {
-            RunWorkerCompletedEventHandler handler = RunWorkerCompleted;
-            if (handler != null)
-            {
-                handler(this, e);
-            }
+            RunWorkerCompleted?.Invoke(this, e);
         }
 
         protected virtual void OnProgressChanged(ProgressChangedEventArgs e)
         {
-            ProgressChangedEventHandler handler = ProgressChanged;
-            if (handler != null)
-            {
-                handler(this, e);
-            }
+            ProgressChanged?.Invoke(this, e);
         }
 
-        public event ProgressChangedEventHandler ProgressChanged;
+        public event ProgressChangedEventHandler? ProgressChanged;
 
         // Gets invoked through the AsyncOperation on the proper thread.
         private void ProgressReporter(object arg)
@@ -103,7 +91,7 @@ namespace System.ComponentModel
         }
 
         // Cause progress update to be posted through current AsyncOperation.
-        public void ReportProgress(int percentProgress, object userState)
+        public void ReportProgress(int percentProgress, object? userState)
         {
             if (!WorkerReportsProgress)
             {
@@ -127,7 +115,7 @@ namespace System.ComponentModel
             RunWorkerAsync(null);
         }
 
-        public void RunWorkerAsync(object argument)
+        public void RunWorkerAsync(object? argument)
         {
             if (_isRunning)
             {
@@ -139,7 +127,7 @@ namespace System.ComponentModel
 
             _asyncOperation = AsyncOperationManager.CreateOperation(null);
             Task.Factory.StartNew(
-                        (arg) => WorkerThreadStart(arg),
+                        arg => WorkerThreadStart(arg),
                         argument,
                         CancellationToken.None,
                         TaskCreationOptions.DenyChildAttach,
@@ -147,7 +135,7 @@ namespace System.ComponentModel
                     );
         }
 
-        public event RunWorkerCompletedEventHandler RunWorkerCompleted;
+        public event RunWorkerCompletedEventHandler? RunWorkerCompleted;
 
         public bool WorkerReportsProgress
         {
@@ -175,12 +163,12 @@ namespace System.ComponentModel
             }
         }
 
-        private void WorkerThreadStart(object argument)
+        private void WorkerThreadStart(object? argument)
         {
             Debug.Assert(_asyncOperation != null, "_asyncOperation not initialized");
 
-            object workerResult = null;
-            Exception error = null;
+            object? workerResult = null;
+            Exception? error = null;
             bool cancelled = false;
 
             try
index 459adec..e001312 100644 (file)
@@ -4,17 +4,17 @@
 
 namespace System.ComponentModel
 {
-    public delegate void DoWorkEventHandler(object sender, DoWorkEventArgs e);
+    public delegate void DoWorkEventHandler(object? sender, DoWorkEventArgs e);
 
     public class DoWorkEventArgs : CancelEventArgs
     {
-        public DoWorkEventArgs(object argument)
+        public DoWorkEventArgs(object? argument)
         {
             Argument = argument;
         }
 
-        public object Argument { get; }
+        public object? Argument { get; }
 
-        public object Result { get; set; }
+        public object? Result { get; set; }
     }
 }
index 38e697e..a3ce08b 100644 (file)
@@ -9,9 +9,9 @@ namespace System.ComponentModel
     public class ProgressChangedEventArgs : EventArgs
     {
         private readonly int _progressPercentage;
-        private readonly object _userState;
+        private readonly object? _userState;
 
-        public ProgressChangedEventArgs(int progressPercentage, object userState)
+        public ProgressChangedEventArgs(int progressPercentage, object? userState)
         {
             _progressPercentage = progressPercentage;
             _userState = userState;
@@ -25,7 +25,7 @@ namespace System.ComponentModel
             }
         }
 
-        public object UserState
+        public object? UserState
         {
             get
             {
index 21c5a18..707b2f6 100644 (file)
@@ -4,21 +4,21 @@
 
 namespace System.ComponentModel
 {
-    public delegate void RunWorkerCompletedEventHandler(object sender, RunWorkerCompletedEventArgs e);
+    public delegate void RunWorkerCompletedEventHandler(object? sender, RunWorkerCompletedEventArgs e);
 
     public class RunWorkerCompletedEventArgs : AsyncCompletedEventArgs
     {
-        private readonly object _result;
+        private readonly object? _result;
 
-        public RunWorkerCompletedEventArgs(object result,
-                                           Exception error,
+        public RunWorkerCompletedEventArgs(object? result,
+                                           Exception? error,
                                            bool cancelled)
             : base(error, cancelled, null)
         {
             _result = result;
         }
 
-        public object Result
+        public object? Result
         {
             get
             {
@@ -29,7 +29,7 @@ namespace System.ComponentModel
 
         // Hide from editor, since never used.
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public new object UserState
+        public new object? UserState
         {
             get
             {