Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Roslyn按执行顺序获取语法树节点_C#_.net_Roslyn - Fatal编程技术网

C# 使用Roslyn按执行顺序获取语法树节点

C# 使用Roslyn按执行顺序获取语法树节点,c#,.net,roslyn,C#,.net,Roslyn,是否有任何方法或解决方法可以使用Roslyn的任何方法在文件/类中按执行顺序获取SyntaxTree节点。输入方法是已知的 例如: class myClass { void EntryMethod() { CallMethod1(); CallMethod2(); AnotherMethod(); CallMethod3(); } void AnotherMethod() { C

是否有任何方法或解决方法可以使用Roslyn的任何方法在文件/类中按执行顺序获取SyntaxTree节点。输入方法是已知的

例如:

class myClass 
{
    void EntryMethod() {
        CallMethod1();
        CallMethod2();
        AnotherMethod();
        CallMethod3();
    }

    void AnotherMethod() 
    {
        CallMethod4();
        CallMethod5();
    }
}
需要的结果如下:

List<ExpressionStatementSyntax or InvocationExpressionSyntax> 
{CallMethod1, CallMethod2, CallMethod4, CallMethod5, CallMethod3}
列表
{CallMethod1,CallMethod2,CallMethod4,CallMethod5,CallMethod3}

没有用于此的内置API,因为在一般情况下是不可能的。不过,您可以使用基本的Roslyn API自己编写代码。

如果您有循环或if语句怎么办?这相当于停止问题。@SLaks我认为在我的例子中,方法内部的出现顺序足够多,那么你可以自己用一个简单的DFS来完成。但是要注意递归。如果您的语句之一是对接受委托的方法的调用,而参数是lambda,并且lambda包含表达式或语句,该怎么办?相对于方法中的表达式和语句,您希望以什么顺序枚举lambda中的表达式或语句?对于这些表达式的执行时间没有任何保证,如果有的话。@EricLippert感谢您的评论!我不需要任何代码库的通用解决方案,将要分析的代码库对我来说是众所周知的,我确信没有任何lambda或委托表达式。我的任务是收集特定自定义方法及其参数的所有调用。我尝试使用基本的Roslyn API来完成此操作,请检查我认为我尝试的方式完全错误。我知道代码不好,但它只是为了获得主要思想而起草的