使用 Rascal 在 Java 中定位 method/variable 声明

Locating method/variable declaration in Java with Rascal

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

示例代码:

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,但这没有足够的信息来确定某些 variables/methods 声明的范围。 如果这不是合适的人选,有什么替代方案吗?我目前正在考虑的候选人名单是:Antlr/symtab; JavaParser/JavaSymbolSolver;勺子;无赖; JDT

是的,肯定有几个选项可以找出声明的地方。

第一个答案是从 AST 中的任何节点检索 decl 信息,例如:

 rascal>myTree.decl
 loc: |java+parameter:///myClass/fac(int)/n|

从位置值可以看出,这是classmyClass中名为fac的方法中名为n的参数。

现在您可以剖析位置以找到 parent,使用位置的访问字段和函数,例如 myTree.decl.path 等,或者您可以在 M3 模型中进一步找到您的信息AST 构建器还可以构造:

 model = createM3FromEclipseProject(|project://myProject);

此模型包含如下关系:rel[loc, loc] containment,所有定义均在此处:

要在包含关系中找到 parents,你可以试试这个:

model.containment[myTree.decl]

或反向查找:

invert(model.containment)[myTree.decl]

对于您的特定问题,rel[loc src, loc name] uses 关系也很有趣,它将完全限定的声明名称映射到源位置使用,rel[loc name, loc src] declarations 将限定名称映射到它们声明的位置。