簡體   English   中英

使用 Roslyn CodeFixProvider 向方法添加訪問修飾符?

[英]Add access modifier to method using Roslyn CodeFixProvider?

幾天前我在 TechEd 上,我看到了 Kevin Pilch-Bisson 的這個演講(相關部分從大約 18 分鍾開始) ......我覺得這很酷,所以我決定自己和 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 ,我也無法弄清楚需要哪種方法來創建SyntaxTokenSyntaxKind.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);

希望這可以幫助

我真正需要的是這個:

var newModifiers = SyntaxFactory.TokenList(SyntaxFactory.Token(accessModifierToken))
    .AddRange(methodDeclaration.Modifiers);

這幾乎是 Chris Eelmaa 的建議,但根據該建議,我最終得到了static public void Main ,它有效但丑陋。

附加public將它添加到列表的末尾,據我所知,訪問修飾符應該始終是第一個。

好吧,要創建指示public static修飾符,您可以使用:

var modifiers = SyntaxFactory.TokenList(
    new SyntaxToken[] { 
        SyntaxFactory.Token(SyntaxKind.PublicKeyword), 
        SyntaxFactory.Token(SyntaxKind.StaticKeyword) 
    }),

但在你的情況下,我不明白為什么

var updatedModifiers = methodDeclaration
                .Modifiers
                .Add(SyntaxFactory.Token(SyntaxKind.PublicKeyword));

methodDeclaration.WithModifiers(updatedModifiers);

行不通。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM