Roslyn - 如何通过方法逐行获取?

Roslyn - How to got line by line through a method?

他们在 Roslyn 中是逐行通过 C# 中的方法的方法吗?

我尝试做的是分析单元测试中的评论并构建文档:

这是我要分析的示例测试

 [TestClass]
    public class ClassToAnalyze
    {

        [TestMethod]
        public void MethodToAnalyze()
        {
            // * Start Testing
            Assert.IsTrue(true);
            // * Test something other
            var text = new string("foobar");
            Assert.IsNotNull(text);
            // ** Test additional strings
            Assert.AreEqual("foobar",text);
            // + Test Numbers
            TestNumbers();
        }

        private void TestNumbers()
        {
            // ** Test integer
            var count = 3;
            Assert.AreEqual(3, count);
            // ** Test Double
            var pi = 3.14;
            Assert.IsTrue(pi > 0);
        }
    }

您可以看到标记为星号的评论,这是 1 级文档,带有 2 个星号的是 2 级文档。就像 markdown 中的未排序列表。

但是带有 + 号的注释表示在此之后它们是一个方法调用,其中还包含用于文档的注释。

例如: 我分析了 Testmethod 的代码,这完全可以正常工作。但是 Comment // + Test Numbers 表示它们是方法 TestNumbers() 中的附加注释。我已经构建了一种方法来分析 TestNumbers() 中的评论 但是我在分析期间没有在评论 // + Test Numbers 和之后的行中的调用 TestNumbers() 之间建立联系。

我尝试了什么:

我试过了,但我只设法获得了一个陈述列表,但我没有找到在每个陈述之前获取琐事的方法。

我该怎么做?

foreach (var method in _classDeclarationSyntax.DescendantNodes().OfType<MethodDeclarationSyntax>())
{
     var blockSyntax = methodDeclarationSyntax.Body;
     var syntaxNodes = blockSyntax.ChildNodes();
}

所以经过大量的尝试和错误之后,这很容易。要用的东西是CSharpSyntaxWalker,给他一个BlockSyntax。

public class MethodBodySyntaxWalker : CSharpSyntaxWalker
{

    public override void VisitLocalDeclarationStatement(LocalDeclarationStatementSyntax node)
    {
        if (node.HasLeadingTrivia)
        {
            Trace.WriteLine(node.GetLeadingTrivia().ToFullString().Trim());
        }
        Trace.WriteLine(node.ToString());
    }

    public override void VisitExpressionStatement(ExpressionStatementSyntax node)
    {
        if (node.HasLeadingTrivia)
        {
            Trace.WriteLine(node.GetLeadingTrivia().ToFullString().Trim());
        }
        Trace.WriteLine(node.ToString());
    }
}