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());
}
}
他们在 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());
}
}