IFields для всех переменных из CompilationUnit - PullRequest
1 голос
/ 14 мая 2011

Мне нужно получить ссылки IField или IJavaElement для всех переменных в моем исходном коде.Я использую плагин, получаю ICompilationUnit, из которого я могу читать все объекты верхнего уровня, используя:

для (IJavaElement i: unit.getTypes () [0] .getChildren ())

или

для (IJavaElement i: unit.getAllTypes ())

Как получить доступ к локальным переменным?Я пытался разобрать ICompilationUnit в CompilationUnit, где Я могу получить ASTNode каждого поля , но затем Я не могу преобразовать его в IField .Есть идеи?

// edit: Например: Для класса:

public class Test {

int global1;int global2;void a () {global1 = 4;int local1;int local2 = 5;}

}

Я звоню

для (Тип IType: unit.getTypes ()) {System.out.println ("itype" +тип);for (IField iField: type.getFields ()) {System.out.println ("iField" + iField);}}

И вывод:

класс itype Test [в [Рабочая копия] Test.java [в [в src [в testowy]]]] intglobal1 int global2 void a () iField int global1 [в Test [в [Рабочей копии] Test.java [в [в [src [в testowy]]]]]] iField int global2 [в Test [в [Рабочей копии] Test.java[in [in src [in testowy]]]]]

Таким образом, локальные переменные не были найдены ...

// добавлено - все еще с трудом: На самом деле это не то поведение, которое яожидал.

for( IMethod i:unit.getAllTypes()[0].getMethods() )
        {
        System.out.println("index to h:"+h+" type "+i.getSource()+" name: "+i.getElementName());
        h++;
        int o =0;
        for( IJavaElement j: i.getChildren() )
            {
                System.out.println("index to o: "+o+j+" type "+j.getElementType()+" name: "+j.getElementName());
                o++;
            }

        }

В этом коде я ожидал найти все методы (которые работают) и получить все локальные переменные из методов (которые не работают).Он никогда не входит в цикл с полями.Он печатает объявление функции правильно, поэтому я уверен, что он видит все переменные ...

А что касается использования INodes, я могу посещать все узлы, но как мне изменить тип с Node на IField / IJavaElement, который мне нужен?

Спасибо:)

1 Ответ

1 голос
/ 14 мая 2011

Если вы просто хотите получить поля типа, вы можете сделать это так:

for (IType type : iCompilationUnit.getTypes()) {
    for (IField iField : type.getFields()) {
        ....
    }
}

Однако, если вы хотите найти все объявления переменных (как полей, так и локальных переменных), вы 'Лучше использовать ASTVisitor .Это будет посещать весь ваш AST, и вам просто нужно будет реализовать методы посещения для нужных элементов AST, в вашем случае, я думаю, это будет VariableDeclarationFragment .

...