@ -12,7 +12,39 @@ import java.lang.annotation.Retention;
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					import  java.lang.annotation.RetentionPolicy ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					import  java.lang.annotation.Target ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					/** Annotation to indicate that when the parameter is null, the result is also null. */ 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					/ * * 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 *  Annotation  specifying  method ' s  contract .  If  a  method ' s  param  is  annotated 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 *  with  @PropagaresNullable ,  it  declares  that  the  method  will  return  { @code  null }  if  and  only  if 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 *  this  param  is  { @code  null } . 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 * 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 *  < p > Calls  to  @PropagatesNullable - annotated  methods  are  treated  by  Nullsafe  typechecker 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 *  accordingly .  If  param  is  non - nullable  in  the  callsite ,  Nullsafe  will  assume  the  method  result  is 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 *  not  null  either ,  and  hence  no  assertion  or  check  will  be  needed . 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 * 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 *  < p > In  the  following  example ,  annotating  the  param  with  @PropagatesNullable  allows  to  simplify 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 *  usage  of  the  method . 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 * 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 *  < p > < code > 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 *  public  static  String  capitalize ( @PropagatesNullable  String  input )  { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 *    if  ( input  = =  null )  { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 *      return  null ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 *    } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 *    return  input . toUpperCase ( ) ; 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 *  } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 * 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 *  void  exampleOfUsage ( @Nullable  String  nullable ,  String  nonnull )  { 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 *    capitalize ( nullable ) . contains ( "A" ) ;  // <-- BAD: need a check
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 *    // if capitalize() was not annotated as @PropagatesNullable,
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 *    // assertNotNull(capitalize(nonnull)) would be required.
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 *    capitalize ( nonnull ) . contains ( "A" ) ;   // <-- OK: safe to dereference
 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 *  } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 *  < / code > 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 * 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 *  < p > If  several  params  are  annotated  as  @PropagatesNullable ,  the  method  should  return  { @code  null } 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 *  if  and  only  if  any  of  those  params  is  { @code  null } . 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 * 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 *  < p > See  also  @TrueOnNull  and  @FalseOnNull  annotations . 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 * / 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					@Retention ( RetentionPolicy . CLASS ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					@Target ( { ElementType . PARAMETER } ) 
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					public  @interface  PropagatesNullable  { }