使用Rascal在Java中查找方法/变量声明

时间:2017-10-03 10:39:12

标签: rascal

我正在寻找一个库或工具,它们提供了构建数据结构的功能,我可以用它来查找在另一个范围内的类中使用的变量或方法声明。

示例代码:

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

1 个答案:

答案 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将限定名称映射到它们声明的位置。