Ejemplo n.º 1
0
  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();
  }
Ejemplo n.º 2
0
  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();
  }