/** * Feed null information from argument annotations into the analysis and mark arguments as * assigned. */ static void analyseArguments( LookupEnvironment environment, FlowInfo flowInfo, Argument[] methodArguments, MethodBinding methodBinding) { if (methodArguments != null) { boolean usesNullTypeAnnotations = environment.usesNullTypeAnnotations(); int length = Math.min(methodBinding.parameters.length, methodArguments.length); for (int i = 0; i < length; i++) { if (usesNullTypeAnnotations) { // leverage null type annotations: long tagBits = methodBinding.parameters[i].tagBits & TagBits.AnnotationNullMASK; if (tagBits == TagBits.AnnotationNonNull) flowInfo.markAsDefinitelyNonNull(methodArguments[i].binding); else if (tagBits == TagBits.AnnotationNullable) flowInfo.markPotentiallyNullBit(methodArguments[i].binding); } else { if (methodBinding.parameterNonNullness != null) { // leverage null-info from parameter annotations: Boolean nonNullNess = methodBinding.parameterNonNullness[i]; if (nonNullNess != null) { if (nonNullNess.booleanValue()) flowInfo.markAsDefinitelyNonNull(methodArguments[i].binding); else flowInfo.markPotentiallyNullBit(methodArguments[i].binding); } } } // tag parameters as being set: flowInfo.markAsDefinitelyAssigned(methodArguments[i].binding); } } }
/** * Feed null information from argument annotations into the analysis and mark arguments as * assigned. */ void analyseArguments(FlowInfo flowInfo) { if (this.arguments != null) { for (int i = 0, count = this.arguments.length; i < count; i++) { if (this.binding.parameterNonNullness != null) { // leverage null-info from parameter annotations: Boolean nonNullNess = this.binding.parameterNonNullness[i]; if (nonNullNess != null) { if (nonNullNess.booleanValue()) flowInfo.markAsDefinitelyNonNull(this.arguments[i].binding); else flowInfo.markPotentiallyNullBit(this.arguments[i].binding); } } // tag parameters as being set: flowInfo.markAsDefinitelyAssigned(this.arguments[i].binding); } } }
/** * When a method is accessed via SourceTypeBinding.resolveTypesFor(MethodBinding) we create the * argument binding and resolve annotations in order to compute null annotation tagbits. */ public void createArgumentBindings() { if (this.arguments != null && this.binding != null) { for (int i = 0, length = this.arguments.length; i < length; i++) { Argument argument = this.arguments[i]; argument.createBinding(this.scope, this.binding.parameters[i]); // createBinding() has resolved annotations, now transfer nullness info from the argument to // the method: if ((argument.binding.tagBits & (TagBits.AnnotationNonNull | TagBits.AnnotationNullable)) != 0) { if (this.binding.parameterNonNullness == null) this.binding.parameterNonNullness = new Boolean[this.arguments.length]; this.binding.parameterNonNullness[i] = Boolean.valueOf((argument.binding.tagBits & TagBits.AnnotationNonNull) != 0); } } } }
// version for invocation from LambdaExpression: static void createArgumentBindings( Argument[] arguments, MethodBinding binding, MethodScope scope) { boolean useTypeAnnotations = scope.environment().usesNullTypeAnnotations(); if (arguments != null && binding != null) { for (int i = 0, length = arguments.length; i < length; i++) { Argument argument = arguments[i]; binding.parameters[i] = argument.createBinding(scope, binding.parameters[i]); if (useTypeAnnotations) continue; // no business with SE7 null annotations in the 1.8 case. // createBinding() has resolved annotations, now transfer nullness info from the argument to // the method: long argTypeTagBits = (argument.binding.tagBits & TagBits.AnnotationNullMASK); if (argTypeTagBits != 0) { if (binding.parameterNonNullness == null) { binding.parameterNonNullness = new Boolean[arguments.length]; binding.tagBits |= TagBits.IsNullnessKnown; } binding.parameterNonNullness[i] = Boolean.valueOf(argTypeTagBits == TagBits.AnnotationNonNull); } } } }