快速业务通道

探索Eclipse的ASTParser - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-17
要缓冲某些信息,特别是从 ICompilationUnit 实现返回的信息。比方说 ,获得源代码的过程非常耗时,所以应该进行缓冲。

解析已有的代码

我们看一看解析的必要步骤,如清单 15 所示。

清单 15. 解析 Java 类

ASTParser parser = ASTParser.newParser(AST.JLS2); parser.setKind(ASTParser.K_COMPILATION_UNIT); parser.setSource(sourceString.toCharArray()); CompilationUnit node = (CompilationUnit) parser.createAST(null);

我知道解析的结果是一个编译单元,因此用 ASTParser.K_COMPILATION_UNIT 初始化了 解析器,也可以使用 K_CLASS_BODY_DECKARATION、K_EXPRESSION 或 K_STATEMENTS。例如 :

清单 16. 解析 Java 语句

parser.setKind(ASTParser.K_STATEMENTS); parser.setSource(sourceString.toCharArray()); Block block = (Block) parser.createAST(null);

探索Eclipse的ASTParser(9)

时间:2011-04-11 IBM Manoel Marques

如果稍后需要将大块的语句插入已有的块中,那么这样做非常有用。但不要忘记插入之 前导入已经解析的节点块,如 block = (Block)ASTNode.copySubtree(unit.getAST(), block);。

createAST() 的参数是 org.eclipse.core.runtime.IProgressMonitor。创建代码时不 需要该接口,但是解析的时候这个接口很重要。通过使用该接口,外部观测者可以跟踪任 务的进展并在需要的时候取消它。当 UI 线程接收来自 IProgressMonitor 的通知时,可 以在不同的线程中进行解析。

所有只读的树操作都是线程安全的,只要没有线程修改它。如果其他线程可以修改节点 ,那么建议同步拥有该树的 AST 对象(synchronize (node.getAST()) {...})。

JFaces 库提供了便利的对话框,在 org.eclipse.jface.dialogs.ProgressMonitorDialog 中封装了 IProgressMonitor。可以 像清单 17 那样使用它。

清单 17. 用 IProgressMonitor 解析

ProgressMonitorDialog dialog = new ProgressMonitorDialog(getShell ()); dialog.run(true, true, new IRunnableWithProgress() {   public void run(final IProgressMonitor monitor)        throws InvocationTargetException {    try {     ASTParser parser = ASTParser.newParser(AST.JLS2);     if (monitor.isCanceled()) return;     parser.setKind(ASTParser.K_COMPILATION_UNIT);     if (monitor.isCanceled()) return;     final String text = buffer.toString();     parser.setSource(text.toCharArray());     if (monitor.isCanceled()) return;     final CompilationUnit node =         (CompilationUnit) parser.createAST(monitor);     if (monitor.isCanceled()) return;     getDisplay().syncExec(new Runnable() {       public void run() {        // update the UI with the result of parsing        ...       }     });    }    catch (IOException e) {     throw new InvocationTargetException(e);    }   } });

对话框 run 方法的前两个布尔参数表示 IRunnableWithProgress 实例的 run 方法应 该在单独的线程中,而且能够取消它。这样,解析是在单独的线程中运行的,对话框中还 显示了一个取消按钮。如果用户按下该按钮,那么对话框就会把 IProgressMonitor 实例 方法 setCanceled() 设为 true。因为还要将该实例传递给解析器,所以解析器的操作将 停止。

解析结束后,我们需要通过它自己的 UI 线程(而不是执行解析的线程)使用解析结果 来刷新 UI。为此,应该使用 org.eclipse.swt.widgets.Display.syncExec 方法,该方法 在 UI 线程的可运行

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号