EditorConfig-如何在自定义分析器中访问editorconfig规则设置

时间:2019-12-11 12:49:02

标签: 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

其中作用域和级别是我的规则的其他属性,我需要对其进行配置(通常是字符串或某种枚举),因为它们可以变化。每次都会有该规则的默认设置,这些默认设置可以被editorconfig覆盖。

有没有可能,如果有的话,还有任何超短示例ev。帖子的链接如何在分析器类中或仅从该项目级别访问附加的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
        }
    }   
}   

即使在其他情况下可能是有益的,也无需访问其他规则设置。

谢谢

1 个答案:

答案 0 :(得分:1)

AnalyzerOptions类具有属性AnalyzerConfigOptionsProvider,可用于访问.editorconfig设置。

例如,如果您正在分析代码块,则可以执行以下操作:

public override void Initialize(AnalysisContext context)
{
    context.RegisterCompilationStartAction(RegisterCompilationStart);
}

private static void RegisterCompilationStart(CompilationStartAnalysisContext startContext)
{
    var optionsProvider = startContext.Options.AnalyzerConfigOptionsProvider;
    startContext.RegisterCodeBlockAction(actionContext => AnalyzeCodeBlock(actionContext, optionsProvider));
}

private static void AnalyzeCodeBlock(CodeBlockAnalysisContext context, AnalyzerConfigOptionsProvider optionsProvider)
{
    // The options contains the .editorconfig settings
    var options = optionsProvider.GetOptions(context.CodeBlock.SyntaxTree);
    var isFound = options.TryGetValue("dotnet_diagnostic.XA0001.level", out var value);
}