Skip to content

Commit

Permalink
Don't report CA1861 if the highest initializer is a static member
Browse files Browse the repository at this point in the history
  • Loading branch information
steveberdy committed Aug 16, 2024
1 parent 16bc384 commit 65af4ba
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 26 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -154,37 +154,29 @@ public override void Initialize(AnalysisContext context)

private static bool IsInitializingStaticOrReadOnlyFieldOrProperty(IOperation operation)
{
var ancestor = operation;
IOperation? highestInitializerOrAssignment = null;
IOperation? ancestor = operation;
do
{
ancestor = ancestor!.Parent;
} while (ancestor != null && !(ancestor.Kind == OperationKind.FieldInitializer || ancestor.Kind == OperationKind.PropertyInitializer ||
ancestor.Kind == OperationKind.CoalesceAssignment || ancestor.Kind == OperationKind.SimpleAssignment));

if (ancestor != null)
{
switch (ancestor)
if (ancestor?.Kind is OperationKind.FieldInitializer or OperationKind.PropertyInitializer or
OperationKind.CoalesceAssignment or OperationKind.SimpleAssignment)
{
case IFieldInitializerOperation fieldInitializer:
return fieldInitializer.InitializedFields.Any(x => x.IsStatic || x.IsReadOnly);
case IPropertyInitializerOperation propertyInitializer:
return propertyInitializer.InitializedProperties.Any(x => x.IsStatic || x.IsReadOnly);
case IAssignmentOperation assignmentOperation:
if (assignmentOperation.Target is IFieldReferenceOperation fieldReference && fieldReference.Field.IsStatic)
{
return true;
}

if (assignmentOperation.Target is IPropertyReferenceOperation propertyReference && propertyReference.Property.IsStatic)
{
return true;
}

break;
highestInitializerOrAssignment = ancestor;
}
}

return false;
ancestor = ancestor!.Parent;
} while (ancestor != null);

return highestInitializerOrAssignment switch
{
IFieldInitializerOperation fieldInitializer =>
fieldInitializer.InitializedFields.Any(x => x.IsStatic || x.IsReadOnly),
IPropertyInitializerOperation propertyInitializer =>
propertyInitializer.InitializedProperties.Any(x => x.IsStatic || x.IsReadOnly),
IAssignmentOperation assignment =>
assignment.Target is IMemberReferenceOperation memberReference && memberReference.Member.IsStatic,
_ => false
};
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1086,5 +1086,24 @@ public Class2()

return VerifyCS.VerifyCodeFixAsync(code, fixedCode);
}

[Fact, WorkItem(7365, "https://github.com/dotnet/roslyn-analyzers/issues/7365")]
public Task InlineStaticProperties_NoDiagnostic()
{
const string code = """
using System.Collections.Generic;

public class Class1
{
public static Class2 c2 = new Class2 { ListEntry = new List<IList<string>> { new[] { "test" } } };
}

public class Class2
{
public List<IList<string>> ListEntry { get; set; }
}
""";
return VerifyCS.VerifyAnalyzerAsync(code);
}
}
}

0 comments on commit 65af4ba

Please sign in to comment.