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 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(); } }