299 references to NullableFlowState
Microsoft.CodeAnalysis.CSharp (257)
Binder\Semantics\BestTypeInferrer.cs (3)
36
public static
NullableFlowState
GetNullableState(ArrayBuilder<TypeWithState> types)
38
NullableFlowState
result =
NullableFlowState
.NotNull;
FlowAnalysis\NullableWalker.cs (182)
111
public VisitResult(TypeSymbol? type, NullableAnnotation annotation,
NullableFlowState
state)
187
private static readonly TypeWithState _invalidType = TypeWithState.Create(ErrorTypeSymbol.UnknownResultType,
NullableFlowState
.NotNull);
747
var
memberState = GetState(ref state, slot);
748
var
badState = symbolType.Type.IsPossiblyNullableReferenceTypeTypeParameter() && (annotations & FlowAnalysisAnnotations.NotNull) == 0
749
?
NullableFlowState
.MaybeDefault
750
:
NullableFlowState
.MaybeNull;
849
var
parameterState = GetState(ref state, memberSlot);
909
SetState(ref this.State, memberSlot, type.Type.IsPossiblyNullableReferenceTypeTypeParameter() ?
NullableFlowState
.MaybeDefault :
NullableFlowState
.MaybeNull);
1063
SetState(ref this.State, memberSlot,
NullableFlowState
.MaybeNull);
1160
var
parameterState = GetState(ref state, slot);
1216
var
parameterState = GetState(ref stateWhen, slot);
1243
private void EnforceNotNullIfNotNull(SyntaxNode? syntaxOpt, LocalState state, ImmutableArray<ParameterSymbol> parameters, ImmutableHashSet<string> inputParamNames,
NullableFlowState
outputState, ParameterSymbol? outputParam)
1819
private
NullableFlowState
GetState(ref LocalState state, int slot)
1822
return
NullableFlowState
.NotNull;
1828
private void SetState(ref LocalState state, int slot,
NullableFlowState
value, bool useNotNullsAsDefault = false)
1850
private
NullableFlowState
GetDefaultState(ref LocalState state, int slot)
1855
return
NullableFlowState
.NotNull;
1885
return
NullableFlowState
.NotNull;
2190
private static bool ShouldReportNullableAssignment(TypeWithAnnotations type,
NullableFlowState
state)
2207
case
NullableFlowState
.NotNull:
2209
case
NullableFlowState
.MaybeNull:
2290
valueType.State ==
NullableFlowState
.MaybeDefault;
2472
var
newState = valueType.State;
2572
NullableFlowState
value = isDefaultValue ?
NullableFlowState
.MaybeNull : fieldOrPropertyType.ToTypeWithState().State;
2584
NullableFlowState
.NotNull;
2616
/// and the new state is not <see cref="
NullableFlowState
.NotNull"/>, this method should be called to perform the
2620
private void SetStateAndTrackForFinally(ref LocalState state, int slot,
NullableFlowState
newState)
2624
if (newState !=
NullableFlowState
.NotNull && NonMonotonicState.HasValue)
2657
private
NullableFlowState
GetDefaultState(Symbol symbol)
2751
var
state = GetParameterState(parameterType, parameter.FlowAnalysisAnnotations).State;
2789
return TypeWithState.Create(parameterType.Type,
NullableFlowState
.MaybeDefault);
2794
return TypeWithState.Create(parameterType.Type,
NullableFlowState
.NotNull);
3448
SetResultType(node, TypeWithState.Create(null,
NullableFlowState
.NotNull));
3467
(int slot,
NullableFlowState
resultState, Func<TypeSymbol, MethodSymbol?, int>? initialStateInferenceCompletion) = inferInitialObjectState(node, type, constructor, arguments, argumentResults, isTargetTyped);
3487
NullableFlowState
resultState,
3516
NullableFlowState
resultState)
3518
Debug.Assert(resultState ==
NullableFlowState
.NotNull);
3551
(int slot,
NullableFlowState
resultState, Func<TypeSymbol, MethodSymbol?, int>? completion) inferInitialObjectState(
3558
return (-1,
NullableFlowState
.NotNull, inferInitialObjectStateAsContinuation(node, arguments, argumentResults));
3566
var
resultState =
NullableFlowState
.NotNull;
3596
resultState =
NullableFlowState
.MaybeNull;
3630
Debug.Assert(resultState ==
NullableFlowState
.NotNull);
3764
var result = new VisitResult(objectInitializer.Type, NullableAnnotation.NotAnnotated,
NullableFlowState
.NotNull);
3953
SetAnalyzedNullability(node.ImplicitReceiverOpt, new VisitResult(node.ImplicitReceiverOpt.Type, NullableAnnotation.NotAnnotated,
NullableFlowState
.NotNull));
4010
SetResultType(node, TypeWithState.Create(node.Type,
NullableFlowState
.NotNull));
4116
SetResultType(node, TypeWithState.Create(anonymousType,
NullableFlowState
.NotNull));
4148
SetResultType(node, TypeWithState.Create(node.Type,
NullableFlowState
.NotNull));
4153
SetResultType(node, TypeWithState.Create(arrayType,
NullableFlowState
.NotNull));
4230
var
elementState = BestTypeInferrer.GetNullableState(expressionTypes);
4410
NullableFlowState
resultState =
NullableFlowState
.NotNull;
4438
resultState =
NullableFlowState
.MaybeNull; // Delegate removal can produce null.
4441
resultState =
NullableFlowState
.NotNull;
4954
SetState(ref stateToUpdate, slot,
NullableFlowState
.NotNull);
4983
SetState(ref state, slot,
NullableFlowState
.NotNull);
5008
if (GetState(ref state, slot) ==
NullableFlowState
.NotNull)
5011
SetState(ref state, slot,
NullableFlowState
.MaybeNull);
5040
SetState(ref state, childSlot,
NullableFlowState
.NotNull);
5159
BoundNullCoalescingOperatorResultKind.NoCommonType => (node.Type,
NullableFlowState
.NotNull),
5164
BoundNullCoalescingOperatorResultKind.RightDynamicType => (rightResultType!,
NullableFlowState
.NotNull),
5171
(TypeSymbol ResultType,
NullableFlowState
LeftState) getLeftResultType(TypeSymbol leftType, TypeSymbol rightType)
5181
return (rightType,
NullableFlowState
.NotNull);
5186
return (leftType,
NullableFlowState
.NotNull);
5189
(TypeSymbol ResultType,
NullableFlowState
LeftState) getResultStateWithRightType(TypeSymbol leftType, TypeSymbol rightType)
5201
TypeWithState.Create(leftType,
NullableFlowState
.NotNull),
5212
return (rightType,
NullableFlowState
.NotNull);
5384
SetResultType(node, TypeWithState.Create(resultType,
NullableFlowState
.MaybeDefault));
5445
var
rValueState = consequenceRValue.State.Join(alternativeRValue.State);
5522
NullableFlowState
resultState;
5674
SetResultType(node, TypeWithState.Create(rvalueType,
NullableFlowState
.NotNull));
5907
private
NullableFlowState
LearnFromCompareExchangeMethod(in CompareExchangeInfo compareExchangeInfo)
5927
return
NullableFlowState
.NotNull;
5937
var
valueFlowState = compareExchangeInfo.Results[valueIndex].RValueType.State;
5944
var
locationFlowState = compareExchangeInfo.Results[locationIndex].RValueType.State;
6041
return TypeWithState.Create(typeWithState.Type,
NullableFlowState
.NotNull);
6046
return TypeWithState.Create(typeWithState.Type,
NullableFlowState
.MaybeDefault);
6442
SetState(ref state, memberSlot,
NullableFlowState
.NotNull);
6716
var
adjustedState = LearnFromCompareExchangeMethod(in compareExchangeInfoOpt);
6840
return TypeWithState.Create(typeWithState.Type,
NullableFlowState
.MaybeDefault);
6846
return TypeWithState.Create(typeWithState.Type,
NullableFlowState
.NotNull);
6861
return TypeWithState.Create(typeWithState.Type,
NullableFlowState
.MaybeDefault);
6865
return TypeWithState.Create(typeWithState.Type,
NullableFlowState
.NotNull);
6880
return TypeWithState.Create(typeWithState.Type,
NullableFlowState
.MaybeDefault);
6884
return TypeWithState.Create(typeWithState.Type,
NullableFlowState
.NotNull);
7312
NullableFlowState
state = GetState(ref this.State, slot);
7577
SetResultType(node, TypeWithState.Create(null,
NullableFlowState
.NotNull));
7584
SetState(ref this.State, slot,
NullableFlowState
.NotNull);
7596
SetResultType(node, TypeWithState.Create(tupleOpt,
NullableFlowState
.NotNull));
7718
SetState(ref this.State, targetFieldSlot,
NullableFlowState
.NotNull);
7735
SetState(ref this.State, targetFieldSlot,
NullableFlowState
.NotNull);
7957
NullableFlowState
resultState =
NullableFlowState
.NotNull;
7991
resultState =
NullableFlowState
.NotNull;
8015
return TypeWithState.Create(targetType,
NullableFlowState
.NotNull);
8021
resultState =
NullableFlowState
.NotNull;
8025
resultState =
NullableFlowState
.NotNull;
8030
resultState =
NullableFlowState
.NotNull;
8069
resultState =
NullableFlowState
.NotNull;
8193
resultState =
NullableFlowState
.NotNull;
8237
static TypeWithState calculateResultType(TypeWithAnnotations targetTypeWithNullability, bool fromExplicitCast,
NullableFlowState
resultState, bool isSuppressed, TypeSymbol targetType)
8241
resultState =
NullableFlowState
.NotNull;
8246
resultState = targetType?.IsTypeParameterDisallowingAnnotationInCSharp8() == true ?
NullableFlowState
.MaybeDefault :
NullableFlowState
.MaybeNull;
8253
static
NullableFlowState
getReferenceConversionResultState(TypeWithAnnotations targetType, TypeWithState operandType)
8255
var
state = operandType.State;
8258
case
NullableFlowState
.MaybeNull:
8264
return
NullableFlowState
.MaybeDefault;
8270
return (annotation == NullableAnnotation.Annotated) ?
NullableFlowState
.MaybeDefault :
NullableFlowState
.MaybeNull;
8274
case
NullableFlowState
.MaybeDefault:
8277
return
NullableFlowState
.MaybeNull;
8287
static
NullableFlowState
getBoxingConversionResultState(TypeWithAnnotations targetType, TypeWithState operandType)
8289
var
state = operandType.State;
8290
if (state ==
NullableFlowState
.MaybeNull)
8295
return
NullableFlowState
.MaybeDefault;
8305
return (annotation == NullableAnnotation.Annotated) ?
NullableFlowState
.MaybeDefault :
NullableFlowState
.MaybeNull;
8315
static
NullableFlowState
getUnboxingConversionResultState(TypeWithState operandType)
8317
var
state = operandType.State;
8318
if (state ==
NullableFlowState
.MaybeNull)
8320
return
NullableFlowState
.MaybeDefault;
8325
static
NullableFlowState
getConversionResultState(TypeWithState operandType)
8327
var
state = operandType.State;
8328
if (state ==
NullableFlowState
.MaybeNull)
8330
return
NullableFlowState
.MaybeDefault;
8457
var resultType = TypeWithState.Create(targetType,
NullableFlowState
.NotNull);
8500
NullableFlowState
operandState = operandType.State;
8617
private TypeWithState GetLiftedReturnType(TypeWithAnnotations returnType,
NullableFlowState
operandState)
8621
NullableFlowState
state = returnType.ToTypeWithState().State.Join(operandState);
8638
private TypeWithState GetLiftedReturnTypeIfNecessary(bool isLifted, TypeWithAnnotations returnType,
NullableFlowState
operandState)
8734
var result = TypeWithState.Create(delegateType,
NullableFlowState
.NotNull);
9019
var rvalueResult = TypeWithState.Create(node.Type,
NullableFlowState
.NotNull);
9435
var valueBeforeNullableWrapping = TypeWithState.Create(underlyingType.Type,
NullableFlowState
.NotNull);
9695
resultType = TypeWithState.Create(node.Type,
NullableFlowState
.NotNull);
9902
var
state = GetState(ref this.State, slot);
9914
SetState(ref this.StateWhenTrue, containingSlot,
NullableFlowState
.NotNull);
10097
if (enumeratorReturnType.State !=
NullableFlowState
.NotNull)
10178
var
state =
NullableFlowState
.NotNull;
10372
TypeWithState.Create(node.Type, node.OperatorKind.IsLifted() ? argumentResult.State :
NullableFlowState
.NotNull);
10419
return TypeWithState.Create(node.Type,
NullableFlowState
.NotNull);
10537
SetResultType(node, TypeWithState.Create(node.Type,
NullableFlowState
.NotNull));
10559
SetResultType(node, TypeWithState.Create(node.Type,
NullableFlowState
.MaybeDefault));
10574
SetState(ref this.State, slot,
NullableFlowState
.NotNull);
10622
NullableFlowState
resultState =
NullableFlowState
.NotNull;
10637
resultState =
NullableFlowState
.MaybeDefault;
10675
SetResultType(node, TypeWithState.Create(node.Type, node.Type?.CanContainNull() != false && node.ConstantValueOpt?.IsNull == true ?
NullableFlowState
.MaybeDefault :
NullableFlowState
.NotNull));
10783
node.IsAddition ? GetState(ref this.State, memberSlot).Meet(ResultType.State) :
NullableFlowState
.MaybeNull);
10900
private bool ReportPossibleNullReceiverIfNeeded(TypeSymbol type,
NullableFlowState
state, bool checkNullableValueType, SyntaxNode syntax, out bool reportedDiagnostic)
10959
SetResultType(node, TypeWithState.Create(node.Type,
NullableFlowState
.NotNull));
10974
SetResultType(node, TypeWithState.Create(node.Type,
NullableFlowState
.NotNull));
11023
SetResultType(node, TypeWithState.Create(node.Type,
NullableFlowState
.NotNull));
11029
SetResultType(node, TypeWithState.Create(type,
NullableFlowState
.NotNull));
11097
SetState(ref this.State, slot,
NullableFlowState
.NotNull);
11186
Debug.Assert(ResultType is TypeWithState { Type: FunctionPointerTypeSymbol { }, State:
NullableFlowState
.NotNull });
11491
SetValue(Id, index, useNotNullsAsDefault ?
NullableFlowState
.NotNull : walker.GetDefaultState(ref this, slot));
11495
public
NullableFlowState
this[int slot]
11509
private
NullableFlowState
GetValue(int id, int index)
11519
private
NullableFlowState
GetValue(int index)
11523
return
NullableFlowState
.NotNull;
11527
var
result = (_state[index], _state[index + 1]) switch
11530
(true, false) =>
NullableFlowState
.MaybeNull,
11531
(false, true) =>
NullableFlowState
.MaybeDefault,
11532
(true, true) =>
NullableFlowState
.NotNull
11537
private void SetValue(int id, int index,
NullableFlowState
value)
11550
private void SetValue(int index,
NullableFlowState
value)
11558
NullableFlowState
.MaybeNull => (true, false),
11559
NullableFlowState
.MaybeDefault => (false, true),
11560
NullableFlowState
.NotNull => (true, true),
11611
var
oldValue = GetValue(i);
11612
var
newValue = oldValue.Join(other.GetValue(i));
11637
var
oldValue = GetValue(i);
11638
var
newValue = oldValue.Meet(other.GetValue(i));
11654
var mayBeNull = GetValue(i) is
NullableFlowState
.MaybeNull or
NullableFlowState
.MaybeDefault;
11685
NullableFlowState
.MaybeNull => "?",
11686
NullableFlowState
.MaybeDefault => "??",
FlowAnalysis\NullableWalker_Patterns.cs (5)
443
SetState(ref State, outputSlot,
NullableFlowState
.NotNull);
537
SetState(ref this.State, outputSlot,
NullableFlowState
.NotNull); // Slice value is assumed to be never null
640
var
tempState = GetState(ref this.State, tempSlot);
913
NullableFlowState
inferredState;
961
NullableFlowState
inferredState = BestTypeInferrer.GetNullableState(resultTypes);
Symbols\ConstraintsHelper.cs (14)
1121
static
NullableFlowState
getTypeArgumentState(in TypeWithAnnotations typeWithAnnotations)
1126
return
NullableFlowState
.NotNull;
1130
return type.IsNullableTypeOrTypeParameter() ?
NullableFlowState
.MaybeNull :
NullableFlowState
.NotNull;
1135
return type.IsTypeParameterDisallowingAnnotationInCSharp8() ?
NullableFlowState
.MaybeDefault :
NullableFlowState
.MaybeNull;
1137
return
NullableFlowState
.NotNull;
1142
return
NullableFlowState
.NotNull;
1144
NullableFlowState
? result = null;
1147
var
constraintState = getTypeArgumentState(constraintType);
1157
return result ??
NullableFlowState
.MaybeNull;
1160
static bool constraintTypeAllows(in TypeWithAnnotations typeWithAnnotations,
NullableFlowState
state)
1162
if (state ==
NullableFlowState
.NotNull)
1189
return state ==
NullableFlowState
.MaybeNull;
Symbols\NullableAnnotationExtensions.cs (1)
104
var
flowState = TypeWithAnnotations.Create(type, annotation).ToTypeWithState().State;
Symbols\NullableFlowState.cs (1)
11
/// When in doubt we conservatively use <see cref="
NullableFlowState
.NotNull"/>
Symbols\NullableFlowStateExtensions.cs (20)
13
public static bool MayBeNull(this
NullableFlowState
state) => state !=
NullableFlowState
.NotNull;
15
public static bool IsNotNull(this
NullableFlowState
state) => state ==
NullableFlowState
.NotNull;
19
/// The result is <see cref="
NullableFlowState
.MaybeNull"/> if either operand is that.
21
public static
NullableFlowState
Join(this
NullableFlowState
a,
NullableFlowState
b) => (a > b) ? a : b;
25
/// The result is <see cref="
NullableFlowState
.NotNull"/> if either operand is that.
27
public static
NullableFlowState
Meet(this
NullableFlowState
a,
NullableFlowState
b) => (a < b) ? a : b;
29
internal static CodeAnalysis.NullableFlowState ToPublicFlowState(this CSharp.
NullableFlowState
nullableFlowState) =>
32
CSharp.
NullableFlowState
.NotNull => CodeAnalysis.NullableFlowState.NotNull,
33
CSharp.
NullableFlowState
.MaybeNull => CodeAnalysis.NullableFlowState.MaybeNull,
34
CSharp.
NullableFlowState
.MaybeDefault => CodeAnalysis.NullableFlowState.MaybeNull,
39
public static CSharp.
NullableFlowState
ToInternalFlowState(this CodeAnalysis.NullableFlowState flowState) =>
42
CodeAnalysis.NullableFlowState.None => CSharp.
NullableFlowState
.NotNull,
43
CodeAnalysis.NullableFlowState.NotNull => CSharp.
NullableFlowState
.NotNull,
44
CodeAnalysis.NullableFlowState.MaybeNull => CSharp.
NullableFlowState
.MaybeNull,
Symbols\TypeWithAnnotations.cs (11)
784
static
NullableFlowState
getFlowState(TypeSymbol type, NullableAnnotation annotation)
788
return annotation.IsAnnotated() ?
NullableFlowState
.MaybeDefault :
NullableFlowState
.NotNull;
792
return annotation switch { NullableAnnotation.Annotated =>
NullableFlowState
.MaybeDefault, NullableAnnotation.NotAnnotated =>
NullableFlowState
.MaybeNull, _ =>
NullableFlowState
.NotNull };
796
return annotation switch { NullableAnnotation.Annotated =>
NullableFlowState
.MaybeDefault, _ =>
NullableFlowState
.NotNull };
800
return
NullableFlowState
.MaybeNull;
802
return annotation switch { NullableAnnotation.Annotated =>
NullableFlowState
.MaybeNull, _ =>
NullableFlowState
.NotNull };
Symbols\TypeWithState.cs (20)
17
public readonly
NullableFlowState
State;
20
public bool MayBeNull => State ==
NullableFlowState
.MaybeNull;
21
public bool IsNotNull => State ==
NullableFlowState
.NotNull;
25
return Create(type,
NullableFlowState
.MaybeDefault);
28
public static TypeWithState Create(TypeSymbol? type,
NullableFlowState
defaultState)
30
if (defaultState ==
NullableFlowState
.MaybeDefault &&
36
var
state = defaultState !=
NullableFlowState
.NotNull && type?.CanContainNull() != false ?
NullableFlowState
.MaybeNull :
NullableFlowState
.NotNull;
45
NullableFlowState
state;
50
state =
NullableFlowState
.MaybeDefault;
54
state =
NullableFlowState
.NotNull;
63
state =
NullableFlowState
.NotNull;
69
private TypeWithState(TypeSymbol? type,
NullableFlowState
state)
71
Debug.Assert(state ==
NullableFlowState
.NotNull || type?.CanContainNull() != false);
72
Debug.Assert(state !=
NullableFlowState
.MaybeDefault || type is null || type.IsTypeParameterDisallowingAnnotationInCSharp8());
81
public TypeWithState WithNotNullState() => new TypeWithState(Type,
NullableFlowState
.NotNull);
83
public TypeWithState WithSuppression(bool suppress) => suppress ? new TypeWithState(Type,
NullableFlowState
.NotNull) : this;
90
return (State ==
NullableFlowState
.MaybeDefault || asAnnotatedType) ? type.SetIsAnnotated(compilation) : type;
Microsoft.CodeAnalysis.CSharp.Semantic.UnitTests (42)
Semantics\NullableReferenceTypesTests.cs (42)
123107
private static readonly
NullableFlowState
[] s_AllNullableFlowStates = (
NullableFlowState
[])Enum.GetValues(typeof(
NullableFlowState
));
123128
var inputs = new[] {
NullableFlowState
.NotNull,
NullableFlowState
.MaybeNull };
123130
Func<int, int,
NullableFlowState
> getResult = (i, j) => inputs[i].Join(inputs[j]);
123132
var expected = new
NullableFlowState
[2, 2]
123134
{
NullableFlowState
.NotNull,
NullableFlowState
.MaybeNull },
123135
{
NullableFlowState
.MaybeNull,
NullableFlowState
.MaybeNull },
123160
var inputs = new[] {
NullableFlowState
.NotNull,
NullableFlowState
.MaybeNull };
123161
Func<int, int,
NullableFlowState
> getResult = (i, j) => inputs[i].Meet(inputs[j]);
123163
var expected = new
NullableFlowState
[2, 2]
123165
{
NullableFlowState
.NotNull,
NullableFlowState
.NotNull },
123166
{
NullableFlowState
.NotNull,
NullableFlowState
.MaybeNull },
123193
private static void AssertEqual(
NullableFlowState
[,] expected, Func<int, int,
NullableFlowState
> getResult, int size)
123195
AssertEx.Equal<
NullableFlowState
>(expected, getResult, (na1, na2) => na1 == na2, na => $"NullableFlowState.{na}", "{0,-32:G}", size);
123214
foreach (
var
a in s_AllNullableFlowStates)
123216
foreach (
var
b in s_AllNullableFlowStates)
123244
foreach (
var
a in s_AllNullableFlowStates)
123246
foreach (
var
b in s_AllNullableFlowStates)
123248
foreach (
var
c in s_AllNullableFlowStates)
123250
var
leftFirst = a.Join(b).Join(c);
123251
var
rightFirst = a.Join(b.Join(c));
123278
foreach (
var
a in s_AllNullableFlowStates)
123280
foreach (
var
b in s_AllNullableFlowStates)
123282
foreach (
var
c in s_AllNullableFlowStates)
123284
var
leftFirst = a.Meet(b).Meet(c);
123285
var
rightFirst = a.Meet(b.Meet(c));
123331
foreach (
var
a in s_AllNullableFlowStates)
123333
foreach (
var
b in s_AllNullableFlowStates)
123335
var
leftFirst = a.Join(b);
123336
var
rightFirst = b.Join(a);
123359
foreach (
var
a in s_AllNullableFlowStates)
123361
foreach (
var
b in s_AllNullableFlowStates)
123363
var
leftFirst = a.Meet(b);
123364
var
rightFirst = b.Meet(a);