nullable: number (#23454)
authorKrzysztof Wicher <mordotymoja@gmail.com>
Tue, 26 Mar 2019 16:23:00 +0000 (09:23 -0700)
committerSantiago Fernandez Madero <safern@microsoft.com>
Thu, 28 Mar 2019 00:31:48 +0000 (17:31 -0700)
src/System.Private.CoreLib/shared/System/Number.BigInteger.cs
src/System.Private.CoreLib/shared/System/Number.DiyFp.cs
src/System.Private.CoreLib/shared/System/Number.Dragon4.cs
src/System.Private.CoreLib/shared/System/Number.Formatting.cs
src/System.Private.CoreLib/shared/System/Number.Grisu3.cs
src/System.Private.CoreLib/shared/System/Number.NumberBuffer.cs
src/System.Private.CoreLib/shared/System/Number.NumberToFloatingPointBits.cs
src/System.Private.CoreLib/shared/System/Number.Parsing.cs

index 06ae1e7..33ac49e 100644 (file)
@@ -2,6 +2,7 @@
 // The .NET Foundation licenses this file to you under the MIT license.
 // See the LICENSE file in the project root for more information.
 
+#nullable enable
 using System.Diagnostics;
 using System.Numerics;
 using System.Runtime.InteropServices;
index bb9fc09..5daf2f5 100644 (file)
@@ -2,6 +2,7 @@
 // The .NET Foundation licenses this file to you under the MIT license.
 // See the LICENSE file in the project root for more information.
 
+#nullable enable
 using System.Diagnostics;
 using System.Numerics;
 
index 3070497..0dc6c90 100644 (file)
@@ -2,6 +2,7 @@
 // The .NET Foundation licenses this file to you under the MIT license.
 // See the LICENSE file in the project root for more information.
 
+#nullable enable
 using System.Diagnostics;
 using System.Numerics;
 using Internal.Runtime.CompilerServices;
index 1ae5b65..6f2fb50 100644 (file)
@@ -1,7 +1,8 @@
-// Licensed to the .NET Foundation under one or more agreements.
+// Licensed to the .NET Foundation under one or more agreements.
 // The .NET Foundation licenses this file to you under the MIT license.
 // See the LICENSE file in the project root for more information.
 
+#nullable enable
 using System.Buffers.Text;
 using System.Diagnostics;
 using System.Globalization;
@@ -129,7 +130,7 @@ namespace System
     // user-defined format strings. The following table describes the formatting
     // characters that are supported in user defined format strings.
     //
-    // 
+    //
     // 0 - Digit placeholder. If the value being
     // formatted has a digit in the position where the '0' appears in the format
     // string, then that digit is copied to the output string. Otherwise, a '0' is
@@ -377,7 +378,7 @@ namespace System
             number.CheckConsistency();
         }
 
-        public static string FormatDouble(double value, string format, NumberFormatInfo info)
+        public static string FormatDouble(double value, string? format, NumberFormatInfo info)
         {
             Span<char> stackBuffer = stackalloc char[CharStackBufferSize];
             var sb = new ValueStringBuilder(stackBuffer);
@@ -388,7 +389,7 @@ namespace System
         {
             Span<char> stackBuffer = stackalloc char[CharStackBufferSize];
             var sb = new ValueStringBuilder(stackBuffer);
-            string s = FormatDouble(ref sb, value, format, info);
+            string? s = FormatDouble(ref sb, value, format, info);
             return s != null ?
                 TryCopyTo(s, destination, out charsWritten) :
                 sb.TryCopyTo(destination, out charsWritten);
@@ -445,7 +446,7 @@ namespace System
                 case 'N':
                 case 'n':
                 {
-                    // The fixed-point and number formats use the precision specifier to indicate the number 
+                    // The fixed-point and number formats use the precision specifier to indicate the number
                     // of decimal digits to format. This defaults to NumberFormatInfo.NumberDecimalDigits.
 
                     if (precision == -1)
@@ -519,7 +520,7 @@ namespace System
         /// Non-null if an existing string can be returned, in which case the builder will be unmodified.
         /// Null if no existing string was returned, in which case the formatted output is in the builder.
         /// </returns>
-        private static unsafe string FormatDouble(ref ValueStringBuilder sb, double value, ReadOnlySpan<char> format, NumberFormatInfo info)
+        private static unsafe string? FormatDouble(ref ValueStringBuilder sb, double value, ReadOnlySpan<char> format, NumberFormatInfo info)
         {
             if (!double.IsFinite(value))
             {
@@ -544,7 +545,7 @@ namespace System
             NumberBuffer number = new NumberBuffer(NumberBufferKind.FloatingPoint, pDigits, DoubleNumberBufferLength);
             number.IsNegative = double.IsNegative(value);
 
-            // We need to track the original precision requested since some formats 
+            // We need to track the original precision requested since some formats
             // accept values like 0 and others may require additional fixups.
             int nMaxDigits = GetFloatingPointMaxDigitsAndPrecision(fmt, ref precision, info, out bool isSignificantDigits);
 
@@ -585,7 +586,7 @@ namespace System
             return null;
         }
 
-        public static string FormatSingle(float value, string format, NumberFormatInfo info)
+        public static string FormatSingle(float value, string? format, NumberFormatInfo info)
         {
             Span<char> stackBuffer = stackalloc char[CharStackBufferSize];
             var sb = new ValueStringBuilder(stackBuffer);
@@ -596,7 +597,7 @@ namespace System
         {
             Span<char> stackBuffer = stackalloc char[CharStackBufferSize];
             var sb = new ValueStringBuilder(stackBuffer);
-            string s = FormatSingle(ref sb, value, format, info);
+            string? s = FormatSingle(ref sb, value, format, info);
             return s != null ?
                 TryCopyTo(s, destination, out charsWritten) :
                 sb.TryCopyTo(destination, out charsWritten);
@@ -607,7 +608,7 @@ namespace System
         /// Non-null if an existing string can be returned, in which case the builder will be unmodified.
         /// Null if no existing string was returned, in which case the formatted output is in the builder.
         /// </returns>
-        private static unsafe string FormatSingle(ref ValueStringBuilder sb, float value, ReadOnlySpan<char> format, NumberFormatInfo info)
+        private static unsafe string? FormatSingle(ref ValueStringBuilder sb, float value, ReadOnlySpan<char> format, NumberFormatInfo info)
         {
             if (!float.IsFinite(value))
             {
@@ -632,7 +633,7 @@ namespace System
             NumberBuffer number = new NumberBuffer(NumberBufferKind.FloatingPoint, pDigits, SingleNumberBufferLength);
             number.IsNegative = float.IsNegative(value);
 
-            // We need to track the original precision requested since some formats 
+            // We need to track the original precision requested since some formats
             // accept values like 0 and others may require additional fixups.
             int nMaxDigits = GetFloatingPointMaxDigitsAndPrecision(fmt, ref precision, info, out bool isSignificantDigits);
 
@@ -687,7 +688,7 @@ namespace System
             return false;
         }
 
-        public static unsafe string FormatInt32(int value, ReadOnlySpan<char> format, IFormatProvider provider)
+        public static unsafe string FormatInt32(int value, ReadOnlySpan<char> format, IFormatProvider? provider)
         {
             // Fast path for default format with a non-negative value
             if (value >= 0 && format.Length == 0)
@@ -733,7 +734,7 @@ namespace System
             }
         }
 
-        public static unsafe bool TryFormatInt32(int value, ReadOnlySpan<char> format, IFormatProvider provider, Span<char> destination, out int charsWritten)
+        public static unsafe bool TryFormatInt32(int value, ReadOnlySpan<char> format, IFormatProvider? provider, Span<char> destination, out int charsWritten)
         {
             // Fast path for default format with a non-negative value
             if (value >= 0 && format.Length == 0)
@@ -779,7 +780,7 @@ namespace System
             }
         }
 
-        public static unsafe string FormatUInt32(uint value, ReadOnlySpan<char> format, IFormatProvider provider)
+        public static unsafe string FormatUInt32(uint value, ReadOnlySpan<char> format, IFormatProvider? provider)
         {
             // Fast path for default format
             if (format.Length == 0)
@@ -823,7 +824,7 @@ namespace System
             }
         }
 
-        public static unsafe bool TryFormatUInt32(uint value, ReadOnlySpan<char> format, IFormatProvider provider, Span<char> destination, out int charsWritten)
+        public static unsafe bool TryFormatUInt32(uint value, ReadOnlySpan<char> format, IFormatProvider? provider, Span<char> destination, out int charsWritten)
         {
             // Fast path for default format
             if (format.Length == 0)
@@ -867,7 +868,7 @@ namespace System
             }
         }
 
-        public static unsafe string FormatInt64(long value, ReadOnlySpan<char> format, IFormatProvider provider)
+        public static unsafe string FormatInt64(long value, ReadOnlySpan<char> format, IFormatProvider? provider)
         {
             // Fast path for default format with a non-negative value
             if (value >= 0 && format.Length == 0)
@@ -914,7 +915,7 @@ namespace System
             }
         }
 
-        public static unsafe bool TryFormatInt64(long value, ReadOnlySpan<char> format, IFormatProvider provider, Span<char> destination, out int charsWritten)
+        public static unsafe bool TryFormatInt64(long value, ReadOnlySpan<char> format, IFormatProvider? provider, Span<char> destination, out int charsWritten)
         {
             // Fast path for default format with a non-negative value
             if (value >= 0 && format.Length == 0)
@@ -961,7 +962,7 @@ namespace System
             }
         }
 
-        public static unsafe string FormatUInt64(ulong value, ReadOnlySpan<char> format, IFormatProvider provider)
+        public static unsafe string FormatUInt64(ulong value, ReadOnlySpan<char> format, IFormatProvider? provider)
         {
             // Fast path for default format
             if (format.Length == 0)
@@ -1006,7 +1007,7 @@ namespace System
             }
         }
 
-        public static unsafe bool TryFormatUInt64(ulong value, ReadOnlySpan<char> format, IFormatProvider provider, Span<char> destination, out int charsWritten)
+        public static unsafe bool TryFormatUInt64(ulong value, ReadOnlySpan<char> format, IFormatProvider? provider, Span<char> destination, out int charsWritten)
         {
             // Fast path for default format
             if (format.Length == 0)
@@ -2131,7 +2132,7 @@ namespace System
             }
         }
 
-        private static unsafe void FormatFixed(ref ValueStringBuilder sb, ref NumberBuffer number, int nMaxDigits, NumberFormatInfo info, int[] groupDigits, string sDecimal, string sGroup)
+        private static unsafe void FormatFixed(ref ValueStringBuilder sb, ref NumberBuffer number, int nMaxDigits, NumberFormatInfo? info, int[]? groupDigits, string? sDecimal, string? sGroup)
         {
             int digPos = number.Scale;
             byte* dig = number.GetDigitsPointer();
@@ -2140,6 +2141,7 @@ namespace System
             {
                 if (groupDigits != null)
                 {
+                    Debug.Assert(sGroup != null, "Must be nulll when groupDigits != null");
                     int groupSizeIndex = 0;                             // Index into the groupDigits array.
                     int bufferSize = digPos;                            // The length of the result buffer string.
                     int groupSize = 0;                                  // The current group size.
index 96ec7af..5ff8d46 100644 (file)
@@ -2,6 +2,7 @@
 // The .NET Foundation licenses this file to you under the MIT license.
 // See the LICENSE file in the project root for more information.
 
+#nullable enable
 using System.Diagnostics;
 
 namespace System
index 268bdc7..ccedf41 100644 (file)
@@ -2,6 +2,7 @@
 // The .NET Foundation licenses this file to you under the MIT license.
 // See the LICENSE file in the project root for more information.
 
+#nullable enable
 using System.Diagnostics;
 using System.Text;
 using Internal.Runtime.CompilerServices;
index ac4c772..cfe8ce5 100644 (file)
@@ -2,6 +2,7 @@
 // The .NET Foundation licenses this file to you under the MIT license.
 // See the LICENSE file in the project root for more information.
 
+#nullable enable
 using System.Diagnostics;
 
 namespace System
index fc845a1..3f9f5c1 100644 (file)
@@ -2,6 +2,7 @@
 // The .NET Foundation licenses this file to you under the MIT license.
 // See the LICENSE file in the project root for more information.
 
+#nullable enable
 using System.Diagnostics;
 using System.Globalization;
 using System.Runtime.CompilerServices;
@@ -274,7 +275,7 @@ namespace System
 
             string decSep;                  // decimal separator from NumberFormatInfo.
             string groupSep;                // group separator from NumberFormatInfo.
-            string currSymbol = null;       // currency symbol from NumberFormatInfo.
+            string? currSymbol = null;       // currency symbol from NumberFormatInfo.
 
             bool parsingCurrency = false;
             if ((styles & NumberStyles.AllowCurrencySymbol) != 0)
@@ -529,7 +530,7 @@ namespace System
             int index = 0;
             int num = value[0];
 
-            // Skip past any whitespace at the beginning.  
+            // Skip past any whitespace at the beginning.
             if ((styles & NumberStyles.AllowLeadingWhite) != 0 && IsWhite(num))
             {
                 do
@@ -700,7 +701,7 @@ namespace System
             int index = 0;
             int num = value[0];
 
-            // Skip past any whitespace at the beginning.  
+            // Skip past any whitespace at the beginning.
             if ((styles & NumberStyles.AllowLeadingWhite) != 0 && IsWhite(num))
             {
                 do
@@ -944,7 +945,7 @@ namespace System
             int index = 0;
             int num = value[0];
 
-            // Skip past any whitespace at the beginning.  
+            // Skip past any whitespace at the beginning.
             if ((styles & NumberStyles.AllowLeadingWhite) != 0 && IsWhite(num))
             {
                 do
@@ -1116,7 +1117,7 @@ namespace System
             int num = value[0];
             uint numValue;
 
-            // Skip past any whitespace at the beginning.  
+            // Skip past any whitespace at the beginning.
             if ((styles & NumberStyles.AllowLeadingWhite) != 0 && IsWhite(num))
             {
                 do
@@ -1272,7 +1273,7 @@ namespace System
             int index = 0;
             int num = value[0];
 
-            // Skip past any whitespace at the beginning.  
+            // Skip past any whitespace at the beginning.
             if ((styles & NumberStyles.AllowLeadingWhite) != 0 && IsWhite(num))
             {
                 do
@@ -1444,7 +1445,7 @@ namespace System
             int num = value[0];
             uint numValue;
 
-            // Skip past any whitespace at the beginning.  
+            // Skip past any whitespace at the beginning.
             if ((styles & NumberStyles.AllowLeadingWhite) != 0 && IsWhite(num))
             {
                 do