private static List<MethodSpec> createBuilderMethods( AutoBundleBindingClass target, String fieldName) { List<MethodSpec> methodSpecs = new ArrayList<>(); for (AutoBundleBindingField arg : target.getNotRequiredArgs()) { String argKey = arg.getArgKey(); TypeName argType = arg.getArgType(); String operationName = arg.getOperationName("put"); MethodSpec.Builder builder = MethodSpec.methodBuilder(argKey) .addModifiers(Modifier.PUBLIC) .addParameter(argType, argKey) .returns(ClassName.get(target.getPackageName(), target.getBuilderClassName())); if (arg.hasCustomConverter()) { TypeName converter = arg.getConverter(); builder .addStatement("$T $NConverter = new $T()", converter, argKey, converter) .addStatement( "$N.$N($S, $NConverter.convert($N))", fieldName, operationName, argKey, argKey, argKey); } else { builder.addStatement("$N.$N($S, $N)", fieldName, operationName, argKey, argKey); } builder.addStatement("return this"); methodSpecs.add(builder.build()); } return methodSpecs; }
private static MethodSpec createBuilderConstructor( AutoBundleBindingClass target, String fieldName) { MethodSpec.Builder builder = MethodSpec.constructorBuilder() .addModifiers(Modifier.PUBLIC) .addStatement("this.$N = new $T()", fieldName, CLASS_BUNDLE); for (AutoBundleBindingField arg : target.getRequiredArgs()) { String key = arg.getArgKey(); TypeName type = arg.getArgType(); String operationName = arg.getOperationName("put"); builder.addParameter(type, key); if (arg.hasCustomConverter()) { TypeName converter = arg.getConverter(); builder .addStatement("$T $NConverter = new $T()", converter, key, converter) .addStatement( "this.$N.$N($S, $NConverter.convert($N))", fieldName, operationName, key, key, key); } else { builder.addStatement("this.$N.$N($S, $N)", fieldName, operationName, key, key); } } return builder.build(); }
private static MethodSpec createCallBuilderMethod(AutoBundleBindingClass target) { ClassName builderClass = ClassName.get(target.getPackageName(), target.getBuilderClassName()); MethodSpec.Builder builder = MethodSpec.methodBuilder("create" + target.getBuilderType().name() + "Builder") .addModifiers(Modifier.PUBLIC, Modifier.STATIC) .returns(builderClass) .addCode("return new $T(", builderClass); for (int i = 0, count = target.getRequiredArgs().size(); i < count; i++) { if (i > 0) { builder.addCode(","); } AutoBundleBindingField arg = target.getRequiredArgs().get(i); builder.addParameter(arg.getArgType(), arg.getArgKey()).addCode("$N", arg.getArgKey()); } return builder.addCode(");\n").build(); }
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(); }