行号的方法名称

给定特定类源代码(Java / C#)的行号 – 是否有一种简单的方法来获取它所属的方法的名称? (如果它在一个内)(推测使用抽象语法树)

(这对于将checkstyle的输出限制为仅触及的方法非常有用)。

我假设您必须使用抽象语法树来执行Line# – > MethodName。

(针对Java)

如果使用调试信息编译类文件,则行号表将包含代码< - >行号的映射。 我不认为有一个内置的API可以在运行时获取它,虽然我相信你可以使用一些字节码工程库,如ASM或BCEL。

我不了解Java,但.NET程序集的元数据表中没有存储行号 – 您需要一个PDB(程序数据库)文件来存储这类信息。

是的,正如你所说,使用正确的AST。 DMS Software Reengineering Toolkit可以为Java和C#构建AST。 每个AST节点都用行号数据修饰。 每个AST节点对应一个语法规则。

因此,确定行号的方法名称的问题非常简单:在AST中找到具有相应行号的节点,然后爬上树直到找到表示方法声明的AST节点; 从该节点中找到方法名称子树并将其打印出来。

此技巧在使用DMS构建的静态分析工具中大量使用,以报告在特定行号诊断出的问题的违规方法名称。 DMS旨在使其他人能够构建此类静态分析工具。