docs: def generate(self, more_content=None, all_members=False):
          # type: (Any, str, bool, bool) -> None
          """Generate reST for the object given by *self.name*, and possibly for
          its members.
  
          If *more_content* is given, include that content.
          If *all_members* is True, document all members.
          """
          directive = getattr(self, 'directivetype', self.objtype)
  
          # parse components out of name
          (file, _, namepath) = self.name.rpartition(':')
          (contract_name, _, fullname) = namepath.partition('.')
          (name, _, paramtypes) = fullname.partition('(')
  
          # normalize components
          name = name.strip() or None
  
          if directive in ('contract', 'interface', 'library') and name is None:
              name = contract_name
              contract_name = None
  
          paramtypes = ','.join(ptype.strip() for ptype in paramtypes.split(','))
          paramtypes = re.sub(r'\s+', ' ', paramtypes)
          if paramtypes.endswith(')'):
              paramtypes = paramtypes[:-1]
  
          # build query
          expressions = [
              SolidityObject.objtype == directive,
              SolidityObject.name == name,
          ]
  
          if file:
              expressions.append(SolidityObject.file == file)
          if contract_name:
              expressions.append(SolidityObject.contract_name == contract_name)
          if paramtypes:
              expressions.append(SolidityObject.paramtypes == paramtypes)
  
          # get associated object
          query = SolidityObject.select().where(*expressions)
          sol_objects = tuple(query)
          if len(sol_objects) == 0:
              logger.warning('{} {} could not be found via query:\n{}'.format(
                  directive, self.name, ',\n'.join(
                      '  ' + str(expr.lhs.column_name) +
                      str(expr.op) + ('' if expr.rhs is None else expr.rhs)
                      for expr in expressions
                  )))
              return
          elif len(sol_objects) > 1:
              logger.warning('multiple candidates for {} {} found:\n{}'.format(
                  directive, self.name,
                  '\n'.join('  ' + obj.signature for obj in sol_objects)))
  
          self.object = sol_objects[0]
  
          # begin rendering output
          sourcename = self.get_sourcename()
  
          # make sure that the result starts with an empty line.  This is
          # necessary for some situations where another directive preprocesses
          # reST and no starting newline is present
          self.add_line('', sourcename)
  
          # generate the directive header and options, if applicable
          self.add_directive_header()
  
          # make sure content is indented
          # TODO: consider adding a source unit directive
          self.indent += self.content_indent
  
          # add all content (from docstrings, attribute docs etc.)
          self.add_content(more_content)
  
          # document members, if possible
          if directive in ('contract', 'interface', 'library'):
              self.add_line('', sourcename)
              self.document_members(all_members)