code: def AddDescriptorFromSchema(self, schema_name, schema):
          
          # TODO(craigcitro): Is schema_name redundant?
          if self.__GetDescriptor(schema_name):
              return
          if schema.get('enum'):
              self.__DeclareEnum(schema_name, schema)
              return
          if schema.get('type') == 'any':
              self.__DeclareMessageAlias(schema, 'extra_types.JsonValue')
              return
          if schema.get('type') != 'object':
              raise ValueError('Cannot create message descriptors for type %s' %
                               schema.get('type'))
          message = extended_descriptor.ExtendedMessageDescriptor()
          message.name = self.__names.ClassName(schema['id'])
          message.description = util.CleanDescription(schema.get(
              'description', 'A %s object.' % message.name))
          self.__DeclareDescriptor(message.name)
          with self.__DescriptorEnv(message):
              properties = schema.get('properties', {})
              for index, (name, attrs) in enumerate(sorted(properties.items())):
                  field = self.__FieldDescriptorFromProperties(
                      name, index + 1, attrs)
                  message.fields.append(field)
                  if field.name != name:
                      message.field_mappings.append(
                          type(message).JsonFieldMapping(
                              python_name=field.name, json_name=name))
                      self.__AddImport(
                          'from %s import encoding' % self.__base_files_package)
              if 'additionalProperties' in schema:
                  self.__AddAdditionalProperties(message, schema, properties)
          self.__RegisterDescriptor(message)
docs: Add a new MessageDescriptor named schema_name based on schema.