6

メソッドがを使用しないかどうかを識別し、それを追加するコード修正を提案する Roslyn コード アナライザーを作成していますasyncCancellationToken

 //Before Code Fix:
 public async Task Example(){}

 //After Code Fix
 public async Task Example(CancellationToken token){}

DiagnosticAnalyzerを調べて Diagnostic を正しく報告するように を接続しましたが、 aの内部に amethodDeclaration.ParameterList.Parametersを追加するための Roslyn API が見つかりません。ParamaterParameterListCodeFixProvider

これは私がこれまでに得たものです:

private async Task<Document> HaveMethodTakeACancellationTokenParameter(
        Document document, SyntaxNode syntaxNode, CancellationToken cancellationToken)
{
    var method = syntaxNode as MethodDeclarationSyntax;

    // what goes here?
    // what I want to do is: 
    // method.ParameterList.Parameters.Add(
          new ParameterSyntax(typeof(CancellationToken));

    //somehow return the Document from method         
}

メソッド宣言を正しく更新し、更新されたを返すにはどうすればよいDocumentですか?

4

1 に答える 1

7

@Nate Barbetini は正しく、構文ノードはすべて不変であるため、 の新しいバージョンを作成しMethodDeclarationSyntax、古いメソッドを の新しいメソッドに置き換えるdocument必要がありましたSyntaxTree

private async Task<Document> HaveMethodTakeACancellationTokenParameter(
        Document document, SyntaxNode syntaxNode, CancellationToken cancellationToken)
    {
        var method = syntaxNode as MethodDeclarationSyntax;

        var updatedMethod = method.AddParameterListParameters(
            SyntaxFactory.Parameter(
                SyntaxFactory.Identifier("cancellationToken"))
                .WithType(SyntaxFactory.ParseTypeName(typeof (CancellationToken).FullName)));

        var syntaxTree = await document.GetSyntaxTreeAsync(cancellationToken);

        var updatedSyntaxTree = 
            syntaxTree.GetRoot().ReplaceNode(method, updatedMethod);

        return document.WithSyntaxRoot(updatedSyntaxTree);
    }
于 2016-04-29T23:17:38.840 に答える