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
@@ -36,10 +35,6 @@ public class AwaitSynchronousTaskCompletionAnalyzer : DiagnosticAnalyzer {
3635 isEnabledByDefault : true , description : Description , helpLinkUri : HelpLinkFactory . CreateUri ( DiagnosticId )
3736 ) ;
3837
39- private const string TaskType = "System.Threading.Tasks.Task" ;
40- private const string FromResultMethod = "FromResult" ;
41- private const string CompletedTaskProperty = "CompletedTask" ;
42-
4338 public override ImmutableArray < DiagnosticDescriptor > SupportedDiagnostics => ImmutableArray . Create ( Rule ) ;
4439
4540 public override void Initialize ( AnalysisContext context ) {
@@ -53,7 +48,11 @@ private static void AnalyzeAwaitExpression(SyntaxNodeAnalysisContext context) {
5348 }
5449
5550 private class Analyzer : InternalAnalyzerBase < AwaitExpressionSyntax > {
56- public Analyzer ( SyntaxNodeAnalysisContext context ) : base ( new SyntaxNodeAnalysisContextWrapper ( context ) ) { }
51+ private readonly TaskAnalysis _taskAnalysis ;
52+
53+ public Analyzer ( SyntaxNodeAnalysisContext context ) : base ( new SyntaxNodeAnalysisContextWrapper ( context ) ) {
54+ _taskAnalysis = new TaskAnalysis ( context . SemanticModel , context . CancellationToken ) ;
55+ }
5756
5857 public override void Analyze ( ) {
5958 if ( ! AwaitsSynchronouslyCompletedTask ( ) ) {
@@ -69,16 +68,12 @@ private bool AwaitsSynchronouslyCompletedTask() {
6968
7069 private bool IsTaskFromResult ( ExpressionSyntax expression ) {
7170 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 ) ;
71+ && _taskAnalysis . IsFromResultInvocation ( invocation ) ;
7572 }
7673
7774 private bool IsCompletedTask ( ExpressionSyntax expression ) {
7875 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 ) ;
76+ && _taskAnalysis . IsCompletedTaskAccess ( memberAccess ) ;
8277 }
8378 }
8479 }
0 commit comments