概述:BodyDeclaration 和 VariableDeclaration
BodyDeclaration(体的声明)为啥叫体的声明,是因为它只描述体的特征,而不描述体里面的内容,体里面的内容由Statement以及其子类提供。所以最典型的一个BodyDeclaration的节点是没有“{}”这个的,每个BodyDeclaration都会告诉你,如果你没有子节点,那么你后面是不会接一对“{}”这个的
VariableDeclaration是针对变量进行声明,为啥这两个抽象类不合并为一个,没想明白。还有一个没有想明白的是FieldDeclaration继承的是BodyDeclaration。其实声明的结构都比较类似。
1.常用BodyDeclaration节点
TypeDeclaration:描述一个类型的声明,它又分为
ClassDeclaration类的声明和
InterfaceDeclaration接口的声明,
这两种声明是用一个属性来进行区分的isInterface。
ClassDeclaration:
[ Javadoc ] { Modifier } class Identifier
[ extends Type]
[ implements Type { , Type } ]
{ { ClassBodyDeclaration | ; } }
InterfaceDeclaration:
[ Javadoc ] { ExtendedModifier } interface Identifier
[ < TypeParameter { , TypeParameter } > ]
[ extends Type { , Type } ]
{ { InterfaceBodyDeclaration | ; } }
有一些比较混乱的ast把早期版本跟后期版本的一些方法放在一起,所以有时会不知道用那个方法。下面列出一个JLS3版的例子
//类名
TypeDeclaration classType = ast.newTypeDeclaration();
classType.setInterface(false);
//添加modifiers
classType.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));
//添加类名
classType.setName(ast.newSimpleName("MyFirstApp"));
//添加父类
classType.setSuperclassType(ast.newSimpleType(ast.newSimpleName("ApplicationWindow")));
//添加实现的接口
classType.superInterfaceTypes().add(null);
//这个是接口才有的“<super,super>”
classType.typeParameters().add(null);
//加类体的声明
classType.bodyDeclarations().add(null);
unit.types().add(classType);
FieldDeclaration:字段声明的节点类型,一个字段声明包含一个
Type 类型和多个
VariableDeclarationFragment
属性
声明片段,
这个片段包含变量名和初始值。
FieldDeclaration:
[Javadoc] { ExtendedModifier } Type VariableDeclarationFragment
{ , VariableDeclarationFragment } ;
VariableDeclarationFragment vdf = ast.newVariableDeclarationFragment();
//属性名
vdf.setName(ast.newSimpleName("sss"));
//初始值
vdf.setInitializer(ast.newBooleanLiteral(true));
FieldDeclaration fieldDeclaration = ast.newFieldDeclaration(vdf);
fieldDeclaration.fragments().add(null);
fieldDeclaration.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));
//属性类型
fieldDeclaration.setType(ast.newSimpleType(ast.newName("XXX")));
//这里有个问题就是顺序问题,属性如果加在后面会显示在方法的后面
classType.bodyDeclarations().add(fieldDeclaration);
Initializer:静态代码块
Initializer:
[ static ] Block
//静态代码块
Initializer initializer = ast.newInitializer();
//加modifiers
initializer.modifiers().add(null);
//加内容
initializer.setBody(null);
classType.bodyDeclarations().add(initializer);
MethodDeclaration:有两种,一种是常见的方法,一种是构造。方法的结构比较复杂,这里就不举例子了,跟上面的写法是类似的,只是要区分有些方法是有版本限制的。
MethodDeclaration:
[ Javadoc ] { ExtendedModifier }
[ < TypeParameter { , TypeParameter } > ]
( Type | void ) Identifier (
[ FormalParameter
{ , FormalParameter } ] ) {[ ] }
[ throws TypeName { , TypeName } ] ( Block | ; )
ConstructorDeclaration:
[ Javadoc ] { ExtendedModifier }
[ < TypeParameter { , TypeParameter } > ]
Identifier (
[ FormalParameter
{ , FormalParameter } ] )
[throws TypeName { , TypeName } ] Block
EnumDeclaration:枚举的声明节点,这个我暂时用不到,这里只是发出它的结构出来
EnumDeclaration:
[ Javadoc ] { ExtendedModifier } enum Identifier
[ implements Type { , Type } ]
{
[ EnumConstantDeclaration { , EnumConstantDeclaration } ] [ , ]
[ ; { ClassBodyDeclaration | ; } ]
}
2.继承VariableDeclaration的节点:SingleVariableDeclaration和VariableDeclarationFragment
SingleVariableDeclaration:有
ExtendedModifier 和
Type 的声明
SingleVariableDeclaration:
{ ExtendedModifier } Type [ ... ] Identifier { [] } [ = Expression ]
VariableDeclarationFragment:
“
{ [] }”数组用的,
[ = Expression ]
VariableDeclarationFragment:
Identifier { [] } [ = Expression ]
// Composite container = new Composite(parent, SWT.NONE);
VariableDeclarationFragment variableFragment = ast.newVariableDeclarationFragment();
variableFragment.setName(ast.newSimpleName("container"));
VariableDeclarationStatement variableStatement = ast.newVariableDeclarationStatement(variableFragment);
variableStatement.setType(ast.newSimpleType(ast.newSimpleName("Composite")));
ClassInstanceCreation classCreation = ast.newClassInstanceCreation();
classCreation.setType(ast.newSimpleType(ast.newSimpleName("Composite")));
variableFragment.setInitializer(classCreation);
methodBlock.statements().add(variableStatement);
classCreation.arguments().add(ast.newSimpleName("parent"));
classCreation.arguments().add(ast.newName(getSimpleNames("SWT.NONE")));
需要注意的是VariableDeclaration一般都是用在Statement里面的