22using Microsoft . CodeAnalysis . CSharp ;
33using Microsoft . CodeAnalysis . CSharp . Syntax ;
44using Microsoft . CodeAnalysis . Diagnostics ;
5- using ParallelHelper . Extensions ;
65using ParallelHelper . Util ;
76using System . Collections . Immutable ;
87
@@ -37,7 +36,6 @@ public class AwaitSynchronousTaskCompletionAnalyzer : DiagnosticAnalyzer {
3736 ) ;
3837
3938 private const string TaskType = "System.Threading.Tasks.Task" ;
40- private const string FromResultMethod = "FromResult" ;
4139 private const string CompletedTaskProperty = "CompletedTask" ;
4240
4341 public override ImmutableArray < DiagnosticDescriptor > SupportedDiagnostics => ImmutableArray . Create ( Rule ) ;
@@ -53,7 +51,11 @@ private static void AnalyzeAwaitExpression(SyntaxNodeAnalysisContext context) {
5351 }
5452
5553 private class Analyzer : InternalAnalyzerBase < AwaitExpressionSyntax > {
56- public Analyzer ( SyntaxNodeAnalysisContext context ) : base ( new SyntaxNodeAnalysisContextWrapper ( context ) ) { }
54+ private readonly TaskAnalysis _taskAnalysis ;
55+
56+ public Analyzer ( SyntaxNodeAnalysisContext context ) : base ( new SyntaxNodeAnalysisContextWrapper ( context ) ) {
57+ _taskAnalysis = new TaskAnalysis ( context . SemanticModel , context . CancellationToken ) ;
58+ }
5759
5860 public override void Analyze ( ) {
5961 if ( ! AwaitsSynchronouslyCompletedTask ( ) ) {
@@ -69,16 +71,12 @@ private bool AwaitsSynchronouslyCompletedTask() {
6971
7072 private bool IsTaskFromResult ( ExpressionSyntax expression ) {
7173 return expression is InvocationExpressionSyntax invocation
72- && SemanticModel . GetSymbolInfo ( invocation , CancellationToken ) . Symbol is IMethodSymbol method
73- && method . Name . Equals ( FromResultMethod )
74- && SemanticModel . IsEqualType ( method . ContainingType , TaskType ) ;
74+ && _taskAnalysis . IsFromResultInvocation ( invocation ) ;
7575 }
7676
7777 private bool IsCompletedTask ( ExpressionSyntax expression ) {
7878 return expression is MemberAccessExpressionSyntax memberAccess
79- && SemanticModel . GetSymbolInfo ( memberAccess , CancellationToken ) . Symbol is IPropertySymbol property
80- && property . Name . Equals ( CompletedTaskProperty )
81- && SemanticModel . IsEqualType ( property . ContainingType , TaskType ) ;
79+ && _taskAnalysis . IsCompletedTaskAccess ( memberAccess ) ;
8280 }
8381 }
8482 }
0 commit comments