Как создать FieldDeclaration с использованием IField (плагин Eclipe) - PullRequest
1 голос
/ 15 ноября 2010

Учитывая, что у меня есть доступ к полю IField (проанализированному из другого файла Java), как мне создать FieldDeclaration, чтобы добавить его в AST?

    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));

Выше

Тип fieldType = ast.newSimpleType (ast.newSimpleName (typeName));

работает только в том случае, если typeName не является ключевым словом java. Есть ли другой способ просто создать fieldDeclaration со всей информацией IField (модификатор, тип, переменная)

Спасибо

Ответы [ 2 ]

1 голос
/ 16 ноября 2010

Я нашел способ, используя copySubtree:

    AST ast = targetCompilationUnit.getAST();

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

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

Тогда newType можно использовать для подключения его к FieldDeclaration

0 голосов
/ 16 ноября 2010

вы можете сделать что-то вроде этого:

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));

и если вы хотите его инициализировать:

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);
...