posts - 1,  comments - 25,  trackbacks - 0

JDT实际上是将Java代码构建成一个基于DOM结构的抽象语法树AST(Abstract Syntax Tree )。代码中的每个部分都对应一个ASTNode,许多的ASTNode就构成了这个抽象的语法树。Java Class一般对应Compilation Unit node,该节点也是AST树上的顶点。创建一个AST如下:

java 代码
  1. ASTParser parser = ASTParser.newParser(AST.JLS3);   
  2. parser.setSource("".toCharArray());   
  3. CompilationUnit unit = (CompilationUnit) parser.createAST(null);    
  4. unit.recordModifications();   
  5. AST ast = unit.getAST();   

其中createAST,当parse需要较长时间时,可以采用createAST(new NullProgressMonitor()),否则直接传null即可。

recordModifications()用于记录节点的变动,比如修改、删除等,当需要对AST树进行变动操作时,必须要预先调用这个方法。


比较重要的是:一个AST树上的所有节点必须都属于该AST。不允许直接将其他AST树上的节点添加该AST树上。否则会抛出java.lang.IllegalArgumentException异常。须使用ASTNode.copySubtree(AST target, ASTNode node)返回一个目标树的深度拷贝,才能进行添加操作。例如:

java 代码
  1. ASTParser parser = ASTParser.newParser(AST.JLS3);   
  2. parser.setSource("".toCharArray());   
  3. CompilationUnit targetRoot= (CompilationUnit) parser.createAST(null);    
  4. targetRoot.recordModifications();   
  5. parser.setSource("class T{}”".toCharArray());   
  6. CompilationUnit srcRoot= (CompilationUnit) parser.createAST(null);    
  7.   
  8. //这是非法操作,两者的AST源不一样   
  9. targetRoot.types().add(srcRoot.types().get(0));   
  10.   
  11. //这是合法操作   
  12. targetRoot.types().add(ASTNode.copySubtree(   
  13. targetRoot.getAST(), (ASTNode) srcRoot.types().get(0)));   
  14.   
  15. //这是合法操作   
  16. targetRoot.types().add(targetRoot.getAST().newTypeDeclaration());  


 

现把一些 Java代码生成对应的ASTNode方式列出来,供参考:

List 1 生成Package
// package astexplorer;
java 代码
 
  1. PackageDeclaration packageDeclaration = ast.newPackageDeclaration();  
  2. unit.setPackage(packageDeclaration);  
  3. packageDeclaration.setName(ast.newSimpleName("astexplorer")); 
List 2 生成Import
// import org.eclipse.swt.SWT;
// import org.eclipse.swt.events.*;
// import org.eclipse.swt.graphics.*;
// import org.eclipse.swt.layout.*;
// import org.eclipse.swt.widgets.*;
java 代码
 
  1. for (int i = 0; i < IMPORTS.length; ++i) {  
  2. ImportDeclaration importDeclaration = ast.newImportDeclaration();  
  3. importDeclaration.setName(ast.newName(getSimpleNames(IMPORTS[i])));  
  4. if (IMPORTS[i].indexOf("*") > 0)  
  5. importDeclaration.setOnDemand(true);  
  6. else  
  7. importDeclaration.setOnDemand(false);  
  8.   
  9. unit.imports().add(importDeclaration);  
  10. }  
List 3 生成Class Declaration
// public class SampleComposite extends Composite 
java 代码
 
  1. TypeDeclaration classType = ast.newTypeDeclaration();  
  2. classType.setInterface(false);  
  3. classType.setModifiers(Modifier.PUBLIC);  
  4. classType.setName(ast.newSimpleName("SampleComposite"));  
  5. classType.setSuperclass(ast.newSimpleName("Composite"));  
  6. unit.types().add(classType);  


List 4 生成Constructor Declaration

// public SampleComposite(Composite parent,int style){}
java 代码
 
  1. MethodDeclaration methodConstructor = ast.newMethodDeclaration();  
  2. methodConstructor.setConstructor(true);  
  3. methodConstructor.setModifiers(Modifier.PUBLIC);  
  4. methodConstructor.setName(ast.newSimpleName("SampleComposite"));  
  5. classType.bodyDeclarations().add(methodConstructor);  
  6.   
  7. // constructor parameters  
  8.   
  9. SingleVariableDeclaration variableDeclaration = ast.newSingleVariableDeclaration();  
  10. variableDeclaration.setModifiers(Modifier.NONE);  
  11. variableDeclaration.setType(ast.newSimpleType(ast.newSimpleName("Composite")));  
  12. variableDeclaration.setName(ast.newSimpleName("parent"));  
  13. methodConstructor.parameters().add(variableDeclaration);  
  14.   
  15. variableDeclaration = ast.newSingleVariableDeclaration();  
  16. variableDeclaration.setModifiers(Modifier.NONE);  
  17. variableDeclaration.setType(ast.newPrimitiveType(PrimitiveType.INT));  
  18. variableDeclaration.setName(ast.newSimpleName("style"));  
  19. methodConstructor.parameters().add(variableDeclaration);  
  20. Block constructorBlock = ast.newBlock();  
  21. methodConstructor.setBody(constructorBlock);
 List 5 生成Spuer Invocation

// super(parent,style)
java 代码
 
  1. SuperConstructorInvocation superConstructorInvocation = ast.newSuperConstructorInvocation();  
  2. constructorBlock.statements().add(superConstructorInvocation);  
  3. Expression exp = ast.newSimpleName("parent");  
  4. superConstructorInvocation.arguments().add(exp);  
  5. superConstructorInvocation.arguments().add(ast.newSimpleName("style"));  

List 6 生成ClassInstanceCreation

// GridLayout gridLayout = new GridLayout();
java 代码
 
  1. VariableDeclarationFragment vdf = ast.newVariableDeclarationFragment();  
  2. vdf.setName(ast.newSimpleName("gridLayout"));  
  3. ClassInstanceCreation cc = ast.newClassInstanceCreation();  
  4. cc.setName(ast.newSimpleName("GridLayout"));  
  5. vdf.setInitializer(cc);  
  6. VariableDeclarationStatement vds = ast.newVariableDeclarationStatement(vdf);  
  7. vds.setType(ast.newSimpleType(ast.newSimpleName("GridLayout"))); 
  8. constructBlock.statements().add(vds);

// Label label = new Label(this,SWT.NONE);
java 代码
 
  1. VariableDeclarationFragment vdf = ast.newVariableDeclarationFragment();  
  2. vdf.setName(ast.newSimpleName("label"));  
  3. cc = ast.newClassInstanceCreation();  
  4. cc.setName(ast.newSimpleName("Label"));  
  5. cc.arguments().add(ast.newThisExpression());  
  6. cc.arguments().add(ast.newName(getSimpleNames("SWT.NONE")));  
  7. vdf.setInitializer(cc); 
  8. VariableDeclarationStatement vds = ast.newVariableDeclarationStatement(vdf);  
  9. vds.setType(ast.newSimpleType(ast.newSimpleName("Label")));
  10. constructBlock.statements().add(vds);

List 7生成MethodInvocation

// setLayout(gridLayout);
java 代码
 
  1. MethodInvocation mi = ast.newMethodInvocation();  
  2. mi.setName(ast.newSimpleName("setLayout"));  
  3. mi.arguments().add(ast.newSimpleName("gridLayout")); 
  4. constructorBlock.statements().add(ast.newExpressionStatement(mi));
// label.setText("Press the button to close:");
         java 代码
  1. mi = ast.newMethodInvocation();   
  2. mi.setExpression(ast.newSimpleName("label"));   
  3. mi.setName(ast.newSimpleName("setText"));   
  4. StringLiteral sl = ast.newStringLiteral();   
  5. sl.setLiteralValue("Press the button to close:");   
  6. mi.arguments().add(sl);   
  7. constructorBlock.statements().add(ast.newExpressionStatement(mi));  
// label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_CENTER));
           java 代码
  1. mi = ast.newMethodInvocation();   
  2. mi.setExpression(ast.newSimpleName("label"));   
  3. mi.setName(ast.newSimpleName("setLayoutData"));   
  4.   
  5. cc = ast.newClassInstanceCreation();   
  6. cc.setName(ast.newSimpleName("GridData"));   
  7. cc.arguments().add(ast.newName(getSimpleNames("GridData.HORIZONTAL_ALIGN_CENTER")));   
  8. mi.arguments().add(cc);   
  9. constructorBlock.statements().add(ast.newExpressionStatement(mi));  

 // Button button = new Button(this,SWT.PUSH);

java 代码
  1. vdf = ast.newVariableDeclarationFragment();   
  2. vdf.setName(ast.newSimpleName("button"));   
  3. vds = ast.newVariableDeclarationStatement(vdf);   
  4. vds.setType(ast.newSimpleType(ast.newSimpleName("Button")));   
  5. constructorBlock.statements().add(vds);   
  6.   
  7. cc = ast.newClassInstanceCreation();   
  8. cc.setName(ast.newSimpleName("Button"));   
  9. vdf.setInitializer(cc);   
  10. cc.arguments().add(ast.newThisExpression());   
  11. cc.arguments().add(ast.newName(getSimpleNames("SWT.PUSH")));  

// button.addSelectionListener(new SelectionAdapter() {});

    java 代码

  1. mi = ast.newMethodInvocation();   
  2. constructorBlock.statements().add(ast.newExpressionStatement(mi));   
  3. mi.setExpression(ast.newSimpleName("button"));   
  4. mi.setName(ast.newSimpleName("addSelectionListener"));   
  5.   
  6. ClassInstanceCreation ci = ast.newClassInstanceCreation();   
  7. ci.setName(ast.newSimpleName("SelectionAdapter"));   
  8. mi.arguments().add(ci);   
  9. AnonymousClassDeclaration cd = ast.newAnonymousClassDeclaration();   
  10. ci.setAnonymousClassDeclaration(cd); 






















// public void setup(){super.setUp()}
      1. MethodDeclaration methodConstructor = ast.newMethodDeclaration();
                methodConstructor.modifiers().add(
                        ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));
                methodConstructor.setName(ast.newSimpleName("setUp"));
  1.         Block constructorBlock = ast.newBlock();
            methodConstructor.setBody(constructorBlock);
  2.         SuperMethodInvocation smi = ast.newSuperMethodInvocation();
            smi.setName(ast.newSimpleName("setUp"));
            ExpressionStatement es = ast.newExpressionStatement(smi);
            constructorBlock.statements().add(es);
  3.         // set exception
            List targetExNames = methodConstructor.thrownExceptions();
            Name targetExName = ast.newName(Exception.class.getName());
            targetExNames.add(targetExName);
  4.         methodConstructor.setJavadoc(JavaDocHelper.getJavaDoc(ast,
                    JavaDocHelper.setUpDoc, null, null));
            classType.bodyDeclarations().add(methodConstructor);
posted on 2008-07-14 13:21 Daniel 阅读(308) 评论(0)  编辑  收藏 所属分类: Eclipse的相关

只有注册用户登录后才能发表评论。


网站导航:
 
<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿(3)

随笔档案

文章分类

文章档案

相册

搜索

  •  

最新评论