Skip to content

Commit 1381d5e

Browse files
committed
Merge in 'release/8.0' changes
2 parents 441c91d + c987e4f commit 1381d5e

11 files changed

+374
-280
lines changed

src/libraries/Microsoft.Extensions.Options/gen/Emitter.cs

+45-38
Original file line numberDiff line numberDiff line change
@@ -382,26 +382,26 @@ public void EmitRangeAttribute(string modifier, string prefix, string className,
382382

383383
string initializationString = emitTimeSpanSupport ?
384384
"""
385-
if (OperandType == typeof(global::System.TimeSpan))
386-
{
387-
if (!global::System.TimeSpan.TryParse((string)Minimum, culture, out global::System.TimeSpan timeSpanMinimum) ||
388-
!global::System.TimeSpan.TryParse((string)Maximum, culture, out global::System.TimeSpan timeSpanMaximum))
389-
{
390-
throw new global::System.InvalidOperationException(c_minMaxError);
391-
}
392-
Minimum = timeSpanMinimum;
393-
Maximum = timeSpanMaximum;
394-
}
395-
else
396-
{
397-
Minimum = ConvertValue(Minimum, culture) ?? throw new global::System.InvalidOperationException(c_minMaxError);
398-
Maximum = ConvertValue(Maximum, culture) ?? throw new global::System.InvalidOperationException(c_minMaxError);
399-
}
385+
if (OperandType == typeof(global::System.TimeSpan))
386+
{
387+
if (!global::System.TimeSpan.TryParse((string)Minimum, culture, out global::System.TimeSpan timeSpanMinimum) ||
388+
!global::System.TimeSpan.TryParse((string)Maximum, culture, out global::System.TimeSpan timeSpanMaximum))
389+
{
390+
throw new global::System.InvalidOperationException(MinMaxError);
391+
}
392+
Minimum = timeSpanMinimum;
393+
Maximum = timeSpanMaximum;
394+
}
395+
else
396+
{
397+
Minimum = ConvertValue(Minimum, culture) ?? throw new global::System.InvalidOperationException(MinMaxError);
398+
Maximum = ConvertValue(Maximum, culture) ?? throw new global::System.InvalidOperationException(MinMaxError);
399+
}
400400
"""
401401
:
402402
"""
403-
Minimum = ConvertValue(Minimum, culture) ?? throw new global::System.InvalidOperationException(c_minMaxError);
404-
Maximum = ConvertValue(Maximum, culture) ?? throw new global::System.InvalidOperationException(c_minMaxError);
403+
Minimum = ConvertValue(Minimum, culture) ?? throw new global::System.InvalidOperationException(MinMaxError);
404+
Maximum = ConvertValue(Maximum, culture) ?? throw new global::System.InvalidOperationException(MinMaxError);
405405
""";
406406

407407
string convertValue = emitTimeSpanSupport ?
@@ -470,7 +470,7 @@ public void EmitRangeAttribute(string modifier, string prefix, string className,
470470
public {{qualifiedClassName}}(global::System.Type type, string minimum, string maximum) : base()
471471
{
472472
OperandType = type;
473-
NeedToConvertMinMax = true;
473+
_needToConvertMinMax = true;
474474
Minimum = minimum;
475475
Maximum = maximum;
476476
}
@@ -483,33 +483,40 @@ public void EmitRangeAttribute(string modifier, string prefix, string className,
483483
public bool ConvertValueInInvariantCulture { get; set; }
484484
public override string FormatErrorMessage(string name) =>
485485
string.Format(global::System.Globalization.CultureInfo.CurrentCulture, GetValidationErrorMessage(), name, Minimum, Maximum);
486-
private bool NeedToConvertMinMax { get; }
487-
private bool Initialized { get; set; }
488-
private const string c_minMaxError = "The minimum and maximum values must be set to valid values.";
486+
private readonly bool _needToConvertMinMax;
487+
private volatile bool _initialized;
488+
private readonly object _lock = new();
489+
private const string MinMaxError = "The minimum and maximum values must be set to valid values.";
489490
490491
public override bool IsValid(object? value)
491492
{
492-
if (!Initialized)
493+
if (!_initialized)
493494
{
494-
if (Minimum is null || Maximum is null)
495-
{
496-
throw new global::System.InvalidOperationException(c_minMaxError);
497-
}
498-
if (NeedToConvertMinMax)
495+
lock (_lock)
499496
{
500-
System.Globalization.CultureInfo culture = ParseLimitsInInvariantCulture ? global::System.Globalization.CultureInfo.InvariantCulture : global::System.Globalization.CultureInfo.CurrentCulture;
497+
if (!_initialized)
498+
{
499+
if (Minimum is null || Maximum is null)
500+
{
501+
throw new global::System.InvalidOperationException(MinMaxError);
502+
}
503+
if (_needToConvertMinMax)
504+
{
505+
System.Globalization.CultureInfo culture = ParseLimitsInInvariantCulture ? global::System.Globalization.CultureInfo.InvariantCulture : global::System.Globalization.CultureInfo.CurrentCulture;
501506
{{initializationString}}
507+
}
508+
int cmp = ((global::System.IComparable)Minimum).CompareTo((global::System.IComparable)Maximum);
509+
if (cmp > 0)
510+
{
511+
throw new global::System.InvalidOperationException("The maximum value '{Maximum}' must be greater than or equal to the minimum value '{Minimum}'.");
512+
}
513+
else if (cmp == 0 && (MinimumIsExclusive || MaximumIsExclusive))
514+
{
515+
throw new global::System.InvalidOperationException("Cannot use exclusive bounds when the maximum value is equal to the minimum value.");
516+
}
517+
_initialized = true;
518+
}
502519
}
503-
int cmp = ((global::System.IComparable)Minimum).CompareTo((global::System.IComparable)Maximum);
504-
if (cmp > 0)
505-
{
506-
throw new global::System.InvalidOperationException("The maximum value '{Maximum}' must be greater than or equal to the minimum value '{Minimum}'.");
507-
}
508-
else if (cmp == 0 && (MinimumIsExclusive || MaximumIsExclusive))
509-
{
510-
throw new global::System.InvalidOperationException("Cannot use exclusive bounds when the maximum value is equal to the minimum value.");
511-
}
512-
Initialized = true;
513520
}
514521
515522
if (value is null or string { Length: 0 })

src/libraries/Microsoft.Extensions.Options/src/Microsoft.Extensions.Options.csproj

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
<TargetFrameworks>$(NetCoreAppCurrent);$(NetCoreAppPrevious);$(NetCoreAppMinimum);netstandard2.1;netstandard2.0;$(NetFrameworkMinimum)</TargetFrameworks>
55
<EnableDefaultItems>true</EnableDefaultItems>
66
<IsPackable>true</IsPackable>
7-
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
8-
<ServicingVersion>1</ServicingVersion>
7+
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
8+
<ServicingVersion>2</ServicingVersion>
99
<PackageDescription>Provides a strongly typed way of specifying and accessing settings using dependency injection.</PackageDescription>
1010
</PropertyGroup>
1111

src/libraries/Microsoft.Extensions.Options/tests/SourceGeneration.Unit.Tests/Baselines/EmitterWithCustomValidator.netcore.g.cs

+30-23
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public __SourceGen__RangeAttribute(double minimum, double maximum) : base()
8484
public __SourceGen__RangeAttribute(global::System.Type type, string minimum, string maximum) : base()
8585
{
8686
OperandType = type;
87-
NeedToConvertMinMax = true;
87+
_needToConvertMinMax = true;
8888
Minimum = minimum;
8989
Maximum = maximum;
9090
}
@@ -97,34 +97,41 @@ public __SourceGen__RangeAttribute(global::System.Type type, string minimum, str
9797
public bool ConvertValueInInvariantCulture { get; set; }
9898
public override string FormatErrorMessage(string name) =>
9999
string.Format(global::System.Globalization.CultureInfo.CurrentCulture, GetValidationErrorMessage(), name, Minimum, Maximum);
100-
private bool NeedToConvertMinMax { get; }
101-
private bool Initialized { get; set; }
102-
private const string c_minMaxError = "The minimum and maximum values must be set to valid values.";
100+
private readonly bool _needToConvertMinMax;
101+
private volatile bool _initialized;
102+
private readonly object _lock = new();
103+
private const string MinMaxError = "The minimum and maximum values must be set to valid values.";
103104

104105
public override bool IsValid(object? value)
105106
{
106-
if (!Initialized)
107+
if (!_initialized)
107108
{
108-
if (Minimum is null || Maximum is null)
109+
lock (_lock)
109110
{
110-
throw new global::System.InvalidOperationException(c_minMaxError);
111+
if (!_initialized)
112+
{
113+
if (Minimum is null || Maximum is null)
114+
{
115+
throw new global::System.InvalidOperationException(MinMaxError);
116+
}
117+
if (_needToConvertMinMax)
118+
{
119+
System.Globalization.CultureInfo culture = ParseLimitsInInvariantCulture ? global::System.Globalization.CultureInfo.InvariantCulture : global::System.Globalization.CultureInfo.CurrentCulture;
120+
Minimum = ConvertValue(Minimum, culture) ?? throw new global::System.InvalidOperationException(MinMaxError);
121+
Maximum = ConvertValue(Maximum, culture) ?? throw new global::System.InvalidOperationException(MinMaxError);
122+
}
123+
int cmp = ((global::System.IComparable)Minimum).CompareTo((global::System.IComparable)Maximum);
124+
if (cmp > 0)
125+
{
126+
throw new global::System.InvalidOperationException("The maximum value '{Maximum}' must be greater than or equal to the minimum value '{Minimum}'.");
127+
}
128+
else if (cmp == 0 && (MinimumIsExclusive || MaximumIsExclusive))
129+
{
130+
throw new global::System.InvalidOperationException("Cannot use exclusive bounds when the maximum value is equal to the minimum value.");
131+
}
132+
_initialized = true;
133+
}
111134
}
112-
if (NeedToConvertMinMax)
113-
{
114-
System.Globalization.CultureInfo culture = ParseLimitsInInvariantCulture ? global::System.Globalization.CultureInfo.InvariantCulture : global::System.Globalization.CultureInfo.CurrentCulture;
115-
Minimum = ConvertValue(Minimum, culture) ?? throw new global::System.InvalidOperationException(c_minMaxError);
116-
Maximum = ConvertValue(Maximum, culture) ?? throw new global::System.InvalidOperationException(c_minMaxError);
117-
}
118-
int cmp = ((global::System.IComparable)Minimum).CompareTo((global::System.IComparable)Maximum);
119-
if (cmp > 0)
120-
{
121-
throw new global::System.InvalidOperationException("The maximum value '{Maximum}' must be greater than or equal to the minimum value '{Minimum}'.");
122-
}
123-
else if (cmp == 0 && (MinimumIsExclusive || MaximumIsExclusive))
124-
{
125-
throw new global::System.InvalidOperationException("Cannot use exclusive bounds when the maximum value is equal to the minimum value.");
126-
}
127-
Initialized = true;
128135
}
129136

130137
if (value is null or string { Length: 0 })

src/libraries/Microsoft.Extensions.Options/tests/SourceGeneration.Unit.Tests/Baselines/EmitterWithCustomValidator.netfx.g.cs

+30-23
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public __SourceGen__RangeAttribute(double minimum, double maximum) : base()
8282
public __SourceGen__RangeAttribute(global::System.Type type, string minimum, string maximum) : base()
8383
{
8484
OperandType = type;
85-
NeedToConvertMinMax = true;
85+
_needToConvertMinMax = true;
8686
Minimum = minimum;
8787
Maximum = maximum;
8888
}
@@ -95,34 +95,41 @@ public __SourceGen__RangeAttribute(global::System.Type type, string minimum, str
9595
public bool ConvertValueInInvariantCulture { get; set; }
9696
public override string FormatErrorMessage(string name) =>
9797
string.Format(global::System.Globalization.CultureInfo.CurrentCulture, GetValidationErrorMessage(), name, Minimum, Maximum);
98-
private bool NeedToConvertMinMax { get; }
99-
private bool Initialized { get; set; }
100-
private const string c_minMaxError = "The minimum and maximum values must be set to valid values.";
98+
private readonly bool _needToConvertMinMax;
99+
private volatile bool _initialized;
100+
private readonly object _lock = new();
101+
private const string MinMaxError = "The minimum and maximum values must be set to valid values.";
101102

102103
public override bool IsValid(object? value)
103104
{
104-
if (!Initialized)
105+
if (!_initialized)
105106
{
106-
if (Minimum is null || Maximum is null)
107+
lock (_lock)
107108
{
108-
throw new global::System.InvalidOperationException(c_minMaxError);
109+
if (!_initialized)
110+
{
111+
if (Minimum is null || Maximum is null)
112+
{
113+
throw new global::System.InvalidOperationException(MinMaxError);
114+
}
115+
if (_needToConvertMinMax)
116+
{
117+
System.Globalization.CultureInfo culture = ParseLimitsInInvariantCulture ? global::System.Globalization.CultureInfo.InvariantCulture : global::System.Globalization.CultureInfo.CurrentCulture;
118+
Minimum = ConvertValue(Minimum, culture) ?? throw new global::System.InvalidOperationException(MinMaxError);
119+
Maximum = ConvertValue(Maximum, culture) ?? throw new global::System.InvalidOperationException(MinMaxError);
120+
}
121+
int cmp = ((global::System.IComparable)Minimum).CompareTo((global::System.IComparable)Maximum);
122+
if (cmp > 0)
123+
{
124+
throw new global::System.InvalidOperationException("The maximum value '{Maximum}' must be greater than or equal to the minimum value '{Minimum}'.");
125+
}
126+
else if (cmp == 0 && (MinimumIsExclusive || MaximumIsExclusive))
127+
{
128+
throw new global::System.InvalidOperationException("Cannot use exclusive bounds when the maximum value is equal to the minimum value.");
129+
}
130+
_initialized = true;
131+
}
109132
}
110-
if (NeedToConvertMinMax)
111-
{
112-
System.Globalization.CultureInfo culture = ParseLimitsInInvariantCulture ? global::System.Globalization.CultureInfo.InvariantCulture : global::System.Globalization.CultureInfo.CurrentCulture;
113-
Minimum = ConvertValue(Minimum, culture) ?? throw new global::System.InvalidOperationException(c_minMaxError);
114-
Maximum = ConvertValue(Maximum, culture) ?? throw new global::System.InvalidOperationException(c_minMaxError);
115-
}
116-
int cmp = ((global::System.IComparable)Minimum).CompareTo((global::System.IComparable)Maximum);
117-
if (cmp > 0)
118-
{
119-
throw new global::System.InvalidOperationException("The maximum value '{Maximum}' must be greater than or equal to the minimum value '{Minimum}'.");
120-
}
121-
else if (cmp == 0 && (MinimumIsExclusive || MaximumIsExclusive))
122-
{
123-
throw new global::System.InvalidOperationException("Cannot use exclusive bounds when the maximum value is equal to the minimum value.");
124-
}
125-
Initialized = true;
126133
}
127134

128135
if (value is null or string { Length: 0 })

0 commit comments

Comments
 (0)