【问题标题】:EditorConfig - how to access editorconfig rule settings in custom analyzerEditorConfig - 如何在自定义分析器中访问 editorconfig 规则设置
【发布时间】:2020-04-04 18:15:04
【问题描述】:

我想知道是否有一种本地方式来存储和访问自定义 roslyn 分析器的其他设置。 假设我有诊断 ID 为“XA0001”的规则,我将在编辑器配置中设置

dotnet_diagnostic.XA0001.severity = error

到目前为止,一切正常。现在我想添加类似这样的内容来为该新规则创建设置:

dotnet_diagnostic.XA0001.scope = class, enum, interface
dotnet_diagnostic.XA0001.level = toplevel

其中范围和级别是我需要配置的规则的附加属性(通常是字符串或某种枚举),因为它们可以变化。每次都会有该规则的默认设置可以被 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
        }
    }   
}   

无需访问其他规则设置,即使在其他情况下可能会有所帮助。

谢谢

【问题讨论】:

    标签: c# roslyn visual-studio-2019 roslyn-code-analysis editorconfig


    【解决方案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);
    }
    

    【讨论】:

    • 本周晚些时候让我检查一下,我最终使用反射访问了这些值,但在构建过程中不能可靠地提供值,只能在实时分析中。这看起来很有希望!
    • 值得检查您使用的是哪个版本的 Microsoft.CodeAnalysis.Common(AnalyzerOptions 所在的位置)。我认为 AnalyzerConfigOptionsProvider 属性是内部的或旧版本中的某些东西(它在 v2.10.0 中肯定不可见,这是我一直在使用的),但在最新版本中它现在是公开的。
    猜你喜欢
    • 1970-01-01
    • 2022-12-20
    • 2020-01-15
    • 2020-04-28
    • 2020-06-14
    • 2018-12-28
    • 2019-10-01
    • 2021-11-24
    • 2019-01-29
    相关资源
    最近更新 更多