Получение ILocalVariable от анализа VariableDeclarationStatement - PullRequest
0 голосов
/ 17 марта 2011

Я анализирую исходный код Java с помощью Eclipse AST parser и успешно могу найти локальную переменную как VariableDeclarationStatement. Проблема в том, что мне нужна переменная ILocalVariable для использования рефакторинга. В этом случае getJavaElement() не работает, поскольку локальные переменные отсутствуют в модели Java. Есть идеи как его получить оттуда?

Ответы [ 5 ]

1 голос
/ 20 марта 2012

Вы можете попробовать следующее:
Запрограммировав в руке VariableDeclarationStatement variable
Вы можете кодировать как:

IVariableBinding binding = variable.resolveBinding();
ILocalVariable local = (ILocalVariable) binding.getJavaElement();
0 голосов
/ 23 июля 2014

Я столкнулся с той же проблемой, но ни одно из приведенных выше решений не помогло мне. После некоторых исследований я нашел решение, которое работает для меня:

// reconcile corresponding compilation unit
compilationUnit.reconcile(ICompilationUnit.NO_AST, false, null, null);

// parse code and get the elements
IJavaElement[] elements =
    ((ICodeAssist) compilationUnit).codeSelect(startPos + length, 0);

// if there is an element and its an instance of ILocalVariable.
if (anElements.length > 0 && anElements[0] instanceof ILocalVariable) {
  return (ILocalVariable) anElements[0];
}

Итак, в заключение: вам нужна начальная позиция и длина переменной. (startPos + length). И модуль компиляции, который у меня уже был.

0 голосов
/ 20 марта 2011

Вот еще один вариант. Создайте объект ILocalVariable самостоятельно. org.eclipse.jdt.internal.core.LocalVariable является внутренним API (и конструктор изменился между 3,6 и 3,7).

Конструктор (в Eclipse 3.6) принимает следующие аргументы:

    public LocalVariable(
        JavaElement parent,
        String name,
        int declarationSourceStart,
        int declarationSourceEnd,
        int nameStart,
        int nameEnd,
        String typeSignature,
        org.eclipse.jdt.internal.compiler.ast.Annotation[] astAnnotations)

Большинство этих параметров должны быть достаточно прямыми и доступны непосредственно из VariableDeclarationStatement. Обратите внимание, что typeSignature - это не полное имя, а сигнатуры типов, сгенерированные из org.eclipse.jdt.core.Signature.

0 голосов
/ 27 февраля 2012
IVariableBinding binding = variable.resolveBinding();
if (!binding.isField() && !binding.isEnumConstant() && !binding.isParameter()) 
{
    ILocalVariable local = (ILocalVariable) binding.getJavaElement();
}
0 голосов
/ 18 марта 2011

Обратите внимание, что я не пробовал это сам, но, глядя на исходный код, должны работать следующие шаги:

  1. Убедитесь, что ASTParser создан с использованием setResolveBindings(true)
  2. Получите все VariableDeclarationFragments, позвонив по номеру VariableDeclarationStatement.fragments().
  3. Для каждого интересующего вас фрагмента звоните resolveBinding().
  4. Для каждой привязки вы должны иметь возможность звонить getJavaElement().
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...