Мне нужно получить ссылки 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, который мне нужен?
Спасибо:)