2016-04-29 5 views
4

Ich bin ein Roslyn Code Analyzer zu schreiben, die ich, wenn eine async Methode identifizieren möge tut nicht ein CancellationToken nehmen und dann einen Code fix vorschlagen, es fügt hinzu:einen Parameter an eine Methode hinzufügen mit einem Roslyn CodeFixProvider

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

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

ich habe die DiagnosticAnalyzer richtig verdrahtet, um einen Diagnosebericht durch die methodDeclaration.ParameterList.Parameters Inspektion, aber ich kann die Roslyn API zum Hinzufügen eines Paramater zum ParameterList in einem CodeFixProvider nicht finden.

Dies ist, was ich bisher habe:

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   
} 

Wie richtig ich die Methode Erklärung aktualisieren und geben die aktualisierten Document?

+0

Ich glaube, dass Sie die gesamte Parameterliste ersetzen müssen, anstatt einen neuen Parameter hinzuzufügen. Es ist schon eine Weile her, seit ich Analysatoren geschrieben habe! –

+0

'ParamaterList' hat keinen Setter :(. Muss ich eine neue MethodDeclaration von Grund auf neu erstellen? –

+0

Ich denke schon. Wenn Sie diesen Code auf GitHub oder etwas werfen wollen, würde ich mich freuen, einen Riss zu machen . –

Antwort

1

@Nate Barbettini korrekt ist, Syntax-Knoten alle unveränderlich sind, so dass ich brauchte eine neue Version des MethodDeclarationSyntax zu erstellen, ersetzen Sie dann die alte Methode mit der neuen Methode in der document ‚s 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); 
    } 
Verwandte Themen