2014-02-25 44 views
1

藉助SO和一些文檔,我能夠快速組裝下面的代碼來生成Java源代碼。但現在我堅持嘗試添加聲明語句。我只是想創建一個看起來像下面JDT AST,如何生成聲明

Connection con = null; 
try{ 
    con = DataSource.getConnection();  
}catch(Exception ex){ 
    ex.printStackTrace(); 
} 

我被困語句的第一個最簡單形式的聲明,'VariableDeclarationStatement」 這是我迄今爲止,但不知道怎麼用variableDeclarationFragment或variableDeclarationExpression 。

public static void main(String[] args) { 

     CompilationUnit unit = ast.newCompilationUnit(); 
     PackageDeclaration packageDeclaration = ast.newPackageDeclaration(); 
     packageDeclaration.setName(ast.newSimpleName("example")); 
     unit.setPackage(packageDeclaration); 
     ImportDeclaration importDeclaration = ast.newImportDeclaration(); 
     QualifiedName name = ast.newQualifiedName(ast.newSimpleName("java"), ast.newSimpleName("util")); 
     importDeclaration.setName(name); 
     importDeclaration.setOnDemand(true); 
     unit.imports().add(importDeclaration); 
     TypeDeclaration type = ast.newTypeDeclaration(); 
     type.setInterface(false); 
     type.modifiers().add(ast.newModifier(Modifier.ModifierKeyword.PUBLIC_KEYWORD)); 
     type.setName(ast.newSimpleName("HelloWorld")); 
     MethodDeclaration createMethod = createMethod("helloWorld", new HashMap<String, String>()); 
     Block block = ast.newBlock(); 
     //VariableDeclarationFragment variableDeclarationFragment = ast.newVariableDeclarationFragment(); 
     //variableDeclarationFragment. 
     //block.statements().add(ast.newVariableDeclarationExpression((getConnectionDeclaration())); 
     //VariableDeclarationExpression variableDeclarationExpression = ast.newVariableDeclarationExpression(ast.newVariableDeclarationFragment()); 
     //block. 
     //variableDeclarationExpression. 
     createMethod.setBody(block); 
     type.bodyDeclarations().add(createMethod); 
     unit.types().add(type); 
     System.out.println(unit); 
    } 
+0

這是基於過程的AST系統的缺陷。構建AST(以及難以實現的輔助功能)確實是一種痛苦(而且很脆弱:ADT的下一個版本可能會破壞您的代碼)。程序轉換引擎提供了一種替代方法:您可以使用* source *形式編寫代碼片段,幾乎完全如您在「看起來像下面的內容」中所表達的那樣。見http://en.wikipedia.org/wiki/Program_transformation –

回答

0

Eclipse ASTView是查看語言樹如何設置的好工具。當我需要創建一些代碼時,我先編寫代碼,然後在ASTView中查看它。 Thuis是我與開普勒一起使用的更新站點:http://www.eclipse.org/jdt/ui/update-site

我最近做了一件與您的案例非常相似的事情。這裏是稍微修改的代碼,這應該是填充HelloWord.helloWord方法的一個很好的例子。

private Block createStatements(AST ast) { 
    Block result = ast.newBlock(); 

    VariableDeclarationStatement conDeclStmt = createVariableDeclarationStatement(ast); 
    result.statements().add(conDeclStmt); 
    TryStatement tryStmt = createTryStatement(ast); 
    result.statements().add(tryStmt); 

    return result; 
} 

private VariableDeclarationStatement createVariableDeclarationStatement(AST ast) { 
    VariableDeclarationFragment fragment = ast.newVariableDeclarationFragment(); 
    fragment.setName(ast.newSimpleName("con")); 
    fragment.setInitializer(ast.newNullLiteral()); 
    VariableDeclarationStatement result = ast.newVariableDeclarationStatement(fragment); 
    return result; 
} 

private TryStatement createTryStatement(AST ast) { 
    TryStatement result = ast.newTryStatement(); 

    Block body = ast.newBlock(); 
    ExpressionStatement assignment = createAssignmentStatement(ast); 
    body.statements().add(assignment); 
    result.setBody(body); 

    CatchClause catchClause = createCatchClause(ast); 
    result.catchClauses().add(catchClause); 

    return result; 
} 

private ExpressionStatement createAssignmentStatement(AST ast) { 
    MethodInvocation invocation = ast.newMethodInvocation(); 
    invocation.setExpression(ast.newSimpleName("DataSource")); 
    invocation.setName(ast.newSimpleName("getConnection")); 

    Assignment assignment = ast.newAssignment(); 
    assignment.setLeftHandSide(ast.newSimpleName("con")); 
    assignment.setOperator(Operator.ASSIGN); 
    assignment.setRightHandSide(invocation); 
    return ast.newExpressionStatement(assignment); 
} 

private CatchClause createCatchClause(AST ast) { 
    CatchClause result = ast.newCatchClause(); 

    SingleVariableDeclaration exDecl = ast.newSingleVariableDeclaration(); 
    exDecl.setType(ast.newSimpleType(ast.newSimpleName("Exception"))); 
    exDecl.setName(ast.newSimpleName("ex")); 
    result.setException(exDecl); 

    Block body = ast.newBlock(); 
    ... 

    return result; 
}