在InvocationExpressionSyntax

时间:2018-01-19 15:38:27

标签: c# .net roslyn code-analysis roslyn-code-analysis

我从已解析的C#脚本中提取了所有InvocationExpressionSyntax,结果如下:

1. System.IO.Directory.GetDirectories(@"c:\").First()
2. Math.Sin(3).ToString()
3. value.Substring(0, 1)

我也有SemanticModel对象,并以各种方式进行搜索和实验,以执行以下操作:

  1. 从最后一次到第一次调用调用迭代,并确定它属于哪种CLR类型。例如,Math.Sin(3).ToString()应告诉我该方法为ToString,而类型为Double。在下一次迭代中,方法为Sin,类型为Math
  2. 为了做到这一点,我有一个类型为List<Type> Allowed的硬编码列表。我现在想要提取CLR Type的每个细分的InvocationExpressionSyntax,看看它是否包含在白名单中。
  3. 目标是列出白名单类型并调用最终用户可以使用的小子集。例如,Math.XXX没问题,Directory.XXX不是。

    我已经搜索过并进行了相当多的实验,但还没有弄清楚如何针对每个表达式提取Type对象。预期课程类型为MethodInfoPropertyInfoClass

    任何指针都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

您是否考虑过使用NDepend代码查询模型? https://www.ndepend.com/features/cqlinq#CQL https://www.ndepend.com/docs/cqlinq-features https://www.ndepend.com/docs/cqlinq-syntax

例如,您可以编写代码查询:

let blackListedMethodNames = new [] {
  "System.IO.Directory.XXX",
  ...
}.ToHashSet()

let blackListedMethods =
Methods.Where(m => blackListedMethodNames.Contains(m.FullName)).ToHashSet()

from m in Application.Methods.UsingAny(blackListedMethods )
select new { m, 
             blackListedMethodsCalled = m.MethodsCalled.Intersect(blackListedMethods ) }

例如:

NDepend code query to black list some method