Skip to content

Commit dc21b95

Browse files
authored
Merge pull request #6343 from Youssef1313/multiple-enumeration-simplify
Simplify multiple enumeration analyzer
2 parents aef515f + f593994 commit dc21b95

File tree

6 files changed

+16
-68
lines changed

6 files changed

+16
-68
lines changed

src/NetAnalyzers/CSharp/Microsoft.CodeQuality.Analyzers/QualityGuidelines/CSharpAvoidMultipleEnumerationsAnalyzer.DataFlowOperationVisitor.cs

Lines changed: 0 additions & 25 deletions
This file was deleted.
Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,15 @@
11
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the MIT license. See License.txt in the project root for license information.
22

3+
using Microsoft.CodeAnalysis.CSharp.Syntax;
34
using Microsoft.CodeAnalysis.Diagnostics;
45
using Microsoft.CodeQuality.Analyzers.QualityGuidelines.AvoidMultipleEnumerations;
5-
using Microsoft.CodeQuality.Analyzers.QualityGuidelines.AvoidMultipleEnumerations.FlowAnalysis;
66

77
namespace Microsoft.CodeAnalysis.CSharp.NetAnalyzers.Microsoft.CodeQuality.Analyzers.QualityGuidelines
88
{
99
[DiagnosticAnalyzer(LanguageNames.CSharp)]
1010
internal sealed partial class CSharpAvoidMultipleEnumerationsAnalyzer : AvoidMultipleEnumerations
1111
{
12-
protected override GlobalFlowStateDictionaryFlowOperationVisitor CreateOperationVisitor(
13-
GlobalFlowStateDictionaryAnalysisContext context,
14-
WellKnownSymbolsInfo wellKnownSymbolsInfo)
15-
=> new CSharpInvocationCountValueSetFlowStateDictionaryFlowOperationVisitor(
16-
context,
17-
wellKnownSymbolsInfo);
12+
protected override bool IsExpressionOfForEachStatement(SyntaxNode node)
13+
=> node.Parent is ForEachStatementSyntax forEachStatementSyntax && forEachStatementSyntax.Expression.Equals(node);
1814
}
1915
}

src/NetAnalyzers/Core/Microsoft.CodeQuality.Analyzers/QualityGuidelines/AvoidMultipleEnumerations/AvoidMultipleEnumerations.DataFlowOperationVisitor.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,19 +15,20 @@ namespace Microsoft.CodeQuality.Analyzers.QualityGuidelines.AvoidMultipleEnumera
1515
{
1616
internal partial class AvoidMultipleEnumerations
1717
{
18-
internal abstract class AvoidMultipleEnumerationsFlowStateDictionaryFlowOperationVisitor : GlobalFlowStateDictionaryFlowOperationVisitor
18+
internal sealed class AvoidMultipleEnumerationsFlowStateDictionaryFlowOperationVisitor : GlobalFlowStateDictionaryFlowOperationVisitor
1919
{
20+
private readonly AvoidMultipleEnumerations _analyzer;
2021
private readonly WellKnownSymbolsInfo _wellKnownSymbolsInfo;
2122

22-
protected AvoidMultipleEnumerationsFlowStateDictionaryFlowOperationVisitor(
23+
internal AvoidMultipleEnumerationsFlowStateDictionaryFlowOperationVisitor(
24+
AvoidMultipleEnumerations analyzer,
2325
GlobalFlowStateDictionaryAnalysisContext analysisContext,
2426
WellKnownSymbolsInfo wellKnownSymbolsInfo) : base(analysisContext)
2527
{
28+
_analyzer = analyzer;
2629
_wellKnownSymbolsInfo = wellKnownSymbolsInfo;
2730
}
2831

29-
protected abstract bool IsExpressionOfForEachStatement(SyntaxNode node);
30-
3132
public override GlobalFlowStateDictionaryAnalysisValue VisitParameterReference(IParameterReferenceOperation operation, object? argument)
3233
{
3334
var value = base.VisitParameterReference(operation, argument);
@@ -361,7 +362,7 @@ private bool IsGetEnumeratorOfForEachLoopInvoked(IOperation operation)
361362
// because the Operation in CFG doesn't have that information. (CFG will convert the for each operation to control flow blocks)
362363
return operation.Parent is IInvocationOperation invocationOperation
363364
&& _wellKnownSymbolsInfo.GetEnumeratorMethods.Contains(invocationOperation.TargetMethod.OriginalDefinition)
364-
&& IsExpressionOfForEachStatement(invocationOperation.Syntax);
365+
&& _analyzer.IsExpressionOfForEachStatement(invocationOperation.Syntax);
365366
}
366367
}
367368
}

src/NetAnalyzers/Core/Microsoft.CodeQuality.Analyzers/QualityGuidelines/AvoidMultipleEnumerations/AvoidMultipleEnumerations.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -150,9 +150,7 @@ internal abstract partial class AvoidMultipleEnumerations : DiagnosticAnalyzer
150150
// Only available on .net6 or later
151151
"TryGetNonEnumeratedCount");
152152

153-
protected abstract GlobalFlowStateDictionaryFlowOperationVisitor CreateOperationVisitor(
154-
GlobalFlowStateDictionaryAnalysisContext context,
155-
WellKnownSymbolsInfo wellKnownSymbolsInfo);
153+
protected abstract bool IsExpressionOfForEachStatement(SyntaxNode syntax);
156154

157155
public override void Initialize(AnalysisContext context)
158156
{
@@ -300,7 +298,8 @@ private void Analyze(
300298
var analysisResult = GlobalFlowStateDictionaryAnalysis.TryGetOrComputeResult(
301299
cfg,
302300
context.OwningSymbol,
303-
analysisContext => CreateOperationVisitor(
301+
analysisContext => new AvoidMultipleEnumerationsFlowStateDictionaryFlowOperationVisitor(
302+
this,
304303
analysisContext,
305304
wellKnownSymbolsInfo),
306305
wellKnownTypeProvider,

src/NetAnalyzers/VisualBasic/Microsoft.CodeQuality.Analyzers/QualityGuidelines/BasicAvoidMultipleEnumerationsAnalyzer.DataFlowOperationVisitor.vb

Lines changed: 0 additions & 24 deletions
This file was deleted.

src/NetAnalyzers/VisualBasic/Microsoft.CodeQuality.Analyzers/QualityGuidelines/BasicAvoidMultipleEnumerationsAnalyzer.vb

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,18 @@
22

33
Imports Microsoft.CodeAnalysis
44
Imports Microsoft.CodeAnalysis.Diagnostics
5+
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
56
Imports Microsoft.CodeQuality.Analyzers.QualityGuidelines.AvoidMultipleEnumerations
6-
Imports Microsoft.CodeQuality.Analyzers.QualityGuidelines.AvoidMultipleEnumerations.FlowAnalysis
77

88
Namespace Microsoft.CodeQuality.VisualBasic.Analyzers.QualityGuidelines
99

1010
<DiagnosticAnalyzer(LanguageNames.VisualBasic)>
1111
Partial Friend NotInheritable Class BasicAvoidMultipleEnumerationsAnalyzer
1212
Inherits AvoidMultipleEnumerations
1313

14-
Protected Overrides Function CreateOperationVisitor(context As GlobalFlowStateDictionaryAnalysisContext, wellKnownSymbolsInfo As WellKnownSymbolsInfo) As GlobalFlowStateDictionaryFlowOperationVisitor
15-
Return New BasicInvocationCountDataFlowOperationVisitor(context, wellKnownSymbolsInfo)
14+
Protected Overrides Function IsExpressionOfForEachStatement(node As SyntaxNode) As Boolean
15+
Dim parent = TryCast(node.Parent, ForEachStatementSyntax)
16+
Return parent IsNot Nothing AndAlso parent.Expression.Equals(node)
1617
End Function
1718
End Class
1819
End Namespace

0 commit comments

Comments
 (0)