Roslyn分析器引发的警告之后被移除。

3

我有一个基于分析器默认模板的分析器。

我的问题是,当我进行完全重建时,一些(但不是全部)警告会出现在错误列表中。

当我打开文件时,由于分析器在打开文件时重新执行,警告开始消失。最终所有警告都会消失

可能我没有正确地注册这些分析器。理想情况下,我希望它们在代码模型正确加载后才执行。

如果您有任何改进的建议,请告诉我。

    public override void Initialize(AnalysisContext context)
    {
        context.RegisterSyntaxNodeAction(
            this.HandleClassDeclaration,
            SyntaxKind.ClassDeclaration);
    }

这段代码分析类声明的文档(在本例中)。 当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;
    }
2个回答

1

您能否将错误列表切换到构建视图,并查看警告是否仍然存在?

如果警告仍然存在,则意味着该警告是由命令行构建生成的。如果打开文档后警告消失,则表示实时分析认为没有问题。由于构建和实时分析之间的差异,可能会出现此问题。

如果是这种情况,则这将是Roslyn中的一个错误。(更具体地说,是实时分析和命令行构建之间编译选项的错误 - 在VS内部进行的构建也是带有略微不同选项的命令行构建)


警告不再被错误地引发了。 下面的检查修复了其中大部分。我认为最后几个是由于我的分析器/修复程序中ID不匹配的错误导致的。 - Jim

0

对于其他试图分析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;
    }

这反映了您项目文件中的“生成XML文档注释”选项。为了保持遗留行为,如果您没有生成XML文档注释,我们就不会解析它们,因为以前我们让您在那里使用错误的语法。 - Jason Malinowski
1
我注意到自从勾选了这个选项以来,虚警数量已经减少了,但是行为仍然不完全正确。我仍然有一些情况,在进行完整的重建后,会显示虚假警告。只要我打开文件,它们就会消失。 - Jim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接