C# EditorConfig-如何在自定义分析器中访问EditorConfig规则设置
我想知道是否有一种本地方式来存储和访问自定义roslyn分析器的附加设置。 假设我有诊断Id为“XA0001”的规则,我将在编辑器配置中进行设置C# EditorConfig-如何在自定义分析器中访问EditorConfig规则设置,c#,roslyn,visual-studio-2019,roslyn-code-analysis,editorconfig,C#,Roslyn,Visual Studio 2019,Roslyn Code Analysis,Editorconfig,我想知道是否有一种本地方式来存储和访问自定义roslyn分析器的附加设置。 假设我有诊断Id为“XA0001”的规则,我将在编辑器配置中进行设置 dotnet_diagnostic.XA0001.severity = error 到目前为止,一切正常。现在,我想添加如下内容来创建新规则的设置: dotnet_diagnostic.XA0001.scope = class, enum, interface dotnet_diagnostic.XA0001.level = toplevel 其中
dotnet_diagnostic.XA0001.severity = error
到目前为止,一切正常。现在,我想添加如下内容来创建新规则的设置:
dotnet_diagnostic.XA0001.scope = class, enum, interface
dotnet_diagnostic.XA0001.level = toplevel
其中,scope和level是规则的附加属性,我需要对其进行配置(通常是字符串或某种枚举),因为它们可能会有所不同。每次都会有可由editorconfig覆盖的该规则的默认设置
是否可能,如果可能,是否有任何超短示例ev。链接到如何在analyzer类中或仅从该项目级别访问其他editorconfig设置的帖子
[DiagnosticAnalyzer(LanguageNames.CSharp)]
public class RuleXA0001Analyzer : DiagnosticAnalyzer
{
public override ImmutableArray<DiagnosticDescriptor> SupportedDiagnostics { get; } = ImmutableArray.Create(RuleXA0001.Descriptor);
public override void Initialize(AnalysisContext context)
{
context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
context.EnableConcurrentExecution();
//TODO access editorconfig settings for this rule
//Perform analysis & report diagnostics
}
}
}
[DiagnosticanAnalyzer(LanguageNames.CSharp)]
公共类RuleXA0001Analyzer:诊断分析器
{
public override ImmutableArray SupportedDiagnostics{get;}=ImmutableArray.Create(RuleXA0001.Descriptor);
公共覆盖无效初始化(AnalysisContext上下文)
{
ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
context.enableCcurrentExecution();
//TODO访问此规则的编辑器配置设置
//执行分析和报告诊断
}
}
}
无需访问其他规则设置,即使它在其他情况下可能有益
感谢AnalyzeZeroOptions类有一个属性
AnalyzerConfigOptionsProvider
,可用于访问.editorconfig设置
例如,如果要分析代码块,可以执行以下操作:
公共覆盖无效初始化(AnalysisContext上下文)
{
RegisterCompilationStartAction(RegisterCompilationStart);
}
专用静态无效注册表CompilationStart(编译StartAnalysisContext startContext)
{
var optionsProvider=startContext.Options.AnalyzerConfigOptionsProvider;
RegisterCodeBlockAction(actionContext=>AnalyzeCodeBlock(actionContext,Options Provider));
}
私有静态无效AnalyzeCodeBlock(CodeBlockAnalysisContext上下文,AnalyzerConfigOptionsProvider选项Provider)
{
//这些选项包含.editorconfig设置
var options=optionsProvider.GetOptions(context.CodeBlock.SyntaxTree);
var isFound=options.TryGetValue(“dotnet_diagnostic.XA0001.level”,输出var值);
}
让我在本周晚些时候检查一下,我最终使用反射访问了这些值,但在构建过程中,反射并不能可靠地提供值,只能在实时分析中提供。这看起来很有希望!值得检查您使用的Microsoft.CodeAnalysis.Common版本(即AnalyzeZeroOptions
的位置)。我认为AnalyzerConfigOptionsProvider
属性是内部的,或者是旧版本中的某个属性(在v2.10.0中肯定不可见,这是我一直在使用的),但在最新版本中,它现在是公开的。