相关疑难解决方法(0)

如何使我的代码诊断语法节点操作适用于已关闭的文件?

我正在使用Roslyn(在VS2015 Preview中)构建一组代码诊断.理想情况下,我希望他们产生的任何错误都可以作为持久性错误,就像我违反了正常的语言规则一样.

有很多选择,但我很难让他们中的任何一个一致地工作.我已经设法实现了一个基本的语法节点动作,即注册的一个

context.RegisterSyntaxNodeAction(AnalyzeSyntaxNode, SyntaxKind.InvocationExpression);
Run Code Online (Sandbox Code Playgroud)

Initialize我的诊断类的方法.瞧,当我打开违反此诊断的文件时(运行VSIX项目时),VS2015显示错误:

  • 正确的代码下的红色波浪形
  • 保证金中的红色区块
  • 错误列表中的错误

但是,当我关闭文件时,错误消失了.

我也尝试过使用context.RegisterCompilationEndAction,但这有两个问题:

  • 它似乎不一致.通常当我打开解决方案时它会触发,但并非总是如此.它不会在清洁/重建时触发,这似乎很奇怪.
  • 虽然直接在分析方法中创建的诊断会激活,但为了实现诊断,我正在使用访问者,就像这样 - 这可能是无效的:

    private static void AnalyzeEndCompilation(CompilationEndAnalysisContext context)
    {
        foreach (var tree in context.Compilation.SyntaxTrees)
        {
            var visitor = new ReportingVisitor(context.Compilation.GetSemanticModel(tree));
            visitor.Visit(tree.GetRoot());
            foreach (var diagnostic in visitor.Diagnostics)
            {
                context.ReportDiagnostic(diagnostic);
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    我知道正在创建诊断 - ReportDiagnostic线路上的断点被多次击中 - 但我没有在错误列表中看到任何内容.(尽管类似ReportDiagnostic的方法,或用每文件路径语法树一开始通话,得到显示.)

我在这做错了什么?如果可行的话,第一种方法(语法节点动作)将是理想的 - 它完全给出了我需要的上下文.项目属性中是否有一些设置需要使编译器使用"完整项目"编译以及"在IDE中处理"交互?这可能只是Roslyn集成的一点还没有完成吗?

(如果它有用的话,我可以包括该类的完整代码 - 在这种情况下,我怀疑它会比信号更多噪音.)

c# roslyn vs-2015-preview

70
推荐指数
1
解决办法
3604
查看次数

标签 统计

c# ×1

roslyn ×1

vs-2015-preview ×1