【eclipse高效开发】——ASTView节点详解
来源:互联网 发布:什么软件收二手手机 编辑:程序博客网 时间:2024/06/01 10:25
一、AstView 的AST节点类型
目的:了解节点类型,之后才能理解AST操作。才能准确的对特定的节点进行操作。
ASTView主要包括三部分:AST nodes、node properties、bindings。
ASTView整体结构为:
ASTView在eclipse中的视图(CompilationUnit根节点未显示):
(注:
ASTView中节点后中括号内的内容表示该节点资源的范围,意为当前节点之前的字符总数+当前节点包含字符数(包含空格),如FieldDeclaration [2295+40]表示fieldDeclaration节点有40字符,该节点之前有2295字符。字母空格中文均算一个字符。
属性后圆括号内的数字表示该抽象节点下有多少个该子类型的节点,如TYPES (2)表示该属性下有两个TypeDeclaration节点。
节点在ASTView中显示为灰色字体,AST节点的孩子节点为该AST节点的属性,属性名的字母均大写。)
部分节点在ASTView中可嵌套使用,如body下有statement,statement下又有body,视具体情况而定。以下节点介绍基于JLS3。JLS2不支持泛型。
1. AST nodes(AST节点)
节点按代码功能可分为注释节点,注解节点,逻辑程序节点
CompilationUnit:Java编译单元,是整个源文件,即一个Java文件或class文件,包括前导和尾随空格和注释。它是所有AST节点的根节点。
PackageDeclaration:对应编译单元包声明部分(包括包前的注释注解等)。
ImportDeclaration:对应编译单元import部分。
TypeDeclaration:每个类或接口类型的声明为一个TypeDeclaration节点,包括注释文档。同一编译单元可以有多个类声明。
BodyDeclaration:类的主体,即类大括号中的内容(不包括大括号本身)。
Block:块,在type中的每个大括号的内容为一个块(包括大括号本身)。
MethodDeclaration:方法,包括方法声明和方法体定义。
SingleVariableDeclaration:方法的参数列表,单形参的变量声明,如“FileNotFoundException e”。
FieldDeclaration:属性声明语句
TypeDeclarationStatement:在类内部将一个类声明包装到一个语句块里,如“{class hh{}}”,此处的“class hh{}”是一个TypeDeclarationStatement节点。
VariableDeclarationStatement:局部变量声明语句。
VariableDeclarationFragment:全局属性或局部变量声明的片段,类型之后的变量名以及初始化部分。
VariableDeclarationExpression:变量声明表达式,如for(int i=0;;)循环中的“int i=0”。区别于方法中的变量声明语句VariableDeclarationStatement
EnhancedForStatement :for-each语句。
IfStatement:if语句
ExpressionStatement:表达式语句,执行某操作。如标准输出语句,方法调用等。
ReturnStatement :return语句。
BreakStatement:break语句
WhileStatement:while语句
TryStatement:try语句,包括try(或try-with-resources)块catch块和finally块
ThrowStatement:抛出异常语句
MethodInvocation :方法调用节点
SuperMethodInvocation:调用父类方法
SwitchStatement:switch语句
SwitchCase:case字句或default字句,不包含该字句后的内容,如“case 1:”或“default:”。
SynchronizedStatement:同步控制语句,如synchronized ( new String() ){ }
ThisExpression:返回类的引用或在构造器中调用另一个构造函数。
TypeParameter:参数化类型的类型参数,如List<T>中的参数T
WildcardType:通配符类型,如List<?>的“?”
UnionType:联合类型(C/C++中特有)
AnnotationTypeDeclaration:注解类型节点
AnnotationTypeMemberDeclaration:注解类型节点的成员声明节点,如抽象方法或默认方法。
AnonymousClassDeclaration:内部类声明节点。包括枚举的内部类实现。
ArrayCreation:数组初始化部分的节点。如new int[2]或new int[]{1,2}。(整个数组创建语句“int array[]=new int[]{1,2};”是一个VariableDeclarationStatement节点)
ArrayInitializer:数组初始化的赋值部分。如{1,2}。
ArrayAccess:访问数组的节点,如访问索引值为0的数组值:array[0]
ArrayType:数组类型节点,如“int[] array;”的int[]部分,这与int array[]是有区别的。后者的类型为PrimitiveType(int型)。
AssertStatement:断言语句(形如:assert Expression [ : Expression ] ;)。assert不常用,一般用于测试。IDE工具默认关闭断言检查功能,即assert在运行时不会生效。
Assignment:赋值语句,如“i=1”
BooleanLiteral:布尔值(true/false)。
CharacterLiteral:字符常量值,如‘char’
StringLiteral:字符串常量值,如“String”
NumberLiteral:数字常量值,包括int、double、float、long等类型的值
TypeLiteral:类型常量
CastExpression:强制类型转换子句,如(int) 11.0
CatchClause:catch块
ClassInstanceCreation:类实例化的new部分,如“new DemoClass()”
ConditionalExpression:条件从句。如“true?1:0”
ConstructorInvocation:构造器调用,在构造方法中出现。如“this();”
SuperConstructorInvocation:父类构造器调用
ContinueStatement:continue语句
DoStatement:do-while循环语句,如“do{}while(i==0);”
EmptyStatement:只有一个结束符号的空语句,即“; ”
EnumConstantDeclaration:枚举常量,包含常量前的文档注释
EnumDeclaration:枚举类型声明节点,包含Javadoc
FieldAccess:一般变量访问语句
SuperFieldAccess:使用关键词super访问父类变量语句
InfixExpression:判断表达式,返回布尔值
Initializer: AST节点类型,形如:[ static ] Block。区别“static int i;”和“static {int i;}”,前者是FieldDeclaration,后者是Initializer
InstanceofExpression:instanceof语句
LabeledStatement:标记语句,用于循环中,如“label:for(;;){for(;;){break label;}}”
Modifier:修饰词节点,包括public、protected、private、static、abstract、final、native、synchronized、transient、volatile、strictfp
ParameterizedType:参数化类型(泛型)节点
PrimitiveType:原始类型节点,8种Java原始类型加上void类型
ParenthesizedExpression:括号表达式,形如:( Expression )
PrefixExpression :前缀表达式, 如++i;
PostfixExpression:后缀表达式,如i++;
QualifiedName:完整名,QualifiedName中每一个名为一个独立的SimpleName
SimpleName:直接名,simple与qualified的区别:前者只是给出了最后的一项命名,后者给出了完整的命名,如java.io.IOException是QualifiedName,而IOException为SimpleName。类比于相对路径与绝对路径的区别。
*QualifiedType:
Type . SimpleName
如类型 "A.B" 可以有两种方式表示:
QualifiedType(SimpleType(SimpleName("A")),SimpleName("B"))
SimpleType(QualifiedName(SimpleName("A"),SimpleName("B")))
在ASTView中一般以第二种方式表示。
SimpleType:直接类型,如List<String>中的“List”和“String”分别是一个SimpleType节点。java.lang.String也为SimpleType
MarkerAnnotation:标记注解,如@Controller功能同NormalAnnotation的@Controller()
NormalAnnotation:标记注解,如@Controller()
SingleMemberAnnotation:单值注解,如@Controller(“String”),作用同NormalAnnotation的@Controller(value=”string”)。
MemberValuePair:注解中的赋值对,如@Controller(value="string")中的“value="string"”。
BlockComment:块注释。/* */
LineComment:行注释。//
Javadoc:注释文档。
MemberRef:Javadoc中成员引用,如
/**
* @see #i
* @see #print(int)
*/
中的“#i”,其中i是类的成员属性,print(int i)为成员方法。常用的标记有@see、@link。
MethodRef:Javadoc中方法引用。类似于MemberRef。如例@see #print(int)中的“#print(int)”。
MethodRefParameter:Javadoc中引用方法的参数类型。如例@see #print(int)中的“int”。
TextElement:Javadoc中的的文本内容,包含标记名与标记内容之间的空格,不包括注释结束符“/** * */”
TagElement:包括标记名和标记内容。如@author leiy。标记内容可以是:TextElement、Name、MethodRef、MemberRef,也可以嵌套一个{TagElement}。
编译单元的属性:PACKAGE、IMPORTS、TYPES(对应编译单元中除了PACKAGE和IMPORTS部分的全部内容)、EnumDeclaration、AnnotationTypeDeclaration。
TypeDeclaration节点属性:JAVADOC、MODIFIERS、INTERFACE、NAME、TYPE_PARAMETERS、SUPERCLASS_TYPE、SUPER_INTERFACE_TYPES、BODY_DECLARATIONS等
FieldDeclaration节点属性:TYPE、FRAGMENTS、MODIFIERS、JAVADOC等
MethodDeclaration节点属性:JAVADOC、MODIFIERS、CONSTRUCTOR、TYPE_PARAMETERS、RETURN_TYPE2、NAME、RECEIVER_TYPE、RECEIVER_QUALIFIER、PARAMETERS、EXTRA_DIMENSIONS2、THROWN_EXCEPTION_TYPES、BODY。
BODY:方法的主体,即方法大括号中的内容(包括大括号本身)。
STATEMENTS:方法体中STATEMENTS会从第一个非注释行开始,忽略之前的注释,但包含之后的注释。
EXPRESSION:表达式,可以为一个变量或赋值或比较句子。
THEN_STATEMENT:if语句的then处理块
ELSE_STATEMENT:if语句的else处理块
ARGUMENTS:方法的实参
3. Bindings(绑定)
在ASTView中,无论是方法定义还是方法调用,method binding是相同的;
包括了Java语言的命名实体,给出了不同命名实体(packages,types,fields,methods,constructors,and local variables)的通用协议接口,从编译器的角度给出了程序结构的完整视图
- 【eclipse高效开发】——ASTView节点详解
- 【eclipse高效开发】——AST View
- 【Eclipse AST】AST与ASTView简介
- 【Eclipse AST】AST与ASTView简介 .
- 【eclipse高效开发】——AST的获取与访问
- 【eclipse高效开发】——eclipse AST(抽象语法树)简介
- Eclipse高效开发插件汇总
- Eclipse高效开发插件汇总
- 寻找链表中间节点—一种高效的算法
- 【eclipse插件开发实战】 Eclipse插件开发5——时间插件Timer开发实例详解
- 【eclipse插件开发实战】 Eclipse插件开发6——eclipse在线翻译插件Translator开发实例详解
- Xcode高效开发 ——快捷键
- 前端开发:模块化 — 高效重构
- 前端开发:模块化 — 高效重构
- DOM对象—节点的详解(一)
- Eclipse进行C/C++开发——Eclipse+CDT+MinGW的配置与使用详解
- Eclipse搭建C语言开发环境——Eclipse+CDT+MinGW的配置与使用详解
- Eclipse高效开发必会12个小技巧
- android 动画系列:插值器-Interpolator
- OpenGL 实例化 初探 之 非实例化绘制行星带
- spring boot 配置文件后缀的一个坑
- C++的继承,多继承,虚继承的对象分布的总结
- Azkaban文档
- 【eclipse高效开发】——ASTView节点详解
- Android中的Material design animation
- python中的切片和join的妙用
- python检索特定内容的文本文件2
- php语法基础(二)- get和post请求
- PHP-Function
- dss源码分析1:OSMutex
- 【Android】AndroidStudio巧用Volley让ListView异步加载图片
- spring整合quartz实现动态定时任务的前台网页配置与管理