【发布时间】:2016-06-29 18:20:52
【问题描述】:
例如:
SqlCommand command = new SqlCommand();
SqlDataReader datareader = command.ExecuteReader();
这里的调用节点是command.ExecuteReader()。如何使用 roslyn 从调用节点获取变量标识符 token/node command?
假设此调用节点之前可以有许多其他方法调用,例如classA.methodA().methodB().classB.methodC(command.ExecuteReader()) 因此通过node.DescendantNodes 获取标识符可能没有用。
我想到的解决方案是先获取ExecuteReader的SpanStart,然后通过调用SymbolFinder.FindSymbolAtPosition以ExecuteReader.SpanStart - 2的位置获取command的符号。但是我不确定这个解决方案是否可以处理每一种情况。我正在开发的应用程序是一个静态代码分析器。
【问题讨论】:
-
最后这些只是链式调用/简单的成员访问。如果你得到最内在的调用(或
SimpleMemberAccessExpression),你就会得到你想要的。查看直接父母而不是所有祖先。 -
有没有比硬编码更好的方法呢?例如,获取方法调用的符号,然后从符号中,确定调用该方法的对象的实例。例如:
ClassA varA = new ClassA(); varA.methodA()获取methodA()的符号并发现varA调用了它。 -
“硬编码”是什么意思?如果您想要该调用,则必须编写获取该调用的代码。
-
我的回答能解决你的问题吗?我可以为您做出任何澄清或扩展以让您接受吗?
标签: c# roslyn roslyn-code-analysis