From 65af4bac03993e40b245c7d325760bc869a648b4 Mon Sep 17 00:00:00 2001 From: Steve Berdy <86739818+steveberdy@users.noreply.github.com> Date: Fri, 16 Aug 2024 18:01:25 -0400 Subject: [PATCH] Don't report CA1861 if the highest initializer is a static member --- .../Runtime/AvoidConstArrays.cs | 44 ++++++++----------- .../Runtime/AvoidConstArraysTests.cs | 19 ++++++++ 2 files changed, 37 insertions(+), 26 deletions(-) diff --git a/src/NetAnalyzers/Core/Microsoft.NetCore.Analyzers/Runtime/AvoidConstArrays.cs b/src/NetAnalyzers/Core/Microsoft.NetCore.Analyzers/Runtime/AvoidConstArrays.cs index 7336f096ab..dbb4e7ed2f 100644 --- a/src/NetAnalyzers/Core/Microsoft.NetCore.Analyzers/Runtime/AvoidConstArrays.cs +++ b/src/NetAnalyzers/Core/Microsoft.NetCore.Analyzers/Runtime/AvoidConstArrays.cs @@ -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 + }; } } } diff --git a/src/NetAnalyzers/UnitTests/Microsoft.NetCore.Analyzers/Runtime/AvoidConstArraysTests.cs b/src/NetAnalyzers/UnitTests/Microsoft.NetCore.Analyzers/Runtime/AvoidConstArraysTests.cs index c189f175db..6f9c4d6c23 100644 --- a/src/NetAnalyzers/UnitTests/Microsoft.NetCore.Analyzers/Runtime/AvoidConstArraysTests.cs +++ b/src/NetAnalyzers/UnitTests/Microsoft.NetCore.Analyzers/Runtime/AvoidConstArraysTests.cs @@ -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> { new[] { "test" } } }; + } + + public class Class2 + { + public List> ListEntry { get; set; } + } + """; + return VerifyCS.VerifyAnalyzerAsync(code); + } } }