docs: def add_binding(self, node, value, report_redef=True):
          """Called when a binding is altered.
  
          - `node` is the statement responsible for the change
          - `value` is the optional new value, a Binding instance, associated
          with the binding; if None, the binding is deleted if it exists.
          - if `report_redef` is True (default), rebinding while unused will be
          reported.
  
          """
          redefinedWhileUnused = False
          if not isinstance(self.scope, ClassScope):
              for scope in self.scope_stack[::-1]:
                  existing = scope.get(value.name)
                  if (isinstance(existing, Importation)
                          and not existing.used
                          and (not isinstance(value, Importation) or
                               value.fullName == existing.fullName)
                          and report_redef
                          and not self.different_forks(node, existing.source)):
                      redefinedWhileUnused = True
                      self.report(messages.RedefinedWhileUnused,
                                  node, value.name, existing.source)
  
          existing = self.scope.get(value.name)
          if not redefinedWhileUnused and self.has_parent(value.source, ast.ListComp):
              if (existing and report_redef
                      and not self.has_parent(existing.source, (ast.For, ast.ListComp))
                      and not self.different_forks(node, existing.source)):
                  self.report(messages.RedefinedInListComp,
                              node, value.name, existing.source)
  
          if (isinstance(existing, Definition)
                  and not existing.used
                  and not self.different_forks(node, existing.source)):
              self.report(messages.RedefinedWhileUnused,
                          node, value.name, existing.source)
          else:
              self.scope[value.name] = value