我正在寻找一个库或工具,它们提供了构建数据结构的功能,我可以用它来查找在另一个范围内的类中使用的变量或方法声明。
示例代码:
class A
{
public void methodA()
{
B external = new B();
external.methodB(); // I would like to know the name/location where this method is declared. something like: classB.java ... line 3
}
}
class B
{
public void methodB()
{
}
}`
Rascal会成为检索此类信息的好人选吗?我之前一直在使用这个工具。据我所知,我可以创建一个AST,但是没有足够的信息来确定声明某些变量/方法的范围。 如果这不是正确的候选人,任何关于替代品的想法?我目前正在研究的候选人名单是:Antlr / symtab; JavaParser类/ JavaSymbolSolver;勺;流氓; JDT
答案 0 :(得分:0)
是的,肯定有几种方法可以找出声明的内容。
第一个答案是从AST中的任何节点检索decl
信息,例如:
rascal>myTree.decl
loc: |java+parameter:///myClass/fac(int)/n|
从位置值中可以看到,这是类n
中名为fac
的方法中名为myClass
的参数。
现在您可以使用访问字段和位置函数(例如myTree.decl.path
等)来查找位置以查找父级,或者您可以在M3构建器中进一步查找您的信息,AST构建器也可以构建:
model = createM3FromEclipseProject(|project://myProject);
此模型包含如下关系:rel[loc, loc] containment
,全部在此处定义:
要找到包含关系中的父母,您可以尝试这样做:
model.containment[myTree.decl]
或反向查找:
invert(model.containment)[myTree.decl]
对于您的特定问题,rel[loc src, loc name] uses
关系也非常有趣,它将完全限定的声明名称映射到源位置使用,rel[loc name, loc src] declarations
将限定名称映射到它们声明的位置。