in src/Microsoft.VisualStudio.Threading.Analyzers/DiagnosticAnalyzerState.cs [99:130]
private static IEnumerable<ITypeSymbol> GetAwaitableTypes(INamespaceOrTypeSymbol namespaceOrTypeSymbol)
{
if (namespaceOrTypeSymbol is null || namespaceOrTypeSymbol.DeclaredAccessibility != Accessibility.Public)
{
yield break;
}
foreach (ISymbol? member in namespaceOrTypeSymbol.GetMembers())
{
switch (member)
{
case INamespaceOrTypeSymbol nsOrType:
foreach (ITypeSymbol? nested in GetAwaitableTypes(nsOrType))
{
yield return nested;
}
break;
case IMethodSymbol method:
if (method.DeclaredAccessibility == Accessibility.Public &&
method.IsExtensionMethod &&
method.Name == GetAwaiterMethodName &&
!method.Parameters.IsEmpty &&
ConformsToAwaiterPattern(method.ReturnType))
{
yield return method.Parameters[0].Type;
}
break;
}
}
}