roslyn 分析器发出警告,后来被删除
roslyn analyzers raising warnings which are later removed
我有一个基于分析器默认模板的分析器。
我的问题是,当执行完全重建时,一些(但不是全部)警告出现在错误列表中。
当我打开文件时,警告开始消失,因为分析器在打开的文件上重新执行。 最终所有的警告都消失了。
我是否错误地注册了这些分析器。理想情况下,我只希望它们在正确加载代码模型后执行。
任何关于如何改进这一点的建议都会很棒。
public override void Initialize(AnalysisContext context)
{
context.RegisterSyntaxNodeAction(
this.HandleClassDeclaration,
SyntaxKind.ClassDeclaration);
}
此代码分析器文档(在本例中)在 class 声明中。
当 Xml 文档节点不存在时,它会报告诊断。
private void HandleClassDeclaration(SyntaxNodeAnalysisContext context)
{
// THE CHECK IN MY ANSWER BELOW GOES HERE...
var declaration = (ClassDeclarationSyntax)context.Node;
{
var hasDocumentation = declaration.HasDocumentation();
if (!hasDocumentation)
{
var diagnostic = Diagnostic.Create(this.Descriptor, declaration.Identifier.GetLocation());
context.ReportDiagnostic(diagnostic);
}
}
}
我正在使用此代码查找文档。
public static DocumentationCommentTriviaSyntax GetDocumentationCommentTriviaSyntax(this SyntaxNode node)
{
if (node == null)
{
return null;
}
foreach (var leadingTrivia in node.GetLeadingTrivia())
{
var structure = leadingTrivia.GetStructure() as DocumentationCommentTriviaSyntax;
if (structure != null)
{
return structure;
}
}
return null;
}
对于任何其他试图分析 Roslyn 中的文档的人来说,这个小检查是必要的。
// <summary>
// check that the compiler is in a build mode that enables documentation analysis.
// it's not clear when this is off, but command line builds, and full rebuilds
// seem to have it turned off from time to time.
// </summary>
internal static bool IsDocumentationModeOn(this SyntaxNodeAnalysisContext context)
{
return context.Node.SyntaxTree?.Options.DocumentationMode
!= DocumentationMode.None;
}
能否将错误列表切换为仅构建视图并查看警告是否仍然存在?
如果警告仍然存在,则说明警告是由命令行生成的。如果打开文档后警告消失,则表示实时分析认为没有问题。由于构建和实时分析之间的差异,可能会发生此问题。
如果是这样,那将是 roslyn 中的错误。 (更具体地说,实时分析和命令行构建之间的编译选项中的错误 - VS 内部的构建也是命令行构建,但选项略有不同)
我有一个基于分析器默认模板的分析器。 我的问题是,当执行完全重建时,一些(但不是全部)警告出现在错误列表中。
当我打开文件时,警告开始消失,因为分析器在打开的文件上重新执行。 最终所有的警告都消失了。
我是否错误地注册了这些分析器。理想情况下,我只希望它们在正确加载代码模型后执行。
任何关于如何改进这一点的建议都会很棒。
public override void Initialize(AnalysisContext context)
{
context.RegisterSyntaxNodeAction(
this.HandleClassDeclaration,
SyntaxKind.ClassDeclaration);
}
此代码分析器文档(在本例中)在 class 声明中。 当 Xml 文档节点不存在时,它会报告诊断。
private void HandleClassDeclaration(SyntaxNodeAnalysisContext context)
{
// THE CHECK IN MY ANSWER BELOW GOES HERE...
var declaration = (ClassDeclarationSyntax)context.Node;
{
var hasDocumentation = declaration.HasDocumentation();
if (!hasDocumentation)
{
var diagnostic = Diagnostic.Create(this.Descriptor, declaration.Identifier.GetLocation());
context.ReportDiagnostic(diagnostic);
}
}
}
我正在使用此代码查找文档。
public static DocumentationCommentTriviaSyntax GetDocumentationCommentTriviaSyntax(this SyntaxNode node)
{
if (node == null)
{
return null;
}
foreach (var leadingTrivia in node.GetLeadingTrivia())
{
var structure = leadingTrivia.GetStructure() as DocumentationCommentTriviaSyntax;
if (structure != null)
{
return structure;
}
}
return null;
}
对于任何其他试图分析 Roslyn 中的文档的人来说,这个小检查是必要的。
// <summary>
// check that the compiler is in a build mode that enables documentation analysis.
// it's not clear when this is off, but command line builds, and full rebuilds
// seem to have it turned off from time to time.
// </summary>
internal static bool IsDocumentationModeOn(this SyntaxNodeAnalysisContext context)
{
return context.Node.SyntaxTree?.Options.DocumentationMode
!= DocumentationMode.None;
}
能否将错误列表切换为仅构建视图并查看警告是否仍然存在?
如果警告仍然存在,则说明警告是由命令行生成的。如果打开文档后警告消失,则表示实时分析认为没有问题。由于构建和实时分析之间的差异,可能会发生此问题。
如果是这样,那将是 roslyn 中的错误。 (更具体地说,实时分析和命令行构建之间的编译选项中的错误 - VS 内部的构建也是命令行构建,但选项略有不同)