Skip to content

Commit b3eead8

Browse files
authored
Updates project to support Nullable types
1 parent 57f0a2c commit b3eead8

File tree

14 files changed

+319
-276
lines changed

14 files changed

+319
-276
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// This IF should be 'any new targets we add that natively support NotNullAttribute'. Right now, that is only 2_1.
2+
#if !NETSTANDARD2_1
3+
// ReSharper disable once CheckNamespace
4+
namespace System.Diagnostics.CodeAnalysis
5+
{
6+
/// <summary>
7+
/// This is JUST so we can avoid having #if regions in each usage site.
8+
///
9+
/// For non-supported frameworks, it may be ignored by CodeAnalysis, but allows the usage
10+
/// sites to avoid all having
11+
/// <code>
12+
/// #if NETSTANDARD2_1
13+
/// [NotNull]
14+
/// #endif
15+
/// [OtherAttributes]
16+
/// public string SampleMethod() {}
17+
/// </code>
18+
/// </summary>
19+
internal sealed class NotNullAttribute : Attribute
20+
{
21+
}
22+
}
23+
#endif

src/projects/EnsureThat/Enforcers/AnyArg.cs

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
using System;
1+
using System;
22
using EnsureThat.Annotations;
33
using JetBrains.Annotations;
44

5+
using NotNullAttribute = System.Diagnostics.CodeAnalysis.NotNullAttribute;
6+
57
namespace EnsureThat.Enforcers
68
{
79
public sealed class AnyArg
@@ -18,9 +20,9 @@ public sealed class AnyArg
1820
/// <param name="optsFn"></param>
1921
/// <returns></returns>
2022
/// <remarks>If you know you are dealing with e.g. a struct, the <see cref="IsNotNull{T}(T?, string, OptsFn)"/> overload is more performant.</remarks>
21-
[NotNull]
23+
[return: NotNull]
2224
[ContractAnnotation("value:null => halt")]
23-
public T HasValue<T>([NoEnumeration, ValidatedNotNull] T value, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
25+
public T HasValue<T>([NoEnumeration, ValidatedNotNull, NotNull] T value, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
2426
{
2527
// ReSharper disable once HeapView.BoxingAllocation
2628
if (value == null)
@@ -29,19 +31,19 @@ public T HasValue<T>([NoEnumeration, ValidatedNotNull] T value, [InvokerParamete
2931
return value;
3032
}
3133

32-
[NotNull]
34+
[return: NotNull]
3335
[ContractAnnotation("value:null => halt")]
34-
public T IsNotNull<T>([NoEnumeration, ValidatedNotNull] T value, [InvokerParameterName] string paramName = null, OptsFn optsFn = null) where T : class
36+
public T IsNotNull<T>([NoEnumeration, ValidatedNotNull, NotNull] T value, [InvokerParameterName] string paramName = null, OptsFn optsFn = null) where T : class
3537
{
3638
if (value == null)
3739
throw Ensure.ExceptionFactory.ArgumentNullException(ExceptionMessages.Common_IsNotNull_Failed, paramName, optsFn);
3840

3941
return value;
4042
}
4143

42-
[NotNull]
44+
[return: NotNull]
4345
[ContractAnnotation("value:null => halt")]
44-
public T? IsNotNull<T>([ValidatedNotNull] T? value, [InvokerParameterName] string paramName = null, OptsFn optsFn = null) where T : struct
46+
public T? IsNotNull<T>([ValidatedNotNull, NotNull] T? value, [InvokerParameterName] string paramName = null, OptsFn optsFn = null) where T : struct
4547
{
4648
if (value == null)
4749
throw Ensure.ExceptionFactory.ArgumentNullException(ExceptionMessages.Common_IsNotNull_Failed, paramName, optsFn);
@@ -57,4 +59,4 @@ public T IsNotDefault<T>(T value, [InvokerParameterName] string paramName = null
5759
return value;
5860
}
5961
}
60-
}
62+
}

src/projects/EnsureThat/Enforcers/CollectionArg.cs

Lines changed: 55 additions & 53 deletions
Large diffs are not rendered by default.

src/projects/EnsureThat/Enforcers/EnumerableArg.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
using EnsureThat.Annotations;
66
using JetBrains.Annotations;
77

8+
using NotNullAttribute = System.Diagnostics.CodeAnalysis.NotNullAttribute;
9+
810
namespace EnsureThat.Enforcers
911
{
1012
/// <summary>
@@ -14,7 +16,7 @@ namespace EnsureThat.Enforcers
1416
[SuppressMessage("ReSharper", "PossibleMultipleEnumeration")]
1517
public sealed class EnumerableArg
1618
{
17-
[NotNull]
19+
[return: NotNull]
1820
[ContractAnnotation("value:null => halt")]
1921
public IEnumerable<T> HasItems<T>([ValidatedNotNull, InstantHandle]IEnumerable<T> value, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
2022
{
@@ -29,7 +31,7 @@ public IEnumerable<T> HasItems<T>([ValidatedNotNull, InstantHandle]IEnumerable<T
2931
return value;
3032
}
3133

32-
[NotNull]
34+
[return: NotNull]
3335
[ContractAnnotation("value:null => halt")]
3436
public IEnumerable<T> SizeIs<T>([ValidatedNotNull, InstantHandle]IEnumerable<T> value, int expected, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
3537
{
@@ -46,7 +48,7 @@ public IEnumerable<T> SizeIs<T>([ValidatedNotNull, InstantHandle]IEnumerable<T>
4648
return value;
4749
}
4850

49-
[NotNull]
51+
[return: NotNull]
5052
[ContractAnnotation("value:null => halt")]
5153
public IEnumerable<T> SizeIs<T>([ValidatedNotNull, InstantHandle]IEnumerable<T> value, long expected, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
5254
{
@@ -69,7 +71,7 @@ public IEnumerable<T> SizeIs<T>([ValidatedNotNull, InstantHandle]IEnumerable<T>
6971
return value;
7072
}
7173

72-
[NotNull]
74+
[return: NotNull]
7375
[ContractAnnotation("value:null => halt")]
7476
public IEnumerable<T> HasAny<T>([ValidatedNotNull, InstantHandle]IEnumerable<T> value, Func<T, bool> predicate, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
7577
{
@@ -84,4 +86,4 @@ public IEnumerable<T> HasAny<T>([ValidatedNotNull, InstantHandle]IEnumerable<T>
8486
return value;
8587
}
8688
}
87-
}
89+
}

src/projects/EnsureThat/Enforcers/StringArg.cs

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,27 @@
1-
using System;
1+
using System;
22
using System.Linq;
33
using System.Text.RegularExpressions;
44
using EnsureThat.Annotations;
55
using JetBrains.Annotations;
66

7+
using NotNullAttribute = System.Diagnostics.CodeAnalysis.NotNullAttribute;
8+
79
namespace EnsureThat.Enforcers
810
{
911
public sealed class StringArg
1012
{
11-
[NotNull]
13+
[return: NotNull]
1214
[ContractAnnotation("value:null => halt")]
13-
public string IsNotNull([ValidatedNotNull]string value, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
15+
public string IsNotNull([ValidatedNotNull, NotNull]string value, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
1416
{
1517
Ensure.Any.IsNotNull(value, paramName, optsFn);
1618

1719
return value;
1820
}
1921

20-
[NotNull]
22+
[return: NotNull]
2123
[ContractAnnotation("value:null => halt")]
22-
public string IsNotNullOrWhiteSpace([ValidatedNotNull]string value, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
24+
public string IsNotNullOrWhiteSpace([ValidatedNotNull, NotNull]string value, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
2325
{
2426
Ensure.Any.IsNotNull(value, paramName, optsFn);
2527

@@ -29,8 +31,8 @@ public string IsNotNullOrWhiteSpace([ValidatedNotNull]string value, [InvokerPara
2931
return value;
3032
}
3133

32-
[NotNull]
33-
public string IsNotNullOrEmpty([ValidatedNotNull]string value, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
34+
[return: NotNull]
35+
public string IsNotNullOrEmpty([ValidatedNotNull, NotNull]string value, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
3436
{
3537
Ensure.Any.IsNotNull(value, paramName, optsFn);
3638

@@ -69,9 +71,9 @@ public string IsNotEmpty(string value, [InvokerParameterName] string paramName =
6971
return value;
7072
}
7173

72-
[NotNull]
74+
[return: NotNull]
7375
[ContractAnnotation("value:null => halt")]
74-
public string HasLength([ValidatedNotNull]string value, int expected, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
76+
public string HasLength([ValidatedNotNull, NotNull]string value, int expected, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
7577
{
7678
Ensure.Any.IsNotNull(value, paramName, optsFn);
7779

@@ -84,9 +86,9 @@ public string HasLength([ValidatedNotNull]string value, int expected, [InvokerPa
8486
return value;
8587
}
8688

87-
[NotNull]
89+
[return: NotNull]
8890
[ContractAnnotation("value:null => halt")]
89-
public string HasLengthBetween([ValidatedNotNull]string value, int minLength, int maxLength, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
91+
public string HasLengthBetween([ValidatedNotNull, NotNull]string value, int minLength, int maxLength, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
9092
{
9193
Ensure.Any.IsNotNull(value, paramName, optsFn);
9294

@@ -107,11 +109,11 @@ public string HasLengthBetween([ValidatedNotNull]string value, int minLength, in
107109
return value;
108110
}
109111

110-
[NotNull]
112+
[return: NotNull]
111113
public string Matches(string value, [RegexPattern] string match, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
112114
=> Matches(value, new Regex(match), paramName, optsFn);
113115

114-
[NotNull]
116+
[return: NotNull]
115117
public string Matches(string value, Regex match, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
116118
{
117119
if (!match.IsMatch(value))
@@ -123,10 +125,10 @@ public string Matches(string value, Regex match, [InvokerParameterName] string p
123125
return value;
124126
}
125127

126-
[NotNull]
128+
[return: NotNull]
127129
[ContractAnnotation("value:null => halt")]
128130
[Obsolete("Use 'HasLength' instead. This will be removed in an upcoming version.")]
129-
public string SizeIs([ValidatedNotNull] string value, int expected, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
131+
public string SizeIs([ValidatedNotNull, NotNull] string value, int expected, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
130132
=> HasLength(value, expected, paramName, optsFn);
131133

132134
public string Is(string value, string expected, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
@@ -185,9 +187,9 @@ public string IsNotEqualTo(string value, string notExpected, StringComparison co
185187
return value;
186188
}
187189

188-
[NotNull]
190+
[return: NotNull]
189191
[ContractAnnotation("value:null => halt")]
190-
public Guid IsGuid([ValidatedNotNull]string value, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
192+
public Guid IsGuid([ValidatedNotNull, NotNull]string value, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
191193
{
192194
if (!Guid.TryParse(value, out var parsed))
193195
throw Ensure.ExceptionFactory.ArgumentException(
@@ -198,9 +200,9 @@ public Guid IsGuid([ValidatedNotNull]string value, [InvokerParameterName] string
198200
return parsed;
199201
}
200202

201-
[NotNull]
203+
[return: NotNull]
202204
[ContractAnnotation("value:null => halt")]
203-
public string StartsWith([ValidatedNotNull]string value, [NotNull] string expectedStartsWith, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
205+
public string StartsWith([ValidatedNotNull, NotNull]string value, [NotNull] string expectedStartsWith, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
204206
{
205207
Ensure.Any.IsNotNull(value, paramName, optsFn);
206208

@@ -213,9 +215,9 @@ public string StartsWith([ValidatedNotNull]string value, [NotNull] string expect
213215
return value;
214216
}
215217

216-
[NotNull]
218+
[return: NotNull]
217219
[ContractAnnotation("value:null => halt")]
218-
public string StartsWith([ValidatedNotNull]string value, [NotNull] string expectedStartsWith, StringComparison comparison, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
220+
public string StartsWith([ValidatedNotNull, NotNull]string value, [NotNull] string expectedStartsWith, StringComparison comparison, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
219221
{
220222
Ensure.Any.IsNotNull(value, paramName, optsFn);
221223

@@ -277,9 +279,9 @@ public string IsInRange(string value, string min, string max, StringComparison c
277279
return value;
278280
}
279281

280-
[NotNull]
282+
[return: NotNull]
281283
[ContractAnnotation("value:null => halt")]
282-
public string IsAllLettersOrDigits([ValidatedNotNull] string value, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
284+
public string IsAllLettersOrDigits([ValidatedNotNull, NotNull] string value, [InvokerParameterName] string paramName = null, OptsFn optsFn = null)
283285
{
284286
Ensure.Any.IsNotNull(value, paramName, optsFn);
285287

0 commit comments

Comments
 (0)