部分类的ReportDiagnostic

Joh*_*ner 10 c# roslyn visual-studio-2015

我正在修改来自代码分析器模板的默认分析器项目,以尝试让它报告部分类的所有声明.

我已将代码修改为:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在两个单独的文件中,我有这样的部分类:

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

// File2.cs
partial class Foo
{
    public string FooBarString;
}
Run Code Online (Sandbox Code Playgroud)

我在ReportDiagnostic上设置了断点,并且看到它调用了每个位置,但在Visual Studio中它只报告单个文件中的诊断.

如果我将多个实现Foo放在一个文件中(并且它恰好报告了该文件声明),那么我将看到两个诊断报告.

我是否误解了如何报告诊断或这是一个错误?如果它是一个bug,它是Roslyn问题还是Visual Studio消耗Roslyn的问题?

Joh*_*ner 0

这是 Visual Studio 诊断服务 V1 实现的限制。

Roslyn 存储库中有一个问题可以跟踪此问题:

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

来自Github问题的回复:

这是 Visual Studio IDE 诊断服务 v1 实现中的一个已知问题。目前,它不处理正在分析的文档之外的分析器报告诊断。Foo因此,如果 File1.cs 具有调用的主要定义AnalyzeSymbol,则诊断服务仅保留该文件中分析器报告的诊断信息。