以编程方式访问 Roslyn 中的代码分析结果

问题描述

我正在构建一个工具来分析 C# 代码片段并提供一些关于它们的反馈。我用

tree = CSharpSyntaxTree.ParseText(codeSample);

得到一个语法树,然后

semanticModel = compilation.GetSemanticModel(tree);

获取语义模型。

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

我的问题是:如何以编程方式获取代码中的那些代码样式问题,例如获取语法错误?

解决方法

解决方案:

首先,您必须加载 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();

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...