读书人

BodyDeclaration跟VariableDeclaration

发布时间: 2012-06-30 17:20:12 作者: rapoo

BodyDeclaration和VariableDeclaration

?

概述:BodyDeclaration 和?VariableDeclarationBodyDeclaration(体的声明)为啥叫体的声明,是因为它只描述体的特征,而不描述体里面的内容,体里面的内容由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里面的

读书人网 >开源软件

热点推荐