行号的方法名称

时间:2009-06-22 12:16:19

标签: c# java diff line-numbers abstract-syntax-tree

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

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

(针对Java)

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

答案 2 :(得分:0)

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

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

这个技巧在使用DMS构建的静态分析工具中大量使用,用于报告在特定行号诊断出的问题的有问题的方法名称。 DMS是 旨在使其他人能够构建这样的静态分析工具。