我想对代码执行查询,例如: - 列出名称以x开头的类 - 列出所有x的子类 - 列出实例化类x对象的方法 - 确定方法x是否包含名为y的变量 - 列出调用方法y的方法 - ...
我正在寻找的是一个API或其他允许我编写程序来检查源代码的东西。
NDepend 提供了一个类似于 SQL 的查询语言,用于查询 .NET 代码结构。
您可以使用System.Reflection,这对于您想要的某些功能非常有用。至于如何进入IL本身,请查看Mono的Cecil。
请查看DMS软件重构工具包。
DMS提供解析器,可以自动构建多种语言(C、C++、Java、C# [1.2、2.0、3.0和4.0]、COBOL、ECMAScript、PHP、Verilog等)的AST,以及一些语言的符号表和控制和数据流分析。
DMS的模式语言可用于匹配表面语法模式,并与过程分析相结合,将代码元素与符号表条目和各种数据流关系联系起来。它已被用于实现各种程序分析工具,并设计为您构建自己的工具的基础,而不浪费大量时间构建基本的程序分析基础设施。
例如,这里是一些CQLinq查询:
-> 列出名称以x开头的类
from t in Application.Types.WithNameLike("^x")
where t.IsClass select t
-> 列出 x 的所有子类
from t in Application.Types
where t.DeriveFrom("MyNamespace.MyTypeX")
select t
-> 列出实例化类 x 对象的方法列表
from m in Application.Methods
where m.CreateA("MyNamespace.MyTypeX")
select m
-> 列出调用方法 y 的方法列表 - ...
from m in Application.Methods
where m.IsUsing("MyNamespace.MyType.MyMethodY()")
select m
默认情况下,提出了200个代码规则。由于C# LINQ语法的广为人知,定制现有规则或创建自己的规则非常简单。
CQLinq查询可以在VisualStudio中实时编辑,并提供即时结果和浏览功能:
实际上,CQLinq基于NDepend.API,更具体地说是基于NDepend.CodeModel命名空间中的类型。使用NDepend.API,您可以编写程序来执行比仅使用CQLinq查询更棘手的任务,例如我们使用NDepend.API编写了一个代码重复查找工具。
规则可以在Visual Studio中实时验证和构建过程时间,在生成的HTML+javascript报告中进行验证。
使用Reflector中的代码模型怎么样?通过代码模型视图插件,您应该能够了解如何查询代码结构的想法。