Добавление элемента в AST в определенной позиции с Eclipse AST - PullRequest
1 голос
/ 30 января 2012

Обновление 2: еще раз спасибо @ deepak-azad, мне удалось решить мою проблему: вот ссылка на основной код: https://gist.github.com/1714641

Обновление: спасибо @ deepak-azadЯ дополнил код, но все еще не работает.

Я пытаюсь обработать исходный файл в Java, используя EclipseJDT.Моя главная цель - написать выражение "x ();"ниже каждого объявления переменной.

например: От этого:

int a = 10;

до этого:

int a = 10;
method();

Я смог создать ast и создал класс thaРасширьте метод посещения, чтобы получить все объявления переменных внутри кода:

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jdt.core.dom.ASTVisitor;
import org.eclipse.jdt.core.dom.VariableDeclarationStatement;

public class VDS extends ASTVisitor {
List<VariableDeclarationStatement> vds = new ArrayList<VariableDeclarationStatement>();

    @Override
    public boolean visit(VariableDeclarationStatement node) {
        vds.add(node);
        return super.visit(node);
    }   

    public List<VariableDeclarationStatement> getVDS() {
        return vds;
    }
}

Я проверил его, и он отлично работает при захвате каждой переменной, но не при вставке нового узла, используя что-то вроде этого:

VDS vds = new VDS();
unit2.accept(vds); // unit2 is the compilation unit
System.out.println("Variables :" + vds.getVDS().size());

for(VariableDeclarationStatement vds_p : vds.getVDS()){
    System.out.println(vds_p.toString()) 

    List<Statement> a = ((Block) vds_.getParent()).statements();
     a.add(e);//e is the artificial statement 

        ListRewrite lrw = astRewrite.getListRewrite(vds_p.getParent().BLock.STATEMENTS_PROPERTY);
lrw.insertAfter(e,vds_p,null);

    }

И код для записи: (эта часть работает, я тестировал с произвольной аннотацией)

IDocument document2;
ITextFileBufferManager bufferManager = FileBuffers.getTextFileBufferManager(); // get the buffer manager
IPath path = unit2.getJavaElement().getPath(); // unit: instance of CompilationUnit
try {
    bufferManager.connect(path, null); 
    ITextFileBuffer textFileBuffer = bufferManager.getTextFileBuffer(path);
    // retrieve the buffer
    document2 = textFileBuffer.getDocument(); 
    textFileBuffer.commit(null /* ProgressMonitor */, false /* Overwrite */); 

} finally{ bufferManager.disconnect(path, null);}
TextEdit edits = unit2.rewrite(document2, null);
edits.apply(document2);
write2File(document2);  

Я немного запутался, как работает иерархия, и япришла идея, основанная на том факте, что каждый оператор переменной принадлежит блоку, а каждый блок принадлежит методу, но все еще не знает, как справиться с этим в элементе ListRewrite.

Я читал об ast в затмении, но все вопросы связаны с созданием кода, но не с процессом редактирования.

Когда я выполняю это, я получаю исключение недопустимого аргумента, такое какэто:

java.lang.IllegalArgumentException
    at org.eclipse.jdt.core.dom.ASTNode.checkNewChild(ASTNode.java:1905)
    at org.eclipse.jdt.core.dom.ASTNode$NodeList.add(ASTNode.java:1269)
    at java.util.AbstractList.add(AbstractList.java:91)
    at plugin.astsimple.handlers.SampleHandler.execute(SampleHandler.java:109)
    at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:293)
    at org.eclipse.core.commands.Command.executeWithChecks(Command.java:476)
        ...

где строка 109 моего кода - это та, которая добавляет e к

a.add(e);

Спасибо!

Ответы [ 2 ]

1 голос
/ 30 января 2012

Каждый «Блок» состоит из «списка» операторов, поэтому вам необходимо использовать «org.eclipse.jdt.core.dom.rewrite.ListRewrite.insertAfter (ASTNode, ASTNode, TextEditGroup)».Вы можете посмотреть примеры использования этого метода в плагине org.eclipse.jdt.ui.

0 голосов
/ 31 января 2012

Чтобы лучше понять, как работает иерархия в AST, вы должны использовать плагин представления AST - http://www.eclipse.org/jdt/ui/astview/index.php

...