我正在修改来自代码分析器模板的默认分析器项目,试图让它报告部分类的所有声明。
我已将代码修改为:
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的问题?
答案 0 :(得分:0)
这是Visual Studio诊断服务的V1实现的限制。
Roslyn存储库中存在跟踪此问题的问题:
https://github.com/dotnet/roslyn/issues/3748#issuecomment-117231706
来自Github问题的回复:
这是Visual Studio的v1实现中的已知问题 IDE的诊断服务。它目前不处理分析仪 在正在分析的文档之外报告诊断。因此,如果 File1.cs具有
Foo
的主要定义AnalyzeSymbol
调用,然后诊断服务仅保留报告的诊断 由该文件中的分析器。