BodyDeclaration和VariableDeclaration
?
概述:BodyDeclaration 和?VariableDeclarationBodyDeclaration(体的声明)为啥叫体的声明,是因为它只描述体的特征,而不描述体里面的内容,体里面的内容由Statement以及其子类提供。所以最典型的一个BodyDeclaration的节点是没有“{}”这个的,每个BodyDeclaration都会告诉你,如果你没有子节点,那么你后面是不会接一对“{}”这个的VariableDeclaration是针对变量进行声明,为啥这两个抽象类不合并为一个,没想明白。还有一个没有想明白的是FieldDeclaration继承的是BodyDeclaration。其实声明的结构都比较类似。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 | ; } ] }? 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里面的