docs: private Expression partToPartExpression(SoyMsgPart part) {
      if (part instanceof SoyMsgPlaceholderPart) {
        return SOY_MSG_PLACEHOLDER_PART.construct(
            constant(((SoyMsgPlaceholderPart) part).getPlaceholderName()), constantNull(STRING_TYPE));
      } else if (part instanceof SoyMsgPluralPart) {
        SoyMsgPluralPart pluralPart = (SoyMsgPluralPart) part;
        List<Expression> caseExprs = new ArrayList<>(pluralPart.getCases().size());
        for (Case<SoyMsgPluralCaseSpec> item : pluralPart.getCases()) {
          Expression spec;
          if (item.spec().getType() == Type.EXPLICIT) {
            spec = SOY_MSG_PLURAL_CASE_SPEC_LONG.construct(constant(item.spec().getExplicitValue()));
          } else {
            spec =
                SOY_MSG_PLURAL_CASE_SPEC_TYPE.construct(
                    FieldRef.enumReference(item.spec().getType()).accessor());
          }
          caseExprs.add(CASE_CREATE.invoke(spec, partsToPartsList(item.parts())));
        }
        return SOY_MSG_PURAL_PART.construct(
            constant(pluralPart.getPluralVarName()),
            constant(pluralPart.getOffset()),
            BytecodeUtils.asList(caseExprs));
      } else if (part instanceof SoyMsgPluralRemainderPart) {
        return SOY_MSG_PLURAL_REMAINDER_PART.construct(
            constant(((SoyMsgPluralRemainderPart) part).getPluralVarName()));
      } else if (part instanceof SoyMsgRawTextPart) {
        return SOY_MSG_RAW_TEXT_PART_OF.invoke(
            constant(((SoyMsgRawTextPart) part).getRawText(), variables));
      } else if (part instanceof SoyMsgSelectPart) {
        SoyMsgSelectPart selectPart = (SoyMsgSelectPart) part;
        List<Expression> caseExprs = new ArrayList<>(selectPart.getCases().size());
        for (Case<String> item : selectPart.getCases()) {
          caseExprs.add(
              CASE_CREATE.invoke(
                  item.spec() == null ? constantNull(STRING_TYPE) : constant(item.spec()),
                  partsToPartsList(item.parts())));
        }
        return SOY_MSG_SELECT_PART.construct(
            constant(selectPart.getSelectVarName()), BytecodeUtils.asList(caseExprs));
      } else {
        throw new AssertionError("unrecognized part: " + part);
      }
    }