微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 使用Roslyn CodeFixProvider向方法添加访问修饰符?

我几天前在TechEd,我看到了 this talk by Kevin Pilch-Bisson (relevent part starts at about 18 minutes) …我以为是很酷,所以我决定和Roslyn一起玩耍.

我试图制定一个规则“访问修饰符必须被声明”(Stylecop SA1400) – 意思是,

这违反了规则:

static void Main(string[] args)
    {
    }

还行吧:

public static void Main(string[] args)
    {
    }

它必须有一个明确的内部关键字,公共关键字,私人关键字或受保护的关键字.

检测违规行为是相当容易的,但现在我试图提供一个修复.我一直在尝试和搜索无处不在,但我无法找到如何添加访问修饰符.

这是我到目前为止

public async Task<IEnumerable<CodeAction>> GetFixesAsync(Document document,TextSpan span,IEnumerable<Diagnostic> diagnostics,CancellationToken cancellationToken)
{
    var root = await document.GetSyntaxRootAsync(cancellationToken).ConfigureAwait(false);
    var token = root.FindToken(span.Start);

    var methodDeclaration = token.Parent as MethodDeclarationSyntax;

    //var newModifiers = methodDeclaration.Modifiers.Add(SyntaxFactory.AccessorDeclaration(SyntaxKind.PublicKeyword));         
    //var newModifiers = new SyntaxTokenList() { new SyntaxToken() };

    MethodDeclarationSyntax newMethodDeclaration = methodDeclaration.WithModifiers(methodDeclaration.Modifiers);
    var newRoot = root.ReplaceNode(methodDeclaration,newMethodDeclaration);
    var newDocument = document.WithSyntaxRoot(newRoot);

    return new[] { CodeAction.Create("Add Public Keyword",newDocument) };
}

WithModifiers需要一个SyntaxTokenList,我可以使用New(),但是我不知道如何使它成为SyntaxKind.PublicKeyword.我也不知道我甚至假设新的,或使用SyntaxFactory.然而,当使用SyntaxFactory时,我也无法弄清楚我需要创建SyntaxToken的方法SyntaxKind.PublicKeyword

我可以发布整个事情,包括DiagnosticAnalyzer如果有兴趣…

解决方法

很高兴你喜欢这个讲话!我们实际上在语法模型中有一些帮助者可以更容易地将项目添加到列表中,因此您应该能够执行以下操作:
var newMethodDeclaration = methodDeclaration.AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword));

获取新的方法声明.

扩展形式将是:

var newModifiers = SyntaxFactory.TokenList(modifiers.Concat(new[] { SyntaxFactory.Token(SyntaxKind.PublicKeyword)}));
var newMethodDeclaration = methodDeclaration.WithModifiers(newModifiers);

希望这可以帮助

原文地址:https://www.jb51.cc/csharp/95604.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐