Skip to content

Commit

Permalink
Update UseAsyncMethodInAsyncContext.cs
Browse files Browse the repository at this point in the history
  • Loading branch information
Youssef1313 authored Jan 4, 2023
1 parent 3f387c3 commit 1b96653
Showing 1 changed file with 12 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -89,17 +89,18 @@ public override void Initialize(AnalysisContext context)
{
if (context.Operation is IInvocationOperation invocationOperation)
{
if (InspectAndReportBlockingMemberAccess(context, invocationOperation.TargetMethod, syncBlockingSymbols, SymbolKind.Method))
if (InspectAndReportBlockingMemberAccess(context, syncBlockingSymbols, SymbolKind.Method))
{
// Don't return double-diagnostics.
return;
}

// Also consider all method calls to check for Async-suffixed alternatives.
var semanticModel = context.Operation.SemanticModel;
var methodSymbol = invocationOperation.TargetMethod;
SymbolInfo symbolInfo = semanticModel.GetSymbolInfo(context.Operation.Syntax, context.CancellationToken);

if (!methodSymbol.Name.EndsWith(MandatoryAsyncSuffix, StringComparison.Ordinal) &&
if (symbolInfo.Symbol is IMethodSymbol methodSymbol &&
!methodSymbol.Name.EndsWith(MandatoryAsyncSuffix, StringComparison.Ordinal) &&
!HasAsyncCompatibleReturnType(methodSymbol, syncBlockingTypes))
{
IEnumerable<IMethodSymbol> methodSymbols = semanticModel.LookupSymbols(
Expand Down Expand Up @@ -136,7 +137,7 @@ public override void Initialize(AnalysisContext context)
}
else
{
InspectAndReportBlockingMemberAccess(context, ((IPropertyReferenceOperation)context.Operation).Property, syncBlockingSymbols, SymbolKind.Property);
InspectAndReportBlockingMemberAccess(context, syncBlockingSymbols, SymbolKind.Property);
}
}
}, OperationKind.Invocation, OperationKind.PropertyReference);
Expand Down Expand Up @@ -254,8 +255,14 @@ private static bool IsInTaskReturningMethodOrDelegate(OperationAnalysisContext c
return HasAsyncCompatibleReturnType(parentMethod, syncBlockingTypes);
}

private static bool InspectAndReportBlockingMemberAccess(OperationAnalysisContext context, ISymbol memberSymbol, List<SyncBlockingSymbol> syncBlockingSymbols, SymbolKind kind)
private static bool InspectAndReportBlockingMemberAccess(OperationAnalysisContext context, List<SyncBlockingSymbol> syncBlockingSymbols, SymbolKind kind)
{
ISymbol? memberSymbol = context.Operation.SemanticModel.GetSymbolInfo(context.Operation.Syntax, context.CancellationToken).Symbol;
if (memberSymbol is null)
{
return false;
}

foreach (SyncBlockingSymbol symbol in syncBlockingSymbols)
{
if (symbol.Kind != kind) continue;
Expand Down

0 comments on commit 1b96653

Please sign in to comment.