Объект Scope
имеет метод getLocalElements()
, , который можно повторять.Затем каждый элемент может быть задан по его имени, и когда это правильный (и это тоже переменная), вы можете получить его тип.
Это концепция, не проверенная:
private final static Set<ElementKind> variableKinds =
Collections.unmodifiableSet(EnumSet.of(ElementKind.FIELD, ElementKind.ENUM_CONSTANT,
ElementKind.PARAMETER, ElementKind.LOCAL_VARIABLE));
public Type getTypeOfVariable(Scope scope, String varName)
{
for(Element e : scope.getLocalElements()) {
if(variableKinds.contains(e.getKind()) && e.getName().equals(varName)) {
return e.getType();
}
}
throw new NoSuchElementException("No variable " + varName + " in " + scope);
}
Редактировать: Да, действительно не проверено (нет метода getType()
).
Итак, как получить из Element
(или VariableElement) его тип?
В классе Trees
есть несколько служебных методов, позволяющих извлекать Tree
или TreePath
из Element
, и, таким образом, мы можем получить VariableTree
(поскольку это происходит из переменнойдекларация).VariableTree
теперь имеет метод getType()
, который возвращает Tree
- но на самом деле это один из PrimitiveTypeTree
, ParametrizedTypeTree
, ArrayTypeTree
и IdentifierTree
(для простых ссылочных типов, а также для типапеременные).Так что, если вы хотите напечатать только тип, этого может быть достаточно.Иначе, снова с классом Trees
мы теперь можем получить TypeMirror для этого типа.
(я однажды сделал нечто подобное, когда попытался написать новый Doclet, который также выводил бы отформатированный исходный код. Ужасное переключениемежду всеми этими API.)