Esempio n. 1
0
    def handle_signature(self, sig: str, signode: desc_signature) -> Tuple[str, str]:
        """Transform a DML signature into RST nodes.

        Return (fully qualified name of the thing, classname if any).
        """
 
        #relevant info: 
        (typ, name, arglist, annotations) = self.split_signature(sig)

        # determine class name as well as full name
        classname = self.env.ref_context.get('dml:class')
        if classname:
            # class name is not given in the signature
            fullname = classname + '.' + name
        else:
            # It is a class itself, so fullname = name
            classname = ""
            fullname = name
 
        signode['class'] = classname
        signode['fullname'] = fullname
          
        signode += addnodes.desc_annotation(str(typ), str(typ))
        signode += addnodes.desc_sig_space()
        signode += addnodes.desc_name(name, name)
        
        if arglist is not None:
                        
            # diff between None (no arguments) and [] (empty argument list, but brackets will be drawn)
            paramlist = addnodes.desc_parameterlist()
            for arg in arglist:
                
                if isinstance(arg, addnodes.pending_xref):
                    print("add pending xref")
                    paramlist += addnodes.desc_parameter('', '', arg)
                else:
                    paramlist += addnodes.desc_parameter(arg, arg)

            signode += paramlist
        
        if annotations:
            signode += addnodes.desc_sig_space()
            signode += addnodes.desc_sig_operator('', '[')
            addsepertor = False
            for anno in annotations:
                if addsepertor:
                    signode += addnodes.desc_sig_operator('', ',')
                    signode += addnodes.desc_sig_space()
                    
                signode += addnodes.desc_annotation(anno, anno)
                aaddseperator = True
                
            signode += addnodes.desc_sig_operator('', ']')
                           
        return fullname, classname
Esempio n. 2
0
def _parse_arglist(arglist: str) -> addnodes.desc_parameterlist:
    """Parse a list of arguments using AST parser"""
    params = addnodes.desc_parameterlist(arglist)
    sig = signature_from_str('(%s)' % arglist)
    last_kind = None
    for param in sig.parameters.values():
        if param.kind != param.POSITIONAL_ONLY and last_kind == param.POSITIONAL_ONLY:
            # PEP-570: Separator for Positional Only Parameter: /
            params += addnodes.desc_parameter(
                '', '', addnodes.desc_sig_operator('', '/'))
        if param.kind == param.KEYWORD_ONLY and last_kind in (
                param.POSITIONAL_OR_KEYWORD, param.POSITIONAL_ONLY, None):
            # PEP-3102: Separator for Keyword Only Parameter: *
            params += addnodes.desc_parameter(
                '', '', addnodes.desc_sig_operator('', '*'))

        node = addnodes.desc_parameter()
        if param.kind == param.VAR_POSITIONAL:
            node += addnodes.desc_sig_operator('', '*')
            node += addnodes.desc_sig_name('', param.name)
        elif param.kind == param.VAR_KEYWORD:
            node += addnodes.desc_sig_operator('', '**')
            node += addnodes.desc_sig_name('', param.name)
        else:
            node += addnodes.desc_sig_name('', param.name)

        if param.annotation is not param.empty:
            children = _parse_annotation(param.annotation)
            node += addnodes.desc_sig_punctuation('', ':')
            node += nodes.Text(' ')
            node += addnodes.desc_sig_name('', '', *children)  # type: ignore
        if param.default is not param.empty:
            if param.annotation is not param.empty:
                node += nodes.Text(' ')
                node += addnodes.desc_sig_operator('', '=')
                node += nodes.Text(' ')
            else:
                node += addnodes.desc_sig_operator('', '=')
            node += nodes.inline('',
                                 param.default,
                                 classes=['default_value'],
                                 support_smartquotes=False)

        params += node
        last_kind = param.kind

    if last_kind == Parameter.POSITIONAL_ONLY:
        # PEP-570: Separator for Positional Only Parameter: /
        params += addnodes.desc_parameter('', '',
                                          addnodes.desc_sig_operator('', '/'))

    return params
Esempio n. 3
0
def parse_frrfmt(env, text, node):
    from sphinx import addnodes

    m = frrfmt_re.match(text)
    if not m:
        logger.warning('could not parse frrfmt:: %r' % (text), location=node)
        node += addnodes.desc_name(text, text)
        return text

    spec, types = m.group('spec'), m.group('types')

    node += addnodes.desc_sig_operator('%', '%')
    node += addnodes.desc_name(spec + ' ', spec + ' ')
    plist = addnodes.desc_parameterlist()
    for typ in types.split(','):
        typ = typ.strip()
        plist += addnodes.desc_parameter(typ, typ)
    node += plist
    return '%' + spec