Roslyn найти рекурсивные методы и добавить в них выражение

Найти в коде все рекурсивные метды и добавить в них выражение

Проблема в том, что если я хочу попробовать вставить свой блок в рекурсивный метод, то может произойти ситуация если в шапке метода (модификатор или любое что либо будет иметь пробелы) Все таки мне кажется что подход мой не очень хороший. А можно как то решить эту задачу буквально в одну строку с помощью анализатора. В нем есть такие штуки как вставка сразу в тело нужной

Идея моя в том, что я хочу собрать по структуре полностью такой же метод с пробелами или еще с чем то. Удалить его с кода. Потом сделать свой и добавить его в код. Ну все же мне кажется это не очень хорошая идея. И она на данный момент не рабочая потому что я не получаю полного метода сразу в таком виде как он есть, а только его складываю по кускам.

    using Microsoft.CodeAnalysis;
    using Microsoft.CodeAnalysis.CSharp;
    using Microsoft.CodeAnalysis.CSharp.Syntax;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    
    namespace ConsoleApp1
    {
        class Program
        {
static class StaticCount {public static count { get; set; }}
            static void Main(string[] args)
            {
                string sourcCode = @"using System;
    
    namespace HelloWorld
    {
         class Program 
         {
            static void Main(string[] args)
            {
                 Console.WriteLine(""Hello World!111""); // Hello World
                Foo(); // Foo() { Foo(); }
                NormalFunc(); /*static void NormalFunc() { Console.WriteLine(""Hello World!111""); }*/
            }
    
            static void Foo()
            {
                Foo();
            }
            static void NormalFunc() { Console.WriteLine(""Hello World!111""); }
        }
    };";
                string expression = "StaticCount.count++;if(StaticCount.count> 1500) throw new Exception();";
                SyntaxTree tree = CSharpSyntaxTree.ParseText(sourcCode);
                IEnumerable<MethodDeclarationSyntax> methods = tree
                  .GetRoot()
                  .DescendantNodes()
                  .OfType<MethodDeclarationSyntax>();
                foreach (var method in methods)
                {
                    string methodModifire = method.Modifiers.ToString().Replace(" ", "");
                    string methodReturn = method.ReturnType.ToString().Replace(" ", "");
                    string methodName = method.Identifier.ToString().Replace(" ", "");
                    string methodParams = method.ParameterList.ToString().Replace(" ", "");
                    string methodBody = method.Body.ToString().Replace(" ", "");
    
                    if (methodBody.Contains(methodName + "("))
                    {
                        Console.WriteLine("RECURSION!!!!!!!!!!!!!!!");
                        sourcCode = sourcCode.Replace(" ", "").Replace(methodModifire + 
                            methodReturn +
                            methodName +
                            methodParams +
                            methodBody, "");
                       // methodBody = methodBody.Insert(1, "++count;if(count > 1500) throw new Exception();");
                        Console.WriteLine(sourcCode);
                    }
                }
            }
        }
    }

Ответы (1 шт):

Автор решения: Terabiterr

Проблему со стеком решил вот так пока.

string expressionParent = "static class StackOverflowCheck {public int StackCount { get; set; }}";
            string expressionMethod = "StackOverflowCheck.StackCount++;if(StackOverflowCheck.StackCount > 1500) throw new Exception();";
            SyntaxTree tree = CSharpSyntaxTree.ParseText(sourcCode);
            IEnumerable<MethodDeclarationSyntax> methods = tree
              .GetRoot()
              .DescendantNodes()
              .OfType<MethodDeclarationSyntax>();
            foreach (var method in methods)
            {
                string methodModifire = method.Modifiers.ToString();
                string methodReturn = method.ReturnType.ToString();
                string methodName = method.Identifier.ToString();
                string methodParams = method.ParameterList.ToString();
                string methodBody = method.Body.ToString();
                //Заменить старое тело на нвоое. 
                if (methodBody.Contains(methodName))
                {
                    string bodyOld = methodBody;
                    methodBody = methodBody.Insert(1, expressionMethod);
                    sourcCode = sourcCode.Replace(bodyOld, methodBody);
                }
            }
→ Ссылка