Exemple #1
0
    def parse_definition(self, parser):
        # add the base classes
        ast = parser.parse_declaration("class", "class")

        bases = []

        for base in self.__bases:
            namestr = base.content_[0].value

            # build a name object
            # TODO: work out if we can use base.refid in a pending_xref somewhere
            try:
                parser = cpp.DefinitionParser(namestr, self, self.env.config)
            except TypeError:
                # sphinx < 1.5
                parser = cpp.DefinitionParser(namestr, self)
            name = parser._parse_nested_name()
            parser.assert_end()

            bases.append(
                cpp.ASTBaseClass(name, base.prot, base.virt == 'virtual',
                                 False))

        ast.declaration.bases = bases

        return ast
Exemple #2
0
    def _parse_args(
            self, function_description: str
    ) -> Optional[cpp.ASTParametersQualifiers]:
        # Note: the caller must catch cpp.DefinitionError
        if function_description == "":
            return None

        parser = cpp.DefinitionParser(function_description,
                                      location=self.get_source_info(),
                                      config=self.config)
        paramQual = parser._parse_parameters_and_qualifiers(
            paramMode="function")

        # strip everything that doesn't contribute to overloading

        def stripParamQual(paramQual):
            paramQual.exceptionSpec = None
            paramQual.final = None
            paramQual.override = None
            # TODO: strip attrs when Doxygen handles them
            paramQual.initializer = None
            paramQual.trailingReturn = None
            for p in paramQual.args:
                if p.arg is None:
                    assert p.ellipsis
                    continue
                p.arg.init = None
                declarator = p.arg.type.decl

                def stripDeclarator(declarator):
                    if hasattr(declarator, "next"):
                        stripDeclarator(declarator.next)
                        if isinstance(declarator, cpp.ASTDeclaratorParen):
                            assert hasattr(declarator, "inner")
                            stripDeclarator(declarator.inner)
                    else:
                        assert isinstance(declarator,
                                          cpp.ASTDeclaratorNameParamQual)
                        assert hasattr(declarator, "declId")
                        declarator.declId = None
                        if declarator.paramQual is not None:
                            stripParamQual(declarator.paramQual)

                stripDeclarator(declarator)

        stripParamQual(paramQual)
        return paramQual
Exemple #3
0
    def _parse_args(self, function_description: str) -> Optional[cpp.ASTParametersQualifiers]:
        if function_description == '':
            return None

        parser = cpp.DefinitionParser(function_description,
                                      location=self.get_source_info(),
                                      config=self.config)
        paramQual = parser._parse_parameters_and_qualifiers(paramMode='function')
        # now erase the parameter names
        for p in paramQual.args:
            if p.arg is None:
                assert p.ellipsis
                continue
            declarator = p.arg.type.decl
            while hasattr(declarator, 'next'):
                declarator = declarator.next  # type: ignore
            assert hasattr(declarator, 'declId')
            declarator.declId = None  # type: ignore
            p.arg.init = None  # type: ignore
        return paramQual
Exemple #4
0
    def create_function_signature(self, node_stack, project_info, filter_,
                                  target_handler, mask_factory,
                                  directive_args):
        "Standard render process used by subclasses"

        try:
            object_renderer = SphinxRenderer(
                self.parser_factory.app,
                project_info,
                node_stack,
                self.state,
                self.state.document,
                target_handler,
                self.parser_factory.create_compound_parser(project_info),
                filter_,
            )
        except ParserError as e:
            return format_parser_error("doxygenclass", e.error, e.filename,
                                       self.state, self.lineno, True)
        except FileIOError as e:
            return format_parser_error("doxygenclass", e.error, e.filename,
                                       self.state, self.lineno)

        context = RenderContext(node_stack, mask_factory, directive_args)
        node = node_stack[0]
        with WithContext(object_renderer, context):
            # this part should be kept in sync with visit_function in sphinxrenderer
            name = node.get_name()
            # assume we are only doing this for C++ declarations
            declaration = ' '.join([
                object_renderer.create_template_prefix(node),
                ''.join(n.astext()
                        for n in object_renderer.render(node.get_type())),
                name,
                node.get_argsstring()
            ])
        parser = cpp.DefinitionParser(declaration,
                                      location=self.get_source_info(),
                                      config=self.config)
        ast = parser.parse_declaration('function', 'function')
        return str(ast)