-
Notifications
You must be signed in to change notification settings - Fork 4.2k
Labels
Milestone
Description
public override BoundNode VisitConditionalAccess(BoundConditionalAccess node)
{
Debug.Assert(!IsConditionalState);
var receiver = node.Receiver;
var receiverType = VisitRvalueWithResult(receiver);
var receiverState = this.State.Clone();
if (receiver.Type?.IsValueType == false)
{
if (receiverType.IsNullable == false)
{
ReportDiagnostic(ErrorCode.HDN_ExpressionIsProbablyNeverNull, receiver.Syntax);
}
int slot = MakeSlot(SkipReferenceConversions(receiver));
if (slot > 0)
{
if (slot >= this.State.Capacity) Normalize(ref this.State);
this.State[slot] = true;
}
}
if (IsConstantNull(node.Receiver))
{
SetUnreachable();
}
VisitRvalue(node.AccessExpression);
IntersectWith(ref this.State, ref receiverState);
// PROTOTYPE(NullableReferenceTypes): Use flow analysis type rather than node.Type
// so that nested nullability is inferred from flow analysis. See VisitConditionalOperator.
_resultType = TypeSymbolWithAnnotations.Create(node.Type, isNullableIfReferenceType: receiverType.IsNullable | _resultType.IsNullable);
// PROTOTYPE(NullableReferenceTypes): Report conversion warnings.
return null;
}
public override BoundNode VisitConditionalReceiver(BoundConditionalReceiver node)
{
var result = base.VisitConditionalReceiver(node);
// PROTOTYPE(NullableReferenceTypes): ConditionalReceiver does not
// have a result type. Should this be moved to ConditionalAccess?
_resultType = TypeSymbolWithAnnotations.Create(node.Type, isNullableIfReferenceType: false);
return result;
}Reactions are currently unavailable