Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement nullable analysis for field keyword #75244

Open
RikkiGibson opened this issue Sep 25, 2024 · 0 comments
Open

Implement nullable analysis for field keyword #75244

RikkiGibson opened this issue Sep 25, 2024 · 0 comments

Comments

@RikkiGibson
Copy link
Contributor

#57012
dotnet/csharplang#8425

Tracks implementation of short-term nullability solution for field keyword in properties.

Calling out a few areas to change to implement set enforcement (not part of the initial PR, but maybe we will do it as a stretch goal):

else
{
do
{
foreach (var memberName in method.NotNullMembers)
{
enforceMemberNotNullOnMember(syntaxOpt, state, method, memberName);
}
method = method.OverriddenMethod;
}
while (method != null);
}

                     else
                     {
+                        if (method is SourcePropertyAccessorSymbol
+                            {
+                                MethodKind: MethodKind.PropertySet,
+                                AssociatedSymbol: SourcePropertySymbolBase { UsesFieldKeyword: true, BackingField: { } backingField }
+                            })
+                        {
+                            if (memberHasBadState(member, state))
+                            {
+                                // Member '{name}' must have a non-null value when exiting.
+                                Diagnostics.Add(ErrorCode.WRN_MemberNotNull, syntaxOpt?.GetLocation() ?? methodMainNode.Syntax.GetLastToken().GetLocation(), member.Name);
+                            }
+                        }

                         do
                         {
                             foreach (var memberName in method.NotNullMembers)
                             {
                                 enforceMemberNotNullOnMember(syntaxOpt, state, method, memberName);
                             }
 
                             method = method.OverriddenMethod;
                         }
                         while (method != null);
                     }

else
{
do
{
makeMembersMaybeNull(method, method.NotNullMembers);
makeMembersMaybeNull(method, method.NotNullWhenTrueMembers);
makeMembersMaybeNull(method, method.NotNullWhenFalseMembers);
method = method.OverriddenMethod;
}
while (method != null);
}

                     else
                     {
+                        if (method is SourcePropertyAccessorSymbol
+                            {
+                                MethodKind: MethodKind.PropertySet,
+                                AssociatedSymbol: SourcePropertySymbolBase { UsesFieldKeyword: true, BackingField: { } backingField }
+                            })
+                        {
+                            // https://github.com/dotnet/csharplang/blob/main/proposals/field-keyword.md#setter-analysis
+                            // setter assumes the backing field may be null and has to put the field into the correct state when exiting.
+                            if (getSlotForFieldOrPropertyOrEvent(backingField) is int memberSlot &&
+                                memberSlot > 0)
+                            {
+                                SetState(ref this.State, memberSlot, NullableFlowState.MaybeNull);
+                            }
+                        }

                         do
                         {
                             makeMembersMaybeNull(method, method.NotNullMembers);
                             makeMembersMaybeNull(method, method.NotNullWhenTrueMembers);
                             makeMembersMaybeNull(method, method.NotNullWhenFalseMembers);
                             method = method.OverriddenMethod;
                         }
                         while (method != null);
                     }
@dotnet-issue-labeler dotnet-issue-labeler bot added Area-Compilers untriaged Issues and PRs which have not yet been triaged by a lead labels Sep 25, 2024
@jaredpar jaredpar added Bug New Feature - Field Keyword and removed untriaged Issues and PRs which have not yet been triaged by a lead labels Oct 1, 2024
@jaredpar jaredpar added this to the 17.13 milestone Oct 1, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants