3

我需要以编程方式重命名给定范围内的标识符,例如 java 程序中的方法。例如,给定以下 java 函数:

public void doSomething(){
   int x = 10;
   int y = x * 2;
   int z = x + y;
}

重命名变量(x 为 a,y 为 b,z 为 c)后,我应该获得以下函数:

public void doSomething(){
   int a = 10;
   int b = a * 2;
   int c = a + b;
}

如何以编程方式实现标识符及其引用的重命名?

我一直在研究 Eclipse AST 和 Java 模型。在任何一种情况下,我都必须搜索任何给定标识符的所有出现,然后替换它们。我想知道是否有更好的方法来做到这一点(Eclipse Refactoring UI 如何支持这种变量重命名)?或者,我应该查看语言工具包(org.eclipse.ltk.core.refactoring)吗?任何教程、示例代码或建议?

请帮忙。

4

4 回答 4

1

我不清楚您是否希望全面执行此重命名(即所有类中的所有方法)或仅针对您将手动识别的特定类。假设是后者,我建议您:

  1. 使用 Java 反射 API java.lang.reflect 来识别在需要局部变量重命名的特定类中定义的所有方法。
  2. 遍历所有方法。对于每种方法,使用org.eclipse.jdt.core API 向下遍历编译元素的层次结构,选择局部范围的变量定义。获取编译单元的变量名称。
  3. 生成新的变量名称。类似于:旧 ==> 旧重命名。此时应用您希望的任何重命名启发式。
  4. 调用 Eclipse 开发工具包org.eclipse.jdt.ui.refactoring API 方法来在方法中进行变量重命名。通过使用此 API,您将有效地调用 Eclipse Rename Variable功能。

这应该够了吧。

于 2010-08-19T23:10:38.573 回答
0

我可以使用以下代码重命名。

RenameSupport renameSupport = RenameSupport.create(field, newName, RenameSupport.UPDATE_REFERENCES);
renameSupport.perform(workbench.getShell(), workbench);

但它将更改应用于实际的源文件。有没有可以预防的?我只需要内部重命名的代码,不能更改实际源代码。

于 2010-11-15T23:54:07.307 回答
-1

我真的质疑这样做是否明智,但可以使用注释处理器来完成。您将不得不接受注释处理器不能修改现有源代码,但可以创建基本上是原始源代码的新源代码(重命名除外)。

  1. 创建定义搜索和替换的注释。
  2. 注释您的源代码。您可以创建一个源文件 package-info.java 并在包级别进行注释。
  3. 您的处理器可以通过Trees.instance 方法使用Compiler Tree API
  4. 您可以扩展SimpleTreeVisitor来进行实际的复制。这将是乏味的,但不是很复杂。

我能想到的唯一用例是,您已经准备了具有在人类语言 A(例如日语)中有意义的变量名的源代码,并且您希望与观众(老板、学生、客户等)讨论它。 ) 更熟悉人类语言 B(例如阿拉伯语)的人

除此之外,我想不出有什么好的理由去这么麻烦。在给出的示例中,x、y 和 z 是局部变量。由于范围如此之小,因此确实没有迫切需要重命名。

于 2010-08-18T02:01:48.953 回答
-3
  • 选择变量
  • 单击鼠标右键
  • 选择重构
  • 选择重命名
  • 重命名变量

Eclipse 将在所有使用它的地方重命名这个变量

于 2010-08-17T20:02:24.473 回答