【问题标题】:Programmatically access Code analysis results in Roslyn以编程方式访问 Roslyn 中的代码分析结果
【发布时间】:2021-02-01 16:33:00
【问题描述】:

我正在构建一个分析 C# sn-ps 并提供一些反馈的工具。我用

tree = CSharpSyntaxTree.ParseText(codeSample);

得到一个 SyntaxTree 然后

semanticModel = compilation.GetSemanticModel(tree);

获取 SemanticModel。

我可以使用 semanticModel.Compilation.GetDiagnostics(); 在代码中找到语法错​​误,但我知道 Roslyn 也可以使用 Roslyn Analyzers 执行许多代码质量规则(herehere)。

我的问题是:如何以编程方式获取代码中的那些代码风格问题,就像我可以获取语法错误一样?

【问题讨论】:

  • 你是如何创建你的编译的?
  • @PauloMorgado 像这样: var compilation = CSharpCompilation.Create("assemblyName") .AddReferences( MetadataReference.CreateFromFile( typeof(object).Assembly.Location)) .AddSyntaxTrees(tree);
  • 目前无法测试,但有WitAnalyzers 方法。找不到吗?
  • 谢谢。我设法让它工作。我会添加一个答案。

标签: coding-style roslyn code-analysis programmatically


【解决方案1】:

解决方案:

首先,您必须加载 CodeAnalysis .dll,并从中获取分析器:

var assembly = Assembly.LoadFrom(@"Microsoft.CodeAnalysis.NetAnalyzers.dll");
var analyzers = assembly.GetTypes()
                        .Where(t => t.GetCustomAttribute<DiagnosticAnalyzerAttribute>() is object)
                        .Select(t => (DiagnosticAnalyzer)Activator.CreateInstance(t))
                        .ToArray();

然后,在生成Compilation 时,添加带有WithAnalyzers(...) 的分析器:

var compilationWithAnalyzers = CSharpCompilation.Create("query")
                .AddReferences(
                    MetadataReference.CreateFromFile(typeof(object).Assembly.Location)
                ).AddSyntaxTrees(tree).WithAnalyzers(ImmutableArray.Create(analyzers));

之后,您可以通过以下方式获得 CodeAnalysis 结果:

var analyzerDiagnostics = (await compilationWithAnalyzers.GetAllDiagnosticsAsync()).ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    • 2021-10-28
    • 2016-02-16
    • 2023-04-08
    • 2021-09-14
    • 2021-12-08
    相关资源
    最近更新 更多