11namespace IDisposableAnalyzers
22{
33 using System . Collections . Immutable ;
4- using System . Diagnostics . CodeAnalysis ;
54 using Gu . Roslyn . AnalyzerExtensions ;
65 using Microsoft . CodeAnalysis ;
76 using Microsoft . CodeAnalysis . CSharp ;
@@ -25,7 +24,7 @@ public override void Initialize(AnalysisContext context)
2524 private static void Handle ( SyntaxNodeAnalysisContext context )
2625 {
2726 if ( ! context . IsExcludedFromAnalysis ( ) &&
28- ShouldCheck ( context , out var expression ) )
27+ ShouldCheck ( context ) is { } expression )
2928 {
3029 if ( context . Node is ObjectCreationExpressionSyntax objectCreation &&
3130 context . SemanticModel . TryGetType ( objectCreation , context . CancellationToken , out var type ) &&
@@ -45,33 +44,28 @@ private static void Handle(SyntaxNodeAnalysisContext context)
4544 }
4645 }
4746
48- private static bool ShouldCheck ( SyntaxNodeAnalysisContext context , [ NotNullWhen ( true ) ] out ExpressionSyntax ? expression )
47+ private static ExpressionSyntax ? ShouldCheck ( SyntaxNodeAnalysisContext context )
4948 {
50- if ( context . Node is ExpressionSyntax candidate )
49+ return context . Node switch
5150 {
52- switch ( candidate . Kind ( ) )
53- {
54- case SyntaxKind . InvocationExpression :
55- case SyntaxKind . ObjectCreationExpression :
56- expression = candidate ;
57- return true ;
58- case SyntaxKind . SimpleMemberAccessExpression
59- when candidate is MemberAccessExpressionSyntax memberAccess &&
60- context . SemanticModel . TryGetSymbol ( memberAccess . Expression , context . CancellationToken , out IPropertySymbol ? property ) &&
61- Disposable . IsPotentiallyAssignableFrom ( property . Type , context . Compilation ) :
62- expression = memberAccess . Expression ;
63- return true ;
64- case SyntaxKind . ConditionalAccessExpression
65- when candidate is ConditionalAccessExpressionSyntax conditionalAccess &&
66- context . SemanticModel . TryGetSymbol ( conditionalAccess . Expression , context . CancellationToken , out IPropertySymbol ? property ) &&
67- Disposable . IsPotentiallyAssignableFrom ( property . Type , context . Compilation ) :
68- expression = conditionalAccess . Expression ;
69- return true ;
70- }
71- }
72-
73- expression = null ;
74- return false ;
51+ InvocationExpressionSyntax { Expression : MemberAccessExpressionSyntax { Expression : { } expression , Name : { Identifier : { ValueText : "Schedule" } } } }
52+ when context . SemanticModel . TryGetNamedType ( expression , context . CancellationToken , out var type ) &&
53+ type . IsAssignableTo ( KnownSymbol . RxIScheduler , context . SemanticModel . Compilation )
54+ => null ,
55+ InvocationExpressionSyntax invocation
56+ => invocation ,
57+ ObjectCreationExpressionSyntax objectCreation
58+ => objectCreation ,
59+ MemberAccessExpressionSyntax { Expression : { } expression }
60+ when context . SemanticModel . TryGetSymbol ( expression , context . CancellationToken , out IPropertySymbol ? property ) &&
61+ Disposable . IsPotentiallyAssignableFrom ( property . Type , context . Compilation )
62+ => expression ,
63+ ConditionalAccessExpressionSyntax { Expression : { } expression }
64+ when context . SemanticModel . TryGetSymbol ( expression , context . CancellationToken , out IPropertySymbol ? property ) &&
65+ Disposable . IsPotentiallyAssignableFrom ( property . Type , context . Compilation )
66+ => expression ,
67+ _ => null ,
68+ } ;
7569 }
7670
7771 private static bool IsStaticFieldInitializer ( ObjectCreationExpressionSyntax objectCreation )
0 commit comments