docs: def makeHashFunction(self, originalHashFunction, syntheticMemberList):
          """
          :param list(SyntheticMember) syntheticMemberList: a list of the class' synthetic members.
          """
          if originalHashFunction is None:
              return None
  
          for member in syntheticMemberList:
              if not member.readOnly():
                  return None
  
          # All synthetic members are read-only: generate a hash function.
          def hash_function(instance):
              values = [getattr(instance, m.privateMemberName()) for m in syntheticMemberList]
              if inspect.isfunction(originalHashFunction) or inspect.ismethod(originalHashFunction):
                  values.append(originalHashFunction(instance))
              return hash(tuple(values))
  
          return hash_function