static TypeSpecDataHolder generatePropsBuilderMethods()

in litho-processor/src/main/java/com/facebook/litho/specmodels/generator/BuilderGenerator.java [329:482]


  static TypeSpecDataHolder generatePropsBuilderMethods(
      SpecModel specModel, PropModel prop, int requiredIndex) {
    final TypeSpecDataHolder.Builder dataHolder = TypeSpecDataHolder.newBuilder();
    final boolean hasVarArgs = prop.hasVarArgs();

    switch (prop.getResType()) {
      case STRING:
        dataHolder.addTypeSpecDataHolder(regularBuilders(specModel, prop, requiredIndex));
        dataHolder.addTypeSpecDataHolder(
            resBuilders(specModel, prop, requiredIndex, ClassNames.STRING_RES, "resolveString"));
        dataHolder.addTypeSpecDataHolder(
            resWithVarargsBuilders(
                specModel,
                prop,
                requiredIndex,
                ClassNames.STRING_RES,
                "resolveString",
                TypeName.OBJECT,
                "formatArgs"));
        dataHolder.addTypeSpecDataHolder(
            attrBuilders(specModel, prop, requiredIndex, ClassNames.STRING_RES, "resolveString"));
        break;
      case STRING_ARRAY:
        dataHolder.addTypeSpecDataHolder(regularBuilders(specModel, prop, requiredIndex));
        dataHolder.addTypeSpecDataHolder(
            resBuilders(
                specModel, prop, requiredIndex, ClassNames.ARRAY_RES, "resolveStringArray"));
        dataHolder.addTypeSpecDataHolder(
            attrBuilders(
                specModel, prop, requiredIndex, ClassNames.ARRAY_RES, "resolveStringArray"));
        break;
      case INT:
        dataHolder.addTypeSpecDataHolder(regularBuilders(specModel, prop, requiredIndex));
        dataHolder.addTypeSpecDataHolder(
            resBuilders(specModel, prop, requiredIndex, ClassNames.INT_RES, "resolveInt"));
        dataHolder.addTypeSpecDataHolder(
            attrBuilders(specModel, prop, requiredIndex, ClassNames.INT_RES, "resolveInt"));
        break;
      case INT_ARRAY:
        dataHolder.addTypeSpecDataHolder(regularBuilders(specModel, prop, requiredIndex));
        dataHolder.addTypeSpecDataHolder(
            resBuilders(
                specModel,
                prop,
                requiredIndex,
                ClassNames.ARRAY_RES,
                hasVarArgs ? "resolveIntegerArray" : "resolveIntArray"));
        dataHolder.addTypeSpecDataHolder(
            attrBuilders(
                specModel,
                prop,
                requiredIndex,
                ClassNames.ARRAY_RES,
                hasVarArgs ? "resolveIntegerArray" : "resolveIntArray"));
        break;
      case BOOL:
        dataHolder.addTypeSpecDataHolder(regularBuilders(specModel, prop, requiredIndex));
        dataHolder.addTypeSpecDataHolder(
            resBuilders(specModel, prop, requiredIndex, ClassNames.BOOL_RES, "resolveBool"));
        dataHolder.addTypeSpecDataHolder(
            attrBuilders(specModel, prop, requiredIndex, ClassNames.BOOL_RES, "resolveBool"));
        break;
      case COLOR:
        dataHolder.addTypeSpecDataHolder(
            regularBuilders(specModel, prop, requiredIndex, annotation(ClassNames.COLOR_INT)));
        dataHolder.addTypeSpecDataHolder(
            resBuilders(specModel, prop, requiredIndex, ClassNames.COLOR_RES, "resolveColor"));
        dataHolder.addTypeSpecDataHolder(
            attrBuilders(specModel, prop, requiredIndex, ClassNames.COLOR_RES, "resolveColor"));
        break;
      case DIMEN_SIZE:
        dataHolder.addTypeSpecDataHolder(pxBuilders(specModel, prop, requiredIndex));
        dataHolder.addTypeSpecDataHolder(dipBuilders(specModel, prop, requiredIndex));
        dataHolder.addTypeSpecDataHolder(
            resBuilders(specModel, prop, requiredIndex, ClassNames.DIMEN_RES, "resolveDimenSize"));
        dataHolder.addTypeSpecDataHolder(
            attrBuilders(specModel, prop, requiredIndex, ClassNames.DIMEN_RES, "resolveDimenSize"));
        break;
      case DIMEN_TEXT:
        dataHolder.addTypeSpecDataHolder(pxBuilders(specModel, prop, requiredIndex));
        dataHolder.addTypeSpecDataHolder(dipBuilders(specModel, prop, requiredIndex));
        dataHolder.addTypeSpecDataHolder(sipBuilders(specModel, prop, requiredIndex));
        dataHolder.addTypeSpecDataHolder(
            resBuilders(specModel, prop, requiredIndex, ClassNames.DIMEN_RES, "resolveDimenSize"));
        dataHolder.addTypeSpecDataHolder(
            attrBuilders(specModel, prop, requiredIndex, ClassNames.DIMEN_RES, "resolveDimenSize"));
        break;
      case DIMEN_OFFSET:
        dataHolder.addTypeSpecDataHolder(pxBuilders(specModel, prop, requiredIndex));
        dataHolder.addTypeSpecDataHolder(dipBuilders(specModel, prop, requiredIndex));
        dataHolder.addTypeSpecDataHolder(sipBuilders(specModel, prop, requiredIndex));
        dataHolder.addTypeSpecDataHolder(
            resBuilders(specModel, prop, requiredIndex, ClassNames.DIMEN_RES, "resolveDimenSize"));
        dataHolder.addTypeSpecDataHolder(
            attrBuilders(specModel, prop, requiredIndex, ClassNames.DIMEN_RES, "resolveDimenSize"));
        break;
      case FLOAT:
        dataHolder.addTypeSpecDataHolder(regularBuilders(specModel, prop, requiredIndex));
        dataHolder.addTypeSpecDataHolder(
            resBuilders(specModel, prop, requiredIndex, ClassNames.DIMEN_RES, "resolveFloat"));
        dataHolder.addTypeSpecDataHolder(
            attrBuilders(specModel, prop, requiredIndex, ClassNames.DIMEN_RES, "resolveFloat"));
        break;
      case DRAWABLE:
        dataHolder.addTypeSpecDataHolder(regularBuilders(specModel, prop, requiredIndex));
        dataHolder.addTypeSpecDataHolder(
            resBuilders(
                specModel, prop, requiredIndex, ClassNames.DRAWABLE_RES, "resolveDrawable"));
        dataHolder.addTypeSpecDataHolder(
            attrBuilders(
                specModel, prop, requiredIndex, ClassNames.DRAWABLE_RES, "resolveDrawable"));
        break;
      case NONE:
        if (hasVarArgs) {
          dataHolder.addMethod(varArgBuilder(specModel, prop, requiredIndex));
          ParameterizedTypeName type = (ParameterizedTypeName) prop.getTypeName();
          if (getRawType(type.typeArguments.get(0)).equals(ClassNames.COMPONENT)) {
            dataHolder.addMethod(varArgBuilderBuilder(specModel, prop, requiredIndex));
          }
          // fall through to generate builder method for List<T>
        }

        final TypeName componentClass =
            prop.getTypeName() instanceof ParameterizedTypeName
                ? ((ParameterizedTypeName) prop.getTypeName()).rawType
                : prop.getTypeName();

        if (componentClass.equals(ClassNames.COMPONENT)) {
          dataHolder.addMethod(componentBuilder(specModel, prop, requiredIndex));
        } else if (prop.isDynamic()) {
          final TypeName dynamicValueType =
              ParameterizedTypeName.get(ClassNames.DYNAMIC_VALUE, prop.getTypeName().box());
          dataHolder.addMethod(
              dynamicValueBuilder(specModel, prop, requiredIndex, dynamicValueType));
          dataHolder.addMethod(
              dynamicValueSimpleBuilder(specModel, prop, requiredIndex, dynamicValueType));
        } else {
          dataHolder.addMethod(regularBuilder(specModel, prop, requiredIndex));
        }
        break;
    }

    if (getRawType(prop.getTypeName()).equals(ClassNames.COMPONENT)) {
      dataHolder.addMethod(
          builderBuilder(specModel, prop, requiredIndex, ClassNames.COMPONENT_BUILDER, true));
    }

    if (getRawType(prop.getTypeName()).equals(ClassNames.SECTION)) {
      dataHolder.addMethod(
          builderBuilder(specModel, prop, requiredIndex, ClassNames.SECTION_BUILDER, true));
    }

    return dataHolder.build();
  }