6

Roslyn ライブラリを使用しています。一致する行の後にステートメントを追加したい: 要件は次のとおりです。まず、以下の行を見つけたい:

_container.RegisterInstance(NavigationService);

そして、上記の行の後に以下のステートメントを追加します。

_container.RegisterInstance<ISessionStateService>(SessionStateService);
_container.RegisterInstance<IFlyoutService>(FlyoutService);

どんな助けでも大歓迎です。

編集:(式を作成しましたが、これら2つの式をtargetExpressionに追加する方法は?

   string strContent = File.ReadAllText(strPath);
        SyntaxTree tree = SyntaxTree.ParseText(strContent);
        var targetExpression = tree.GetRoot().DescendantNodes().OfType<InvocationExpressionSyntax>()
                .FirstOrDefault(
                    x => x.Expression.ToString().Contains("_container.RegisterInstance") && x.ArgumentList.ToString().Contains("NavigationService"));

        InvocationExpressionSyntax replacementNode1 =
            Syntax.InvocationExpression(Syntax.ParseExpression(@"_container.RegisterInstance<ISessionStateService>(SessionStateService);"));

        InvocationExpressionSyntax replacementNode2 =
           Syntax.InvocationExpression(Syntax.ParseExpression(@"_container.RegisterInstance<IFlyoutService>(FlyoutService);"));

        MethodDeclarationSyntax targetMethod = (MethodDeclarationSyntax)targetExpression.Parent.Parent.Parent;

        List<InvocationExpressionSyntax> list = targetMethod.DescendantNodes().OfType<InvocationExpressionSyntax>().ToList();
        int index = list.IndexOf(targetExpression);

        list.Insert(index + 1, replacementNode1);
        list.Insert(index + 1, replacementNode2);

今の問題は、更新されたツリーを取得する方法です?? リストを更新し、これらの変更を含むツリーを取得する方法を意味します。

編集:ノードを追加して生成できるようになりましたが、フォーマットだけが問題です。間隔が正しくありません。コードは次のとおりです。

   string strContent = File.ReadAllText(strPath);
        SyntaxTree tree = SyntaxTree.ParseText(strContent);

        ExpressionStatementSyntax expressionStatementSyntax =
            Syntax.ExpressionStatement(Syntax.ParseExpression("_container.RegisterInstance(NavigationService);"));

        var targetBlock =
            tree.GetRoot()
                .DescendantNodes()
                .OfType<BlockSyntax>()
                .FirstOrDefault(x => x.Statements.Any(y => y.ToString().Contains("_container.RegisterInstance")));

        StatementSyntax syn1 =
            Syntax.ParseStatement(@"_container.RegisterInstance<ISessionStateService>(SessionStateService);");
        StatementSyntax syn2 = Syntax.ParseStatement(@"_container.RegisterInstance<ISessionStateService>(SessionStateService2);");

        List<StatementSyntax> newSynList = new List<StatementSyntax> { syn1, syn2 };

        SyntaxList<StatementSyntax> blockWithNewStatements = targetBlock.Statements;

        foreach (var syn in newSynList)
        {
            blockWithNewStatements = blockWithNewStatements.Insert(1, syn);
        }

        BlockSyntax newBlock = Syntax.Block(blockWithNewStatements);

        var newRoot = tree.GetRoot().ReplaceNode(targetBlock, newBlock);

すべての行が左揃えで出力を生成します..何か提案はありますか?

4

1 に答える 1