使用 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
,所有定义均在此处:
- 核心语言模型:https://github.com/usethesource/rascal/blob/master/src/org/rascalmpl/library/analysis/m3/Core.rsc
- Java 扩展名:https://github.com/usethesource/rascal/blob/master/src/org/rascalmpl/library/lang/java/m3/Core.rsc
要在包含关系中找到 parents,你可以试试这个:
model.containment[myTree.decl]
或反向查找:
invert(model.containment)[myTree.decl]
对于您的特定问题,rel[loc src, loc name] uses
关系也很有趣,它将完全限定的声明名称映射到源位置使用,rel[loc name, loc src] declarations
将限定名称映射到它们声明的位置。
我正在寻找一个库或工具,它们提供构建数据结构的功能,我可以使用它来查找在另一个范围内的 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
,所有定义均在此处:
- 核心语言模型:https://github.com/usethesource/rascal/blob/master/src/org/rascalmpl/library/analysis/m3/Core.rsc
- Java 扩展名:https://github.com/usethesource/rascal/blob/master/src/org/rascalmpl/library/lang/java/m3/Core.rsc
要在包含关系中找到 parents,你可以试试这个:
model.containment[myTree.decl]
或反向查找:
invert(model.containment)[myTree.decl]
对于您的特定问题,rel[loc src, loc name] uses
关系也很有趣,它将完全限定的声明名称映射到源位置使用,rel[loc name, loc src] declarations
将限定名称映射到它们声明的位置。