Skip to content

Commit 587ebac

Browse files
committed
chore: enable nullable for job/characteristics relating code
1 parent 0767efe commit 587ebac

20 files changed

+129
-86
lines changed

src/BenchmarkDotNet/Characteristics/Characteristic.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
using System.Diagnostics.CodeAnalysis;
33
using static BenchmarkDotNet.Characteristics.CharacteristicHelper;
44

5+
#nullable enable
6+
57
namespace BenchmarkDotNet.Characteristics
68
{
79
public abstract class Characteristic
@@ -24,7 +26,7 @@ public abstract class Characteristic
2426
null, fallbackValue,
2527
false);
2628

27-
public static Characteristic<T> Create<TOwner, [DynamicallyAccessedMembers(CharacteristicObject.CharacteristicMemberTypes)] T>(string memberName, Func<CharacteristicObject, T, T> resolver, T fallbackValue, bool ignoreOnApply)
29+
public static Characteristic<T> Create<TOwner, [DynamicallyAccessedMembers(CharacteristicObject.CharacteristicMemberTypes)] T>(string memberName, Func<CharacteristicObject, T?, T> resolver, T fallbackValue, bool ignoreOnApply)
2830
where TOwner : CharacteristicObject
2931
=> new Characteristic<T>(
3032
memberName,
@@ -52,7 +54,7 @@ protected Characteristic(
5254
string id,
5355
[DynamicallyAccessedMembers(CharacteristicObject.CharacteristicMemberTypes)] Type characteristicType,
5456
Type declaringType,
55-
object fallbackValue,
57+
object? fallbackValue,
5658
bool ignoreOnApply,
5759
bool dontShowInSummary = false)
5860
{
@@ -84,7 +86,7 @@ protected Characteristic(
8486

8587
public Type DeclaringType { get; }
8688

87-
private object FallbackValue { get; }
89+
private object? FallbackValue { get; }
8890

8991
public object? this[CharacteristicObject obj]
9092
{
@@ -94,7 +96,7 @@ public object? this[CharacteristicObject obj]
9496

9597
public bool HasChildCharacteristics => IsCharacteristicObjectSubclass(CharacteristicType);
9698

97-
internal virtual object ResolveValueCore(CharacteristicObject obj, object currentValue) =>
99+
internal virtual object? ResolveValueCore(CharacteristicObject obj, object currentValue) =>
98100
ReferenceEquals(currentValue, EmptyValue) ? FallbackValue : currentValue;
99101

100102
public override string ToString() => Id;

src/BenchmarkDotNet/Characteristics/CharacteristicHelper.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
using System.Reflection;
77
using JetBrains.Annotations;
88

9+
#nullable enable
10+
911
namespace BenchmarkDotNet.Characteristics
1012
{
1113
public static class CharacteristicHelper
@@ -54,12 +56,12 @@ private static IReadOnlyList<Characteristic> GetThisTypeCharacteristicsCore(
5456
var fieldValues = characteristicObjectType.GetTypeInfo()
5557
.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy | BindingFlags.Static)
5658
.Where(f => IsCharacteristicSubclass(f.FieldType))
57-
.Select(f => AssertHasValue(f, (Characteristic)f.GetValue(null)));
59+
.Select(f => AssertHasValue(f, (Characteristic)f.GetValue(null)!));
5860

5961
var propertyValues = characteristicObjectType.GetTypeInfo()
6062
.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy | BindingFlags.Static)
6163
.Where(p => p.GetMethod != null && IsCharacteristicSubclass(p.PropertyType))
62-
.Select(p => AssertHasValue(p, (Characteristic)p.GetValue(null)));
64+
.Select(p => AssertHasValue(p, (Characteristic)p.GetValue(null)!));
6365

6466
// DONTTOUCH: DO NOT change the order of characteristic as it may break logic of some operations.
6567
return fieldValues

src/BenchmarkDotNet/Characteristics/CharacteristicObject.cs

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ protected static string ResolveId(CharacteristicObject obj, string actual)
2525
string result = CharacteristicSetPresenter.Display.ToPresentation(obj);
2626

2727
if (result.Length == 0)
28-
result = IdCharacteristic.FallbackValue;
28+
result = IdCharacteristic.FallbackValue!;
2929

3030
return result;
3131
}
@@ -44,7 +44,7 @@ protected CharacteristicObject()
4444
sharedValues = new Dictionary<Characteristic, object>();
4545
}
4646

47-
protected CharacteristicObject(string? id) : this()
47+
protected CharacteristicObject(string id) : this()
4848
{
4949
if (!string.IsNullOrEmpty(id))
5050
{
@@ -79,7 +79,7 @@ private void AssertIsNonFrozenRoot()
7979
AssertIsRoot();
8080
}
8181

82-
private static void AssertIsAssignable(Characteristic characteristic, object value)
82+
private static void AssertIsAssignable(Characteristic characteristic, object? value)
8383
{
8484
if (ReferenceEquals(value, Characteristic.EmptyValue) || ReferenceEquals(value, null))
8585
{
@@ -140,20 +140,20 @@ public bool HasValue(Characteristic characteristic)
140140
return false;
141141
}
142142

143-
internal T GetValue<[DynamicallyAccessedMembers(CharacteristicMemberTypes)] T>(Characteristic<T> characteristic)
143+
internal T? GetValue<[DynamicallyAccessedMembers(CharacteristicMemberTypes)] T>(Characteristic<T> characteristic)
144144
{
145-
return (T)GetValue((Characteristic)characteristic);
145+
return (T?)GetValue((Characteristic)characteristic);
146146
}
147147

148-
internal object GetValue(Characteristic characteristic)
148+
internal object? GetValue(Characteristic characteristic)
149149
{
150150
if (!sharedValues.TryGetValue(characteristic, out var result))
151151
result = Characteristic.EmptyValue;
152152

153153
return ResolveCore(characteristic, result);
154154
}
155155

156-
private object ResolveCore(Characteristic characteristic, object result)
156+
private object? ResolveCore(Characteristic characteristic, object result)
157157
{
158158
return characteristic.ResolveValueCore(this, result);
159159
}
@@ -180,13 +180,13 @@ public object ResolveValue(Characteristic characteristic, IResolver resolver, ob
180180
return resolver.Resolve(this, characteristic, defaultValue);
181181
}
182182

183-
public T ResolveValue<[DynamicallyAccessedMembers(CharacteristicObject.CharacteristicMemberTypes)] T>(Characteristic<T> characteristic, T defaultValue)
183+
public T? ResolveValue<[DynamicallyAccessedMembers(CharacteristicObject.CharacteristicMemberTypes)] T>(Characteristic<T> characteristic, T defaultValue)
184184
{
185-
return HasValue(characteristic) ? GetValue(characteristic) : (T)characteristic.ResolveValueCore(this, defaultValue);
185+
return HasValue(characteristic) ? GetValue(characteristic) : (T?)characteristic.ResolveValueCore(this, defaultValue!);
186186
}
187187

188188
[PublicAPI]
189-
public object ResolveValue(Characteristic characteristic, object defaultValue)
189+
public object? ResolveValue(Characteristic characteristic, object defaultValue)
190190
{
191191
return HasValue(characteristic) ? GetValue(characteristic) : characteristic.ResolveValueCore(this, defaultValue);
192192
}
@@ -203,16 +203,16 @@ public object ResolveValue(Characteristic characteristic, object defaultValue)
203203
SetValue((Characteristic)characteristic, value);
204204
}
205205

206-
internal void SetValue(Characteristic characteristic, object value)
206+
internal void SetValue(Characteristic characteristic, object? value)
207207
{
208208
AssertNotFrozen();
209209

210210
if (characteristic.HasChildCharacteristics)
211211
{
212212
AssertIsAssignable(characteristic, value);
213213

214-
var oldObjectValue = (CharacteristicObject)GetValue(characteristic);
215-
var newObjectValue = (CharacteristicObject)ResolveCore(characteristic, value);
214+
var oldObjectValue = (CharacteristicObject?)GetValue(characteristic);
215+
var newObjectValue = (CharacteristicObject?)ResolveCore(characteristic, value!);
216216

217217
if (!ReferenceEquals(oldObjectValue, newObjectValue))
218218
{
@@ -226,7 +226,7 @@ internal void SetValue(Characteristic characteristic, object value)
226226
}
227227
}
228228

229-
private void SetValueCore(Characteristic characteristic, object value)
229+
private void SetValueCore(Characteristic characteristic, object? value)
230230
{
231231
AssertIsAssignable(characteristic, value);
232232

@@ -243,7 +243,7 @@ private void SetValueCore(Characteristic characteristic, object value)
243243
$"The current node {this} has value for {characteristic} already.",
244244
nameof(characteristic));
245245

246-
var characteristicObject = (CharacteristicObject)ResolveCore(characteristic, value);
246+
var characteristicObject = (CharacteristicObject)ResolveCore(characteristic, value!)!;
247247
characteristicObject.SetOwnerCore(OwnerOrSelf);
248248

249249
sharedValues[characteristic] = characteristicObject;
@@ -321,7 +321,7 @@ private void SetValueOnAttach(Characteristic characteristic, object value)
321321
if (characteristic.HasChildCharacteristics)
322322
{
323323
// DONTTOUCH: workaround on case there were no parent characteristic.
324-
var characteristicObject = (CharacteristicObject)GetValue(characteristic);
324+
var characteristicObject = (CharacteristicObject?)GetValue(characteristic);
325325
characteristicObject?.DetachFromOwner(characteristic);
326326
}
327327

@@ -358,13 +358,13 @@ private CharacteristicObject ApplyCore(
358358
{
359359
if (!HasValue(characteristic))
360360
{
361-
var characteristicObject = (CharacteristicObject)ResolveCore(characteristic, value);
361+
var characteristicObject = (CharacteristicObject?)ResolveCore(characteristic, value);
362362
if (characteristicObject != null)
363363
{
364364
value = Activator.CreateInstance(characteristicObject.GetType());
365365
}
366366

367-
SetValueCore(characteristic, value);
367+
SetValueCore(characteristic, value!);
368368
}
369369
}
370370
else
@@ -399,20 +399,20 @@ protected CharacteristicObject UnfreezeCopyCore()
399399
{
400400
AssertIsRoot();
401401

402-
var newRoot = (CharacteristicObject)Activator.CreateInstance(GetType());
402+
var newRoot = (CharacteristicObject)Activator.CreateInstance(GetType())!;
403403
newRoot.ApplyCore(this);
404404

405405
// Preserve the IdCharacteristic of the original object
406406
if (this.HasValue(IdCharacteristic))
407407
{
408-
newRoot.SetValue(IdCharacteristic, this.GetValue(IdCharacteristic));
408+
newRoot.SetValue(IdCharacteristic, this.GetValue(IdCharacteristic)!);
409409
}
410410

411411
return newRoot;
412412
}
413413
#endregion
414414

415-
public string Id => IdCharacteristic[this];
415+
public string Id => IdCharacteristic[this]!;
416416

417417
public override string ToString() => Id;
418418
}

src/BenchmarkDotNet/Characteristics/CharacteristicObject`1.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ public abstract class CharacteristicObject<T> : CharacteristicObject
88
{
99
protected CharacteristicObject() { }
1010

11-
protected CharacteristicObject(string? id) : base(id) { }
11+
protected CharacteristicObject(string id) : base(id) { }
1212

1313
public new T Apply(CharacteristicObject other) => (T)ApplyCore(other);
1414

src/BenchmarkDotNet/Characteristics/CharacteristicPresenter.cs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
using BenchmarkDotNet.Helpers;
66
using BenchmarkDotNet.Jobs;
77

8+
#nullable enable
9+
810
namespace BenchmarkDotNet.Characteristics
911
{
1012
public abstract class CharacteristicPresenter
@@ -16,7 +18,7 @@ public abstract class CharacteristicPresenter
1618

1719
public abstract string ToPresentation(CharacteristicObject obj, Characteristic characteristic);
1820

19-
public abstract string ToPresentation(object characteristicValue, Characteristic characteristic);
21+
public abstract string ToPresentation(object? characteristicValue, Characteristic characteristic);
2022

2123
private class DefaultCharacteristicPresenter : CharacteristicPresenter
2224
{
@@ -26,11 +28,11 @@ public override string ToPresentation(CharacteristicObject obj, Characteristic c
2628
return job.ResolvedId;
2729

2830
return obj.HasValue(characteristic)
29-
? ToPresentation(characteristic[obj], characteristic)
31+
? ToPresentation(characteristic[obj]!, characteristic)
3032
: "Default";
3133
}
3234

33-
public override string ToPresentation(object value, Characteristic characteristic)
35+
public override string ToPresentation(object? value, Characteristic characteristic)
3436
{
3537
if (!(value is string) && value is IEnumerable collection)
3638
return ToPresentation(collection);
@@ -64,7 +66,7 @@ private static string ToPresentation(IEnumerable collection)
6466
return buffer.ToString();
6567
}
6668

67-
private static string ToPresentation(object value)
69+
private static string ToPresentation(object? value)
6870
=> (value as IFormattable)?.ToString(null, DefaultCultureInfo.Instance)
6971
?? value?.ToString()
7072
?? "";
@@ -77,11 +79,11 @@ private class SourceCodeCharacteristicPresenter : CharacteristicPresenter
7779
public override string ToPresentation(CharacteristicObject obj, Characteristic characteristic)
7880
=> ToPresentation(characteristic[obj], characteristic);
7981

80-
public override string ToPresentation(object characteristicValue, Characteristic characteristic)
82+
public override string ToPresentation(object? characteristicValue, Characteristic characteristic)
8183
{
8284
// TODO: DO NOT hardcode Characteristic suffix
8385
string id = characteristic.Id;
84-
string type = characteristic.DeclaringType.FullName;
86+
string type = characteristic.DeclaringType.FullName!;
8587
string value = SourceCodeHelper.ToSourceCode(characteristicValue);
8688
return $"{type}.{id}Characteristic[job] = {value}";
8789
}
@@ -94,7 +96,7 @@ public override string ToPresentation(CharacteristicObject obj, Characteristic c
9496
? ToPresentation(characteristic[obj], characteristic)
9597
: "Default";
9698

97-
public override string ToPresentation(object characteristicValue, Characteristic characteristic)
99+
public override string ToPresentation(object? characteristicValue, Characteristic characteristic)
98100
=> FolderNameHelper.ToFolderName(characteristicValue);
99101
}
100102
}
Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
using System;
22
using System.Diagnostics.CodeAnalysis;
33

4+
#nullable enable
5+
46
namespace BenchmarkDotNet.Characteristics
57
{
68
public class Characteristic<[DynamicallyAccessedMembers(CharacteristicObject.CharacteristicMemberTypes)] T> : Characteristic
79
{
810
internal Characteristic(
911
string id,
1012
Type declaringType,
11-
Func<CharacteristicObject, T, T>? resolver,
12-
T fallbackValue,
13+
Func<CharacteristicObject, T?, T>? resolver,
14+
T? fallbackValue,
1315
bool ignoreOnApply,
1416
bool dontShowInSummary = false)
1517
: base(id, typeof(T), declaringType, fallbackValue, ignoreOnApply, dontShowInSummary)
@@ -18,22 +20,22 @@ internal Characteristic(
1820
FallbackValue = fallbackValue;
1921
}
2022

21-
private Func<CharacteristicObject, T, T>? Resolver { get; }
23+
private Func<CharacteristicObject, T?, T>? Resolver { get; }
2224

23-
public T FallbackValue { get; }
25+
public T? FallbackValue { get; }
2426

25-
public new T this[CharacteristicObject obj]
27+
public new T? this[CharacteristicObject obj]
2628
{
2729
get { return obj.GetValue(this); }
2830
set { obj.SetValue(this, value); }
2931
}
3032

31-
internal override object ResolveValueCore(CharacteristicObject obj, object currentValue)
33+
internal override object? ResolveValueCore(CharacteristicObject obj, object currentValue)
3234
{
3335
if (Resolver == null)
34-
return (T)base.ResolveValueCore(obj, currentValue);
36+
return (T?)base.ResolveValueCore(obj, currentValue);
3537

36-
return Resolver(obj, (T)base.ResolveValueCore(obj, currentValue));
38+
return Resolver(obj, (T?)base.ResolveValueCore(obj, currentValue));
3739
}
3840
}
3941
}

src/BenchmarkDotNet/Extensions/ProcessExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ internal static void SetEnvironmentVariables(this ProcessStartInfo start, Benchm
160160
if (!benchmarkCase.Job.HasValue(EnvironmentMode.EnvironmentVariablesCharacteristic))
161161
return;
162162

163-
foreach (var environmentVariable in benchmarkCase.Job.Environment.EnvironmentVariables)
163+
foreach (var environmentVariable in benchmarkCase.Job.Environment.EnvironmentVariables ?? [])
164164
start.EnvironmentVariables[environmentVariable.Key] = environmentVariable.Value;
165165
}
166166

src/BenchmarkDotNet/Helpers/FolderNameHelper.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@ namespace BenchmarkDotNet.Helpers
1010
{
1111
public static class FolderNameHelper
1212
{
13-
public static string ToFolderName(object value)
13+
public static string ToFolderName(object? value)
1414
{
1515
switch (value) {
16+
case null:
17+
return "null";
1618
case bool b:
1719
return b.ToLowerCase();
1820
case string s:

0 commit comments

Comments
 (0)