/**
  * Recursively checks whether the specified class uses any Protocol Buffers fields that cannot be
  * deterministically encoded.
  *
  * @throws NonDeterministicException if the object cannot be encoded deterministically.
  */
 static void verifyDeterministic(ProtoCoder<?> coder) throws NonDeterministicException {
   Class<? extends Message> message = coder.getMessageType();
   ExtensionRegistry registry = coder.getExtensionRegistry();
   Set<Descriptor> descriptors = getRecursiveDescriptorsForClass(message, registry);
   for (Descriptor d : descriptors) {
     for (FieldDescriptor fd : d.getFields()) {
       // If there is a transitively reachable Protocol Buffers map field, then this object cannot
       // be encoded deterministically.
       if (fd.isMapField()) {
         String reason =
             String.format(
                 "Protocol Buffers message %s transitively includes Map field %s (from file %s)."
                     + " Maps cannot be deterministically encoded.",
                 message.getName(), fd.getFullName(), fd.getFile().getFullName());
         throw new NonDeterministicException(coder, reason);
       }
     }
   }
 }