BodyDeclaration和VariableDeclaration

 

概述: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里面的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值