private static MethodSpec createBindWithSourceMethod(AutoBundleBindingClass target) { List<AutoBundleBindingField> args = new ArrayList<>(); args.addAll(target.getRequiredArgs()); args.addAll(target.getNotRequiredArgs()); MethodSpec.Builder builder = MethodSpec.methodBuilder("bind") .addModifiers(Modifier.PUBLIC, Modifier.STATIC) .returns(void.class) .addParameter(target.getTargetType(), "target") .addParameter(CLASS_BUNDLE, "source"); for (AutoBundleBindingField arg : args) { String key = arg.getArgKey(); String fieldName = arg.getFieldName(); TypeName argType = arg.getArgType(); String operationName = arg.getOperationName("get"); builder.beginControlFlow("if (source.containsKey($S))", key); if (arg.hasCustomConverter()) { TypeName converter = arg.getConverter(); builder .addStatement("$T $NConverter = new $T()", converter, key, converter) .addStatement( "target.$N = ($T) $NConverter.original(source.$N($S))", fieldName, argType, key, operationName, key); } else { if (arg.noCast()) { builder.addStatement("target.$N = source.$N($S)", fieldName, operationName, key); } else { builder.addStatement( "target.$N = ($T) source.$N($S)", fieldName, argType, operationName, key); } } if (arg.isRequired()) { String exceptionMessage = String.format("%s is required, but not found in the bundle.", key); builder .nextControlFlow("else") .addStatement("throw new IllegalStateException($S)", exceptionMessage); } builder.endControlFlow(); } return builder.build(); }
private static MethodSpec createPackMethod(AutoBundleBindingClass target) { List<AutoBundleBindingField> args = new ArrayList<>(); args.addAll(target.getRequiredArgs()); args.addAll(target.getNotRequiredArgs()); MethodSpec.Builder builder = MethodSpec.methodBuilder("pack") .addModifiers(Modifier.PUBLIC, Modifier.STATIC) .returns(void.class) .addParameter(target.getTargetType(), "source") .addParameter(CLASS_BUNDLE, "args"); for (AutoBundleBindingField arg : args) { String key = arg.getArgKey(); String fieldName = arg.getFieldName(); TypeName argType = arg.getArgType(); String operationName = arg.getOperationName("put"); if (!argType.isPrimitive()) { String exceptionMessage = String.format("%s must not be null.", fieldName); builder .beginControlFlow("if (source.$N == null)", fieldName) .addStatement("throw new IllegalStateException($S)", exceptionMessage) .endControlFlow(); } if (arg.hasCustomConverter()) { TypeName converter = arg.getConverter(); builder .addStatement("$T $NConverter = new $T()", converter, key, converter) .addStatement( "args.$N($S, $NConverter.convert(source.$N))", operationName, key, key, fieldName); } else { builder.addStatement("args.$N($S, source.$N)", operationName, key, fieldName); } } return builder.build(); }