@Override public boolean isAssignable(AnnotatedTypeMirror varType, Tree varTree) { if (varTree.getKind() == Tree.Kind.VARIABLE || varType.hasAnnotation(ASSIGNABLE)) return true; Element varElement = InternalUtils.symbol(varTree); if (varElement == null || !varElement.getKind().isField() || ElementUtils.isStatic(varElement)) return true; ExpressionTree expTree = (ExpressionTree) varTree; AnnotatedTypeMirror receiver = factory.getReceiver(expTree); boolean isAssignable = receiver.hasAnnotation(MUTABLE) || (receiver.hasAnnotation(ASSIGNS_FIELDS) && TreeUtils.isSelfAccess(expTree)); return isAssignable; }