@Override
public Tree visitUnary(UnaryTree node, Element field) {
ExpressionTree t = node.getExpression();
Kind kind = node.getKind();
boolean isArrayOrImmutable = kind != Kind.POSTFIX_DECREMENT
&& kind != Kind.POSTFIX_INCREMENT
&& kind != Kind.PREFIX_DECREMENT
&& kind != Kind.PREFIX_INCREMENT;
while (t.getKind() == Tree.Kind.ARRAY_ACCESS) {
isArrayOrImmutable = true;
t = ((ArrayAccessTree) t).getExpression();
}
Element el = workingCopy.getTrees().getElement(new TreePath(getCurrentPath(), t));
EncapsulateDesc desc = el == null ? null : fields.get(el);
if (desc != null && desc.useAccessors
&& desc.refactoring.getGetterName() != null
&& (isArrayOrImmutable || checkAssignmentInsideExpression())
&& !isInConstructorOfFieldClass(getCurrentPath(), desc.field)
&& !isInGetterSetter(getCurrentPath(), desc.currentGetter, desc.currentSetter)) {
// check (++field + 3)
ExpressionTree invkgetter = createGetterInvokation(t, desc.refactoring.getGetterName());
if (isArrayOrImmutable) {
rewrite(t, invkgetter);
} else if (desc.refactoring.getSetterName() != null) {
ExpressionTree setter = createMemberSelection(node.getExpression(), desc.refactoring.getSetterName());
Tree.Kind operator = kind == Tree.Kind.POSTFIX_INCREMENT || kind == Tree.Kind.PREFIX_INCREMENT
? Tree.Kind.PLUS
: Tree.Kind.MINUS;
// resolve types
Trees trees = workingCopy.getTrees();
ExpressionTree expTree = node.getExpression();
TreePath varPath = trees.getPath(workingCopy.getCompilationUnit(), expTree);
TypeMirror varType = trees.getTypeMirror(varPath);
TypeMirror expType = workingCopy.getTypes().getPrimitiveType(TypeKind.INT);
ExpressionTree newExpTree = make.Binary(operator, invkgetter, make.Literal(1));
if (!workingCopy.getTypes().isSubtype(expType, varType)) {
newExpTree = make.TypeCast(make.Type(varType), make.Parenthesized(newExpTree));
}
MethodInvocationTree invksetter = make.MethodInvocation(
Collections.emptyList(),
setter,
Collections.singletonList(newExpTree));
rewrite(node, invksetter);
}
}
return null;
}