1+ // Licensed to the .NET Foundation under one or more agreements.
2+ // The .NET Foundation licenses this file to you under the MIT license.
3+
4+ namespace System . Diagnostics . CodeAnalysis
5+ {
6+ #if ! NETCOREAPP3_0_OR_GREATER
7+ /// <summary>Specifies that null is allowed as an input even if the corresponding type disallows it.</summary>
8+ [ AttributeUsage ( AttributeTargets . Field | AttributeTargets . Parameter | AttributeTargets . Property , Inherited = false ) ]
9+ internal sealed class AllowNullAttribute : Attribute
10+ { }
11+
12+ /// <summary>Specifies that null is disallowed as an input even if the corresponding type allows it.</summary>
13+ [ AttributeUsage ( AttributeTargets . Field | AttributeTargets . Parameter | AttributeTargets . Property , Inherited = false ) ]
14+ internal sealed class DisallowNullAttribute : Attribute
15+ { }
16+
17+ /// <summary>Specifies that an output may be null even if the corresponding type disallows it.</summary>
18+ [ AttributeUsage ( AttributeTargets . Field | AttributeTargets . Parameter | AttributeTargets . Property | AttributeTargets . ReturnValue , Inherited = false ) ]
19+ internal sealed class MaybeNullAttribute : Attribute
20+ { }
21+
22+ /// <summary>Specifies that an output will not be null even if the corresponding type allows it. Specifies that an input argument was not null when the call returns.</summary>
23+ [ AttributeUsage ( AttributeTargets . Field | AttributeTargets . Parameter | AttributeTargets . Property | AttributeTargets . ReturnValue , Inherited = false ) ]
24+ internal sealed class NotNullAttribute : Attribute
25+ { }
26+
27+ /// <summary>Specifies that when a method returns <see cref="ReturnValue"/>, the parameter may be null even if the corresponding type disallows it.</summary>
28+ [ AttributeUsage ( AttributeTargets . Parameter , Inherited = false ) ]
29+ internal sealed class MaybeNullWhenAttribute : Attribute
30+ {
31+ /// <summary>Initializes the attribute with the specified return value condition.</summary>
32+ /// <param name="returnValue">
33+ /// The return value condition. If the method returns this value, the associated parameter may be null.
34+ /// </param>
35+ public MaybeNullWhenAttribute ( bool returnValue ) => ReturnValue = returnValue ;
36+
37+ /// <summary>Gets the return value condition.</summary>
38+ public bool ReturnValue { get ; }
39+ }
40+
41+ /// <summary>Specifies that when a method returns <see cref="ReturnValue"/>, the parameter will not be null even if the corresponding type allows it.</summary>
42+ [ AttributeUsage ( AttributeTargets . Parameter , Inherited = false ) ]
43+ internal sealed class NotNullWhenAttribute : Attribute
44+ {
45+ /// <summary>Initializes the attribute with the specified return value condition.</summary>
46+ /// <param name="returnValue">
47+ /// The return value condition. If the method returns this value, the associated parameter will not be null.
48+ /// </param>
49+ public NotNullWhenAttribute ( bool returnValue ) => ReturnValue = returnValue ;
50+
51+ /// <summary>Gets the return value condition.</summary>
52+ public bool ReturnValue { get ; }
53+ }
54+
55+ /// <summary>Specifies that the output will be non-null if the named parameter is non-null.</summary>
56+ [ AttributeUsage ( AttributeTargets . Parameter | AttributeTargets . Property | AttributeTargets . ReturnValue , AllowMultiple = true , Inherited = false ) ]
57+ internal sealed class NotNullIfNotNullAttribute : Attribute
58+ {
59+ /// <summary>Initializes the attribute with the associated parameter name.</summary>
60+ /// <param name="parameterName">
61+ /// The associated parameter name. The output will be non-null if the argument to the parameter specified is non-null.
62+ /// </param>
63+ public NotNullIfNotNullAttribute ( string parameterName ) => ParameterName = parameterName ;
64+
65+ /// <summary>Gets the associated parameter name.</summary>
66+ public string ParameterName { get ; }
67+ }
68+
69+ /// <summary>Applied to a method that will never return under any circumstance.</summary>
70+ [ AttributeUsage ( AttributeTargets . Method , Inherited = false ) ]
71+ internal sealed class DoesNotReturnAttribute : Attribute
72+ { }
73+
74+ /// <summary>Specifies that the method will not return if the associated Boolean parameter is passed the specified value.</summary>
75+ [ AttributeUsage ( AttributeTargets . Parameter , Inherited = false ) ]
76+ internal sealed class DoesNotReturnIfAttribute : Attribute
77+ {
78+ /// <summary>Initializes the attribute with the specified parameter value.</summary>
79+ /// <param name="parameterValue">
80+ /// The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to
81+ /// the associated parameter matches this value.
82+ /// </param>
83+ public DoesNotReturnIfAttribute ( bool parameterValue ) => ParameterValue = parameterValue ;
84+
85+ /// <summary>Gets the condition parameter value.</summary>
86+ public bool ParameterValue { get ; }
87+ }
88+
89+ #endif
90+ #if ! NET5_0_OR_GREATER
91+
92+ /// <summary>Specifies that the method or property will ensure that the listed field and property members have not-null values.</summary>
93+ [ AttributeUsage ( AttributeTargets . Method | AttributeTargets . Property , Inherited = false , AllowMultiple = true ) ]
94+ internal sealed class MemberNotNullAttribute : Attribute
95+ {
96+ /// <summary>Initializes the attribute with a field or property member.</summary>
97+ /// <param name="member">
98+ /// The field or property member that is promised to be not-null.
99+ /// </param>
100+ public MemberNotNullAttribute ( string member ) => Members = new [ ] { member } ;
101+
102+ /// <summary>Initializes the attribute with the list of field and property members.</summary>
103+ /// <param name="members">
104+ /// The list of field and property members that are promised to be not-null.
105+ /// </param>
106+ public MemberNotNullAttribute ( params string [ ] members ) => Members = members ;
107+
108+ /// <summary>Gets field or property member names.</summary>
109+ public string [ ] Members { get ; }
110+ }
111+
112+ /// <summary>Specifies that the method or property will ensure that the listed field and property members have not-null values when returning with the specified return value condition.</summary>
113+ [ AttributeUsage ( AttributeTargets . Method | AttributeTargets . Property , Inherited = false , AllowMultiple = true ) ]
114+ internal sealed class MemberNotNullWhenAttribute : Attribute
115+ {
116+ /// <summary>Initializes the attribute with the specified return value condition and a field or property member.</summary>
117+ /// <param name="returnValue">
118+ /// The return value condition. If the method returns this value, the associated parameter will not be null.
119+ /// </param>
120+ /// <param name="member">
121+ /// The field or property member that is promised to be not-null.
122+ /// </param>
123+ public MemberNotNullWhenAttribute ( bool returnValue , string member )
124+ {
125+ ReturnValue = returnValue ;
126+ Members = new [ ] { member } ;
127+ }
128+
129+ /// <summary>Initializes the attribute with the specified return value condition and list of field and property members.</summary>
130+ /// <param name="returnValue">
131+ /// The return value condition. If the method returns this value, the associated parameter will not be null.
132+ /// </param>
133+ /// <param name="members">
134+ /// The list of field and property members that are promised to be not-null.
135+ /// </param>
136+ public MemberNotNullWhenAttribute ( bool returnValue , params string [ ] members )
137+ {
138+ ReturnValue = returnValue ;
139+ Members = members ;
140+ }
141+
142+ /// <summary>Gets the return value condition.</summary>
143+ public bool ReturnValue { get ; }
144+
145+ /// <summary>Gets field or property member names.</summary>
146+ public string [ ] Members { get ; }
147+ }
148+ #endif
149+ }
0 commit comments