ReportDiagnostic на частичных классах

Я изменяю проект анализатора по умолчанию, который исходит из шаблона анализатора кода, чтобы попытаться заставить его сообщать обо всех объявлениях для частичного класса.

Я изменил код на:

public override void Initialize(AnalysisContext context)
{
    context.RegisterSymbolAction(AnalyzeSymbol, SymbolKind.NamedType);
}

private static void AnalyzeSymbol(SymbolAnalysisContext context)
{
    var namedTypeSymbol = (INamedTypeSymbol)context.Symbol;

    // Find just those named type symbols with names containing lowercase letters.
    if (namedTypeSymbol.Name.ToCharArray().Any(char.IsLower))
    {
        foreach (var location in namedTypeSymbol.Locations)
        {
            // For all such symbols, produce a diagnostic.
            var diagnostic = Diagnostic.Create(Rule, location, namedTypeSymbol.Name);
            context.ReportDiagnostic(diagnostic);
        }
    }
}

В двух отдельных файлах у меня есть частичные классы:

// File1.cs
partial class Foo
{
    public string BarString;
}

// File2.cs
partial class Foo
{
    public string FooBarString;
}

Я поставил контрольные точки в ReportDiagnostic и вижу, что он вызвал для каждого местоположения, но в Visual Studio он сообщает только диагностику в пределах одного файла.

Если я помещаю несколько реализаций Foo в один файл (и, как представляется, это сообщение об объявлении этих файлов), я увижу, что сообщались обе диагностированные.

Я не понимаю, как должны сообщаться о диагностике или это ошибка? Если это ошибка, это проблема Roslyn или это проблема с потреблением Visual Studio Roslyn?

Ответ 1

Это ограничение реализации V1 диагностической службы Visual Studio.

В репозитории Roslyn есть проблема с этой проблемой:

https://github.com/dotnet/roslyn/issues/3748#issuecomment-117231706

Из ответа в проблеме Github:

Это известная проблема в реализации v1 для Visual Studio IDE. В настоящее время он не обрабатывает анализатор диагностика отчетов за пределами анализируемого документа. Так что если File1.cs имеет основное определение Foo, для которого AnalyzeSymbol было вызывается, тогда диагностическая служба сохраняет только диагностику анализатором внутри этого файла.