2016-12-21 1 views
0

私は開発用に使用する内部フレームワークの新しいバージョンに移行したいC#ファイルの束を作りました。これまでのところ私は、特定の物事を成し遂げることができましたが、私は、私は上記の方法を変更する必要が使用することを変更する必要が修飾子を待つと、メソッド呼び出しがそうRoslynリライトメソッドawait修飾子を使用するための呼び出し

var a = EntityService.GetBy(Entities.INSTANT_ISSUANCE_REQUEST, requestFilter); 
var b = EntityService.GetBy(Entities.ISSUANCE_SETTINGS, new DejaVuObject()).FirstOrDefault(); 

のように異なる種類があり、特定のメソッド呼び出しがあります次の構文を使用するように呼び出します。

var a = await EntityService.GetBy(Entities.INSTANT_ISSUANCE_REQUEST, requestFilter); 
var b = await EntityService.GetBy(Entities.ISSUANCE_SETTINGS, new DejaVuObject()).FirstOrDefault(); 

私はRoslyn CSharpSyntaxWriterを使用して構文木をトラバースしています。

public override SyntaxNode VisitLocalDeclarationStatement(LocalDeclarationStatementSyntax node) 
{ 
    var variableDeclarations = 
     from i in node.DescendantNodes().OfType<VariableDeclaratorSyntax>() 
     where i.DescendantNodes().OfType<EqualsValueClauseSyntax>().Any<EqualsValueClauseSyntax>(
      p => p.DescendantNodes().OfType<InvocationExpressionSyntax>().Any<InvocationExpressionSyntax>()) 
     select i; 

    foreach (var syntax in variableDeclarations) 
    { 
     var equalsToken = syntax.DescendantNodes(); 
     //now we have the equals token 
     foreach (var syntaxNode in equalsToken) 
     { 
      if (syntaxNode is EqualsValueClauseSyntax) 
      { 
       var equalsValueSyntax = syntaxNode.DescendantNodes().OfType<InvocationExpressionSyntax>(); 
       foreach (var invocationExpressionSyntax in equalsValueSyntax) 
       { 
        var simpleMemberAcessExpressions = invocationExpressionSyntax 
         .DescendantNodes() 
         .OfType<IdentifierNameSyntax>() 
         .Where(i => i.Identifier.Text == "EntityService"); 
        foreach (var simpleMemberAcessExpression in simpleMemberAcessExpressions) 
        { 
         var newExpression = $"{invocationExpressionSyntax.ToFullString()}"; 
         Console.WriteLine(newExpression); 
         //TODO: Modify the Node 
        } 
       } 
      } 
     } 
    } 
    return base.VisitLocalDeclarationStatement(node); 
} 

ここに私の問題コンソールの出力は

EntityService.GetBy(Entities.ISSUANCE_SETTINGS, new DejaVuObject()).FirstOrDefault(); 
EntityService.GetBy(Entities.ISSUANCE_SETTINGS, new DejaVuObject()) 

どちら

が同じ InvocationExpressionを参照多少重複しているが、 FirstOrDefault()のは、コンソール出力に二度現れるので

私は

たいです一意のメソッド呼び出しだけを含むように結果をフィルタリングし、await修飾子を追加してノードを更新することによって実際のメソッド呼び出しを実行する方法については

予想されるヘルプは高く評価されています

+0

実際に動作させるには、FirstOrDefauを処理するカスタム拡張メソッドが必要ですlt; Task > 'のlt; 'public static Task FirstOrDefault (このタスク> e)=>(待っている).FirstOrDefault();'そうでなければ、2番目のステートメントを '(EntityService.GetBy(Entities.ISSUANCE_SETTINGS、new DejaVuObject()))。FirstOrDefault() '。 – m0sa

答えて

0

まず、VisitLocalDeclarationStatementをオーバーライドする理由は何ですか? VisitInvocationExpressionを上書きする必要があるように見えます。

あなたはこれを行うべきではありません。

var simpleMemberAcessExpressions = 
    invocationExpressionSyntax.DescendantNodes().OfType<IdentifierNameSyntax>() 

代わりに、それはのようなものでなければなりません:呼び出し式がnodeと呼ばれていると仮定すると、

var identifier = 
    (node.Expression as MemberAccessExpressionSyntax)?.Expression as IdentifierNameSyntax; 

if (identifier != null && identifier.Identifier.Text == "EntityService") 
{ 
    // process the invocation expression 
} 

、あなたの新しい表現は、おそらく

です
var newExpression = 
    SyntaxFactory.ParenthesizedExpression(SyntaxFactory.AwaitExpression(node)) 
    .WithAdditionalAnnotations(Simplifier.Annotation) 
    .WithAdditionalAnnotations(Formatter.Annotation); 
関連する問題