summaryrefslogtreecommitdiff
path: root/src/System.Private.CoreLib/shared/System/Globalization
diff options
context:
space:
mode:
authorKrzysztof Wicher <mordotymoja@gmail.com>2019-03-28 16:21:31 -0700
committerGitHub <noreply@github.com>2019-03-28 16:21:31 -0700
commitf414bbdebcd361a653191dc2465f7f7d63223ca0 (patch)
tree414d82f46dcc250c30e35a32c563494493ef5f44 /src/System.Private.CoreLib/shared/System/Globalization
parentaba605f9a7e19467c01c486cb99a3184b5528654 (diff)
downloadcoreclr-f414bbdebcd361a653191dc2465f7f7d63223ca0.tar.gz
coreclr-f414bbdebcd361a653191dc2465f7f7d63223ca0.tar.bz2
coreclr-f414bbdebcd361a653191dc2465f7f7d63223ca0.zip
Nullable: NumberFormatInfo, CultureInfo (#23459)
* Nullable: NumberFormatInfo, CultureInfo * fix build * fix windows * fix APPX issue * another appx failure * get rid of line split * mark retVal as nullable
Diffstat (limited to 'src/System.Private.CoreLib/shared/System/Globalization')
-rw-r--r--src/System.Private.CoreLib/shared/System/Globalization/CultureInfo.Unix.cs3
-rw-r--r--src/System.Private.CoreLib/shared/System/Globalization/CultureInfo.Windows.cs5
-rw-r--r--src/System.Private.CoreLib/shared/System/Globalization/CultureInfo.cs134
-rw-r--r--src/System.Private.CoreLib/shared/System/Globalization/NumberFormatInfo.cs10
4 files changed, 70 insertions, 82 deletions
diff --git a/src/System.Private.CoreLib/shared/System/Globalization/CultureInfo.Unix.cs b/src/System.Private.CoreLib/shared/System/Globalization/CultureInfo.Unix.cs
index 0b897c878e..d7adc02633 100644
--- a/src/System.Private.CoreLib/shared/System/Globalization/CultureInfo.Unix.cs
+++ b/src/System.Private.CoreLib/shared/System/Globalization/CultureInfo.Unix.cs
@@ -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
namespace System.Globalization
{
public partial class CultureInfo : IFormatProvider
@@ -11,7 +12,7 @@ namespace System.Globalization
if (GlobalizationMode.Invariant)
return CultureInfo.InvariantCulture;
- CultureInfo cultureInfo = null;
+ CultureInfo cultureInfo;
string localeName;
if (CultureData.GetDefaultLocaleName(out localeName))
{
diff --git a/src/System.Private.CoreLib/shared/System/Globalization/CultureInfo.Windows.cs b/src/System.Private.CoreLib/shared/System/Globalization/CultureInfo.Windows.cs
index c5479deac5..72db2db9ac 100644
--- a/src/System.Private.CoreLib/shared/System/Globalization/CultureInfo.Windows.cs
+++ b/src/System.Private.CoreLib/shared/System/Globalization/CultureInfo.Windows.cs
@@ -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
#if FEATURE_APPX
using System.Resources;
using Internal.Resources;
@@ -69,7 +70,7 @@ namespace System.Globalization
}
#if FEATURE_APPX
- internal static CultureInfo GetCultureInfoForUserPreferredLanguageInAppX()
+ internal static CultureInfo? GetCultureInfoForUserPreferredLanguageInAppX()
{
// If a call to GetCultureInfoForUserPreferredLanguageInAppX() generated a recursive
// call to itself, return null, since we don't want to stack overflow. For example,
@@ -81,7 +82,7 @@ namespace System.Globalization
return null;
}
- CultureInfo toReturn = null;
+ CultureInfo toReturn;
try
{
diff --git a/src/System.Private.CoreLib/shared/System/Globalization/CultureInfo.cs b/src/System.Private.CoreLib/shared/System/Globalization/CultureInfo.cs
index 1b22676bad..c02a2ed537 100644
--- a/src/System.Private.CoreLib/shared/System/Globalization/CultureInfo.cs
+++ b/src/System.Private.CoreLib/shared/System/Globalization/CultureInfo.cs
@@ -26,6 +26,7 @@
//
////////////////////////////////////////////////////////////////////////////
+#nullable enable
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;
@@ -59,11 +60,11 @@ namespace System.Globalization
// We use the _cultureData to get the data for our object
private bool _isReadOnly;
- private CompareInfo _compareInfo;
- private TextInfo _textInfo;
- internal NumberFormatInfo _numInfo;
- internal DateTimeFormatInfo _dateTimeInfo;
- private Calendar _calendar;
+ private CompareInfo? _compareInfo;
+ private TextInfo? _textInfo;
+ internal NumberFormatInfo? _numInfo;
+ internal DateTimeFormatInfo? _dateTimeInfo;
+ private Calendar? _calendar;
//
// The CultureData instance that we are going to read data from.
// For supported culture, this will be the CultureData instance that read data from mscorlib assembly.
@@ -73,7 +74,7 @@ namespace System.Globalization
internal bool _isInherited;
- private CultureInfo _consoleFallbackCulture;
+ private CultureInfo? _consoleFallbackCulture;
// Names are confusing. Here are 3 names we have:
//
@@ -91,18 +92,18 @@ namespace System.Globalization
// This will hold the non sorting name to be returned from CultureInfo.Name property.
// This has a de-DE style name even for de-DE_phoneb type cultures
- private string _nonSortName;
+ private string? _nonSortName;
// This will hold the sorting name to be returned from CultureInfo.SortName property.
// This might be completely unrelated to the culture name if a custom culture. Ie en-US for fj-FJ.
// Otherwise its the sort name, ie: de-DE or de-DE_phoneb
- private string _sortName;
+ private string? _sortName;
// Get the current user default culture. This one is almost always used, so we create it by default.
- private static volatile CultureInfo s_userDefaultCulture;
+ private static volatile CultureInfo? s_userDefaultCulture;
//The culture used in the user interface. This is mostly used to load correct localized resources.
- private static volatile CultureInfo s_userDefaultUICulture;
+ private static volatile CultureInfo? s_userDefaultUICulture;
// WARNING: We allow diagnostic tools to directly inspect these three members (s_InvariantCultureInfo, s_DefaultThreadCurrentUICulture and s_DefaultThreadCurrentCulture)
// See https://github.com/dotnet/corert/blob/master/Documentation/design-docs/diagnostics/diagnostics-tools-contract.md for more details.
@@ -113,16 +114,16 @@ namespace System.Globalization
private static readonly CultureInfo s_InvariantCultureInfo = new CultureInfo(CultureData.Invariant, isReadOnly: true);
// These are defaults that we use if a thread has not opted into having an explicit culture
- private static volatile CultureInfo s_DefaultThreadCurrentUICulture;
- private static volatile CultureInfo s_DefaultThreadCurrentCulture;
+ private static volatile CultureInfo? s_DefaultThreadCurrentUICulture;
+ private static volatile CultureInfo? s_DefaultThreadCurrentCulture;
[ThreadStatic]
private static CultureInfo s_currentThreadCulture;
[ThreadStatic]
private static CultureInfo s_currentThreadUICulture;
- private static AsyncLocal<CultureInfo> s_asyncLocalCurrentCulture;
- private static AsyncLocal<CultureInfo> s_asyncLocalCurrentUICulture;
+ private static AsyncLocal<CultureInfo>? s_asyncLocalCurrentCulture;
+ private static AsyncLocal<CultureInfo>? s_asyncLocalCurrentUICulture;
private static void AsyncLocalSetCurrentCulture(AsyncLocalValueChangedArgs<CultureInfo> args)
{
@@ -135,11 +136,11 @@ namespace System.Globalization
}
private static readonly object _lock = new object();
- private static volatile Dictionary<string, CultureInfo> s_NameCachedCultures;
- private static volatile Dictionary<int, CultureInfo> s_LcidCachedCultures;
+ private static volatile Dictionary<string, CultureInfo>? s_NameCachedCultures;
+ private static volatile Dictionary<int, CultureInfo>? s_LcidCachedCultures;
// The parent culture.
- private CultureInfo _parent;
+ private CultureInfo? _parent;
// LOCALE constants of interest to us internally and privately for LCID functions
// (ie: avoid using these and use names if possible)
@@ -153,13 +154,13 @@ namespace System.Globalization
private static CultureInfo InitializeUserDefaultCulture()
{
Interlocked.CompareExchange(ref s_userDefaultCulture, GetUserDefaultCulture(), null);
- return s_userDefaultCulture;
+ return s_userDefaultCulture!;
}
private static CultureInfo InitializeUserDefaultUICulture()
{
Interlocked.CompareExchange(ref s_userDefaultUICulture, GetUserDefaultUICulture(), null);
- return s_userDefaultUICulture;
+ return s_userDefaultUICulture!;
}
public CultureInfo(string name) : this(name, true)
@@ -194,10 +195,10 @@ namespace System.Globalization
_isReadOnly = isReadOnly;
}
- private static CultureInfo CreateCultureInfoNoThrow(string name, bool useUserOverride)
+ private static CultureInfo? CreateCultureInfoNoThrow(string name, bool useUserOverride)
{
Debug.Assert(name != null);
- CultureData cultureData = CultureData.GetCultureData(name, useUserOverride);
+ CultureData? cultureData = CultureData.GetCultureData(name, useUserOverride);
if (cultureData == null)
{
return null;
@@ -295,7 +296,7 @@ namespace System.Globalization
/// </summary>
public static CultureInfo CreateSpecificCulture(string name)
{
- CultureInfo culture;
+ CultureInfo? culture;
try
{
@@ -403,24 +404,16 @@ namespace System.Globalization
#if FEATURE_APPX
if (ApplicationModel.IsUap)
{
- CultureInfo culture = GetCultureInfoForUserPreferredLanguageInAppX();
+ CultureInfo? culture = GetCultureInfoForUserPreferredLanguageInAppX();
if (culture != null)
return culture;
}
#endif
- if (s_currentThreadCulture != null)
- {
- return s_currentThreadCulture;
- }
-
- CultureInfo ci = s_DefaultThreadCurrentCulture;
- if (ci != null)
- {
- return ci;
- }
-
- return s_userDefaultCulture ?? InitializeUserDefaultCulture();
+ return s_currentThreadCulture ??
+ s_DefaultThreadCurrentCulture ??
+ s_userDefaultCulture ??
+ InitializeUserDefaultCulture();
}
set
{
@@ -452,7 +445,7 @@ namespace System.Globalization
{
Interlocked.CompareExchange(ref s_asyncLocalCurrentCulture, new AsyncLocal<CultureInfo>(AsyncLocalSetCurrentCulture), null);
}
- s_asyncLocalCurrentCulture.Value = value;
+ s_asyncLocalCurrentCulture!.Value = value;
}
}
@@ -470,24 +463,15 @@ namespace System.Globalization
#if FEATURE_APPX
if (ApplicationModel.IsUap)
{
- CultureInfo culture = GetCultureInfoForUserPreferredLanguageInAppX();
+ CultureInfo? culture = GetCultureInfoForUserPreferredLanguageInAppX();
if (culture != null)
return culture;
}
#endif
- if (s_currentThreadUICulture != null)
- {
- return s_currentThreadUICulture;
- }
-
- CultureInfo ci = s_DefaultThreadCurrentUICulture;
- if (ci != null)
- {
- return ci;
- }
-
- return UserDefaultUICulture;
+ return s_currentThreadUICulture ??
+ s_DefaultThreadCurrentUICulture ??
+ UserDefaultUICulture;
}
set
{
@@ -523,7 +507,7 @@ namespace System.Globalization
}
// this one will set s_currentThreadUICulture too
- s_asyncLocalCurrentUICulture.Value = value;
+ s_asyncLocalCurrentUICulture!.Value = value;
}
}
@@ -531,7 +515,7 @@ namespace System.Globalization
public static CultureInfo InstalledUICulture => s_userDefaultCulture ?? InitializeUserDefaultCulture();
- public static CultureInfo DefaultThreadCurrentCulture
+ public static CultureInfo? DefaultThreadCurrentCulture
{
get => s_DefaultThreadCurrentCulture;
set
@@ -542,7 +526,7 @@ namespace System.Globalization
}
}
- public static CultureInfo DefaultThreadCurrentUICulture
+ public static CultureInfo? DefaultThreadCurrentUICulture
{
get => s_DefaultThreadCurrentUICulture;
set
@@ -588,7 +572,7 @@ namespace System.Globalization
{
if (_parent == null)
{
- CultureInfo culture = null;
+ CultureInfo culture;
string parentName = _cultureData.ParentName;
if (string.IsNullOrEmpty(parentName))
@@ -597,19 +581,16 @@ namespace System.Globalization
}
else
{
- culture = CreateCultureInfoNoThrow(parentName, _cultureData.UseUserOverride);
- if (culture == null)
- {
+ culture = CreateCultureInfoNoThrow(parentName, _cultureData.UseUserOverride) ??
// For whatever reason our IPARENT or SPARENT wasn't correct, so use invariant
// We can't allow ourselves to fail. In case of custom cultures the parent of the
// current custom culture isn't installed.
- culture = InvariantCulture;
- }
+ InvariantCulture;
}
- Interlocked.CompareExchange<CultureInfo>(ref _parent, culture, null);
+ Interlocked.CompareExchange<CultureInfo?>(ref _parent, culture, null);
}
- return _parent;
+ return _parent!;
}
}
@@ -760,7 +741,7 @@ namespace System.Globalization
}
}
- public override bool Equals(object value)
+ public override bool Equals(object? value)
{
if (object.ReferenceEquals(this, value))
{
@@ -789,7 +770,7 @@ namespace System.Globalization
/// </summary>
public override string ToString() => _name;
- public virtual object GetFormat(Type formatType)
+ public virtual object? GetFormat(Type? formatType)
{
if (formatType == typeof(NumberFormatInfo))
{
@@ -844,7 +825,7 @@ namespace System.Globalization
temp._isReadOnly = _isReadOnly;
Interlocked.CompareExchange(ref _numInfo, temp, null);
}
- return _numInfo;
+ return _numInfo!;
}
set
{
@@ -873,7 +854,7 @@ namespace System.Globalization
temp._isReadOnly = _isReadOnly;
Interlocked.CompareExchange(ref _dateTimeInfo, temp, null);
}
- return _dateTimeInfo;
+ return _dateTimeInfo!;
}
set
@@ -1005,7 +986,7 @@ namespace System.Globalization
public CultureInfo GetConsoleFallbackUICulture()
{
- CultureInfo temp = _consoleFallbackCulture;
+ CultureInfo? temp = _consoleFallbackCulture;
if (temp == null)
{
temp = CreateSpecificCulture(_cultureData.SCONSOLEFALLBACKNAME);
@@ -1129,13 +1110,13 @@ namespace System.Globalization
/// Helper function overloads of GetCachedReadOnlyCulture. If lcid is 0, we use the name.
/// If lcid is -1, use the altName and create one of those special SQL cultures.
/// </summary>
- internal static CultureInfo GetCultureInfoHelper(int lcid, string name, string altName)
+ internal static CultureInfo? GetCultureInfoHelper(int lcid, string? name, string? altName)
{
// retval is our return value.
- CultureInfo retval;
+ CultureInfo? retval;
// Temporary hashtable for the names.
- Dictionary<string, CultureInfo> tempNameHT = s_NameCachedCultures;
+ Dictionary<string, CultureInfo>? tempNameHT = s_NameCachedCultures;
if (name != null)
{
@@ -1157,10 +1138,11 @@ namespace System.Globalization
// If we are called by name, check if the object exists in the hashtable. If so, return it.
if (lcid == -1 || lcid == 0)
{
+ Debug.Assert(name != null && (lcid != -1 || altName != null));
bool ret;
lock (_lock)
{
- ret = tempNameHT.TryGetValue(lcid == 0 ? name : name + '\xfffd' + altName, out retval);
+ ret = tempNameHT.TryGetValue(lcid == 0 ? name! : name! + '\xfffd' + altName!, out retval);
}
if (ret && retval != null)
@@ -1171,7 +1153,7 @@ namespace System.Globalization
}
// Next, the Lcid table.
- Dictionary<int, CultureInfo> tempLcidHT = s_LcidCachedCultures;
+ Dictionary<int, CultureInfo>? tempLcidHT = s_LcidCachedCultures;
if (tempLcidHT == null)
{
@@ -1203,11 +1185,13 @@ namespace System.Globalization
{
case -1:
// call the private constructor
- retval = new CultureInfo(name, altName);
+ Debug.Assert(name != null && altName != null);
+ retval = new CultureInfo(name!, altName!);
break;
case 0:
- retval = new CultureInfo(name, false);
+ Debug.Assert(name != null);
+ retval = new CultureInfo(name!, false);
break;
default:
@@ -1280,7 +1264,7 @@ namespace System.Globalization
{
throw new ArgumentOutOfRangeException(nameof(culture), SR.ArgumentOutOfRange_NeedPosNum);
}
- CultureInfo retval = GetCultureInfoHelper(culture, null, null);
+ CultureInfo? retval = GetCultureInfoHelper(culture, null, null);
if (null == retval)
{
throw new CultureNotFoundException(nameof(culture), culture, SR.Argument_CultureNotSupported);
@@ -1300,7 +1284,7 @@ namespace System.Globalization
throw new ArgumentNullException(nameof(name));
}
- CultureInfo retval = GetCultureInfoHelper(0, name, null);
+ CultureInfo? retval = GetCultureInfoHelper(0, name, null);
if (retval == null)
{
throw new CultureNotFoundException(
@@ -1324,7 +1308,7 @@ namespace System.Globalization
throw new ArgumentNullException(nameof(altName));
}
- CultureInfo retval = GetCultureInfoHelper(-1, name, altName);
+ CultureInfo? retval = GetCultureInfoHelper(-1, name, altName);
if (retval == null)
{
throw new CultureNotFoundException("name or altName",
diff --git a/src/System.Private.CoreLib/shared/System/Globalization/NumberFormatInfo.cs b/src/System.Private.CoreLib/shared/System/Globalization/NumberFormatInfo.cs
index 09030b9e07..a312d29951 100644
--- a/src/System.Private.CoreLib/shared/System/Globalization/NumberFormatInfo.cs
+++ b/src/System.Private.CoreLib/shared/System/Globalization/NumberFormatInfo.cs
@@ -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
namespace System.Globalization
{
/// <remarks>
@@ -205,7 +206,7 @@ namespace System.Globalization
}
}
- public static NumberFormatInfo GetInstance(IFormatProvider formatProvider)
+ public static NumberFormatInfo GetInstance(IFormatProvider? formatProvider)
{
return formatProvider == null ?
CurrentInfo : // Fast path for a null provider
@@ -384,13 +385,14 @@ namespace System.Globalization
System.Globalization.CultureInfo culture = CultureInfo.CurrentCulture;
if (!culture._isInherited)
{
- NumberFormatInfo info = culture._numInfo;
+ NumberFormatInfo? info = culture._numInfo;
if (info != null)
{
return info;
}
}
- return ((NumberFormatInfo)culture.GetFormat(typeof(NumberFormatInfo)));
+ // returns non-nullable when passed typeof(NumberFormatInfo)
+ return (NumberFormatInfo)culture.GetFormat(typeof(NumberFormatInfo))!;
}
}
@@ -700,7 +702,7 @@ namespace System.Globalization
}
}
- public object GetFormat(Type formatType)
+ public object? GetFormat(Type? formatType)
{
return formatType == typeof(NumberFormatInfo) ? this : null;
}