public void addField(String key, String name, TypeMirror type, boolean required, boolean parcel) { ExtraInjection extraInjection = bindingMap.get(key); if (extraInjection == null) { extraInjection = new ExtraInjection(key); bindingMap.put(key, extraInjection); } extraInjection.addFieldBinding(new FieldBinding(name, type, required, parcel)); hasRequiredFields = hasRequiredFields || required; }
/** * @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()); }
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(); } }
private void emitExtraDSLStateMachine(TypeSpec.Builder intentBuilderTypeBuilder) { //separate required extras from optional extras and sort both sublists. List<ExtraInjection> requiredInjections = new ArrayList<>(); List<ExtraInjection> optionalInjections = new ArrayList<>(); for (ExtraInjection extraInjection : target.bindingMap.values()) { if (!extraInjection.getRequiredBindings().isEmpty()) { requiredInjections.add(extraInjection); } else { optionalInjections.add(extraInjection); } } final ExtraInjectionComparator extraInjectionComparator = new ExtraInjectionComparator(); Collections.sort(requiredInjections, extraInjectionComparator); Collections.sort(optionalInjections, extraInjectionComparator); emitRequiredSequence(intentBuilderTypeBuilder, requiredInjections); emitOptionalSequence(intentBuilderTypeBuilder, optionalInjections); }
private void emitFieldBindings(MethodSpec.Builder builder, ExtraInjection binding) { Collection<FieldBinding> fieldBindings = binding.getFieldBindings(); if (fieldBindings.isEmpty()) { return; } for (FieldBinding fieldBinding : fieldBindings) { builder.addCode("target.$L = ", fieldBinding.getName()); if (fieldBinding.isParcel()) { builder.addCode("org.parceler.Parcels.unwrap((android.os.Parcelable) object);\n"); } else { emitCast(builder, fieldBinding.getType()); builder.addCode("object;\n"); } } }
final Collection<FieldBinding> fieldBindings = binding.getFieldBindings(); if (fieldBindings.isEmpty()) { return null; 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);