Update 2: еще раз спасибо @ Дипак-Азад, мне удалось решить мою проблему: вот ссылка на основной код: https://gist.github.com/1714641Добавление элемента в AST в определенном положении с Eclipse, AST
Обновление: спасибо к @ deepak-azad, я дополнил код, но все еще не работаю.
Im пытается использовать исходный файл в Java, используя EclipseJDT. Моя главная цель - поставить некоторое утверждение «x();» ниже каждого объявления переменной.
, например: Из этого:
int a = 10;
к этому:
int a = 10;
method();
Я был в состоянии создать AST и сделал класс тх распространить метод посещения, чтобы получить все объявления переменных внутри кода:
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;
}
}
Я тестировал его и отлично работает захват o е каждая переменный, но не для вставки нового узла, используя что-то вроде этого:
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 элемент.
Я читал о аст в затмении, но весь вопрос связан с созданием коды, но не в процессе издания
Когда я выполнил это, я получаю незаконное исключение аргумента, как это:
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 моего кода является тот, который добавляет е к
a.add(e);
Спасибо!
Спасибо @ Дипак Азад-. Как вы можете видеть в обновленном коде, я использовал метод insertAfter, но все равно получаю сообщение об ошибке –
Исключить это утверждение в вашем коде «a.add (e);». Вы эффективно пытаетесь добавить узел дважды через add (e) и insertAfter (...). Также вы не можете повторно использовать, что вы, кажется, делаете. В каждом месте объявления переменной необходимо добавить другой объект узла. –
Еще раз спасибо @ deepak-azad, я смог решить эту проблему. Я добавил ссылку на свой основной код. С наилучшими пожеланиями! –