FlowAnalysis\NullableWalker.cs (32)
111public VisitResult(TypeSymbol? type, NullableAnnotation annotation, NullableFlowState state)
2200case NullableAnnotation.Oblivious:
2201case NullableAnnotation.Annotated:
3764var result = new VisitResult(objectInitializer.Type, NullableAnnotation.NotAnnotated, NullableFlowState.NotNull);
3953SetAnalyzedNullability(node.ImplicitReceiverOpt, new VisitResult(node.ImplicitReceiverOpt.Type, NullableAnnotation.NotAnnotated, NullableFlowState.NotNull));
4061return GetOrCreatePlaceholderSlot(node, TypeWithAnnotations.Create(node.Type, NullableAnnotation.NotAnnotated));
5110targetType = TypeWithAnnotations.Create(node.Type, NullableAnnotation.NotAnnotated);
5444var lValueAnnotation = consequenceLValue.NullableAnnotation.EnsureCompatible(alternativeLValue.NullableAnnotation);
7090private static NullableAnnotation GetNullableAnnotation(BoundExpression expr)
7097return expr.ConstantValueOpt == ConstantValue.NotAvailable || !expr.ConstantValueOpt.IsNull || expr.IsSuppressed ? NullableAnnotation.NotAnnotated : NullableAnnotation.Annotated;
7104return NullableAnnotation.NotAnnotated;
7107return NullableAnnotation.Oblivious;
7160return new BoundExpressionWithNullability(argument.Syntax, argument, NullableAnnotation.Oblivious, type: null);
8268dependsOnTypeParameter(typeParameter1, (TypeParameterSymbol)targetType.Type, NullableAnnotation.NotAnnotated, out var annotation))
8270return (annotation == NullableAnnotation.Annotated) ? NullableFlowState.MaybeDefault : NullableFlowState.MaybeNull;
8301bool dependsOn = dependsOnTypeParameter(typeParameter1, typeParameter2, NullableAnnotation.NotAnnotated, out var annotation);
8305return (annotation == NullableAnnotation.Annotated) ? NullableFlowState.MaybeDefault : NullableFlowState.MaybeNull;
8338static bool dependsOnTypeParameter(TypeParameterSymbol typeParameter1, TypeParameterSymbol typeParameter2, NullableAnnotation typeParameter1Annotation, out NullableAnnotation annotation)
8346var combinedAnnotation = NullableAnnotation.Annotated;
8350dependsOnTypeParameter(constraintTypeParameter, typeParameter2, constraintType.NullableAnnotation, out var constraintAnnotation))
8833var argTypeWithAnnotations = TypeWithAnnotations.Create(argType, NullableAnnotation.NotAnnotated);
9020var lvalueResult = TypeWithAnnotations.Create(node.Type, NullableAnnotation.NotAnnotated);
9300placeholderArgs.Add(new BoundExpressionWithNullability(variables[i].Expression.Syntax, variables[i].Expression, NullableAnnotation.Oblivious, conversion.DeconstructionInfo.OutputPlaceholders[i].Type));
10088TypeWithAnnotations.Create(node.EnumeratorInfoOpt.ElementType, NullableAnnotation.NotAnnotated).ToTypeWithState();
10758var result = TypeWithAnnotations.Create(node.Type, NullableAnnotation.Oblivious);
10864var result = TypeWithAnnotations.Create(node.Type, NullableAnnotation.Oblivious);
11035var result = TypeWithAnnotations.Create(node.Type, node.IsInferred ? NullableAnnotation.Annotated : node.NullableAnnotation);
Generated\BoundNodes.xml.Generated.cs (10)
1532public BoundRefValueOperator(SyntaxNode syntax, NullableAnnotation nullableAnnotation, BoundExpression operand, TypeSymbol type, bool hasErrors = false)
1544public NullableAnnotation NullableAnnotation { get; }
1550public BoundRefValueOperator Update(NullableAnnotation nullableAnnotation, BoundExpression operand, TypeSymbol type)
8209public BoundDiscardExpression(SyntaxNode syntax, NullableAnnotation nullableAnnotation, bool isInferred, TypeSymbol? type, bool hasErrors)
8216public BoundDiscardExpression(SyntaxNode syntax, NullableAnnotation nullableAnnotation, bool isInferred, TypeSymbol? type)
8224public NullableAnnotation NullableAnnotation { get; }
8230public BoundDiscardExpression Update(NullableAnnotation nullableAnnotation, bool isInferred, TypeSymbol? type)
8442public BoundExpressionWithNullability(SyntaxNode syntax, BoundExpression expression, NullableAnnotation nullableAnnotation, TypeSymbol? type, bool hasErrors = false)
8454public NullableAnnotation NullableAnnotation { get; }
8459public BoundExpressionWithNullability Update(BoundExpression expression, NullableAnnotation nullableAnnotation, TypeSymbol? type)
Symbols\NullableAnnotationExtensions.cs (44)
16public static bool IsAnnotated(this NullableAnnotation annotation) => annotation == NullableAnnotation.Annotated;
18public static bool IsNotAnnotated(this NullableAnnotation annotation) => annotation == NullableAnnotation.NotAnnotated;
20public static bool IsOblivious(this NullableAnnotation annotation) => annotation == NullableAnnotation.Oblivious;
26public static NullableAnnotation Join(this NullableAnnotation a, NullableAnnotation b)
28Debug.Assert(a != NullableAnnotation.Ignored);
29Debug.Assert(b != NullableAnnotation.Ignored);
37public static NullableAnnotation Meet(this NullableAnnotation a, NullableAnnotation b)
39Debug.Assert(a != NullableAnnotation.Ignored);
40Debug.Assert(b != NullableAnnotation.Ignored);
48public static NullableAnnotation EnsureCompatible(this NullableAnnotation a, NullableAnnotation b)
50Debug.Assert(a != NullableAnnotation.Ignored);
51Debug.Assert(b != NullableAnnotation.Ignored);
54(NullableAnnotation.Oblivious, _) => b,
55(_, NullableAnnotation.Oblivious) => a,
63public static NullableAnnotation MergeNullableAnnotation(this NullableAnnotation a, NullableAnnotation b, VarianceKind variance)
65Debug.Assert(a != NullableAnnotation.Ignored);
66Debug.Assert(b != NullableAnnotation.Ignored);
77/// The attribute (metadata) representation of <see cref="NullableAnnotation.NotAnnotated"/>.
82/// The attribute (metadata) representation of <see cref="NullableAnnotation.Annotated"/>.
87/// The attribute (metadata) representation of <see cref="NullableAnnotation.Oblivious"/>.
98CSharp.NullableAnnotation internalAnnotation = annotation.ToInternalAnnotation();
102internal static NullabilityInfo ToNullabilityInfo(this NullableAnnotation annotation, TypeSymbol type)
126internal static CodeAnalysis.NullableAnnotation ToPublicAnnotation(TypeSymbol? type, NullableAnnotation annotation)
128Debug.Assert(annotation != NullableAnnotation.Ignored);
131NullableAnnotation.Annotated => CodeAnalysis.NullableAnnotation.Annotated,
132NullableAnnotation.NotAnnotated => CodeAnalysis.NullableAnnotation.NotAnnotated,
137NullableAnnotation.Oblivious when type?.IsValueType == true => CodeAnalysis.NullableAnnotation.NotAnnotated,
138NullableAnnotation.Oblivious => CodeAnalysis.NullableAnnotation.None,
140NullableAnnotation.Ignored => CodeAnalysis.NullableAnnotation.None,
148internal static CSharp.NullableAnnotation ToInternalAnnotation(this CodeAnalysis.NullableAnnotation annotation) =>
151CodeAnalysis.NullableAnnotation.None => CSharp.NullableAnnotation.Oblivious,
152CodeAnalysis.NullableAnnotation.NotAnnotated => CSharp.NullableAnnotation.NotAnnotated,
153CodeAnalysis.NullableAnnotation.Annotated => CSharp.NullableAnnotation.Annotated,
Symbols\TypeWithAnnotations.cs (49)
48public readonly NullableAnnotation NullableAnnotation;
50private TypeWithAnnotations(TypeSymbol defaultType, NullableAnnotation nullableAnnotation, Extensions extensions)
52Debug.Assert(defaultType?.IsNullableType() != true || nullableAnnotation == NullableAnnotation.Annotated);
79return Create(typeSymbol, nullableAnnotation: isAnnotated ? NullableAnnotation.Annotated : isNullableEnabled ? NullableAnnotation.NotAnnotated : NullableAnnotation.Oblivious);
82internal static TypeWithAnnotations Create(TypeSymbol typeSymbol, NullableAnnotation nullableAnnotation = NullableAnnotation.Oblivious, ImmutableArray<CustomModifier> customModifiers = default)
89Debug.Assert(nullableAnnotation != NullableAnnotation.Ignored || typeSymbol.IsTypeParameter());
92case NullableAnnotation.Oblivious:
93case NullableAnnotation.NotAnnotated:
97nullableAnnotation = NullableAnnotation.Annotated;
112return Create(Type, NullableAnnotation.Annotated, CustomModifiers);
122return Create(Type, NullableAnnotation.NotAnnotated, CustomModifiers);
126internal NullableAnnotation GetValueNullableAnnotation()
135return NullableAnnotation.Annotated;
140return NullableAnnotation.Annotated;
152case NullableAnnotation.Oblivious:
153case NullableAnnotation.Annotated:
156case NullableAnnotation.NotAnnotated:
165private static TypeWithAnnotations CreateNonLazyType(TypeSymbol typeSymbol, NullableAnnotation nullableAnnotation, ImmutableArray<CustomModifier> customModifiers)
172return new TypeWithAnnotations(defaultType: underlying.DefaultType, nullableAnnotation: NullableAnnotation.Annotated, Extensions.CreateLazy(compilation, underlying));
196return CreateNonLazyType(typeSymbol, NullableAnnotation.Annotated, this.CustomModifiers);
236NullableAnnotation nullableAnnotation = this.NullableAnnotation.MergeNullableAnnotation(other.NullableAnnotation, variance);
353var thisAnnotation = NullableAnnotation;
354var otherAnnotation = other.NullableAnnotation;
431Debug.Assert(NullableAnnotation != NullableAnnotation.Ignored);
441Debug.Assert(NullableAnnotation != NullableAnnotation.Ignored);
462else if (Is((TypeParameterSymbol)typeSymbol) && newTypeWithModifiers.NullableAnnotation != NullableAnnotation.Ignored)
472NullableAnnotation newAnnotation;
473Debug.Assert(newTypeWithModifiers.Type is not IndexedTypeParameterSymbol || newTypeWithModifiers.NullableAnnotation == NullableAnnotation.Ignored);
477newAnnotation = NullableAnnotation.Annotated;
479else if (newTypeWithModifiers.NullableAnnotation == NullableAnnotation.Ignored)
483else if (NullableAnnotation != NullableAnnotation.Oblivious)
494else if (newTypeWithModifiers.NullableAnnotation != NullableAnnotation.Oblivious)
568typeWithAnnotationsPredicate: (t, a, b) => t.NullableAnnotation != NullableAnnotation.Oblivious && !t.Type.IsErrorType() && !t.Type.IsValueType,
605var annotation = typeWithAnnotations.NullableAnnotation;
681if (result.NullableAnnotation != NullableAnnotation.Oblivious &&
684result = CreateNonLazyType(newTypeSymbol, NullableAnnotation.Oblivious, result.CustomModifiers);
704return CreateNonLazyType(typeSymbol, NullableAnnotation.NotAnnotated, CustomModifiers);
712if (NullableAnnotation != NullableAnnotation.Oblivious)
716return CreateNonLazyType(newTypeSymbol, NullableAnnotation.Oblivious, CustomModifiers);
784static NullableFlowState getFlowState(TypeSymbol type, NullableAnnotation annotation)
792return annotation switch { NullableAnnotation.Annotated => NullableFlowState.MaybeDefault, NullableAnnotation.NotAnnotated => NullableFlowState.MaybeNull, _ => NullableFlowState.NotNull };
796return annotation switch { NullableAnnotation.Annotated => NullableFlowState.MaybeDefault, _ => NullableFlowState.NotNull };
802return annotation switch { NullableAnnotation.Annotated => NullableFlowState.MaybeNull, _ => NullableFlowState.NotNull };
893return CreateNonLazyType(type.DefaultType, NullableAnnotation.Annotated, _customModifiers);
899return CreateNonLazyType(defaultType, defaultType.IsNullableType() ? type.NullableAnnotation : NullableAnnotation.NotAnnotated, _customModifiers);