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 内部的构建也是命令行构建,但选项略有不同)