Roslyn - Как получить построчно через метод? - PullRequest
0 голосов
/ 25 февраля 2020

Это путь в Рослине к go через метод в C# строка за строкой?

Что я пытаюсь сделать, это проанализировать комментарии внутри UnitTest и создать документацию:

Это пример теста, который я хочу проанализировать

 [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);
        }
    }

Вы можете видеть комментарии, помеченные звездочкой, это сделать c уровень 1, а тот, у которого 2 звездочки, - это уровень 2 Подобно несортированному списку в уценке.

Но комментарий со знаком + отмечает, что после этого это вызов метода, к которому также относятся комментарии для документации.

Например: я анализирую код Testmethod, все работает нормально. Но комментарий // + Test Numbers указывает на то, что они являются дополнительными комментариями в методах TestNumbers () . Я уже разработал способ анализа комментариев в TestNumbers () , но во время анализа я не вижу связи между комментарием // + Test Numbers и вызовом TestNumbers ( ) в строке после.

То, что я пробовал:

Я попробовал это, но мне удалось получить только список утверждений, и я не нашел способа получить викторины до каждое утверждение.

Как я мог это сделать?

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

1 Ответ

0 голосов
/ 31 марта 2020

Так что после многих попыток и ошибок это довольно легко. Нужно использовать 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());
    }
}
...