`

常见的ASTNode

    博客分类:
  • JET
 
阅读更多

概述:ASTNode就是AST的描述节点,想很娴熟的生成出java文件,必须得此套节点有所了解

 

ASTNode:所有AST节点的父类

 

static Class nodeClassForType(int nodeType):静态方法,通过类型type获取到对应的class对象

 

checkNewChild(ASTNode node, ASTNode newChild,boolean cycleCheck, Class nodeType):检查传入的孩子。

 

 

boolean subtreeMatch(ASTMatcher matcher, Object other):比较两个节点的子是否向匹配,ASTMatcher 可以通过节点获取

 

ASTNode copySubtree(AST target, ASTNode node):拷贝节点

 

 

ASTNode 的子节点:

ASTNode 有几个抽象节点,它们不具体描述,但是却对节点的类型进行了很好的分组

 

抽象类:

Comment:所有跟注释相关的节点的父类,它里面有三个状态属性,isBlockComment,isLineComment和isDocComment来描述是什么类型的注释。这些跟它的子类也是一一对应的。

 

 

Comment:
     LineComment
     BlockComment
     Javadoc

 

Comment的三个子类:都只是起到描述的作用,并不实质包含内容。LineComment就是表示单行注释"//",BlockComment表示的是一个注释区域"/*  */",不过Javadoc是有内容的,TagElement就是具体的内容

 

Javadoc:
   /**  { TagElement } */

 

 

BodyDeclaration:在body里面定义了javadoc和IExtendedModifier两个子节点,所以它的所以子类都具备描述Modifier的特性。

 

 

 BodyDeclaration:
		ClassDeclaration
		InterfaceDeclaration
		EnumDeclaration
		MethodDeclaration
 		ConstructorDeclaration
 		FieldDeclaration
 		Initializer
		EnumConstantDeclaration
		AnnotationTypeDeclaration
		AnnotationTypeMemberDeclaration

 

[Javadoc] { ExtendedModifier } XXXX
 

 

Expression:所有具有表达式特性的节点的父类,

 

 

Expression:
    Annotation,
    ArrayAccess,
    ArrayCreation,
    ArrayInitializer,
    Assignment,
    BooleanLiteral,
    CastExpression,
    CharacterLiteral,
    ClassInstanceCreation,
    ConditionalExpression,
    FieldAccess,
    InfixExpression,
    InstanceofExpression,
    MethodInvocation,
    Name,
    NullLiteral,
    NumberLiteral,
    ParenthesizedExpression,
    PostfixExpression,
    PrefixExpression,
    StringLiteral,
    SuperFieldAccess,
    SuperMethodInvocation,
    ThisExpression,
    TypeLiteral,
    VariableDeclarationExpression
 

 

Statement:表示一个代码片段,此父类的大部分方法都过时了

 

 Statement:
    AssertStatement,
    Block,
    BreakStatement,
    ConstructorInvocation,
    ContinueStatement,
    DoStatement,
    EmptyStatement,
    ExpressionStatement,
    ForStatement,
    IfStatement,
    LabeledStatement,
    ReturnStatement,
    SuperConstructorInvocation,
    SwitchCase,
    SwitchStatement,
    SynchronizedStatement,
    ThrowStatement,
    TryStatement,
    TypeDeclarationStatement,
    VariableDeclarationStatement,
    WhileStatement
 

Type:所有描述类型的节点的父类,它里面就提供了一些判断节点类型的方法,isXXX()

 

 Type:
    PrimitiveType
    ArrayType
    SimpleType
    QualifiedType
    ParameterizedType
    WildcardType
 PrimitiveType:
    byte
    short
    char
    int
    long
    float
    double
    boolean
    void
 ArrayType:
    Type [ ]
 SimpleType:
    TypeName
 ParameterizedType:
    Type < Type { , Type } >
 QualifiedType:
    Type . SimpleName
 WildcardType:
    ? [ ( extends | super) Type ]

 

 VariableDeclaration:它的两个子类SingleVariableDeclaration是定义一个变量,并且可以初始化。VariableDeclarationFragment是为已有的类型进行赋值。

 

 VariableDeclaration:
    SingleVariableDeclaration
    VariableDeclarationFragment

 

 

实体类:这些实体类都是直接继承ASTNode的

CompilationUnit:一个编辑单元包含PackageDeclaration,ImportDeclaration和TypeDeclaration(包,引入和类体

 

 

CompilationUnit:
    [ PackageDeclaration ]
        { ImportDeclaration }
        { TypeDeclaration | EnumDeclaration | AnnotationTypeDeclaration | ; }

 

 对于单数子节点用[]修饰,复数子节点用{}描述。单数子节点是用ChildPropertyDescriptor对象存储的,复数节点用ChildListPropertyDescriptor存储。

recordModifications():记录修改痕迹的一个方法,在你要对该编辑单元做任何更改之前,调用此方法开始进行记录。

TextEdit rewrite(IDocument document, Map options):用于把编辑单元的内容写入到文件中。

unit添加三中子元素的方式:

 

 

PackageDeclaration packageDeclaration = ast.newPackageDeclaration();
        unit.setPackage(packageDeclaration);
        packageDeclaration.setName(ast.newSimpleName("astdemo"));
        for (int i = 0; i < IMPORTS.length; ++i)
        {
            ImportDeclaration importDeclaration = ast.newImportDeclaration();
            importDeclaration.setName(ast.newName(getSimpleNames(IMPORTS[i])));
            if (IMPORTS[i].indexOf("*") > 0)
                importDeclaration.setOnDemand(true);
            else
                importDeclaration.setOnDemand(false);

            unit.imports().add(importDeclaration);
        }

        //类名
        TypeDeclaration classType = ast.newTypeDeclaration();
        classType.setInterface(false);
        List classTypeModifier = classType.modifiers();
        classTypeModifier.add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));
        classType.setName(ast.newSimpleName("MyFirstApp"));
        classType.setSuperclassType(ast.newSimpleType(ast.newSimpleName("ApplicationWindow")));
        unit.types().add(classType);

 

 从上面代码可以看出,astnode节点在添加单数类型的子节点的时候,用的是set,在添加复数类型的子节点的时候,用的是list的add方法。

 

PackageDeclaration:包描述节点,如下所示Package有三个子节点:Javadoc,Annotation和Name

 

 

PackageDeclaration:
    [ Javadoc ] { Annotation } package Name ;

 

 

 

PackageDeclaration packageDeclaration = ast.newPackageDeclaration();
        unit.setPackage(packageDeclaration);
        packageDeclaration.setName(ast.newSimpleName("astdemo"));
        packageDeclaration.setJavadoc(null);
        packageDeclaration.annotations();

 

 

 

ImportDeclaration:import 有两种简单属性和一个子节点 static和. *状态,Name子节点。

注意在AST中是用SimplePropertyDescriptor存放简单属性的。

 

 

ImportDeclaration:
    import [ static ] Name [ . * ] ;

for (int i = 0; i < IMPORTS.length; ++i)
        {
            ImportDeclaration importDeclaration = ast.newImportDeclaration();
            importDeclaration.setName(ast.newName(getSimpleNames(IMPORTS[i])));
            if (IMPORTS[i].indexOf("*") > 0)
                importDeclaration.setOnDemand(true);
            else
                importDeclaration.setOnDemand(false);
            importDeclaration.setStatic(true);
            unit.imports().add(importDeclaration);
        }
 

Modifier:描述关键字的,它里面有一个静态的内部类,用于描述这些关键字ModifierKeyword

Modifier:
    public
    protected
    private
    static
    abstract
    final
    native
    synchronized
    transient
    volatile
    strictfp
 
TagElement:这个节点是配合Comment一起使用的,Comment描述的是那种类型的注释,而TagElement是注释的具体内容,一个TagElement是包含多种元素的“@Identifier ”就是我们在注释中看到的那个啥。在TagElement里面也定义了很多这种注解符号,可以直接使用。

TagElement:
     [ @ Identifier ] { DocElement }
 DocElement:
     TextElement
     Name
     MethodRef
     MemberRef
     { TagElement }
 
TextElement:跟TagElement用法类似只是存放的是纯文本内容。



 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics