2012-01-30 3 views
1

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

Спасибо!

ответ

1

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

+0

Спасибо @ Дипак Азад-. Как вы можете видеть в обновленном коде, я использовал метод insertAfter, но все равно получаю сообщение об ошибке –

+1

Исключить это утверждение в вашем коде «a.add (e);». Вы эффективно пытаетесь добавить узел дважды через add (e) и insertAfter (...). Также вы не можете повторно использовать, что вы, кажется, делаете. В каждом месте объявления переменной необходимо добавить другой объект узла. –

+0

Еще раз спасибо @ deepak-azad, я смог решить эту проблему. Я добавил ссылку на свой основной код. С наилучшими пожеланиями! –

Смежные вопросы