2010-11-15 13 views
1

Étant donné que j'ai accès à un champ IField (analysé à partir d'un autre fichier Java), comment puis-je créer un FieldDeclaration pour l'ajouter à un AST?Comment créer une déclaration FieldDeclaration avec un IField (plugin Eclipe)

String varName = field.getElementName(); 
    String typeName = Signature.toString(field.getTypeSignature()); 

    VariableDeclarationFragment fieldFrag = ast.newVariableDeclarationFragment(); 
    fieldFrag.setName(ast.newSimpleName(varName)); 
    FieldDeclaration field = ast.newFieldDeclaration(fieldFrag); 
    Type fieldType = ast.newSimpleType(ast.newSimpleName(typeName)); 
    field.setType(fieldType); 
    field.modifiers().add(ast.newModifier(modifierKeyword)); 

ci-dessus

type fieldType = ast.newSimpleType (ast.newSimpleName (typeName)); Ne fonctionne que si typeName n'est pas un mot-clé Java. Y at-il une autre façon de créer simplement une fieldDeclaration avec toutes les informations Ifield (modificateur, type, variable)

Merci

Répondre

1

J'ai trouvé un moyen utilisant copySubtree:

AST ast = targetCompilationUnit.getAST(); 

    FieldDeclaration oldFieldDeclaration = ASTNodeSearchUtil.getFieldDeclarationNode(field, sourceCompilationUnit); 
    Type oldType = oldFieldDeclaration.getType(); 

    Type newType = (Type) ASTNode.copySubtree(ast, oldType); 

Alors newType peut être utilisé pour brancher un que vous pouvez faire quelque chose comme FieldDeclaration

0

ceci:

VariableDeclarationFragment fragment = ast.newVariableDeclarationFragment(); 
fragment.setName(ast.newSimpleName("log")); 
final FieldDeclaration declaration = ast.newFieldDeclaration(fragment); 
declaration.setType(ast.newSimpleType(ast.newName("Logger"))); 
declaration.modifiers().addAll(ASTNodeFactory.newModifiers(ast, Modifier.PRIVATE | Modifier.STATIC | Modifier.FINAL)); 

et si vous voulez l'init:

MethodInvocation methodInvocation = ast.newMethodInvocation(); 
methodInvocation.setName(ast.newSimpleName("getLogger")); 
methodInvocation.setExpression(ast.newSimpleName("Logger")); 
TypeLiteral typeLiteral = ast.newTypeLiteral(); 
typeLiteral.setType(ast.newSimpleType(ast.newName(className))); 
methodInvocation.arguments().add(typeLiteral); 
fragment.setInitializer(methodInvocation); 
+0

Je ne pense pas que cela fonctionnera lorsque le SimpleType est une primitive – javacoder