【问题标题】:ReportDiagnostic on Partial ClassesReportDiagnostic on Partial Classes
【发布时间】:2015-07-01 00:57:26
【问题描述】:

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

我已将代码修改为:

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 的多个实现放在一个文件中(并且它恰好报告了该文件声明),那么我将看到报告的两个诊断。

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

【问题讨论】:

  • 您是否在 IDE 中打开了这两个文件?
  • 是的,两个文件都打开了。
  • 我可以重现这个。这对我来说就像一个错误。如果您还没有,我建议您在以下位置打开一个问题:github.com/dotnet/roslyn/issues

标签: c# visual-studio-2015 roslyn


【解决方案1】:

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

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

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

来自 Github 问题的回复:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 2017-07-05
    相关资源
    最近更新 更多