in src/Microsoft.VisualStudio.Threading.Analyzers/Utils.cs [366:400]
internal static bool IsPublic([NotNullWhen(true)] ISymbol? symbol)
{
if (symbol is null)
{
return false;
}
if (symbol is INamespaceSymbol)
{
return true;
}
// The only member that is public without saying so are explicit interface implementations;
// and only when the interfaces implemented are themselves public.
var methodSymbol = symbol as IMethodSymbol;
if (methodSymbol?.ExplicitInterfaceImplementations.Any(IsPublic) ?? false)
{
return true;
}
switch (symbol.DeclaredAccessibility)
{
case Accessibility.Internal:
case Accessibility.Private:
case Accessibility.ProtectedAndInternal:
return false;
case Accessibility.Protected:
case Accessibility.ProtectedOrInternal:
case Accessibility.Public:
return symbol.ContainingType is null || IsPublic(symbol.ContainingType);
case Accessibility.NotApplicable:
default:
return false;
}
}