Я пишу анализатор Roslyn для обеспечения соблюдения некоторых правил документации.Правила гласят, что только поля и типы, видимые вне сборки, должны быть документированы.Это приводит меня к проблеме определения, является ли поле или тип эффективно видимым и может ли использоваться за пределами декларирующей сборки.
Учитывая это объявление:
namespace TestApp {
internal class InternalClass {
public class InnerClass {
public int PublicFieldInInternal;
}
}
}
Я хочу знать,PublicFieldInInternal
видно за пределами декларирующей сборки.Я использую приведенный ниже код для определения доступности:
private bool IsNonPrivateMemberDeclaration(SyntaxNodeAnalysisContext context, SyntaxNode node)
{
if (node is BaseFieldDeclarationSyntax fieldDeclaration)
{
var firstField = fieldDeclaration.Declaration.Variables.First();
var fieldAccessibility = context.SemanticModel.GetDeclaredSymbol(firstField).DeclaredAccessibility;
return ConstructVisibleFromOtherAssemblies(fieldAccessibility);
}
var accessibility = context.SemanticModel.GetDeclaredSymbol(node)?.DeclaredAccessibility;
if (accessibility != null)
{
return ConstructVisibleFromOtherAssemblies(accessibility.Value);
}
Debug.Assert(true, "This code should be unreachable as one of the two cases above will catch all calls");
return false;
}
private static bool ConstructVisibleFromOtherAssemblies(Accessibility accessibility) =>
accessibility == Accessibility.Public ||
accessibility == Accessibility.Protected ||
accessibility == Accessibility.ProtectedOrInternal;
Однако он не учитывает доступность родительских типов, поэтому свойство DeclaredAccessibility
для символа, соответствующего PublicFieldInInternal
, возвращает Accessibility.Public
.Есть ли способ запросить семантическую модель напрямую, чтобы получить эффективную доступность, или мне нужно рекурсивно взглянуть на содержащие типы?