第二章 AST 的相关操作
2.1
AST 的节点的定位
本节主要介绍 AST 节点获取子节点的方法和从源代码搜索节点的方法。
2.1.1 获取 AST 节点的子节点
ASTNode 是 AST 用于表示树中节点的数据结构,也是所有节点类型(如 Expression,的
父类 ASTNode 获得父节点可以直接调用 getParent 即可,若想获得根节点可以调用 getRoot,
具体可以参照 JDT API,但是仔细查看方法列表就会发现 ASTNode 类没有提供 getChildren 方
法,下面就介绍如何获得 ASTNode 的子节点。
首先介绍节点属性,一个节点的子节点被属性划分,例如 TypeDeclaration 节点(类的
声明节点),该节点有一个 SimpleName 节点(表示类的名称),这个节点在 TypeDeclaration
节点中的属性就是 Name,节点通过属性为节点分类,方便用户提取对应的节点,也更容易
理解子节点的含义。ASTNode 关于属性有两个重要的方法:
1) structuralPropertiesForType
功能:返回节点的属性列表(List 对象)
2) getLocationInParent
功能:返回该节点在其父节点的位置(属性)
属性列表中的元素是 StructuralPropertyDescriptor,属性有三种类型:
1)SimplePropertyDescriptor
表示该节点为一个简单属性
2)ChildPropertyDescriptor
表示该节点仍有一个子节点
3)ChildListPropertyDescriptor
表示该节点有大于 1 个的子节点
ASTNode 从属性获得子节点(属性)的方法:
getStructuralProperty(StructuralPropertyDescriptor property)
该方法的返回值根据上述三种类型也有三种返回值类型:
1)SimplePropertyDescriptor
返回一个 Object 对象,通过 toString()方法获得内容 ,通过 property.getId 获得属性名称。
2)ChildPropertyDescriptor
返回一个 ASTNode 对象,即该节点的子节点
3)ChildListPropertyDescriptor
返回一个 List 对象,包含多个 ASTNode,都为该属性下的子节点
总的来说,ASTNode 获得子节点的机制如下图所示:(图 1,2)
图 1 ASTNode 通过 Property 获得子节点和自身属性信息
图 2 ASTNode 根据 Property 不同而得到类型的节点或属性
2.2.2 从源代码搜索节点
NodeFinder 类介绍:在 ASTView(具体可以参照“AST View 插件介绍”)源代码中实现了
该类,JDT 从 3.5 版起正式收入 NodeFinder,路径为 org.eclipse.jdt.core.dom.NodeFinder
NodeFinder 类的初始化:
NodeFinder(ASTNode root, int start, int length) //root 为开始搜索的根节点,start 为源代码开
始位置,length 为长度
使用 NodeFinder 有两种方式:
第一种,创建该类的实体对象,有两种方法供调用:
getCoveredNode()
返回被覆盖的节点(完全覆盖),如果覆盖节点大于一个,则返回尽可能接近所给范围的节点,
具有同样范围则返回第一个发现的节点
getCoveringNode()
返回正被覆盖(部分覆盖)节点,如果该类种节点大于一个,则返回尽可能多的被覆盖的节点,
具有同样的范围则返回最后一个发现的节点。
第二种,调用静态方法:
public static ASTNode perform(ASTNode root, int start, int length)
该方法规则:
1、查找节点的 start 和 length 与所给的起始位置和长度完全匹配的节点
2、若找不到,在这个范围的附近查找,优先完全覆盖的节点,若完全覆盖节点不存在,则
返回部分覆盖节点。
3、若 length 为 0,则返回节点的 start 或者 end 等于所给起始位置的节点
4、若上述三条均查找不到,则返回 null
2.2
AST 的遍历
本节主要介绍 ASTVisitor 的使用方法。
ASTVisitor 提供了一种遍历树的能力,由节点以访问者模式对其子树遍历,我们将对树
的操作在 ASTVisitor 中实现,使用 ASTNode 的 accept 方法,完成用户定义的 visitor 对树的遍
历。
该方法用来对 AST 节点的访问,提供了四个方法:
1) public boolean visit(T node)
T 代表了不同的 AST 节点类型(ASTNode 子类),可以控制对该节点的子节点的访问,如果
返回 true,则继续访问子节点,若返回 false 则不访问子节点
2) public void endVisit(T node)
该方法在该节点的所有子节点访问完成(或 visit 返回 false)后被调用
3) public void preVisit(ASTNode node)
在 visit 方法之前被调用
4) public void postVisit(ASTNode node)
在 endvisit 方法之后被调用
子类根据需要重写上述方法,完成对树的某些操作。
PreVisit 和 visit 的区别:
图 3 ASTVisitor 的执行顺序
两者的最主要区别是参数不同,前者的参数是 ASTNode,并且在 ASTVisitor 中该方法只
有一个,而后者的参数是所有可能的节点类型,所以该方法因重载在 ASTVisitor 有很多个。
ASTVisitor 这样设计是因为有些操作是对所有节点的统一操作,而这些操作不关注节点类型,
并且可能需要最先执行,所以提供了 preVisit 方法供调用,随后节点的类型被确定,随即调
用匹配类型的 visit 方法,完成对某类节点的操作。
同理可知 postVisit 和 endvisit 的区别。
AST 的遍历示例可以参考“数据元素的构造”
第三章 AST View 插件介绍
3.1
AST View 简介
AST View 是 eclipse 环境中的一个 view 插件,它提供了如下主要功能:
1) 将 eclipse 编辑窗口打开的一个 Java 文件转换为抽象语法树(AST: Abstract syntax
tree)的形式,并显示出来;
2) 可进行从编辑器中的文本(代码、注释等)选择到 AST 节点的操作,也可以进行从
节点到文本的反向操作;
3) 进行节点比较;
4) 显示节点的绑定信息和简单的错误信息;
AST View 界面如图 1 所示
图 1 AST View 基本界面
AST View 安装
3.2
AST View 的安装分为更新和手动安装两种方式。
3.2.1 更新方式
更新站点:
http://www.eclipse.org/jdt/ui/update-site
1)在 eclipse 菜单中选择 Help -> Install new software...
2)在打开的窗口中点击“Add...”按钮(已添加过的跳过此步),填写更新站点的网址。(见
图 2)
3)在列表中选择对应的版本,Next 就可以在线更新。(见图 3)
图 2 添加更新站点
图 3 选择安装的版本
3.2.2 手动安装
1) 下载
下载地址:
http://www.eclipse.org/jdt/ui/astview/index.php
见 Manual Install 列表,找到适合(对应 eclipse 版本)的版本下载。(见图 4)
2) 解压缩后拷贝文件夹到 eclipse 文件夹下的 plugins 或者 dropins 文件夹中。
图 4 选择手动安装版本
3.3
AST View 使用
(1) 打开 AST View 插件(已经打开的跳过此步)
1) 从菜单中选择打开:
eclipse 菜单:Window -> Show View -> Other...
选择 Java,找到 AST View 并选择。
2) 使用快捷键:Alt+Shift+Q, A
(2) 在 eclipse 编辑器中打开一个 Java 文件
(3) 点击“Show AST( )”,在 view 插件中显示当前编辑器的中代码的 AST 结果。
(4) AST View 节点介绍。(见图 5)
图 5 AST View 节点总览
1)AST 节点显示为灰色,中括号里的是该节点在源代码中的起始位置和长度。
2)节点属性的名为全大写显示,节点属性代表了子节点或者本身的属性信息。
3)绑定信息显示为蓝色。
(5) 可以选择“链接编辑器( )”,自动的建立编辑器中文本与插件中的 AST 节点的关
联,具体表现形式是:在编辑器中选定的一段代码,AST View 插件可以自动定位到选定代码
对应的 AST 节点,并突出显示。
(6) 双击 AST View 中的节点,在编辑器中自动突出显示选定该节点对应的代码。(见图 6)
图 6 选定节点显示
(7) 再次双击以上节点,会以拓展形式显示对应的代码,包括了与该节点相关的注释文本。
(8) 在 AST View 选定一个节点后,右键菜单中可以选择放入比较,该机制允许用户选定
某些节点放在一起比较。(见图 7,8)
图 7 添加到比较盒
(9) 当 AST View 解析的 Java 文件发生变化的时候,可以点击“刷新( )”以更新 AST
结果。
图 8 比较盒内容
AST View 源码分析
3.4
3.4.1 从 CVS 中获得源码
Repository: :pserver:anonymous@dev.eclipse.org:/cvsroot/eclipse
Module: jdt-ui-home/plugins/org.eclipse.jdt.astview
添加步骤:
eclipse 菜单:选择 File -> Import...
1) 选择 CVS –> Projects from CVS
2) 选中 Create a new repository location
3) 填写相应信息。(见图 9)
4) 找到 astview 项目,导入到 eclipse。
图 9 CVS 信息添加
3.4.2 源代码结构
导入 astview 以后的源代码结构如图 10 所示: