Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -592,41 +592,25 @@ protected override TypeAnnotations CreateValueFromKey(TypeDesc key)
}
}

if (IsAutoProperty(property))
bool backingFieldFound = backingFieldFromGetter is not null
|| backingFieldFromSetter is not null;
bool mismatchingBackingField = backingFieldFromGetter is not null
&& backingFieldFromSetter is not null
&& backingFieldFromGetter != backingFieldFromSetter;

if (backingFieldFound
&& !mismatchingBackingField
&& IsAutoProperty(property))
Comment thread
jtschuster marked this conversation as resolved.
Outdated
{
FieldDesc? backingField = null;
if ((property.SetMethod is not null
&& property.SetMethod.HasCustomAttribute("System.Runtime.CompilerServices", "CompilerGeneratedAttribute")
&& backingFieldFromSetter is null)
|| (property.GetMethod is not null
&& property.GetMethod.HasCustomAttribute("System.Runtime.CompilerServices", "CompilerGeneratedAttribute")
&& backingFieldFromGetter is null))
// We either have a single auto-property accessor or both accessors point to the same backing field
FieldDesc backingField = backingFieldFromSetter ?? backingFieldFromGetter!;
if (annotatedFields.Any(a => a.Field == backingField))
Comment thread
jtschuster marked this conversation as resolved.
Outdated
Comment thread
sbomer marked this conversation as resolved.
Outdated
{
// We failed to find the backing field of an auto-property accessor
_logger.LogWarning(property, DiagnosticId.DynamicallyAccessedMembersCouldNotFindBackingField, property.GetDisplayName());
}
else if (backingFieldFromGetter is not null && backingFieldFromSetter is not null
&& backingFieldFromSetter != backingFieldFromGetter)
{
// We found two different backing fields for the getter and the setter
_logger.LogWarning(property, DiagnosticId.DynamicallyAccessedMembersCouldNotFindBackingField, property.GetDisplayName());
_logger.LogWarning(backingField, DiagnosticId.DynamicallyAccessedMembersOnPropertyConflictsWithBackingField, property.GetDisplayName(), backingField.GetDisplayName());
}
else
{
// We either have a single auto-property accessor or both accessors point to the same backing field
backingField = backingFieldFromSetter ?? backingFieldFromGetter;
}

if (backingField != null)
{
if (annotatedFields.Any(a => a.Field == backingField))
{
_logger.LogWarning(backingField, DiagnosticId.DynamicallyAccessedMembersOnPropertyConflictsWithBackingField, property.GetDisplayName(), backingField.GetDisplayName());
}
else
{
annotatedFields.Add(new FieldAnnotation(backingField, annotation));
}
annotatedFields.Add(new FieldAnnotation(backingField, annotation));
}
Comment thread
jtschuster marked this conversation as resolved.
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,11 +117,11 @@ internal static DynamicallyAccessedMemberTypes GetFieldAnnotation(IFieldSymbol f
if (!field.OriginalDefinition.Type.IsTypeInterestingForDataflow(isByRef: field.RefKind is not RefKind.None))
return DynamicallyAccessedMemberTypes.None;

if (field.AssociatedSymbol is IPropertySymbol property)
if (field.AssociatedSymbol is IPropertySymbol property
&& property.IsAutoProperty())
{
// If this is an auto property, we get the property annotation
if (property.IsAutoProperty())
return property.GetDynamicallyAccessedMemberTypes();
return property.GetDynamicallyAccessedMemberTypes();
}

return field.GetDynamicallyAccessedMemberTypes();
Expand Down
43 changes: 13 additions & 30 deletions src/tools/illink/src/linker/Linker.Dataflow/FlowAnnotations.cs
Original file line number Diff line number Diff line change
Expand Up @@ -433,41 +433,24 @@ TypeAnnotations BuildTypeAnnotations(TypeDefinition type)
}
}

if (IsAutoProperty(property))
bool backingFieldFound = backingFieldFromGetter is not null
|| backingFieldFromSetter is not null;
bool mismatchingBackingField = backingFieldFromGetter is not null
&& backingFieldFromSetter is not null
&& backingFieldFromGetter != backingFieldFromSetter;

if (backingFieldFound
&& !mismatchingBackingField
&& IsAutoProperty(property))
{
FieldDefinition? backingField = null;
// If it's an annotated auto-prop, we should be able to find the compiler generated field
if ((property.SetMethod is not null
&& property.SetMethod.IsCompilerGenerated()
&& backingFieldFromSetter is null)
|| (property.GetMethod is not null
&& property.GetMethod.IsCompilerGenerated()
&& backingFieldFromGetter is null))
FieldDefinition backingField = backingFieldFromSetter ?? backingFieldFromGetter!;
if (annotatedFields.Any(a => a.Field == backingField))
{
// We failed to find the backing field of an auto-property accessor
_context.LogWarning(property, DiagnosticId.DynamicallyAccessedMembersCouldNotFindBackingField, property.GetDisplayName());
}
else if (backingFieldFromGetter is not null && backingFieldFromSetter is not null
&& backingFieldFromSetter != backingFieldFromGetter)
{
// We found two different backing fields for the getter and the setter
_context.LogWarning(property, DiagnosticId.DynamicallyAccessedMembersCouldNotFindBackingField, property.GetDisplayName());
_context.LogWarning(backingField, DiagnosticId.DynamicallyAccessedMembersOnPropertyConflictsWithBackingField, property.GetDisplayName(), backingField.GetDisplayName());
}
else
{
// We either have a single auto-property accessor or both accessors point to the same backing field
backingField = backingFieldFromSetter ?? backingFieldFromGetter;
}
if (backingField != null)
{
if (annotatedFields.Any(a => a.Field == backingField))
{
_context.LogWarning(backingField, DiagnosticId.DynamicallyAccessedMembersOnPropertyConflictsWithBackingField, property.GetDisplayName(), backingField.GetDisplayName());
}
else
{
annotatedFields.Add(new FieldAnnotation(backingField, annotation));
}
annotatedFields.Add(new FieldAnnotation(backingField, annotation));
}
}
}
Expand Down
Loading