docs: private void number(
      JSType node,
      Map context,
      boolean boxVariant,
      int arrayCount,
      List tmpFields,
      List tmpVariants) {
      // If node is a JSField and arrayCount is positive, we create a JSListCoder for the
      // field.
      if (node instanceof JSField && arrayCount > 0)
         ((JSField)node).setCoder(new JSListCoder(arrayCount - 1, (JSField)node));
      // Process the node according to its kind
      if (node instanceof JSPrimitive || node instanceof JSEnum) {
        // Primitives and enumerations always go in the 'fields' section
        tmpFields.add(node);
      }
      else if (node instanceof JSDynamic) {
        // Dynamics always go in the 'fields' section
        tmpFields.add(node);
        // The following is called for its side-effect of ensuring creation of the
        // expectedSchema if the JSDynamic has an expectedType.  The result isn't needed
        // here.
         ((JSDynamic)node).getExpectedSchema(context);
      }
      else if (node instanceof JSVariant) {
        if (boxVariant) {
          // Variant boxes go in the 'fields' section now, and will have their boxed
          // information later added to the 'boxed' section.  We do not recursively visit
          // nodes below a boxed variant (even though such nodes are undoubtedly there).
          // Rather, we will rely on a later call to the JSVariant.box method to initialize
          // the subSchema for the material inside the box.
          tmpFields.add(node);
        }
        else {
          // Unboxed variants go in the 'variants' section
          JSVariant var = (JSVariant)node;
          var.setIndex(tmpVariants.size());
          tmpVariants.add(var);
          for (int i = 0; i < var.getCaseCount(); i++)
            // The children of unboxed variants are now recursively visited.  Any additional
            // variants found below this point but not below an intervening JSRepeated are
            // considered 'unboxed.'
            number((JSType)var.getCase(i), context, false, arrayCount, tmpFields, tmpVariants);
        }
      }
      else if (node instanceof JSRepeated) {
        JSRepeated arr = (JSRepeated)node;
        // The child of a JSRepeated is now recursively visited so that its (repeated) value
        // can be interrogated.  Any JSVariant found below a JSRepeated but not below an
        // intervening JSVariant is considered 'boxed.'
        number((JSType)arr.getItemType(), context, true, arrayCount + 1, tmpFields, tmpVariants);
      }
      else {
        JSTuple tup = (JSTuple)node;
        // The JSTuple is not, itself, entered anywhere.
        for (int i = 0; i < tup.getFieldCount(); i++)
          // The children of a JSTuple are now recursively visited.  The boxed status of any
          // JSVariants below this JSTuple are determined by JSRepeated and JSVariant nodes
          // higher in the tree and not by the JSTuple.
          number((JSType)tup.getField(i), context, boxVariant, arrayCount, tmpFields, tmpVariants);
      }
    }