gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:44:59 35 4
gpt4 key购买 nike

几天前我在 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)关键字、私有(private)关键字或 protected 关键字。

检测违规相当容易,但现在我正在尝试提供修复。我一直在尝试并到处搜索,但找不到如何添加访问修饰符。

这是我目前所拥有的:

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 时,我也无法弄清楚需要使用哪种方法来创建 SyntaxKind.PublicKeywordSyntaxToken

如果有兴趣,我可以发布整个内容,包括 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);

希望对你有帮助

关于c# - 使用 Roslyn CodeFixProvider 向方法添加访问修饰符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26703018/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com