code: def _validate_object_can_be_tagged_with_redactor(self, annotated_object):
          
          data_type = annotated_object.data_type
          name = annotated_object.name
          loc = annotated_object._ast_node.lineno, annotated_object._ast_node.path
          curr_data_type = data_type
  
          while isinstance(curr_data_type, Alias) or isinstance(curr_data_type, Nullable):
              # aliases have redactors assocaited with the type itself
              if hasattr(curr_data_type, 'redactor') and curr_data_type.redactor:
                  raise InvalidSpec("A redactor has already been defined for '%s' by '%s'." %
                                    (str(name), str(curr_data_type.name)), *loc)
  
              curr_data_type = curr_data_type.data_type
  
          if hasattr(annotated_object, 'redactor') and annotated_object.redactor:
              if is_map_type(curr_data_type) or is_list_type(curr_data_type):
                  while True:
                      if is_map_type(curr_data_type):
                          curr_data_type = curr_data_type.value_data_type
                      else:
                          curr_data_type = curr_data_type.data_type
  
                      should_continue = (is_map_type(curr_data_type) or is_list_type(curr_data_type)
                          or is_nullable_type(curr_data_type))
  
                      if should_continue is False:
                          break
  
              if is_user_defined_type(curr_data_type) or is_void_type(curr_data_type):
                  raise InvalidSpec("Redactors can't be applied to user-defined or void types.", *loc)
docs: Validates that the object type can be annotated and object does not have
          conflicting annotations.