java程序中的标识符重命名

时间:2010-08-17 19:56:07

标签: java eclipse-plugin identifier renaming

我需要以编程方式重命名给定范围内的标识符,例如,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 Model。在任何一种情况下,我都必须实现搜索所有出现的任何给定标识符,然后替换它们。我想知道是否有更好的方法来做到这一点(Eclipse Refactoring UI如何支持这种变量重命名)?或者,我应该查看语言工具包(org.eclipse.ltk.core.refactoring)?任何教程,示例代码或建议?

请帮忙。

4 个答案:

答案 0 :(得分:1)

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

  1. 使用Java反射API java.lang.reflect标识在需要本地的特定类中定义的所有方法 变量重命名。
  2. 遍历所有方法。对于每个方法,使用 org.eclipse.jdt.core API下降编译元素的层次结构,选择本地范围的变量定义。获取变量的名称 编译单位。
  3. 生成新的变量名称。类似于:Old ==> OldRenamed。在此时应用您希望的任何重命名启发式。
  4. 调用Eclipse开发工具包 org.eclipse.jdt.ui.refactoring API方法进行变量重命名 在方法内。实际上,您将调用Eclipse 重命名变量功能 通过使用此API无头。
  5. 这应该可以解决问题。

答案 1 :(得分:0)

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

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

但它将更改应用于实际的源文件。无论如何可以预防吗?我只需要在内部重命名代码,不得更改实际源代码。

答案 2 :(得分:-1)

我真的质疑这样做的智慧,但可以使用注释处理器来完成。您必须接受注释处理器无法修改现有源代码,但可以创建新的源代码,基本上是原始代码的克隆(重命名除外)。

  1. 创建定义搜索和替换的注释。
  2. 注释您的源代码。您可以在包级别创建源文件package-info.java并进行注释。
  3. 您的处理器可以通过Compiler Tree API使用Trees.instance method
  4. 您可以延长SimpleTreeVisitor进行实际复制。这将是乏味的,但不是很复杂。
  5. 我能想到的唯一一个用例就是你准备了具有在人类语言A(例如日语)中有意义的变量名的源代码,并且你希望与观众讨论它(老板,学生,客户)谁等人类语言B(如阿拉伯语)更为舒适

    除此之外,我想不出任何有理由去做这么多麻烦。在给出的示例中,x,y和z是局部变量。由于范围很小,所以没有迫切需要重命名。

答案 3 :(得分:-3)

  • 选择变量
  • 单击鼠标右键
  • 选择重构
  • 选择重命名
  • 重命名变量

Eclipse将在其使用的所有位置重命名此变量