Skip to content

Commit 1551bee

Browse files
authored
Don't report CA1861 if the highest initializer is a static member (#7381)
1 parent b88dcdb commit 1551bee

File tree

2 files changed

+37
-26
lines changed
  • src/Microsoft.CodeAnalysis.NetAnalyzers

2 files changed

+37
-26
lines changed

src/Microsoft.CodeAnalysis.NetAnalyzers/src/Microsoft.CodeAnalysis.NetAnalyzers/Microsoft.NetCore.Analyzers/Runtime/AvoidConstArrays.cs

Lines changed: 18 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -154,37 +154,29 @@ public override void Initialize(AnalysisContext context)
154154

155155
private static bool IsInitializingStaticOrReadOnlyFieldOrProperty(IOperation operation)
156156
{
157-
var ancestor = operation;
157+
IOperation? highestInitializerOrAssignment = null;
158+
IOperation? ancestor = operation;
158159
do
159160
{
160-
ancestor = ancestor!.Parent;
161-
} while (ancestor != null && !(ancestor.Kind == OperationKind.FieldInitializer || ancestor.Kind == OperationKind.PropertyInitializer ||
162-
ancestor.Kind == OperationKind.CoalesceAssignment || ancestor.Kind == OperationKind.SimpleAssignment));
163-
164-
if (ancestor != null)
165-
{
166-
switch (ancestor)
161+
if (ancestor?.Kind is OperationKind.FieldInitializer or OperationKind.PropertyInitializer or
162+
OperationKind.CoalesceAssignment or OperationKind.SimpleAssignment)
167163
{
168-
case IFieldInitializerOperation fieldInitializer:
169-
return fieldInitializer.InitializedFields.Any(x => x.IsStatic || x.IsReadOnly);
170-
case IPropertyInitializerOperation propertyInitializer:
171-
return propertyInitializer.InitializedProperties.Any(x => x.IsStatic || x.IsReadOnly);
172-
case IAssignmentOperation assignmentOperation:
173-
if (assignmentOperation.Target is IFieldReferenceOperation fieldReference && fieldReference.Field.IsStatic)
174-
{
175-
return true;
176-
}
177-
178-
if (assignmentOperation.Target is IPropertyReferenceOperation propertyReference && propertyReference.Property.IsStatic)
179-
{
180-
return true;
181-
}
182-
183-
break;
164+
highestInitializerOrAssignment = ancestor;
184165
}
185-
}
186166

187-
return false;
167+
ancestor = ancestor!.Parent;
168+
} while (ancestor != null);
169+
170+
return highestInitializerOrAssignment switch
171+
{
172+
IFieldInitializerOperation fieldInitializer =>
173+
fieldInitializer.InitializedFields.Any(x => x.IsStatic || x.IsReadOnly),
174+
IPropertyInitializerOperation propertyInitializer =>
175+
propertyInitializer.InitializedProperties.Any(x => x.IsStatic || x.IsReadOnly),
176+
IAssignmentOperation assignment =>
177+
assignment.Target is IMemberReferenceOperation memberReference && memberReference.Member.IsStatic,
178+
_ => false
179+
};
188180
}
189181
}
190182
}

src/Microsoft.CodeAnalysis.NetAnalyzers/tests/Microsoft.CodeAnalysis.NetAnalyzers.UnitTests/Microsoft.NetCore.Analyzers/Runtime/AvoidConstArraysTests.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1086,5 +1086,24 @@ public Class2()
10861086

10871087
return VerifyCS.VerifyCodeFixAsync(code, fixedCode);
10881088
}
1089+
1090+
[Fact, WorkItem(7365, "https://github.com/dotnet/roslyn-analyzers/issues/7365")]
1091+
public Task InlineStaticProperties_NoDiagnostic()
1092+
{
1093+
const string code = """
1094+
using System.Collections.Generic;
1095+
1096+
public class Class1
1097+
{
1098+
public static Class2 c2 = new Class2 { ListEntry = new List<IList<string>> { new[] { "test" } } };
1099+
}
1100+
1101+
public class Class2
1102+
{
1103+
public List<IList<string>> ListEntry { get; set; }
1104+
}
1105+
""";
1106+
return VerifyCS.VerifyAnalyzerAsync(code);
1107+
}
10891108
}
10901109
}

0 commit comments

Comments
 (0)