@@ -125,12 +125,39 @@ private static void HandleReturnValue(SyntaxNodeAnalysisContext context, Express
125125 if ( ReturnType ( context ) ? . IsAwaitable ( ) == true &&
126126 IsInUsing ( returnValue ) &&
127127 ! returnValue . TryFirstAncestorOrSelf < AwaitExpressionSyntax > ( out _ ) &&
128- context . SemanticModel . TryGetType ( returnValue , context . CancellationToken , out var returnValueType2 ) &&
129- returnValueType2 . IsAwaitable ( ) &&
130128 ShouldAwait ( context , returnValue ) )
131129 {
132130 context . ReportDiagnostic ( Diagnostic . Create ( Descriptors . IDISP013AwaitInUsing , returnValue . GetLocation ( ) ) ) ;
133131 }
132+
133+ static bool ShouldAwait ( SyntaxNodeAnalysisContext context , ExpressionSyntax returnValue )
134+ {
135+ if ( context . SemanticModel . GetType ( returnValue , context . CancellationToken ) ? . IsAwaitable ( ) == true )
136+ {
137+ if ( returnValue . TryFirstAncestor ( out InvocationExpressionSyntax ? ancestor ) &&
138+ ancestor . TryGetMethodName ( out var ancestorName ) &&
139+ ancestorName == "ThrowsAsync" )
140+ {
141+ return false ;
142+ }
143+
144+ return returnValue switch
145+ {
146+ InvocationExpressionSyntax invocation
147+ => ! ( invocation . IsSymbol ( KnownSymbols . Task . FromResult , context . SemanticModel , context . CancellationToken )
148+ || invocation . IsSymbol ( KnownSymbols . ValueTask . FromResult , context . SemanticModel , context . CancellationToken ) ) ,
149+ MemberAccessExpressionSyntax { Name . Identifier . ValueText : "CompletedTask" } memberAccess
150+ => ! ( memberAccess . IsSymbol ( KnownSymbols . Task . CompletedTask , context . SemanticModel , context . CancellationToken )
151+ || memberAccess . IsSymbol ( KnownSymbols . ValueTask . CompletedTask , context . SemanticModel , context . CancellationToken ) ) ,
152+ DefaultExpressionSyntax => false ,
153+ LiteralExpressionSyntax => false ,
154+ ObjectCreationExpressionSyntax => false ,
155+ _ => true ,
156+ } ;
157+ }
158+
159+ return false ;
160+ }
134161 }
135162
136163 private static bool IsInUsing ( SyntaxNode node )
@@ -176,27 +203,6 @@ private static bool IsUsing(ISymbol symbol, CancellationToken cancellationToken)
176203 return false ;
177204 }
178205
179- private static bool ShouldAwait ( SyntaxNodeAnalysisContext context , ExpressionSyntax returnValue )
180- {
181- if ( returnValue . TryFirstAncestor ( out InvocationExpressionSyntax ? ancestor ) &&
182- ancestor . TryGetMethodName ( out var ancestorName ) &&
183- ancestorName == "ThrowsAsync" )
184- {
185- return false ;
186- }
187-
188- return returnValue switch
189- {
190- InvocationExpressionSyntax invocation
191- => ! ( invocation . IsSymbol ( KnownSymbols . Task . FromResult , context . SemanticModel , context . CancellationToken )
192- || invocation . IsSymbol ( KnownSymbols . ValueTask . FromResult , context . SemanticModel , context . CancellationToken ) ) ,
193- MemberAccessExpressionSyntax { Name . Identifier . ValueText : "CompletedTask" } memberAccess
194- => ! ( memberAccess . IsSymbol ( KnownSymbols . Task . CompletedTask , context . SemanticModel , context . CancellationToken )
195- || memberAccess . IsSymbol ( KnownSymbols . ValueTask . CompletedTask , context . SemanticModel , context . CancellationToken ) ) ,
196- _ => true ,
197- } ;
198- }
199-
200206 private static bool IsLazyEnumerable ( InvocationExpressionSyntax invocation , INamedTypeSymbol containingType , SemanticModel semanticModel , CancellationToken cancellationToken )
201207 {
202208 using var recursion = Recursion . Borrow ( containingType , semanticModel , cancellationToken ) ;
0 commit comments