<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def document_members(self, all_members=False):
 # type: (bool) -> None """Generate reST for member documentation. If *all_members* is True, do all members, else those given by *self.options.members*. """

        sourcename = self.get_sourcename()

        want_all = all_members or self.options.members is ALL

        if not want_all and not self.options.members:
            return

        expressions = [
            SolidityObject.file == self.object.file,
            SolidityObject.contract_name == self.object.name
        ]

        if not want_all:
            members_inset = set()
            should_include_fallback = False
            should_include_constructor = False

            for member in self.options.members:
                if member == '<fallback>':
                    should_include_fallback = True
                elif member == 'constructor':
                    should_include_constructor = True
                elif member:
                    members_inset.add(member)

            expr = SolidityObject.name.in_(members_inset)
            if should_include_fallback:
                expr |= (SolidityObject.objtype == 'function') & (SolidityObject.name.is_null(True))
            if should_include_constructor:
                expr |= (SolidityObject.objtype == 'constructor') & (SolidityObject.name.is_null(True))

            expressions.append(expr)

        if self.options.exclude_members:
            should_exclude_fallback = False
            should_exclude_constructor = False

            if '<fallback>' in self.options.exclude_members:
                self.options.exclude_members.remove('<fallback>')
                should_exclude_fallback = True
            if 'constructor' in self.options.exclude_members:
                self.options.exclude_members.remove('constructor')
                should_exclude_constructor = True

            expr = SolidityObject.name.not_in(self.options.exclude_members)

            subexpr = SolidityObject.name.is_null(True)
            if should_exclude_fallback:
                subexpr &= (SolidityObject.objtype != 'function')
            if should_exclude_constructor:
                subexpr &= (SolidityObject.objtype != 'constructor')
            expr |= subexpr

            expressions.append(expr)

        for member in SolidityObject.select().where(*expressions):
            self.add_line('', sourcename)
            full_mname = '{file}:{contract}{name}{paramtypes}'.format(
                file=member.file,
                contract='' if member.contract_name is None
                else member.contract_name + '.',
                name=member.name or '',
                paramtypes='' if member.paramtypes is None
                else '(' + member.paramtypes + ')',
            )
            documenter = all_solidity_documenters[member.objtype](
                self.directive, full_mname, self.indent)
            documenter.generate(all_members=True)