/** * @param builder the intent builder in which to emit. * @param binding the binding to emit. * @param generic generic value. */ private void emitOptionalSetter( TypeSpec.Builder builder, ExtraInjection binding, TypeName generic) { Collection<FieldBinding> fieldBindings = binding.getFieldBindings(); if (fieldBindings.isEmpty()) { return; } FieldBinding firstFieldBinding = fieldBindings.iterator().next(); TypeMirror extraType = firstFieldBinding.getType(); String castToParcelableIfNecessary = doCreateParcelableCastIfExtraIsParcelable(extraType); final String value = extractValue(firstFieldBinding); MethodSpec.Builder setterBuilder = MethodSpec.methodBuilder(binding.getKey()) .addModifiers(Modifier.PUBLIC) .addParameter(TypeName.get(extraType), firstFieldBinding.getName()) .returns(generic) .addStatement( "bundler.put($S," + castToParcelableIfNecessary + " $L)", binding.getKey(), value) .addStatement("return ($T) this", generic); builder.addMethod(setterBuilder.build()); }
REQUIRED_SEQUENCE_INTERMEDIARY_CLASS_PREFIX + capitalize(binding.getKey()); MethodSpec.methodBuilder(binding.getKey()) .addModifiers(Modifier.PUBLIC) .addParameter(TypeName.get(extraType), firstFieldBinding.getName()) .returns(nextState) .addStatement( "bundler.put($S," + castToParcelableIfNecessary + " $L)", binding.getKey(), value);
private void emitExtraInjection(MethodSpec.Builder builder, ExtraInjection binding) { builder.addStatement("object = finder.getExtra(source, $S)", binding.getKey()); List<Binding> requiredBindings = binding.getRequiredBindings(); if (!requiredBindings.isEmpty()) { builder .beginControlFlow("if (object == null)") .addStatement( "throw new IllegalStateException(\"Required extra with key '$L' for $L " + "was not found. If this extra is optional add '@Nullable' annotation.\")", binding.getKey(), emitHumanDescription(requiredBindings)) .endControlFlow(); emitFieldBindings(builder, binding); } else { // an optional extra, wrap it in a check to keep original value, if any builder.beginControlFlow("if (object != null)"); emitFieldBindings(builder, binding); builder.endControlFlow(); } }