首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Roslyn Analyzer替换类型声明

Roslyn Analyzer替换类型声明
EN

Stack Overflow用户
提问于 2020-07-02 13:57:29
回答 1查看 184关注 0票数 1

我需要实现一个Roslyn分析器和CodeFixProvider来替换属性和参数中声明的类型。例如,我有一个声明,比如

代码语言:javascript
复制
public IReadOnlyCollection<string> Collection { get; }

我需要把它换成

代码语言:javascript
复制
public IReadOnlyList<string> Collection { get; }

问:使用DiagnosticAnalyzer的后代类在源代码中查找此类位置的最佳方式是什么?有许多方法,例如:

代码语言:javascript
复制
RegisterSyntaxNodeAction()
RegisterSymbolAction()
RegisterSyntaxTreeAction()

从哪里开始会更好呢?如果可能的话,也能找到一些例子,那就太好了。

EN

回答 1

Stack Overflow用户

发布于 2020-07-03 17:06:28

最后,我设法以这种方式实现它:

代码语言:javascript
复制
public override void Initialize(AnalysisContext context)
{
    context.EnableConcurrentExecution();
    context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.Analyze | GeneratedCodeAnalysisFlags.ReportDiagnostics);

    context.RegisterSyntaxNodeAction(
        AnalyzeNode,
        SyntaxKind.PropertyDeclaration,
        SyntaxKind.FieldDeclaration,
        SyntaxKind.Parameter);
}

private void AnalyzeNode(SyntaxNodeAnalysisContext context)
{
    var type = context.Node switch
    {
        PropertyDeclarationSyntax p => p.Type,
        FieldDeclarationSyntax p => p.Declaration.Type,
        ParameterSyntax p => p.Type,
        _ => null
    };

    if (type is null)
        return;

    if (!(type is GenericNameSyntax))
        return;

    if (type.GetFirstToken().ToString() == "IReadOnlyCollection")
    {
        var diagnostic = Diagnostic.Create(Rule, type.GetLocation());
        context.ReportDiagnostic(diagnostic);
    }
}

据我所知看起来不错。如果您知道更好的方法,请随时添加更多详细信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62689892

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档