快速业务通道

扩展Eclipse的Java开发工具 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-18
何时使用 AST 之间的差别,请考虑清单 10 中的代码。

清单 10. 模糊的变量引用

public class Foo {   int foo = 1;   public int foo(int foo) {     return foo + this.foo;   }   public int getFoo() {    return foo;   } }

如果作为重构的一部分,您希望查找对实例变量 foo 的引用,那么就会明白一个单纯的解析会使区分本地引用和实例变量引用成为一个难题。AST 创建了完整的分析树,其中表示了 Java 源代码的每个元素并对这些元素进行了区分。在这个特例中,不同的类会考虑“foo”引用的上下文,将“foo”引用表示成 AST 的节点(如 FieldDeclaration 、 SimpleName 和 ThisExpression ),因此您会很轻松地识别它们。

正如前面提到的,本文将只讨论我们所选择的简单例子。现在,让我们回到我们前面跳过的用省略号表示的代码。这个代码将使用 IScanner 的实例以确定并替换源代码中确定成员可视性的关键字。我们将处理的可视性修饰符是 public 、 private 、 protected 和 final 。通过采用“蛮力”方法,我们可以简化这个解决方案,即,采用两个步骤就可以完成。首先删除方法特征符中所有的可视性修饰符(或至少扫描查找它们,如果找到,就删除),然后插入所希望的修饰符。特别地:

如果在方法特征符中找到 public 、 private 或 protected ,就删除它们。

插入所请求的可视性修饰符(对于包可视性的情况,不作任何操作,因为这是缺省操作;即没有任何修饰符)。

final 修饰符很简单。因为所希望的行为就是插入和除去这个修饰符,所以如果它存在,我们除去它;否则就插入它。清单 11 中的代码只显示了一个例子,它无条件地将成员的可视性从 pubilc 改成 private。在与本文相关的解决方案中,您将看到每个操作的公共代码都被移到了抽象超类中。它基本上与下面的代码相同,只不过稍作了整理以避免冗余。

清单 11. 扫描是否有 pubilc 关键字

ICompilationUnit cu = member.getCompilationUnit(); if (cu.isWorkingCopy()) {   IBuffer buffer = cu.getBuffer();   IScanner scanner =     ToolFactory.createScanner(false, false, false, false);   scanner.setSource(buffer.getCharacters());   ISourceRange sr = member.getSourceRange();   scanner.resetTo(    sr.getOffset(),    sr.getOffset() + sr.getLength() - 1);   int token = scanner.getNextToken();   while (token != ITerminalSymbols.TokenNameEOF     && token != ITerminalSymbols.TokenNameLPAREN)    token = scanner.getNextToken();    if (token == ITerminalSymbols.TokenNamePUBLIC) {     buffer.replace(      scanner.getCurrentTokenStartPosition(),      scanner.getCurrentTokenEndPosition(),      scanner.getCurrentTokenStartPosition() + 1,      "private");     break;    }   }   cu.reconcile(); }

扩展Eclipse的Java开发工具(10)

时间:2011-02-23 IBM Dan Kehn

注: ITerminalSymbols 定义了扫描程序可以返回的标记名称,它们对应于 Java 语法的标准标记。您可以进一步查询扫描程序以询问当前标记在缓冲区中开始和结束的具体位置,它出现在哪一行上,当然还有标记本身(特别是象 ITerminalSymbols.TokenNameStringLiteral 和 ITerminalSymbols.TokenNameIdentifier 这样的例子,它们不是保留的关键字)。

上述代码片段中,向 scanner.setSource 方法提供了编译单元的完整源代码,即 Java 源文件中的所有内容。正如前面提到的,扫描

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号