B
    \             V   @   sV  d Z ddlZddlmZ ddlmZmZ ddlmZ ddl	m
Z
mZ ddlmZ ddlmZ dd	lmZmZ dd
lmZ ddlmZmZ ddlmZ ddlmZ ddlmZmZ ddlm Z  ddl!m"Z" ddl#m$Z$ e%e&Z'e(dZ)e(dZ*e(dZ+e(dZ,e(dZ-e(dZ.e(dZ/e(dZ0e(dZ1e(dZ2e(dej3Z4e(dZ5e(dZ6e(dZ7d d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdugVZ8dvZ9dddwdxdygZ:dzdzd{d|d|d}d~d~ddd
Z;dddddddZ<ddddddddddddddddddddddddddddddddddddddddddd*Z=dddzdddddddddddd|d|d|ddd~d~d~d~dddddddddddddddĜ%Z>ddddddddddddRdddddddddddddddddddddddddddddddd+Z?dddddddddZ@dzdzddddZAdgdgdgdgdgddgdd ddgddgddgddd	gd
dggZBddddddddgZCdddddddddddgZDdddddZEG d d! d!e$eFZGG d"d# d#e$eFZHG d$d% d%e$eFZIG d&d' d'e$ZJd(d) ZKG d*d+ d+eJZLG d,d- d-eJZMG d.d/ d/eJZNG d0d1 d1eJZOG d2d3 d3eJZPG d4d5 d5eJZQG d6d7 d7eJZRG d8d9 d9eJZSG d:d; d;e$eFZTG d<d= d=eJZUG d>d? d?eJZVG d@dA dAeJZWG dBdC dCeJZXG dDdE dEeJZYG dFdG dGeJZZG dHdI dIeJZ[G dJdK dKeJZ\G dLdM dMeJZ]G dNdO dOeJZ^G dPdQ dQeJZ_G dRdS dSeJZ`G dTdU dUeJZaG dVdW dWeJZbG dXdY dYeJZcG dZd[ d[eJZdG d\d] d]eJZeG d^d_ d_eJZfG d`da daeJZgG dbdc dceJZhG ddde deeJZiG dfdg dgeJZjG dhdi dieJZkG djdk dkeJZlG dldm dmeJZmG dndo doeJZnG dpdq dqeJZoG drds dseJZpG dtdu dueJZqG dvdw dweJZrG dxdy dyeJZsG dzd{ d{eJZtG d|d} d}eJZuG d~d deJZvG dd deJZwG dd deJZxG dd deJZyG dd deJZzG dd dezZ{G dd dezZ|G dd dezZ}G dd deJZ~G dd deJZG dd deJZG dd deJZG dd deJZG dd deJZG dd deJZG dd deJZG dd deJZG dd deJZG dd deJZG dd deJZG dd deJZG dd deJZG dd deJZG dd deJZG dd deJZG dd deJZG dd deJZG dd deJZG dd deJZG dd deJZG dd deJZG dd deJZG dd deJZG dd deJZG ddÄ deJZG dĐdń deJZG dƐdǄ deJZG dȐdɄ deJZG dʐd˄ deJZG d̐d̈́ deZG dΐdτ deZG dАdф deZdҐdӄ ZG dԐdՄ deZG d֐dׄ deZG dؐdل deZG dڐdۄ deZG dܐd݄ deZG dސd߄ deZG dd deZG dd deZG dd deZG dd de ZG dd de ZG dd de ZG dd deZG dd deZG dd deZdd ZdS (  z
    sphinx.domains.cpp
    ~~~~~~~~~~~~~~~~~~

    The C++ language domain.

    :copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
    :license: BSD, see LICENSE for details.
    N)deepcopy)nodesutils)
directives)	iteritems	text_type)addnodes)ObjectDescription)DomainObjType)NoUri)___)XRefRole)logging)FieldGroupedField)SphinxDirective)make_refnode)UnicodeMixinz[1-9][0-9]*z0[0-7]*z0[xX][0-7a-fA-F][0-7a-fA-F]*z0[bB][01][01]* a;  (?x)
    [+-]?(
    # decimal
      ([0-9]+[eE][+-]?[0-9]+)
    | ([0-9]*\.[0-9]+([eE][+-]?[0-9]+)?)
    | ([0-9]+\.([eE][+-]?[0-9]+)?)
    # hex
    | (0[xX][0-9a-fA-F]+[pP][+-]?[0-9a-fA-F]+)
    | (0[xX][0-9a-fA-F]*\.[0-9a-fA-F]+([pP][+-]?[0-9a-fA-F]+)?)
    | (0[xX][0-9a-fA-F]+\.([pP][+-]?[0-9a-fA-F]+)?)
    )
z(?x)
    ((?:u8)|u|U|L)?
    '(
      (?:[^\\'])
    | (\\(
        (?:['"?\\abfnrtv])
      | (?:[0-7]{1,3})
      | (?:x[0-9a-fA-F]{2})
      | (?:u[0-9a-fA-F]{4})
      | (?:U[0-9a-fA-F]{8})
      ))
    )'
z(@[a-zA-Z0-9_])[a-zA-Z0-9_]*\ba
  (?x)
    (   # This 'extends' _anon_identifier_re with the ordinary identifiers,
        # make sure they are in sync.
        (~?\b[a-zA-Z_])  # ordinary identifiers
    |   (@[a-zA-Z0-9_])  # our extension for names of anonymous entities
    )
    [a-zA-Z0-9_]*\b
z(?u)\s+z>[LuU8]?('([^'\\]*(?:\\.[^'\\]*)*)'|"([^"\\]*(?:\\.[^"\\]*)*)")z\b(public|private|protected)\bz(?x)
        \[\s*\]
    |   \(\s*\)
    |   \+\+ | --
    |   ->\*? | \,
    |   (<<|>>)=? | && | \|\|
    |   [!<>=/*%+|&^~-]=?
zx(?x)
        ->\*    |    \.\*    |    \,
    |   (<<|>>)=?    |    &&    |    \|\|
    |   !=
    |   [<>=/*%+|&^~-]=?
ZalignasalignofandZand_eqZasmautoZbitandZbitorboolbreakZcaseZcatchcharchar16_tchar32_tclassZcomplconceptconst	constexpr
const_castcontinuedecltypedefaultdeleteZdodoubledynamic_castelseenumexplicitZexportexternfalsefloatforfriendZgotoifinlineintlongmutable	namespacenewnoexceptnotZnot_eqnullptroperatororZor_eqprivateZ	protectedpublicregisterreinterpret_castZrequiresreturnshortsignedsizeofstaticZstatic_assertstatic_caststructZswitchtemplatethisthread_localthrowtruetrytypedeftypeidtypenameunionunsignedusingvirtualvoidvolatilewchar_twhilexorZxor_eq   Z_CPPv2Z_CPPv3Z_CPPv4cCiUlLb)
r   zsigned charzunsigned charr4   z
signed intzunsigned intr5   zsigned longzunsigned longr   ZssosisZiosvm)zstd::stringzstd::ostreamzstd::istreamzstd::iostreamzstd::vectorzstd::mapznew-operatorznew-array-operatorzdelete-operatorzdelete-array-operatorzinv-operatorzadd-operatorzsub-operatorzmul-operatorzdiv-operatorzmod-operatorzand-operatorzor-operatorzxor-operatorzassign-operatorzadd-assign-operatorzsub-assign-operatorzmul-assign-operatorzdiv-assign-operatorzmod-assign-operatorzand-assign-operatorzor-assign-operatorzxor-assign-operatorzlshift-operatorzrshift-operatorzlshift-assign-operatorzrshift-assign-operatorzeq-operatorzneq-operatorzlt-operatorzgt-operatorzlte-operatorzgte-operatorznot-operatorzsand-operatorzsor-operatorzinc-operatorzdec-operatorzcomma-operatorzpointer-by-pointer-operatorzpointer-operatorzcall-operatorzsubscript-operator)*r8   znew[]r'   zdelete[]~+-*/%&|^=z+=z-=z*=z/=z%=z&=z|=z^=z<<z>>z<<=z>>=z==z!=<>z<=z>=!z&&z||z++z--,z->*z->z()z[]ahwZDiZDsstjxyfdeZDaDcZDn)%rV   r   r   zsigned charzunsigned charrX   r   r   rC   z	short intzsigned shortzsigned short intzunsigned shortzunsigned short intr4   rD   z
signed intrS   zunsigned intr5   zlong intzsigned longzsigned long intzunsigned longzunsigned long intz	long longzlong long intzsigned long longzsigned long long intzunsigned long longzunsigned long long intr/   r(   zlong doubler   zdecltype(auto)zstd::nullptr_tnwZnadldacoZplZmiZmlZdvZrmZanZeoZaSZpLZmIZmLZdVZrMZaNZoRZeOZlsZrsZlSZrSeqneltgtlegentZaaZooppmmcmZpmptclixZds)+r8   znew[]r'   zdelete[]rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   z+=z-=z*=z/=z%=z&=z|=z^=z<<z>>z<<=z>>=z==z!=rq   rr   z<=z>=rs   z&&z||z++z--rt   z->*z->z()z[]z.*Zpp_Zmm_ZdeZadZpsZng)z++z--rj   rm   rh   ri   rs   rg   )Nu8ur_   ra   z||z&&rn   ro   rm   z==z!=z<=z>=rq   rr   z<<z>>rh   ri   rj   rk   rl   z.*z->*z++z--rs   rg   rp   z*=z/=z%=z+=z-=z>>=z<<=z&=z^=z|=ZdcZscZccZrc)r)   rG   r#   rA   c               @   s   e Zd ZdddZdd ZdS )NoOldIdErrorr   c             C   s
   || _ d S )N)description)selfr    r   1lib/python3.7/site-packages/sphinx/domains/cpp.py__init__D  s    zNoOldIdError.__init__c             C   s   | j S )N)r   )r   r   r   r   __unicode__H  s    zNoOldIdError.__unicode__N)r   )__name__
__module____qualname__r   r   r   r   r   r   r   B  s   
r   c               @   s   e Zd Zdd Zdd ZdS )DefinitionErrorc             C   s
   || _ d S )N)r   )r   r   r   r   r   r   N  s    zDefinitionError.__init__c             C   s   | j S )N)r   )r   r   r   r   r   R  s    zDefinitionError.__unicode__N)r   r   r   r   r   r   r   r   r   r   M  s   r   c               @   s   e Zd Zdd Zdd ZdS )_DuplicateSymbolErrorc             C   s    |st |st || _|| _d S )N)AssertionErrorsymboldeclaration)r   r   r   r   r   r   r   X  s    z_DuplicateSymbolError.__init__c             C   s   d| j d S )Nz'Internal C++ duplicate symbol error:
%sr   )r   dump)r   r   r   r   r   _  s    z!_DuplicateSymbolError.__unicode__N)r   r   r   r   r   r   r   r   r   r   W  s   r   c               @   sH   e Zd Zdd Zdd ZdZdd Zdd	 Zd
d Zdd Z	dd Z
dS )ASTBasec             C   s\   t | t |k	rdS y.x(t| jD ]\}}|t||kr"dS q"W W n tk
rV   dS X dS )NFT)typer   __dict__getattrAttributeError)r   otherkeyvaluer   r   r   __eq__e  s    zASTBase.__eq__c             C   s   |  | S )N)r   )r   r   r   r   r   __ne__q  s    zASTBase.__ne__Nc             C   s   t | S )z#Clone a definition expression node.)r   )r   r   r   r   clonew  s    zASTBase.clonec             C   s   t t| d S )N)NotImplementedErrorrepr)r   	transformr   r   r   
_stringify|  s    zASTBase._stringifyc             C   s   |  dd S )Nc             S   s   t | S )N)r   )astr   r   r   <lambda>  s    z%ASTBase.__unicode__.<locals>.<lambda>)r   )r   r   r   r   r     s    zASTBase.__unicode__c             C   s   |  dd S )Nc             S   s   |   S )N)get_display_string)r   r   r   r   r     s    z,ASTBase.get_display_string.<locals>.<lambda>)r   )r   r   r   r   r     s    zASTBase.get_display_stringc             C   s   d| j j| f S )Nz<%s %s>)	__class__r   )r   r   r   r   __repr__  s    zASTBase.__repr__)r   r   r   r   r   __hash__r   r   r   r   r   r   r   r   r   r   d  s   r   c             C   s   | dkrt d|  d S )N)
lastIsName
noneIsNamemarkTypeparamz!Description mode '%s' is invalid.)	Exception)moder   r   r   _verify_description_mode  s    r   c               @   s$   e Zd Zdd Zdd Zdd ZdS )ASTCPPAttributec             C   s
   || _ d S )N)arg)r   r   r   r   r   r     s    zASTCPPAttribute.__init__c             C   s   d| j  d S )Nz[[z]])r   )r   r   r   r   r   r     s    zASTCPPAttribute._stringifyc             C   s   t | }|t|| d S )N)r   appendr   Text)r   signodetxtr   r   r   describe_signature  s    z"ASTCPPAttribute.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r     s   r   c               @   s   e Zd Zdd Zdd ZdS )ASTGnuAttributec             C   s   || _ || _d S )N)nameargs)r   r   r   r   r   r   r     s    zASTGnuAttribute.__init__c             C   s<   | j g}| jr2|d ||| j |d d|S )N()r   )r   r   r   join)r   r   resr   r   r   r     s    

zASTGnuAttribute._stringifyN)r   r   r   r   r   r   r   r   r   r     s   r   c               @   s$   e Zd Zdd Zdd Zdd ZdS )ASTGnuAttributeListc             C   s
   || _ d S )N)attrs)r   r   r   r   r   r     s    zASTGnuAttributeList.__init__c             C   sN   dg}d}x.| j D ]$}|s$|d d}||| qW |d d|S )Nz__attribute__((Tz, Fz))r   )r   r   r   )r   r   r   firstattrr   r   r   r     s    

zASTGnuAttributeList._stringifyc             C   s   t | }|t|| d S )N)r   r   r   r   )r   r   r   r   r   r   r     s    z&ASTGnuAttributeList.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r     s   r   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	ASTIdAttributez*For simple attributes defined by the user.c             C   s
   || _ d S )N)id)r   r   r   r   r   r     s    zASTIdAttribute.__init__c             C   s   | j S )N)r   )r   r   r   r   r   r     s    zASTIdAttribute._stringifyc             C   s   | t| j| j d S )N)r   r   r   r   )r   r   r   r   r   r     s    z!ASTIdAttribute.describe_signatureN)r   r   r   __doc__r   r   r   r   r   r   r   r     s   r   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	ASTParenAttributez)For paren attributes defined by the user.c             C   s   || _ || _d S )N)r   r   )r   r   r   r   r   r   r     s    zASTParenAttribute.__init__c             C   s   | j d | j d S )Nr   r   )r   r   )r   r   r   r   r   r     s    zASTParenAttribute._stringifyc             C   s   t | }|t|| d S )N)r   r   r   r   )r   r   r   r   r   r   r     s    z$ASTParenAttribute.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r     s   r   c               @   s$   e Zd Zdd Zdd Zdd ZdS )ASTPointerLiteralc             C   s   dS )Nr;   r   )r   r   r   r   r   r     s    zASTPointerLiteral._stringifyc             C   s   dS )NZLDnEr   )r   versionr   r   r   get_id  s    zASTPointerLiteral.get_idc             C   s   | td d S )Nr;   )r   r   r   )r   r   r   envr   r   r   r   r     s    z$ASTPointerLiteral.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r     s   r   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTBooleanLiteralc             C   s
   || _ d S )N)r   )r   r   r   r   r   r     s    zASTBooleanLiteral.__init__c             C   s   | j r
dS dS d S )NrM   r.   )r   )r   r   r   r   r   r     s    zASTBooleanLiteral._stringifyc             C   s   | j r
dS dS d S )NZL1EZL0E)r   )r   r   r   r   r   r     s    zASTBooleanLiteral.get_idc             C   s   | tt|  d S )N)r   r   r   r   )r   r   r   r   r   r   r   r   r   	  s    z$ASTBooleanLiteral.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r     s   r   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTNumberLiteralc             C   s
   || _ d S )N)data)r   r   r   r   r   r     s    zASTNumberLiteral.__init__c             C   s   | j S )N)r   )r   r   r   r   r   r     s    zASTNumberLiteral._stringifyc             C   s
   d| j  S )NzL%sE)r   )r   r   r   r   r   r     s    zASTNumberLiteral.get_idc             C   s   t | }|t|| d S )N)r   r   r   r   )r   r   r   r   r   r   r   r   r   r     s    z#ASTNumberLiteral.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r     s   r   c               @   s   e Zd Zdd ZdS )$UnsupportedMultiCharacterCharLiteralc             C   s
   || _ d S )N)decoded)r   r   r   r   r   r     s    z-UnsupportedMultiCharacterCharLiteral.__init__N)r   r   r   r   r   r   r   r   r     s   r   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTCharLiteralc             C   sT   || _ || _|tkstt| | _| d}t|dkrHt|| _	nt
|d S )Nzunicode-escape   )prefixr   _id_char_from_prefixr   r   encodedecodelenordr   r   )r   r   r   r   r   r   r   r   #  s    
zASTCharLiteral.__init__c             C   s0   | j d krd| j d S | j d | j d S d S )N')r   r   )r   r   r   r   r   r   /  s    
zASTCharLiteral._stringifyc             C   s   | j t| j S )N)r   strr   )r   r   r   r   r   r   5  s    zASTCharLiteral.get_idc             C   s   t | }|t|| d S )N)r   r   r   r   )r   r   r   r   r   r   r   r   r   r   8  s    z!ASTCharLiteral.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r   "  s   r   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTStringLiteralc             C   s
   || _ d S )N)r   )r   r   r   r   r   r   >  s    zASTStringLiteral.__init__c             C   s   | j S )N)r   )r   r   r   r   r   r   B  s    zASTStringLiteral._stringifyc             C   s   dt | jd  S )NzLA%d_KcE   )r   r   )r   r   r   r   r   r   E  s    zASTStringLiteral.get_idc             C   s   t | }|t|| d S )N)r   r   r   r   )r   r   r   r   r   r   r   r   r   r   I  s    z#ASTStringLiteral.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r   =  s   r   c               @   s$   e Zd Zdd Zdd Zdd ZdS )ASTThisLiteralc             C   s   dS )NrJ   r   )r   r   r   r   r   r   O  s    zASTThisLiteral._stringifyc             C   s   dS )NZfpTr   )r   r   r   r   r   r   R  s    zASTThisLiteral.get_idc             C   s   | td d S )NrJ   )r   r   r   )r   r   r   r   r   r   r   r   r   U  s    z!ASTThisLiteral.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   N  s   r   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTParenExprc             C   s
   || _ d S )N)expr)r   r   r   r   r   r   Z  s    zASTParenExpr.__init__c             C   s   d|| j  d S )Nr   r   )r   )r   r   r   r   r   r   ]  s    zASTParenExpr._stringifyc             C   s   | j |S )N)r   r   )r   r   r   r   r   r   `  s    zASTParenExpr.get_idc             C   s:   | tdd | j|||| | tdd d S )Nr   r   )r   r   r   r   r   )r   r   r   r   r   r   r   r   r   c  s    zASTParenExpr.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r   Y  s   r   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTFoldExprc             C   s*   |d k	s|d k	st || _|| _|| _d S )N)r   leftExprop	rightExpr)r   r   r   r   r   r   r   r   j  s    zASTFoldExpr.__init__c             C   s   dg}| j r@||| j  |d ||| j |d |d | jr|d ||| j |d ||| j |d d|S )Nr    z...r   r   )r   r   r   r   r   )r   r   r   r   r   r   r   q  s    





zASTFoldExpr._stringifyc             C   s   |dkst |dkrt| S g }| jd kr6|d n | jd krL|d n
|d |tt| j  | jr|| j| | jr|| j| d	|S )N   ZflfrZfLr   )
r   r   r   r   r   r   _id_operator_v2r   r   r   )r   r   r   r   r   r   r     s    


zASTFoldExpr.get_idc             C   s   | td | jrZ| j|||| | td | t| j | td | td | jr| td | t| j | td | j|||| | td d S )Nr   r   z...r   )r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r     s    zASTFoldExpr.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r   i  s   r   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTBinOpExprc             C   s8   t |dkstt |t |d ks(t|| _|| _d S )Nr   r   )r   r   exprsops)r   r   r   r   r   r   r     s    zASTBinOpExpr.__init__c             C   sx   g }| || jd  xTtdt| jD ]@}| d | | j|d   | d | || j|  q*W d|S )Nr   r   r   r   )r   r   ranger   r   r   )r   r   r   r^   r   r   r   r     s    

zASTBinOpExpr._stringifyc             C   sr   |dkst g }x@tt| jD ].}|t| j|   || j| | q W || jd | d|S )Nr   r   )	r   r   r   r   r   r   r   r   r   )r   r   r   r^   r   r   r   r     s    zASTBinOpExpr.get_idc             C   s   | j d |||| xhtdt| j D ]T}|td |t| j|d   |td | j | |||| q(W d S )Nr   r   r   )r   r   r   r   r   r   r   r   )r   r   r   r   r   r^   r   r   r   r     s    zASTBinOpExpr.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r     s   
	r   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTAssignmentExprc             C   s8   t |dkstt |t |d ks(t|| _|| _d S )Nr   r   )r   r   r   r   )r   r   r   r   r   r   r     s    zASTAssignmentExpr.__init__c             C   sx   g }| || jd  xTtdt| jD ]@}| d | | j|d   | d | || j|  q*W d|S )Nr   r   r   r   )r   r   r   r   r   r   )r   r   r   r^   r   r   r   r     s    

zASTAssignmentExpr._stringifyc             C   sf   g }x@t t| jD ].}|t| j|   || j| | qW || jd | d|S )Nr   r   )r   r   r   r   r   r   r   r   )r   r   r   r^   r   r   r   r     s    zASTAssignmentExpr.get_idc             C   s   | j d |||| xhtdt| j D ]T}|td |t| j|d   |td | j | |||| q(W d S )Nr   r   r   )r   r   r   r   r   r   r   r   )r   r   r   r   r   r^   r   r   r   r     s    z$ASTAssignmentExpr.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r     s   
r   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTCastExprc             C   s   || _ || _d S )N)typr   )r   r   r   r   r   r   r     s    zASTCastExpr.__init__c             C   s:   dg}| || j | d | || j d|S )Nr   r   r   )r   r   r   r   )r   r   r   r   r   r   r     s
    
zASTCastExpr._stringifyc             C   s   d| j | | j| S )Ncv)r   r   r   )r   r   r   r   r   r     s    zASTCastExpr.get_idc             C   sH   | td | j|||| | td | j|||| d S )Nr   r   )r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r     s    zASTCastExpr.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r     s   r   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTUnaryOpExprc             C   s   || _ || _d S )N)r   r   )r   r   r   r   r   r   r     s    zASTUnaryOpExpr.__init__c             C   s   || j || j S )N)r   r   )r   r   r   r   r   r     s    zASTUnaryOpExpr._stringifyc             C   s   t | j | j| S )N)_id_operator_unary_v2r   r   r   )r   r   r   r   r   r   	  s    zASTUnaryOpExpr.get_idc             C   s(   | t| j | j|||| d S )N)r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r     s    z!ASTUnaryOpExpr.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r     s   r   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTSizeofParamPackc             C   s
   || _ d S )N)
identifier)r   r  r   r   r   r     s    zASTSizeofParamPack.__init__c             C   s   d|| j  d S )Nz
sizeof...(r   )r  )r   r   r   r   r   r     s    zASTSizeofParamPack._stringifyc             C   s   d| j | S )NZsZ)r  r   )r   r   r   r   r   r     s    zASTSizeofParamPack.get_idc             C   s<   | td | jj||||ddd | td d S )Nz
sizeof...(r   )r   r   templateArgsr   )r   r   r   r  r   )r   r   r   r   r   r   r   r   r     s    z%ASTSizeofParamPack.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r    s   r  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTSizeofTypec             C   s
   || _ d S )N)r   )r   r   r   r   r   r   #  s    zASTSizeofType.__init__c             C   s   d|| j  d S )Nzsizeof(r   )r   )r   r   r   r   r   r   &  s    zASTSizeofType._stringifyc             C   s   d| j | S )Nst)r   r   )r   r   r   r   r   r   )  s    zASTSizeofType.get_idc             C   s6   | td | j|||| | td d S )Nzsizeof(r   )r   r   r   r   r   )r   r   r   r   r   r   r   r   r   ,  s    z ASTSizeofType.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r  "  s   r  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTSizeofExprc             C   s
   || _ d S )N)r   )r   r   r   r   r   r   3  s    zASTSizeofExpr.__init__c             C   s   d|| j  S )Nzsizeof )r   )r   r   r   r   r   r   6  s    zASTSizeofExpr._stringifyc             C   s   d| j | S )NZsz)r   r   )r   r   r   r   r   r   9  s    zASTSizeofExpr.get_idc             C   s&   | td | j|||| d S )Nzsizeof )r   r   r   r   r   )r   r   r   r   r   r   r   r   r   <  s    z ASTSizeofExpr.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r  2  s   r  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTAlignofExprc             C   s
   || _ d S )N)r   )r   r   r   r   r   r   B  s    zASTAlignofExpr.__init__c             C   s   d|| j  d S )Nzalignof(r   )r   )r   r   r   r   r   r   E  s    zASTAlignofExpr._stringifyc             C   s   d| j | S )NZat)r   r   )r   r   r   r   r   r   H  s    zASTAlignofExpr.get_idc             C   s6   | td | j|||| | td d S )Nzalignof(r   )r   r   r   r   r   )r   r   r   r   r   r   r   r   r   K  s    z!ASTAlignofExpr.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r  A  s   r  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTNoexceptExprc             C   s
   || _ d S )N)r   )r   r   r   r   r   r   R  s    zASTNoexceptExpr.__init__c             C   s   d|| j  d S )Nz	noexcept(r   )r   )r   r   r   r   r   r   U  s    zASTNoexceptExpr._stringifyc             C   s   d| j | S )NZnx)r   r   )r   r   r   r   r   r   X  s    zASTNoexceptExpr.get_idc             C   s6   | td | j|||| | td d S )Nz	noexcept(r   )r   r   r   r   r   )r   r   r   r   r   r   r   r   r   [  s    z"ASTNoexceptExpr.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r  Q  s   r  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )

ASTNewExprc             C   s:   || _ || _|| _|| _|| _| jd k	r6| jdks6td S )Nz)})rootedisNewTypeIdr   initListinitTyper   )r   r
  r  r   r  r  r   r   r   r   b  s    
zASTNewExpr.__init__c             C   s   g }| j r|d |d | jr6||| j nds>t| jd k	r| jdkr\|d d}x.| jD ]$}|sz|d d}||| qhW || j d|S )	Nz::znew Fr   r   Tz, r   )r
  r   r  r   r   r  r  r   )r   r   r   r   r   r   r   r   r   l  s$    





zASTNewExpr._stringifyc             C   s   dg}| d | | j| | jd k	rv| jdkrl| d x| jD ]}| || qHW | d qdstn
| d d|S )Nr   r   r   ZpiEFr   )r   r   r   r  r  r   r   )r   r   r   r   r   r   r   r     s    





zASTNewExpr.get_idc             C   s   | j r|td |td | jr@| j|||| ndsHt| jd k	r| j	dkr|td d}x6| jD ],}|s|td d}||||| qxW |td ndstd S )Nz::znew Fr   r   Tz, )
r
  r   r   r   r  r   r   r   r  r  )r   r   r   r   r   r   r   r   r   r   r     s"    

zASTNewExpr.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r	  a  s   
r	  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTDeleteExprc             C   s   || _ || _|| _d S )N)r
  arrayr   )r   r
  r  r   r   r   r   r     s    zASTDeleteExpr.__init__c             C   sH   g }| j r|d |d | jr.|d ||| j d|S )Nz::zdelete z[] r   )r
  r   r  r   r   )r   r   r   r   r   r   r     s    


zASTDeleteExpr._stringifyc             C   s    | j rd}nd}|| j| S )Nr   r   )r  r   r   )r   r   r   r   r   r   r     s    zASTDeleteExpr.get_idc             C   sR   | j r|td |td | jr<|td | j|||| d S )Nz::zdelete z[] )r
  r   r   r   r  r   r   )r   r   r   r   r   r   r   r   r     s    z ASTDeleteExpr.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r    s   
r  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTExplicitCastc             C   s"   |t kst|| _|| _|| _d S )N)_id_explicit_castr   castr   r   )r   r  r   r   r   r   r   r     s    zASTExplicitCast.__init__c             C   sP   | j g}|d ||| j |d ||| j |d d|S )Nrq   z>(r   r   )r  r   r   r   r   )r   r   r   r   r   r   r     s    


zASTExplicitCast._stringifyc             C   s"   t | j | j| | j| S )N)r  r  r   r   r   )r   r   r   r   r   r     s    zASTExplicitCast.get_idc             C   sz   | t| j | td | j|||| | td | td | j|||| | td d S )Nrq   rr   r   r   )r   r   r   r  r   r   r   )r   r   r   r   r   r   r   r   r     s    z"ASTExplicitCast.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r    s   	r  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
	ASTTypeIdc             C   s   || _ || _d S )N)
typeOrExprisType)r   r  r  r   r   r   r     s    zASTTypeId.__init__c             C   s   d|| j  d S )Nztypeid(r   )r  )r   r   r   r   r   r     s    zASTTypeId._stringifyc             C   s   | j r
dnd}|| j| S )NZtiZte)r  r  r   )r   r   r   r   r   r   r     s    zASTTypeId.get_idc             C   sF   | td | td | j|||| | td d S )NrP   r   r   )r   r   r   r  r   )r   r   r   r   r   r   r   r   r     s    zASTTypeId.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r    s   r  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTPostfixCallExprc             C   s
   || _ d S )N)r   )r   r   r   r   r   r     s    zASTPostfixCallExpr.__init__c             C   sN   dg}d}x.| j D ]$}|s$|d d}||| qW |d d|S )Nr   Tz, Fr   r   )r   r   r   )r   r   r   r   r   r   r   r   r     s    

zASTPostfixCallExpr._stringifyc             C   s<   d|g}x| j D ]}||| qW |d d|S )Nr   r  r   )r   r   r   r   )r   idPrefixr   r   r   r   r   r   r     s
    
zASTPostfixCallExpr.get_idc             C   s`   | td d}x6| jD ],}|s4| td d}||||| qW | td d S )Nr   Tz, Fr   )r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r     s    z%ASTPostfixCallExpr.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r    s   r  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTPostfixArrayc             C   s
   || _ d S )N)r   )r   r   r   r   r   r     s    zASTPostfixArray.__init__c             C   s   d|| j  d S )N[])r   )r   r   r   r   r   r   "  s    zASTPostfixArray._stringifyc             C   s   d| | j | S )Nr   )r   r   )r   r  r   r   r   r   r   %  s    zASTPostfixArray.get_idc             C   s6   | td | j|||| | td d S )Nr  r  )r   r   r   r   r   )r   r   r   r   r   r   r   r   r   (  s    z"ASTPostfixArray.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r    s   r  c               @   s$   e Zd Zdd Zdd Zdd ZdS )ASTPostfixIncc             C   s   dS )Nz++r   )r   r   r   r   r   r   /  s    zASTPostfixInc._stringifyc             C   s   d| S )Nr   r   )r   r  r   r   r   r   r   2  s    zASTPostfixInc.get_idc             C   s   | td d S )Nz++)r   r   r   )r   r   r   r   r   r   r   r   r   5  s    z ASTPostfixInc.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r  .  s   r  c               @   s$   e Zd Zdd Zdd Zdd ZdS )ASTPostfixDecc             C   s   dS )Nz--r   )r   r   r   r   r   r   :  s    zASTPostfixDec._stringifyc             C   s   d| S )Nr   r   )r   r  r   r   r   r   r   =  s    zASTPostfixDec.get_idc             C   s   | td d S )Nz--)r   r   r   )r   r   r   r   r   r   r   r   r   @  s    z ASTPostfixDec.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r  9  s   r  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTPostfixMemberc             C   s
   || _ d S )N)r   )r   r   r   r   r   r   E  s    zASTPostfixMember.__init__c             C   s   d|| j  S )N.)r   )r   r   r   r   r   r   H  s    zASTPostfixMember._stringifyc             C   s   d| | j | S )NZdt)r   r   )r   r  r   r   r   r   r   K  s    zASTPostfixMember.get_idc             C   s&   | td | j|d|| d S )Nr  r   )r   r   r   r   r   )r   r   r   r   r   r   r   r   r   N  s    z#ASTPostfixMember.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r  D  s   r  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTPostfixMemberOfPointerc             C   s
   || _ d S )N)r   )r   r   r   r   r   r   T  s    z"ASTPostfixMemberOfPointer.__init__c             C   s   d|| j  S )Nz->)r   )r   r   r   r   r   r   W  s    z$ASTPostfixMemberOfPointer._stringifyc             C   s   d| | j | S )Nr   )r   r   )r   r  r   r   r   r   r   Z  s    z ASTPostfixMemberOfPointer.get_idc             C   s&   | td | j|d|| d S )Nz->r   )r   r   r   r   r   )r   r   r   r   r   r   r   r   r   ]  s    z,ASTPostfixMemberOfPointer.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r   S  s   r   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTPostfixExprc             C   s    t |dkst|| _|| _d S )Nr   )r   r   r   	postFixes)r   r   r"  r   r   r   r   c  s    zASTPostfixExpr.__init__c             C   s4   || j g}x| jD ]}||| qW d|S )Nr   )r   r"  r   r   )r   r   r   pr   r   r   r   h  s    zASTPostfixExpr._stringifyc             C   s,   | j |}x| jD ]}|||}qW |S )N)r   r   r"  )r   r   r   r#  r   r   r   r   n  s    zASTPostfixExpr.get_idc             C   s6   | j |||| x| jD ]}||||| qW d S )N)r   r   r"  )r   r   r   r   r   r#  r   r   r   r   t  s    z!ASTPostfixExpr.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r!  b  s   r!  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTPackExpansionExprc             C   s
   || _ d S )N)r   )r   r   r   r   r   r   {  s    zASTPackExpansionExpr.__init__c             C   s   || j d S )Nz...)r   )r   r   r   r   r   r   ~  s    zASTPackExpansionExpr._stringifyc             C   s   | j |}d| S )Nsp)r   r   )r   r   r   r   r   r   r     s    zASTPackExpansionExpr.get_idc             C   s$   | j |||| |td7 }d S )Nz...)r   r   r   r   )r   r   r   r   r   r   r   r   r     s    z'ASTPackExpansionExpr.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r$  z  s   r$  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTFallbackExprc             C   s
   || _ d S )N)r   )r   r   r   r   r   r     s    zASTFallbackExpr.__init__c             C   s   | j S )N)r   )r   r   r   r   r   r     s    zASTFallbackExpr._stringifyc             C   s
   t | jS )N)r   r   )r   r   r   r   r   r     s    zASTFallbackExpr.get_idc             C   s   |t | j7 }d S )N)r   r   r   )r   r   r   r   r   r   r   r   r     s    z"ASTFallbackExpr.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r&    s   r&  c               @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )ASTIdentifierc             C   s&   |d k	st t|dkst || _d S )Nr   )r   r   r  )r   r  r   r   r   r     s    zASTIdentifier.__init__c             C   s   | j d dkS )Nr   @)r  )r   r   r   r   is_anon  s    zASTIdentifier.is_anonc             C   s   |   r|dk rt |dkr2| jdkr,dS | jS | jdkr@dS | jd dkrRd	S |   rzd
t| jd | jdd  f S tt| j| j S d S )Nr   r   Zsize_trx   stdZStr   rg   ZD0zUt%d_%s)r)  r   r  r   r   )r   r   r   r   r   r     s    

 zASTIdentifier.get_idc             C   s   | j S )N)r  )r   r   r   r   r     s    zASTIdentifier.__unicode__c             C   s   |   rdS | jS )Nz[anonymous])r)  r  )r   r   r   r   r     s    z ASTIdentifier.get_display_stringc       
      C   s   t | |dkrx|| j | }tjddd|d d d}| }	|	|d< |  r^|tjdd7 }n|t| j7 }||7 }nx|d	kr|  r|tjdd7 }q|t	| j| j7 }n@|d
kr|  r|tjdd7 }q|t| j7 }nt
d| d S )Nr   r   cppr  )Z	refdomainreftype	reftargetmodnameZ	classnamezcpp:parent_keyz[anonymous])textr   r   zUnknown description mode: %s)r   r  r   Zpending_xrefget_lookup_keyr)  r   Zstrongr   	desc_namer   )
r   r   r   r   r   r  r   Z
targetTextpnoder   r   r   r   r     s,    
z ASTIdentifier.describe_signatureN)	r   r   r   r   r)  r   r   r   r   r   r   r   r   r'    s   r'  c               @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS ) ASTTemplateKeyParamPackIdDefaultc             C   s4   |st |r|d kst || _|| _|| _|| _d S )N)r   r   r  parameterPackr&   )r   r   r  r4  r&   r   r   r   r     s    z)ASTTemplateKeyParamPackIdDefault.__init__c             C   s   | j S )N)r  )r   r   r   r   get_identifier  s    z/ASTTemplateKeyParamPackIdDefault.get_identifierc             C   s6   |dkst g }| jr"|d n
|d d|S )Nr   Dp0r   )r   r4  r   r   )r   r   r   r   r   r   r     s    
z'ASTTemplateKeyParamPackIdDefault.get_idc             C   sx   | j g}| jr(| jr|d |d | jrN| js>|d ||| j | jrn|d ||| j d|S )Nr   z...z = r   )r   r4  r  r   r&   r   )r   r   r   r   r   r   r     s    



z+ASTTemplateKeyParamPackIdDefault._stringifyc             C   s   |t | j7 }| jr8| jr*|t d7 }|t d7 }| jrh| jsR|t d7 }| j|||dd| | jr|t d7 }| j|d|| d S )Nr   z...r   z = r   )r   r   r   r4  r  r   r&   )r   r   r   r   r   r   r   r   r     s    z3ASTTemplateKeyParamPackIdDefault.describe_signatureN)r   r   r   r   r5  r   r   r   r   r   r   r   r3    s
   
r3  c               @   sN   e Zd Zdd Zedd Zedd Zdd Zdd
dZdd Z	dd Z
d	S )ASTTemplateParamTypec             C   s   |st || _d S )N)r   r   )r   r   r   r   r   r     s    zASTTemplateParamType.__init__c             C   s    |   }tt|d gdgddS )NF)r
  )r5  ASTNestedNameASTNestedNameElement)r   r   r   r   r   r   !  s    zASTTemplateParamType.namec             C   s   | j jS )N)r   r4  )r   r   r   r   isPack'  s    zASTTemplateParamType.isPackc             C   s
   | j  S )N)r   r5  )r   r   r   r   r5  +  s    z#ASTTemplateParamType.get_identifierNc             C   s2   |dkst |r"|jjj|ddS | j|S d S )Nr   F)prefixed)r   parentr   r   r   )r   r   
objectTyper   r   r   r   r   /  s    zASTTemplateParamType.get_idc             C   s
   || j S )N)r   )r   r   r   r   r   r   9  s    zASTTemplateParamType._stringifyc             C   s   | j |||| d S )N)r   r   )r   r   r   r   r   r   r   r   r   <  s    z'ASTTemplateParamType.describe_signature)NN)r   r   r   r   propertyr   r;  r5  r   r   r   r   r   r   r   r8    s   

r8  c               @   sF   e Zd Zdd Zedd Zedd Zddd	Zd
d Zdd Z	dS )'ASTTemplateParamConstrainedTypeWithInitc             C   s   |st || _|| _d S )N)r   r   init)r   r   rA  r   r   r   r   B  s    z0ASTTemplateParamConstrainedTypeWithInit.__init__c             C   s   | j jS )N)r   r   )r   r   r   r   r   H  s    z,ASTTemplateParamConstrainedTypeWithInit.namec             C   s   | j jS )N)r   r;  )r   r   r   r   r;  M  s    z.ASTTemplateParamConstrainedTypeWithInit.isPackNc             C   s2   |dkst |r"|jjj|ddS | j|S d S )Nr   F)r<  )r   r=  r   r   r   )r   r   r>  r   r   r   r   r   Q  s    z.ASTTemplateParamConstrainedTypeWithInit.get_idc             C   s*   || j }| jr&|d7 }||| j7 }|S )Nz = )r   rA  )r   r   r   r   r   r   r   [  s
    
z2ASTTemplateParamConstrainedTypeWithInit._stringifyc             C   s<   | j |||| | jr8|td7 }| j|||| d S )Nz = )r   r   rA  r   r   )r   r   r   r   r   r   r   r   r   b  s    z:ASTTemplateParamConstrainedTypeWithInit.describe_signature)NN)
r   r   r   r   r?  r   r;  r   r   r   r   r   r   r   r@  A  s   

r@  c               @   sN   e Zd Zdd Zedd Zedd Zdd Zdd
dZdd Z	dd Z
d	S )ASTTemplateParamTemplateTypec             C   s    |st |st || _|| _d S )N)r   nestedParamsr   )r   rC  r   r   r   r   r   k  s    z%ASTTemplateParamTemplateType.__init__c             C   s    |   }tt|d gdgddS )NF)r
  )r5  r9  r:  )r   r   r   r   r   r   r  s    z!ASTTemplateParamTemplateType.namec             C   s   | j jS )N)r   r4  )r   r   r   r   r;  x  s    z#ASTTemplateParamTemplateType.isPackc             C   s
   | j  S )N)r   r5  )r   r   r   r   r5  |  s    z+ASTTemplateParamTemplateType.get_identifierNc             C   s>   |dkst |r"|jjj|d dS | j|| j| S d S )Nr   )r<  )r   r=  r   r   rC  r   )r   r   r>  r   r   r   r   r     s    z#ASTTemplateParamTemplateType.get_idc             C   s   || j || j S )N)rC  r   )r   r   r   r   r   r     s    z'ASTTemplateParamTemplateType._stringifyc             C   s6   | j |d|| |td7 }| j|||| d S )Nr   r   )rC  r   r   r   r   )r   r   r   r   r   r   r   r   r     s    z/ASTTemplateParamTemplateType.describe_signature)NN)r   r   r   r   r?  r   r;  r5  r   r   r   r   r   r   r   rB  j  s   

rB  c               @   sN   e Zd Zdd Zedd Zedd Zdd Zdd
dZdd Z	dd Z
d	S )ASTTemplateParamNonTypec             C   s   |st || _d S )N)r   r   )r   r   r   r   r   r     s    z ASTTemplateParamNonType.__init__c             C   s    |   }tt|d gdgddS )NF)r
  )r5  r9  r:  )r   r   r   r   r   r     s    zASTTemplateParamNonType.namec             C   s   | j jS )N)r   r;  )r   r   r   r   r;    s    zASTTemplateParamNonType.isPackc             C   sR   | j j}|rJt|jdkst|jd js.t|jd jr>t|jd jS d S d S )Nr   r   )r   r   r   namesr   	identOrOpr  )r   r   r   r   r   r5    s    z&ASTTemplateParamNonType.get_identifierNc             C   s6   |dkst |r"|jjj|d dS d| j| S d S )Nr   )r<  r   )r   r=  r   r   r   )r   r   r>  r   r   r   r   r     s    zASTTemplateParamNonType.get_idc             C   s
   || j S )N)r   )r   r   r   r   r   r     s    z"ASTTemplateParamNonType._stringifyc             C   s   | j |||| d S )N)r   r   )r   r   r   r   r   r   r   r   r     s    z*ASTTemplateParamNonType.describe_signature)NN)r   r   r   r   r?  r   r;  r5  r   r   r   r   r   r   r   rD    s   

rD  c               @   s.   e Zd Zdd Zdd Zdd Zd
dd	ZdS )ASTTemplateParamsc             C   s   |d k	st || _d| _d S )NF)r   paramsisNested)r   rH  r   r   r   r     s    zASTTemplateParams.__init__c             C   sN   |dkst g }|d x| jD ]}||| q"W |d d|S )Nr   Ir  r   )r   r   rH  r   r   )r   r   r   r   r   r   r   r     s    

zASTTemplateParams.get_idc                sB   g }| d | d fdd| jD  | d d|S )Nz	template<z, c             3   s   | ]} |V  qd S )Nr   ).0ru   )r   r   r   	<genexpr>  s    z/ASTTemplateParams._stringify.<locals>.<genexpr>z> r   )r   r   rH  )r   r   r   r   )r   r   r     s
    
 
zASTTemplateParams._stringifyNc       
      C   s   |fdd}| j r|}n| }|td7 }d}x>| jD ]4}	|sN|td7 }d}|r\| }|	|||| q8W |r~|s~| }|td7 }d S )Nc             S   s   t  }| |7 } d|_|S )NtemplateParams)r   desc_signature_linesphinx_cpp_tagname)
parentNoder   r   r   r   makeLine  s    z6ASTTemplateParams.describe_signature.<locals>.makeLinez	template<Tz, Frr   )rI  r   r   rH  r   )
r   rP  r   r   r   lineSpecrQ  ZlineNoder   r   r   r   r   r     s     z$ASTTemplateParams.describe_signature)N)r   r   r   r   r   r   r   r   r   r   r   rG    s   
rG  c               @   sV   e Zd Zdd Zedd Zedd Zdd Zdd
dZdd Z	dd Z
dd Zd	S ) ASTTemplateIntroductionParameterc             C   s   || _ || _d S )N)r  r4  )r   r  r4  r   r   r   r     s    z)ASTTemplateIntroductionParameter.__init__c             C   s    |   }tt|d gdgddS )NF)r
  )r5  r9  r:  )r   r   r   r   r   r     s    z%ASTTemplateIntroductionParameter.namec             C   s   | j S )N)r4  )r   r   r   r   r;    s    z'ASTTemplateIntroductionParameter.isPackc             C   s   | j S )N)r  )r   r   r   r   r5    s    z/ASTTemplateIntroductionParameter.get_identifierNc             C   s4   |dkst |r"|jjj|d dS | jr,dS dS d S )Nr   )r<  r6  r7  )r   r=  r   r   r4  )r   r   r>  r   r   r   r   r     s    z'ASTTemplateIntroductionParameter.get_idc             C   s.   |dkst | j|}| jr&d| S |S d S )Nr   r%  )r   r  r   r4  )r   r   r   r   r   r   get_id_as_arg  s
    z.ASTTemplateIntroductionParameter.get_id_as_argc             C   s.   g }| j r|d ||| j d|S )Nz...r   )r4  r   r  r   )r   r   r   r   r   r   r     s
    
z+ASTTemplateIntroductionParameter._stringifyc             C   s.   | j r|td7 }| j|||dd| d S )Nz...r   )r4  r   r   r  r   )r   r   r   r   r   r   r   r   r   %  s    z3ASTTemplateIntroductionParameter.describe_signature)NN)r   r   r   r   r?  r   r;  r5  r   rT  r   r   r   r   r   r   rS    s   

rS  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTTemplateIntroductionc             C   s    t |dkst|| _|| _d S )Nr   )r   r   r    rH  )r   r    rH  r   r   r   r   -  s    z ASTTemplateIntroduction.__init__c             C   s   |dkst g }|d x| jD ]}||| q"W |d |d || j| |d x| jD ]}||| qrW |d |d d|S )Nr   rJ  r  Xr   )r   r   rH  r   r    rT  r   )r   r   r   r   r   r   r   r   3  s    





zASTTemplateIntroduction.get_idc                sR   g }|  | j | d | d fdd| jD  | d d|S )N{z, c             3   s   | ]} |V  qd S )Nr   )rK  r   )r   r   r   rL  J  s    z5ASTTemplateIntroduction._stringify.<locals>.<genexpr>z} r   )r   r    r   rH  )r   r   r   r   )r   r   r   F  s    
 
z"ASTTemplateIntroduction._stringifyc       	      C   s   t  }||7 }d|_| j|d|| |td7 }d}x4| jD ]*}|sX|td7 }d}||||| qBW |td7 }d S )NZtemplateIntroductionr   rW  Tz, F})r   rN  rO  r    r   r   r   rH  )	r   rP  r   r   r   rR  r   r   r   r   r   r   r   N  s    z*ASTTemplateIntroduction.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   rU  ,  s   rU  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTTemplateDeclarationPrefixc             C   s
   || _ d S )N)	templates)r   rZ  r   r   r   r   `  s    z%ASTTemplateDeclarationPrefix.__init__c             C   s:   |dkst g }x| jD ]}||| qW d|S )Nr   r   )r   rZ  r   r   r   )r   r   r   ry   r   r   r   r   e  s
    z#ASTTemplateDeclarationPrefix.get_idc             C   s,   g }x| j D ]}||| qW d|S )Nr   )rZ  r   r   )r   r   r   ry   r   r   r   r   n  s    z'ASTTemplateDeclarationPrefix._stringifyc             C   s.   t | x | jD ]}||d||| qW d S )Nr   )r   rZ  r   )r   r   r   r   r   rR  ry   r   r   r   r   t  s    z/ASTTemplateDeclarationPrefix.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   rY  _  s   	rY  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTOperatorc             C   s   dS )NFr   )r   r   r   r   r)    s    zASTOperator.is_anonc             C   s   dS )NTr   )r   r   r   r   is_operator  s    zASTOperator.is_operatorc             C   s
   t  d S )N)r   )r   r   r   r   r   r     s    zASTOperator.get_idc             C   s>   t | t| }|dkr*|t||7 }n|t||7 }d S )Nr   )r   r   r   r1  desc_addname)r   r   r   r   r   r  r   r  r   r   r   r     s
    zASTOperator.describe_signatureN)r   r   r   r)  r\  r   r   r   r   r   r   r[  ~  s   r[  c               @   s$   e Zd Zdd Zdd Zdd ZdS )ASTOperatorBuildInc             C   s
   || _ d S )N)r   )r   r   r   r   r   r     s    zASTOperatorBuildIn.__init__c             C   s4   |dkrt }nt}| j|kr*td| j || j S )Nr   zBInternal error: Build-in operator "%s" can not be mapped to an id.)_id_operator_v1r   r   r   )r   r   idsr   r   r   r     s    

zASTOperatorBuildIn.get_idc             C   s"   | j dkrd| j  S d| j  S d S )N)r8   znew[]r'   zdelete[]z	operator r<   )r   )r   r   r   r   r   r     s    

zASTOperatorBuildIn._stringifyN)r   r   r   r   r   r   r   r   r   r   r^    s   r^  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTOperatorTypec             C   s
   || _ d S )N)r   )r   r   r   r   r   r     s    zASTOperatorType.__init__c             C   s,   |dkrd| j | S d| j | S d S )Nr   zcastto-%s-operatorr   )r   r   )r   r   r   r   r   r     s    zASTOperatorType.get_idc             C   s   d d|| jgS )Nr   z	operator )r   r   )r   r   r   r   r   r     s    zASTOperatorType._stringifyc             C   s   t | S )N)r   )r   r   r   r   get_name_no_template  s    z$ASTOperatorType.get_name_no_templateN)r   r   r   r   r   r   rb  r   r   r   r   ra    s   ra  c               @   s$   e Zd Zdd Zdd Zdd ZdS )ASTOperatorLiteralc             C   s
   || _ d S )N)r  )r   r  r   r   r   r     s    zASTOperatorLiteral.__init__c             C   s$   |dkrt  nd| j| S d S )Nr   Zli)r   r  r   )r   r   r   r   r   r     s    zASTOperatorLiteral.get_idc             C   s   d|| j  S )Nz
operator"")r  )r   r   r   r   r   r     s    zASTOperatorLiteral._stringifyN)r   r   r   r   r   r   r   r   r   r   rc    s   rc  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTTemplateArgConstantc             C   s
   || _ d S )N)r   )r   r   r   r   r   r     s    zASTTemplateArgConstant.__init__c             C   s
   || j S )N)r   )r   r   r   r   r   r     s    z!ASTTemplateArgConstant._stringifyc             C   sD   |dkrt | ddS |dkr0dt |  d S d| j| d S )Nr   r   ri   r   rV  r  )r   replacer   r   )r   r   r   r   r   r     s
    zASTTemplateArgConstant.get_idc             C   s   t | | j|||| d S )N)r   r   r   )r   r   r   r   r   r   r   r   r     s    z)ASTTemplateArgConstant.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   rd    s   rd  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTTemplateArgsc             C   s   |d k	st || _d S )N)r   r   )r   r   r   r   r   r     s    zASTTemplateArgs.__init__c                s    dkrJg }| d | d fdd| jD  | d d|S g }| d x| jD ]}| |  q`W | d d|S )	Nr   :r  c             3   s   | ]}|  V  qd S )N)r   )rK  ru   )r   r   r   rL    s    z)ASTTemplateArgs.get_id.<locals>.<genexpr>r   rJ  r  )r   r   r   r   )r   r   r   ru   r   )r   r   r     s    
 



zASTTemplateArgs.get_idc                s&   d  fdd| jD }d| d S )Nz, c             3   s   | ]} |V  qd S )Nr   )rK  ru   )r   r   r   rL    s    z-ASTTemplateArgs._stringify.<locals>.<genexpr>rq   rr   )r   r   )r   r   r   r   )r   r   r     s    zASTTemplateArgs._stringifyc             C   sd   t | |td7 }d}x6| jD ],}|s8|td7 }d}|j|d||d q"W |td7 }d S )Nrq   Tz, Fr   )r   rr   )r   r   r   r   r   )r   r   r   r   r   r   ru   r   r   r   r     s    z"ASTTemplateArgs.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   rf    s   rf  c               @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )r:  c             C   s   || _ || _d S )N)rF  r  )r   rF  r  r   r   r   r     s    zASTNestedNameElement.__init__c             C   s   dS )NFr   )r   r   r   r   r\    s    z ASTNestedNameElement.is_operatorc             C   s&   | j |}| jr"|| j|7 }|S )N)rF  r   r  )r   r   r   r   r   r   r     s    zASTNestedNameElement.get_idc             C   s"   || j }| jr||| j7 }|S )N)rF  r  )r   r   r   r   r   r   r      s    
zASTNestedNameElement._stringifyc             C   sN   | j d k	rt| j nd}| j|||||| | j d k	rJ| j |||| d S )Nr   )r  r   rF  r   )r   r   r   r   r   r   ZtArgsr   r   r   r   &  s    
z'ASTNestedNameElement.describe_signatureN)r   r   r   r   r\  r   r   r   r   r   r   r   r:    s
   r:  c               @   sB   e Zd Zdd Zedd Zdd Zddd	Zd
d Zdd Z	dS )r9  c             C   s>   t |dkst|| _|| _t | jt | jks4t|| _d S )Nr   )r   r   rE  rZ  r
  )r   rE  rZ  r
  r   r   r   r   /  s
    zASTNestedName.__init__c             C   s   | S )Nr   )r   r   r   r   r   7  s    zASTNestedName.namec             C   s0   d}x&| j D ]}| rq|jr|d7 }qW |S )Nr   r   )rE  r\  r  )r   countnr   r   r   num_templates<  s    zASTNestedName.num_templatesr   c                s    dkr:t | }|tkr t| S d fdd| jD S g }t| jdksXt|dkrb|d || x| jD ]}||  qtW t| jdkst|dkr|d d|S )	Nr   z::c             3   s   | ]}|  V  qd S )N)r   )rK  ri  )r   r   r   rL  M  s    z'ASTNestedName.get_id.<locals>.<genexpr>r   Nr  r   )r   _id_shorthands_v1r   rE  r   r   r   )r   r   	modifiersZttr   ri  r   )r   r   r   F  s    


zASTNestedName.get_idc             C   sp   g }| j r|d xPtt| jD ]>}| j| }| j| }|rT|d||  q$||| q$W d|S )Nr   z	template z::)r
  r   r   r   rE  rZ  r   )r   r   r   r^   ri  ry   r   r   r   r   X  s    


zASTNestedName._stringifyc             C   s  t | |dkr&|tt| 7 }n|dkrJt| }|t||7 }n|dks\|dkrg }|dkr|d k	stt|jjd k	r|jjj}d}d}d}	d}
|dkr| j	d d n| j	}|}|dkrt
 }xtt|D ]}|| }| j| }|
s
|td	7 }|	d	7 }	|r|td
7 }d}
t|}|dkrx|jrb|t|k rb|t|| 7 }|d7 }||d|||	 | |	|7 }	qW |dkrt| j	dkr|t
d	d	7 }||7 }| jd r|td
7 }| j	d |||d| ntd| d S )Nr   r   r   r   r   r   Tr   z::z	template Fr   zUnknown description mode: %s)r   r   r   r   Zemphasisr   r   templatePrefixrZ  rE  r   r]  r   r   r  r   r   )r   r   r   r   r   r   rM  ZiTemplateParamsZtemplateParamsPrefixr   r   rE  destr^   nnerI   Ztxt_nner   r   r   r   e  sZ    



z ASTNestedName.describe_signatureN)r   )
r   r   r   r   r?  r   rj  r   r   r   r   r   r   r   r9  .  s   

r9  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTTrailingTypeSpecFundamentalc             C   s
   || _ d S )N)r   )r   r   r   r   r   r     s    z'ASTTrailingTypeSpecFundamental.__init__c             C   s   | j S )N)r   )r   r   r   r   r   r     s    z)ASTTrailingTypeSpecFundamental._stringifyc             C   sp   |dkrNg }x6| j dD ]&}|tkr6|t|  q|| qW d|S | j tkrftd| j  t| j  S )Nr   r   ri   zSemi-internal error: Fundamental type "%s" can not be mapped to an id. Is it a true fundamental type? If not so, the parser should have rejected it.)r   split_id_fundamental_v1r   r   _id_fundamental_v2r   )r   r   r   ru   r   r   r   r     s    


z%ASTTrailingTypeSpecFundamental.get_idc             C   s   |t t| j7 }d S )N)r   r   r   r   )r   r   r   r   r   r   r   r   r     s    z1ASTTrailingTypeSpecFundamental.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   rq    s   rq  c               @   s8   e Zd Zdd Zedd Zdd Zdd Zd	d
 ZdS )ASTTrailingTypeSpecNamec             C   s   || _ || _d S )N)r   
nestedName)r   r   rv  r   r   r   r     s    z ASTTrailingTypeSpecName.__init__c             C   s   | j S )N)rv  )r   r   r   r   r     s    zASTTrailingTypeSpecName.namec             C   s   | j |S )N)rv  r   )r   r   r   r   r   r     s    zASTTrailingTypeSpecName.get_idc             C   s:   g }| j r || j  |d ||| j d|S )Nr   r   )r   r   rv  r   )r   r   r   r   r   r   r     s    
z"ASTTrailingTypeSpecName._stringifyc             C   s@   | j r(|t| j | j 7 }|td7 }| jj||||d d S )Nr   )r   )r   r   desc_annotationr   r   rv  r   )r   r   r   r   r   r   r   r   r     s    z*ASTTrailingTypeSpecName.describe_signatureN)	r   r   r   r   r?  r   r   r   r   r   r   r   r   ru    s
   ru  c               @   s$   e Zd Zdd Zdd Zdd ZdS )ASTTrailingTypeSpecDecltypeAutoc             C   s   dS )Nzdecltype(auto)r   )r   r   r   r   r   r     s    z*ASTTrailingTypeSpecDecltypeAuto._stringifyc             C   s   |dkrt  dS )Nr   r   )r   )r   r   r   r   r   r     s    z&ASTTrailingTypeSpecDecltypeAuto.get_idc             C   s   | tt|  d S )N)r   r   r   r   )r   r   r   r   r   r   r   r   r     s    z2ASTTrailingTypeSpecDecltypeAuto.describe_signatureN)r   r   r   r   r   r   r   r   r   r   rx    s   rx  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTTrailingTypeSpecDecltypec             C   s
   || _ d S )N)r   )r   r   r   r   r   r     s    z$ASTTrailingTypeSpecDecltype.__init__c             C   s   d|| j  d S )Nz	decltype(r   )r   )r   r   r   r   r   r     s    z&ASTTrailingTypeSpecDecltype._stringifyc             C   s"   |dkrt  d| j| d S )Nr   ZDTr  )r   r   r   )r   r   r   r   r   r     s    z"ASTTrailingTypeSpecDecltype.get_idc             C   s6   | td | j|||| | td d S )Nz	decltype(r   )r   r   r   r   r   )r   r   r   r   r   r   r   r   r     s    z.ASTTrailingTypeSpecDecltype.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   ry    s   ry  c               @   s0   e Zd ZdddZdddZdd Zd	d
 ZdS )ASTFunctionParameterFc             C   s   || _ || _d S )N)r   ellipsis)r   r   r{  r   r   r   r     s    zASTFunctionParameter.__init__Nc             C   s0   |r|j jj|d dS | jr dS | j|S d S )N)r<  z)r=  r   r   r{  r   )r   r   r>  r   r   r   r   r   	  s
    zASTFunctionParameter.get_idc             C   s   | j r
dS || jS d S )Nz...)r{  r   )r   r   r   r   r   r   	  s    zASTFunctionParameter._stringifyc             C   s6   t | | jr|td7 }n| jj||||d d S )Nz...)r   )r   r{  r   r   r   r   )r   r   r   r   r   r   r   r   r   	  s    z'ASTFunctionParameter.describe_signature)F)NN)r   r   r   r   r   r   r   r   r   r   r   rz    s   

rz  c               @   s@   e Zd Zdd Zedd Zdd Zdd Zd	d
 Zdd Z	dS )ASTParametersQualifiersc	       	      C   s4   || _ || _|| _|| _|| _|| _|| _|| _d S )N)r   rW   r!   refQualexceptionSpecoverridefinalinitializer)	r   r   rW   r!   r~  r  r  r  r  r   r   r   r    	  s    z ASTParametersQualifiers.__init__c             C   s   | j S )N)r   )r   r   r   r   function_params,	  s    z'ASTParametersQualifiers.function_paramsc             C   sl   g }| j r|d | jr8|dkr.|d n
|d | jdkrN|d n| jdkrb|d d	|S )
NVr   r]   Kz&&Orm   Rr   )rW   r   r!   r~  r   )r   r   r   r   r   r   get_modifiers_id1	  s    




z(ASTParametersQualifiers.get_modifiers_idc                sh    dkr8t | jdkrdS dd fdd| jD  S t | jdkrJdS d fd	d| jD S d S )
Nr   r   r   r   r  c             3   s   | ]}|  V  qd S )N)r   )rK  ru   )r   r   r   rL  G	  s    z7ASTParametersQualifiers.get_param_id.<locals>.<genexpr>re   c             3   s   | ]}|  V  qd S )N)r   )rK  ru   )r   r   r   rL  K	  s    )r   r   r   )r   r   r   )r   r   get_param_idA	  s    z$ASTParametersQualifiers.get_param_idc             C   s   g }| d d}x.| jD ]$}|s,| d d}| t| qW | d | jr\| d | jrl| d | jr| d | | j | jr| d | t| j | jr| d	 | jr| d
 | j	r| d | | j	 d
|S )Nr   Tz, Fr   z	 volatilez constr   z finalz	 overridez = r   )r   r   r   rW   r!   r~  r  r  r  r  r   )r   r   r   r   ru   r   r   r   r   M	  s6    









z"ASTParametersQualifiers._stringifyc       
      C   s  t | t }xT| jD ]J}tjdddd}|dkrH|j|d||d n|j|d||d ||7 }qW ||7 }dd	 }d
d }	| jr||d | jr||d | jr|	|| j | j	r||t
| j	 | jr||d | jr||d | jr|	|dt
| j  d S )Nr   T)Znoemphr   r   )r   r   c             S   s"   | t d7 } | t||7 } d S )Nr   )r   r   r   rw  )r   r/  r   r   r   	_add_annow	  s    z=ASTParametersQualifiers.describe_signature.<locals>._add_annoc             S   s   | t d| 7 } d S )Nr   )r   r   )r   r/  r   r   r   	_add_text{	  s    z=ASTParametersQualifiers.describe_signature.<locals>._add_textrW   r!   r  r  z= )r   r   Zdesc_parameterlistr   Zdesc_parameterr   rW   r!   r~  r  r   r  r  r  )
r   r   r   r   r   Z	paramlistr   r   r  r  r   r   r   r   j	  s2    



z*ASTParametersQualifiers.describe_signatureN)
r   r   r   r   r?  r  r  r  r   r   r   r   r   r   r}  	  s   r}  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTDeclSpecsSimplec             C   s@   || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	d S )N)
storagethreadLocalr3   rU   r,   r"   rW   r!   r1   r   )r   r  r  r3   rU   r,   r"   rW   r!   r1   r   r   r   r   r   	  s    zASTDeclSpecsSimple.__init__c             C   sr   |s| S t | jp|j| jp|j| jp(|j| jp2|j| jp<|j| jpF|j| jpP|j| jpZ|j| j	pd|j	| j
|j
 
S )N)r  r  r  r3   rU   r,   r"   rW   r!   r1   r   )r   r   r   r   r   	mergeWith	  s    







zASTDeclSpecsSimple.mergeWithc                s   g }|  fdd| jD  | jr0|| j | jr@|d | jrP|d | jr`|d | jrp|d | jr|d | j	r|d | j
r|d	 | jr|d
 d|S )Nc             3   s   | ]} |V  qd S )Nr   )rK  r   )r   r   r   rL  	  s    z0ASTDeclSpecsSimple._stringify.<locals>.<genexpr>rK   r3   r1   rU   r,   r"   rW   r!   r   )extendr   r  r   r  r3   r1   rU   r,   r"   rW   r!   r   )r   r   r   r   )r   r   r   	  s*    







zASTDeclSpecsSimple._stringifyc             C   s   dd }x:| j D ]0}t|dkr0|td ||| qW | jrV||| j | jrf||d | jrv||d | j	r||d | j
r||d | jr||d	 | jr||d
 | jr||d | jr||d d S )Nc             S   s2   t | dkr| td | t|| d S )Nr   r   )r   r   r   r   r   rw  )rm  r/  r   r   r   _add	  s    z3ASTDeclSpecsSimple.describe_signature.<locals>._addr   r   rK   r3   r1   rU   r,   r"   rW   r!   )r   r   r   r   r   r   r  r  r3   r1   rU   r,   r"   rW   r!   )r   rm  r  r   r   r   r   r   	  s.    






z%ASTDeclSpecsSimple.describe_signatureN)r   r   r   r   r  r   r   r   r   r   r   r  	  s   r  c               @   s8   e Zd Zdd Zedd Zdd Zdd Zd	d
 ZdS )ASTDeclSpecsc             C   s,   || _ || _|| _| j| j| _|| _d S )N)outer	leftSpecs
rightSpecsr  allSpecstrailingTypeSpec)r   r  r  r  trailingr   r   r   r   	  s
    zASTDeclSpecs.__init__c             C   s   | j jS )N)r  r   )r   r   r   r   r   	  s    zASTDeclSpecs.namec             C   s   |dkrLg }| | j| | jjr0| d | jjrB| d d|S g }| jjrb| d | jjrt| d | jd k	r| | j| d|S )Nr   r  r]   r   r  )r   r  r   r  rW   r!   r   )r   r   r   r   r   r   r   	  s     





zASTDeclSpecs.get_idc             C   s   g }|| j }t|dkr:t|dkr0|d || | jrt|dkrV|d ||| j t| j}t|dkrt|dkr|d || d|S )Nr   r   r   )r  r   r   r  r   r  r   )r   r   r   r`   rr   r   r   r   
  s     






zASTDeclSpecs._stringifyc             C   s   t | g }dd }| j| x|D ]}||7 }q&W | jrt|dkrV|td7 }| jj||||d g }| j| t|dkr|td7 }x|D ]}||7 }qW d S )Nc             S   s2   t | dkr| td | t|| d S )Nr   r   )r   r   r   r   r   rw  )rm  r/  r   r   r   r  
  s    z-ASTDeclSpecs.describe_signature.<locals>._addr   r   )r   )r   r  r   r  r   r   r   r  )r   r   r   r   r   rm  r  rf   r   r   r   r   
  s"    

zASTDeclSpecs.describe_signatureN)	r   r   r   r   r?  r   r   r   r   r   r   r   r   r  	  s
   	r  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTArrayc             C   s
   || _ d S )N)size)r   r  r   r   r   r   1
  s    zASTArray.__init__c             C   s    | j rd|| j  d S dS d S )Nr  r  z[])r  )r   r   r   r   r   r   4
  s    zASTArray._stringifyc             C   sR   |dkrdS |dkr0| j r,dt| j  d S dS | j rJd| j | d S dS d S )Nr   Ar   r   ZA_)r  r   r   )r   r   r   r   r   r   :
  s    zASTArray.get_idc             C   sD   t | |td | jr0| j|||| |td d S )Nr  r  )r   r   r   r   r  r   )r   r   r   r   r   r   r   r   r   H
  s
    zASTArray.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r  0
  s   r  c               @   sl   e Zd Zdd Zedd Zedd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )ASTDeclaratorPtrc             C   s$   |st || _|| _|| _|| _d S )N)r   nextrW   r!   r   )r   r  rW   r!   r   r   r   r   r   Q
  s
    zASTDeclaratorPtr.__init__c             C   s   | j jS )N)r  r   )r   r   r   r   r   Y
  s    zASTDeclaratorPtr.namec             C   s   | j jS )N)r  r  )r   r   r   r   r  ^
  s    z ASTDeclaratorPtr.function_paramsc             C   s   dS )NTr   )r   r   r   r   require_space_after_declSpecsc
  s    z.ASTDeclaratorPtr.require_space_after_declSpecsc             C   s   dg}x| j D ]}||| qW t| j dkrH| js>| jrH|d | jrX|d | jrx| jrn|d |d | js| jst| j dkr| jjr|d ||| j d|S )Nrj   r   r   rW   r!   r   )r   r   r   rW   r!   r  r  r   )r   r   r   ru   r   r   r   r   h
  s     




zASTDeclaratorPtr._stringifyc             C   s   | j |S )N)r  r  )r   r   r   r   r   r  z
  s    z!ASTDeclaratorPtr.get_modifiers_idc             C   s   | j |S )N)r  r  )r   r   r   r   r   r  ~
  s    zASTDeclaratorPtr.get_param_idc             C   s   |dkrJdg}| j r|d | jr.|d || j| d|S | j|g}|d | j rr|d | jr|d d|S )Nr   Pr  r]   r   )rW   r   r!   r  get_ptr_suffix_idr   )r   r   r   r   r   r   r  
  s    





z"ASTDeclaratorPtr.get_ptr_suffix_idc             C   sF   dg}| j r|d | jr&|d || | jj|d|dS )Nr  r  r]   r   )returnTypeId)rW   r   r!   r  get_type_idr   )r   r   r  r   r   r   r   r  
  s    


zASTDeclaratorPtr.get_type_idc             C   s
   | j  S )N)r  is_function_type)r   r   r   r   r  
  s    z!ASTDeclaratorPtr.is_function_typec             C   s   t | |td7 }x| jD ]}|| qW t| jdkrX| jsJ| jrX|td7 }dd }| jrp||d | jr| jr|td7 }||d | js| jst| jdkr| jj	r|td7 }| j|||| d S )Nrj   r   r   c             S   s   | t ||7 } d S )N)r   rw  )r   r/  r   r   r   r  
  s    z6ASTDeclaratorPtr.describe_signature.<locals>._add_annorW   r!   )
r   r   r   r   r   r   rW   r!   r  r  )r   r   r   r   r   ru   r  r   r   r   r   
  s"    

z#ASTDeclaratorPtr.describe_signatureN)r   r   r   r   r?  r   r  r  r   r  r  r  r  r  r   r   r   r   r   r  P
  s   r  c               @   sx   e Zd Zdd Zedd Zedd Zedd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd ZdS )ASTDeclaratorRefc             C   s   |st || _|| _d S )N)r   r  r   )r   r  r   r   r   r   r   
  s    zASTDeclaratorRef.__init__c             C   s   | j jS )N)r  r   )r   r   r   r   r   
  s    zASTDeclaratorRef.namec             C   s   dS )NTr   )r   r   r   r   r;  
  s    zASTDeclaratorRef.isPackc             C   s   | j jS )N)r  r  )r   r   r   r   r  
  s    z ASTDeclaratorRef.function_paramsc             C   s
   | j  S )N)r  r  )r   r   r   r   r  
  s    z.ASTDeclaratorRef.require_space_after_declSpecsc             C   s^   dg}x| j D ]}||| qW t| j dkrD| jjrD|d ||| j d|S )Nrm   r   r   r   )r   r   r   r  r  r   )r   r   r   ru   r   r   r   r   
  s    
zASTDeclaratorRef._stringifyc             C   s   | j |S )N)r  r  )r   r   r   r   r   r  
  s    z!ASTDeclaratorRef.get_modifiers_idc             C   s   | j |S )N)r  r  )r   r   r   r   r   r  
  s    zASTDeclaratorRef.get_param_idc             C   s,   |dkrd| j | S | j |d S d S )Nr   r  )r  r  )r   r   r   r   r   r  
  s    z"ASTDeclaratorRef.get_ptr_suffix_idc             C   s    |dkst | jj|d| dS )Nr   r  )r  )r   r  r  )r   r   r  r   r   r   r  
  s    zASTDeclaratorRef.get_type_idc             C   s
   | j  S )N)r  r  )r   r   r   r   r  
  s    z!ASTDeclaratorRef.is_function_typec             C   sj   t | |td7 }x| jD ]}|| qW t| jdkrT| jjrT|td7 }| j|||| d S )Nrm   r   r   )r   r   r   r   r   r   r  r  )r   r   r   r   r   ru   r   r   r   r   
  s    z#ASTDeclaratorRef.describe_signatureN)r   r   r   r   r?  r   r;  r  r  r   r  r  r  r  r  r   r   r   r   r   r  
  s   	r  c               @   sl   e Zd Zdd Zedd Zedd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )ASTDeclaratorParamPackc             C   s   |st || _d S )N)r   r  )r   r  r   r   r   r     s    zASTDeclaratorParamPack.__init__c             C   s   | j jS )N)r  r   )r   r   r   r   r     s    zASTDeclaratorParamPack.namec             C   s   | j jS )N)r  r  )r   r   r   r   r    s    z&ASTDeclaratorParamPack.function_paramsc             C   s   dS )NFr   )r   r   r   r   r    s    z4ASTDeclaratorParamPack.require_space_after_declSpecsc             C   s"   || j }| j jrd| }d| S )Nr   z...)r  r   )r   r   r   r   r   r   r     s    
z!ASTDeclaratorParamPack._stringifyc             C   s   | j |S )N)r  r  )r   r   r   r   r   r    s    z'ASTDeclaratorParamPack.get_modifiers_idc             C   s   | j |S )N)r  r  )r   r   r   r   r   r    s    z#ASTDeclaratorParamPack.get_param_idc             C   s,   |dkrd| j | S | j |d S d S )Nr   r6  )r  r  )r   r   r   r   r   r  #  s    z(ASTDeclaratorParamPack.get_ptr_suffix_idc             C   s    |dkst | jj|d| dS )Nr   r6  )r  )r   r  r  )r   r   r  r   r   r   r  *  s    z"ASTDeclaratorParamPack.get_type_idc             C   s
   | j  S )N)r  r  )r   r   r   r   r  0  s    z'ASTDeclaratorParamPack.is_function_typec             C   sB   t | |td7 }| jjr,|td7 }| j|||| d S )Nz...r   )r   r   r   r  r   r   )r   r   r   r   r   r   r   r   r   4  s
    z)ASTDeclaratorParamPack.describe_signatureN)r   r   r   r   r?  r   r  r  r   r  r  r  r  r  r   r   r   r   r   r    s   r  c               @   sl   e Zd Zdd Zedd Zedd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )ASTDeclaratorMemPtrc             C   s,   |st |st || _|| _|| _|| _d S )N)r   	classNamer!   rW   r  )r   r  r!   rW   r  r   r   r   r   >  s    zASTDeclaratorMemPtr.__init__c             C   s   | j jS )N)r  r   )r   r   r   r   r   G  s    zASTDeclaratorMemPtr.namec             C   s   | j jS )N)r  r  )r   r   r   r   r  L  s    z#ASTDeclaratorMemPtr.function_paramsc             C   s   dS )NTr   )r   r   r   r   r  Q  s    z1ASTDeclaratorMemPtr.require_space_after_declSpecsc             C   sl   g }| || j | d | jr.| d | jr>| d | j rR| d | || j d|S )Nz::*z	 volatilez constr   r   )r   r  rW   r!   r  r  r   )r   r   r   r   r   r   r   U  s    




zASTDeclaratorMemPtr._stringifyc             C   s    |dkrt  n| j|S d S )Nr   )r   r  r  )r   r   r   r   r   r  b  s    z$ASTDeclaratorMemPtr.get_modifiers_idc             C   s    |dkrt  n| j|S d S )Nr   )r   r  r  )r   r   r   r   r   r  i  s    z ASTDeclaratorMemPtr.get_param_idc             C   s*   |dkrt  nt | j|d S d S )Nr   r6  )r   r   r  r  )r   r   r   r   r   r  p  s    z%ASTDeclaratorMemPtr.get_ptr_suffix_idc             C   sZ   |dkst d}| jr|d7 }| jr,|d7 }|d7 }|| j|7 }||7 }| j||S )Nr   r   r  r  M)r   rW   r!   r  r   r  r  )r   r   r  ZnextReturnTypeIdr   r   r   r  x  s    zASTDeclaratorMemPtr.get_type_idc             C   s
   | j  S )N)r  r  )r   r   r   r   r    s    z$ASTDeclaratorMemPtr.is_function_typec             C   s   t | | j|||| |td7 }dd }| jr@||d | jrd| jrZ|td7 }||d | j r| jsz| jr|td7 }| j|||| d S )Nz::*c             S   s   | t ||7 } d S )N)r   rw  )r   r/  r   r   r   r    s    z9ASTDeclaratorMemPtr.describe_signature.<locals>._add_annorW   r   r!   )	r   r  r   r   r   rW   r!   r  r  )r   r   r   r   r   r  r   r   r   r     s    


z&ASTDeclaratorMemPtr.describe_signatureN)r   r   r   r   r?  r   r  r  r   r  r  r  r  r  r   r   r   r   r   r  =  s   	r  c               @   sl   e Zd Zdd Zedd Zedd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd ZdS )ASTDeclaratorParenc             C   s    |st |st || _|| _d S )N)r   innerr  )r   r  r  r   r   r   r     s    zASTDeclaratorParen.__init__c             C   s   | j jS )N)r  r   )r   r   r   r   r     s    zASTDeclaratorParen.namec             C   s   | j jS )N)r  r  )r   r   r   r   r    s    z"ASTDeclaratorParen.function_paramsc             C   s   dS )NTr   )r   r   r   r   r    s    z0ASTDeclaratorParen.require_space_after_declSpecsc             C   s:   dg}| || j | d | || j d|S )Nr   r   r   )r   r  r  r   )r   r   r   r   r   r   r     s
    
zASTDeclaratorParen._stringifyc             C   s   | j |S )N)r  r  )r   r   r   r   r   r    s    z#ASTDeclaratorParen.get_modifiers_idc             C   s   | j |S )N)r  r  )r   r   r   r   r   r    s    zASTDeclaratorParen.get_param_idc             C   sB   |dkr&t  | j|| j| S | j|| j| S d S )Nr   )r   r  r  r  )r   r   r   r   r   r    s    

z$ASTDeclaratorParen.get_ptr_suffix_idc             C   s*   |dkst | j||}| jj||dS )Nr   )r  )r   r  r  r  )r   r   r  ZnextIdr   r   r   r    s    zASTDeclaratorParen.get_type_idc             C   s
   | j  S )N)r  r  )r   r   r   r   r    s    z#ASTDeclaratorParen.is_function_typec             C   sL   t | |td7 }| j|||| |td7 }| j|d|| d S )Nr   r   r   )r   r   r   r  r   r  )r   r   r   r   r   r   r   r   r     s
    z%ASTDeclaratorParen.describe_signatureN)r   r   r   r   r?  r   r  r  r   r  r  r  r  r  r   r   r   r   r   r    s   
r  c               @   sx   e Zd Zdd Zedd Zedd Zedd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd ZdS )ASTDeclaratorNameParamQualc             C   s   || _ || _|| _d S )N)declIdarrayOps	paramQual)r   r  r  r  r   r   r   r     s    z#ASTDeclaratorNameParamQual.__init__c             C   s   | j S )N)r  )r   r   r   r   r     s    zASTDeclaratorNameParamQual.namec             C   s   dS )NFr   )r   r   r   r   r;    s    z!ASTDeclaratorNameParamQual.isPackc             C   s   | j jS )N)r  r  )r   r   r   r   r    s    z*ASTDeclaratorNameParamQual.function_paramsc             C   s&   | j r| j |S tdt|  d S )Nz,This should only be called on a function: %s)r  r  r   r   )r   r   r   r   r   r    s    z+ASTDeclaratorNameParamQual.get_modifiers_idc             C   s   | j r| j |S dS d S )Nr   )r  r  )r   r   r   r   r   r    s    z'ASTDeclaratorNameParamQual.get_param_idc                s   d  fdd| jD S )Nr   c             3   s   | ]}|  V  qd S )N)r   )rK  ru   )r   r   r   rL    s    z?ASTDeclaratorNameParamQual.get_ptr_suffix_id.<locals>.<genexpr>)r   r  )r   r   r   )r   r   r    s    z,ASTDeclaratorNameParamQual.get_ptr_suffix_idc             C   sz   |dkst g }|| | | jrf|| | |d || || | |d n
|| d|S )Nr   Fr  r   )r   r   r  r  r  r  r   )r   r   r  r   r   r   r   r  
  s    


z&ASTDeclaratorNameParamQual.get_type_idc             C   s
   | j d k	S )N)r  )r   r   r   r   r    s    z8ASTDeclaratorNameParamQual.require_space_after_declSpecsc             C   s
   | j d k	S )N)r  )r   r   r   r   r     s    z+ASTDeclaratorNameParamQual.is_function_typec             C   sX   g }| j r||| j  x| jD ]}||| q"W | jrN||| j d|S )Nr   )r  r   r  r  r   )r   r   r   r   r   r   r   r   $  s    z%ASTDeclaratorNameParamQual._stringifyc             C   s\   t | | jr | j|||| x| jD ]}||||| q(W | jrX| j|||| d S )N)r   r  r   r  r  )r   r   r   r   r   r   r   r   r   r   .  s    z-ASTDeclaratorNameParamQual.describe_signatureN)r   r   r   r   r?  r   r;  r  r  r  r  r  r  r  r   r   r   r   r   r   r    s   
r  c               @   s$   e Zd Zdd Zdd Zdd ZdS )ASTInitializerc             C   s
   || _ d S )N)r   )r   r   r   r   r   r   :  s    zASTInitializer.__init__c             C   s   d|| j  S )Nz = )r   )r   r   r   r   r   r   =  s    zASTInitializer._stringifyc             C   s.   t | |td | j|d|| d S )Nz = r   )r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   @  s    z!ASTInitializer.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r  9  s   r  c               @   sZ   e Zd Zdd Zedd Zedd Zedd Zdd
dZdd Z	dd Z
dd Zd	S )ASTTypec             C   s    |st |st || _|| _d S )N)r   	declSpecsdecl)r   r  r  r   r   r   r   H  s    zASTType.__init__c             C   s   | j jS )N)r  r   )r   r   r   r   r   O  s    zASTType.namec             C   s   | j jS )N)r  r;  )r   r   r   r   r;  T  s    zASTType.isPackc             C   s   | j jS )N)r  r  )r   r   r   r   r  X  s    zASTType.function_paramsNc       	      C   s  |dkrg }|r|dkrx| | | | | j| | | j| | jjjsl| jj	r| jj	jr| d q|dkr| | | qt
| dstnF| j rt | | j| | | j| | | j| d|S g }|r|dkr| j|}| | || |dkrv|jj}|d k	rv| j|}| j|}| | | | | | j| n2|dkr| | | nt
| dstn$| j|}| j||}| | d|S )Nr   functionZCEr   Fr   r[   )r   get_full_nested_namer   r  r  r  r  r  r"   r  printr   r  r   r  r   r   rn  r  )	r   r   r>  r   r   rm  ZtemplZtypeIdr  r   r   r   r   ]  sT    











zASTType.get_idc             C   sR   g }|| j }|| | j r8t|dkr8|d ||| j d|S )Nr   r   r   )r  r   r  r  r   r   )r   r   r   r  r   r   r   r     s    


zASTType._stringifyc             C   s   | j jrdS dS d S )NrO   r   )r  r  )r   r   r   r   get_type_declaration_prefix  s    z#ASTType.get_type_declaration_prefixc             C   sf   t | | j|d|| | j rDtt| jdkrD|td7 }|dkrPd}| j|||| d S )Nr   r   r   r   )	r   r  r   r  r  r   r   r   r   )r   r   r   r   r   r   r   r   r     s    
zASTType.describe_signature)NN)r   r   r   r   r?  r   r;  r  r   r   r  r   r   r   r   r   r  G  s   
5	r  c               @   sF   e Zd Zdd Zedd Zedd Zddd	Zd
d Zdd Z	dS )ASTTypeWithInitc             C   s   || _ || _d S )N)r   rA  )r   r   rA  r   r   r   r     s    zASTTypeWithInit.__init__c             C   s   | j jS )N)r   r   )r   r   r   r   r     s    zASTTypeWithInit.namec             C   s   | j jS )N)r   r;  )r   r   r   r   r;    s    zASTTypeWithInit.isPackNc             C   sJ   |dkr| j ||S |dkr<| |d | j | S | |S )Nmemberr   r   )r   r   r  )r   r   r>  r   r   r   r   r     s
    zASTTypeWithInit.get_idc             C   s4   g }| || j | jr*| || j d|S )Nr   )r   r   rA  r   )r   r   r   r   r   r   r     s
    zASTTypeWithInit._stringifyc             C   s6   t | | j|||| | jr2| j|||| d S )N)r   r   r   rA  )r   r   r   r   r   r   r   r   r     s    z"ASTTypeWithInit.describe_signature)NN)
r   r   r   r   r?  r   r;  r   r   r   r   r   r   r   r    s   
	r  c               @   s6   e Zd Zdd ZdddZdd Zdd	 Zd
d ZdS )ASTTypeUsingc             C   s   || _ || _d S )N)r   r   )r   r   r   r   r   r   r     s    zASTTypeUsing.__init__Nc             C   s   |dkrt  | |S )Nr   )r   r  r   )r   r   r>  r   r   r   r   r     s    zASTTypeUsing.get_idc             C   s>   g }| || j | jr4| d | || j d|S )Nz = r   )r   r   r   r   )r   r   r   r   r   r   r     s    
zASTTypeUsing._stringifyc             C   s   dS )NrT   r   )r   r   r   r   r    s    z(ASTTypeUsing.get_type_declaration_prefixc             C   sH   t | | jj||||d | jrD|td7 }| jj|d||d d S )N)r   z = r   )r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r     s
    zASTTypeUsing.describe_signature)NN)r   r   r   r   r   r   r  r   r   r   r   r   r    s
   
r  c               @   s:   e Zd Zdd Zedd ZdddZdd	 Zd
d ZdS )
ASTConceptc             C   s   || _ || _d S )N)rv  r  )r   rv  r  r   r   r   r     s    zASTConcept.__init__c             C   s   | j S )N)rv  )r   r   r   r   r     s    zASTConcept.nameNc             C   s   |dkrt  | |S )Nr   )r   r  r   )r   r   r>  r   r   r   r   r     s    zASTConcept.get_idc             C   s"   || j }| jr||| j7 }|S )N)rv  r  )r   r   r   r   r   r   r   	  s    
zASTConcept._stringifyc             C   s.   | j |||| | jr*| j|||| d S )N)rv  r   r  )r   r   r   r   r   r   r   r   r     s    zASTConcept.describe_signature)NN)	r   r   r   r   r?  r   r   r   r   r   r   r   r   r    s
   
r  c               @   s$   e Zd Zdd Zdd Zdd ZdS )ASTBaseClassc             C   s   || _ || _|| _|| _d S )N)r   
visibilityrU   pack)r   r   r  rU   r  r   r   r   r     s    zASTBaseClass.__init__c             C   s^   g }| j dkr$|| j  |d | jr4|d ||| j | jrT|d d|S )Nr>   r   zvirtual z...r   )r  r   rU   r   r  r   )r   r   r   r   r   r   r     s    



zASTBaseClass._stringifyc             C   s   t | | jdkr4|t| j| j7 }|td7 }| jrX|tdd7 }|td7 }| jj|d||d | j	r|td7 }d S )Nr>   r   rU   r   )r   z...)
r   r  r   rw  r   r   rU   r   r   r  )r   r   r   r   r   r   r   r   r   *  s    


zASTBaseClass.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r    s   r  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTClassc             C   s   || _ || _|| _d S )N)r   r  bases)r   r   r  r  r   r   r   r   :  s    zASTClass.__init__c             C   s   |  |S )N)r  r   )r   r   r>  r   r   r   r   r   @  s    zASTClass.get_idc             C   sz   g }| || j | jr$| d t| jdkrp| d d}x.| jD ]$}|sZ| d d}| || qHW d|S )Nz finalr   z : Tz, Fr   )r   r   r  r   r  r   )r   r   r   r   rb   r   r   r   r   D  s    


zASTClass._stringifyc             C   s   t | | jj||||d | jr@|td7 }|tdd7 }t| j	dkr|td7 }x.| j	D ]$}|j||||d |td7 }qdW |
  d S )N)r   r   r  r   z : z, )r   r   r   r  r   r   r   rw  r   r  pop)r   r   r   r   r   rb   r   r   r   r   S  s    zASTClass.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r  9  s   r  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTUnionc             C   s
   || _ d S )N)r   )r   r   r   r   r   r   c  s    zASTUnion.__init__c             C   s   |dkrt  | |S )Nr   )r   r  r   )r   r   r>  r   r   r   r   r   g  s    zASTUnion.get_idc             C   s
   || j S )N)r   )r   r   r   r   r   r   m  s    zASTUnion._stringifyc             C   s    t | | jj||||d d S )N)r   )r   r   r   )r   r   r   r   r   r   r   r   r   p  s    zASTUnion.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r  b  s   r  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTEnumc             C   s   || _ || _|| _d S )N)r   scopedunderlyingType)r   r   r  r  r   r   r   r   w  s    zASTEnum.__init__c             C   s   |dkrt  | |S )Nr   )r   r  r   )r   r   r>  r   r   r   r   r   }  s    zASTEnum.get_idc             C   sZ   g }| j r || j  |d ||| j | jrP|d ||| j d|S )Nr   z : r   )r  r   r   r  r   )r   r   r   r   r   r   r     s    

zASTEnum._stringifyc             C   sH   t | | jj||||d | jrD|td7 }| jj|d||d d S )N)r   z : r   )r   r   r   r  r   r   )r   r   r   r   r   r   r   r   r     s    
zASTEnum.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r  v  s   r  c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
ASTEnumeratorc             C   s   || _ || _d S )N)r   rA  )r   r   rA  r   r   r   r     s    zASTEnumerator.__init__c             C   s   |dkrt  | |S )Nr   )r   r  r   )r   r   r>  r   r   r   r   r     s    zASTEnumerator.get_idc             C   s4   g }| || j | jr*| || j d|S )Nr   )r   r   rA  r   )r   r   r   r   r   r   r     s
    zASTEnumerator._stringifyc             C   s6   t | | j|||| | jr2| j|d|| d S )Nr   )r   r   r   rA  )r   r   r   r   r   r   r   r   r     s    z ASTEnumerator.describe_signatureN)r   r   r   r   r   r   r   r   r   r   r   r    s   r  c               @   sV   e Zd Zdd Zdd Zedd Zedd Zdd
dZdd Z	dd Z
dd ZdS )ASTDeclarationc             C   s(   || _ || _|| _|| _d | _d | _d S )N)r>  r  rn  r   r   enumeratorScopedSymbol)r   r>  r  rn  r   r   r   r   r     s    zASTDeclaration.__init__c             C   s.   | j r| j  }nd }t| j| j|| j S )N)rn  r   r  r>  r  r   )r   ZtemplatePrefixCloner   r   r   r     s    
zASTDeclaration.clonec             C   s   | j jS )N)r   r   )r   r   r   r   r     s    zASTDeclaration.namec             C   s   | j dkrd S | jjS )Nr  )r>  r   r  )r   r   r   r   r    s    
zASTDeclaration.function_paramsTc             C   s   |dkrF| j rt | jdkr2| jr2| jj|S | j|| j| jS | jdkrf| jrf| jj||S |rvt| g}ng }| j r|| j | || j|| j| j d	|S )Nr   
enumeratorr   )
rn  r   r>  r  r   r   r   
_id_prefixr   r   )r   r   r<  r   r   r   r   r     s    zASTDeclaration.get_idc             C   s   |  tdS )NT)r   _max_id)r   r   r   r   get_newest_id  s    zASTDeclaration.get_newest_idc             C   sZ   g }| j r*| j dkr*|| j  |d | jr@||| j ||| j d|S )Nr?   r   r   )r  r   rn  r   r   )r   r   r   r   r   r   r     s    
zASTDeclaration._stringifyc             C   s  t | | jstd|d< t }d|_| jj |d< | jrZ| jj|||| j|	dd ||7 }| j
r| j
dkr|t| j
d | j
d 7 }| jd	kr| j }|d7 }|t||7 }n| jd
kr|tdd7 }n| jdkrn| jdkrn| jdkr|tdd7 }n| jdkr,|tdd7 }nd| jdkrhd}| jrV|| j7 }|d7 }|t||7 }n(| jdkr|tdd7 }n
dst| j|||| j d S )NTZis_multilineZ
declaratorZadd_permalinkztparam-line-spec)r   rR  r?   r   r   r    zconcept r  r  r   zclass rR   zunion r+   zenum r  zenumerator F)r   r   r   r   rN  rO  isRedeclarationrn  r   getr  rw  r>  r   r  r  )r   r   r   r   optionsZmainDeclNoder   r   r   r   r     sL    







z!ASTDeclaration.describe_signatureN)T)r   r   r   r   r   r?  r   r  r   r  r   r   r   r   r   r   r    s   


r  c               @   s   e Zd Zdd ZdS )ASTNamespacec             C   s   || _ || _d S )N)rv  rn  )r   rv  rn  r   r   r   r   (  s    zASTNamespace.__init__N)r   r   r   r   r   r   r   r   r  '  s   r  c               @   s   e Zd Zdd ZdS )SymbolLookupResultc             C   s"   || _ || _|| _|| _|| _d S )N)symbolsparentSymbolrF  rM  r  )r   r  r  rF  rM  r  r   r   r   r   /  s
    zSymbolLookupResult.__init__N)r   r   r   r   r   r   r   r   r  .  s   r  c               @   s   e Zd ZdZdZdd Zdd Zdd Zdd	 Zd
d Z	dd Z
dd Zdd Zedd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd3d#d$Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd"S )4SymbolFc             C   sN   | j s:| jrt| jrt| jr$t| jr.t| jrJtn| jrJ| jsJtd S )N)r=  rF  r   rM  r  r   docname)r   r   r   r   _assert_invariants<  s    



zSymbol._assert_invariantsc             C   s$   |dkrds t nt| ||S d S )NchildrenF)r   object__setattr__)r   r   r   r   r   r   r  I  s    
zSymbol.__setattr__c             C   sl   || _ || _|| _|| _|| _|| _d| _|   g | _g | _	| j rR| j j
|  | jr`| | j_|   d S )NF)r=  rF  rM  r  r   r  r  r  	_childrenZ_anonChildrenr   r   !_add_template_and_function_params)r   r=  rF  rM  r  r   r  r   r   r   r   O  s    	zSymbol.__init__c             C   sT   |    | jrt| jrt|s$t|s,t|| _| | j_|| _|    |   d S )N)r  r   r   r  r   r  )r   r   r  r   r   r   _fill_emptym  s    

zSymbol._fill_emptyc             C   s   | j rnxf| j jD ]Z}| sq| jr4tdd d |}nd }t| d }t|gdgdd}| |g || j qW | jd k	r| jj	d k	rxj| jj	D ]^}|j
d krq|j
j}|d krqtdd d |}|jrtt|jdkst| |g || j qW d S )NtemplateParamF)r
  ZfunctionParamr   )rM  rH  r5  r   r  r:  r9  _add_symbolsr  r  r   r   r
  r   r   rE  )r   r#  r  rp  Znnr   r   r   r  {  s*    

z(Symbol._add_template_and_function_paramsc             C   s6   | j d krd S | | j jkst| j j|  d | _ d S )N)r=  r  r   remove)r   r   r   r   r    s
    
zSymbol.removec             C   sN   g }x>| j D ]4}|| |jr6|j|kr6d |_d |_|| qW || _ d S )N)r  	clear_docr   r  r   )r   r  ZnewChildrensChildr   r   r   r    s    
zSymbol.clear_docc             c   s2   | V  x&| j D ]}x| D ]
}|V  qW qW d S )N)r  get_all_symbols)r   r  rx   r   r   r   r    s    zSymbol.get_all_symbolsc             c   s<   x6| j D ],}|V  |j sqx|jD ]
}|V  q&W qW d S )N)r  rF  r)  children_recurse_anon)r   r\   nestedr   r   r   r    s    
zSymbol.children_recurse_anonc             C   s`   g }| }x|j r"|| |j }q
W |  g }x*|D ]"}t|j|j}|||jf q6W |S )N)r=  r   reverser:  rF  r  rM  )r   r  rx   r   rp  r   r   r   r0    s    


zSymbol.get_lookup_keyc             C   s@   g }g }x(|   D ]\}}|| |d qW t||ddS )NF)r
  )r0  r   r9  )r   rE  rZ  rp  rM  r   r   r   r    s    
zSymbol.get_full_nested_namec       	   	   C   s8   |  |||||||}yt|S  tk
r2   d S X d S )N)_find_named_symbolsr  StopIteration)	r   rF  rM  r  templateShorthand	matchSelfrecurseInAnoncorrectPrimaryTemplateArgsr   r   r   r   _find_first_named_symbol  s    
zSymbol._find_first_named_symbolc             #   s   fdd}|r,d k	r,d k	r,| s,d  fdd}	|rP|	| rP| V  |rZ| j n| j}
x|
D ]}|	|rf|V  qfW d S )Nc                 s   t jt  jkrdS t jdkr*dS xttt jD ]b} j|  } j|  }t|j}t|}|d}|j|kr|dS |r|d d n|}||kr:dS q:W dS )NTr   z...F)r   rH  r   r   r   r   endswithr;  )r^   r   r   Z	paramNameZargTxtZisArgPackExpansionZargName)r  rM  r   r   isSpecialization  s     




z4Symbol._find_named_symbols.<locals>.isSpecializationc                s   | j  krdS | jd kd kkr4d k	r,dS s4dS rNt| jtkrNdS | jd kd kkrddS | jrt| jtkrdS dS )NFT)rF  rM  r   r  )rx   )rF  r  rM  r  r   r   matches  s     
z+Symbol._find_named_symbols.<locals>.matches)r  r  )r   rF  rM  r  r  r  r  r  r  r  r  rx   r   )rF  r  rM  r  r   r    s    
zSymbol._find_named_symbolsc
          
   C   s   |r.|  t|ksF|  d t|ksFtnt||  d ksFt|j}
| }|jrhx|jrf|j}qXW |d k	r|
d }| sxR|jr|j|j||drt|
dkr|dkr|r|jr|jj|jkrnP |j}qW d}x|
d d D ]}|j}|j	}|r,|r&|t|k st|| }|d7 }nd }n*|rR|t|k rR|| }|d7 }nd }|j
|||||||	d}|d kr|||||}|d krd S d}|}qW |
d }|j}|j	}|t|k r|d t|kst|| }n|t|kstd }|j||||||dd}t|||||S )Nr   r   )r  r  r   r   )r  r  r  r  F)rj  r   r   rE  r
  r=  r\  find_identifierrF  r  r  r  r  )r   rv  templateDeclsonMissingQualifiedSymbolstrictTemplateParamArgListsancestorLookupTyper  r  r  r  rE  r  Z	firstNameZiTemplateDeclr   rF  r  rM  r   r  r   r   r   _symbol_lookup+  s    







zSymbol._symbol_lookupc                s  t jr6td td| td| td  td dd }| j|||dd d	d	ddd
	d k	sfttj}t|dkrt jrtd tdj tdj	 tdj
 td  td t jj	jj
 d}|S t jrtd tdt|  st jrtd |d S g }g }	g }
xD|D ]<}|jd krJ|| n|jr^|
| n
|	| q.W t jrtdt| tdt|	 tdt|
  fdd}t|	dkrd }n| } fdd} jdkrt|	dkst||	d |   }t jrtd| x>|	D ]6}|j }t jrBtd | ||kr"||| q"W t|dkrt jrtd!|d k	 |d k	r|S | S n@t jrtd"|d k	 |d k	r|  |d }|  |S d S )#Nz_add_symbols:z
   tdecls:z
   nn:    z
   decl:  z
   doc:   c             S   s@   t jr,td td| td| td| t | |||d d dS )Nz*   _add_symbols, onMissingQualifiedSymbol:z      templateParams:z      identOrOp:     z      templateARgs:  )r=  rF  rM  r  r   r  )r  debug_lookupr  )r  rF  rM  r  r   r   r   r    s    


z5Symbol._add_symbols.<locals>.onMissingQualifiedSymbolTF)r  r  r  r  r  r  r   z#   _add_symbols, result, no symbol:z      templateParams:z      identOrOp:     z      templateArgs:  z      declaration:   z      docname:       )r=  rF  rM  r  r   r  z!   _add_symbols, result, symbols:z      number symbols:z      no delcarationz      #noDecl:  z      #withDecl:z      #dupDecl: c                 s<   t jrtd t jjjj d} t jr8td | S )Nz&      begin: creating candidate symbol)r=  rF  rM  r  r   r  z&      end:   creating candidate symbol)r  r  r  r  rF  rM  r  )r   )r   r  lookupResultr   r   makeCandSymbol  s    z+Symbol._add_symbols.<locals>.makeCandSymbolc                s"   t jrtd d|_t|  d S )Nz      redeclarationT)r  r  r  r  r   )r   
candSymbol)r   r   r   handleDuplicateDeclaration  s    z7Symbol._add_symbols.<locals>.handleDuplicateDeclarationr  r   z      candId:z      oldId: z2      no match, no empty, candSybmol is not None?:zG      no match, but fill an empty declaration, candSybmol is not None?:)r  r  r  r  r   listr  r   rM  rF  r  r  r   r   r  r>  r  r  r  )r   rv  r  r   r  r  r  r   ZnoDeclZwithDeclZdupDeclrx   r  r  r  candIdZoldIdr   )r   r  r  r   r    s    







	







zSymbol._add_symbolsc          
   C   s   |d k	st x|jD ]}| j|j|j|jddddd}|d krZ| j| | |_|  q|j	r|j
|kr|j	s||j	|j
 n>|j
|j
krt|j	}td}||j
|f }tj||j
d n |||| qW d S )NF)rF  rM  r  r  r  r  r  zADuplicate declaration, also defined in '%s'.
Declaration is '%s'.)location)r   r  r  rF  rM  r  r   r=  r  r   r  r  r   r   loggerwarning
merge_with)r   r   docnamesr   Z
otherChildZourChildr   msgr   r   r   r  .  s,    

zSymbol.merge_withNc             C   s"   |r|j }ng }| j||d d dS )N)r   r  )rZ  r  )r   rv  rn  r  r   r   r   add_nameN  s
    zSymbol.add_namec             C   s:   |st |st |j}|jr&|jj}ng }| ||||S )N)r   r   rn  rZ  r  )r   r   r  rv  r  r   r   r   add_declarationW  s    
zSymbol.add_declarationc             C   sB   |r| j |kr| S |r| jn| j}x|D ]}|j |kr(|S q(W d S )N)rF  r  r  )r   rF  r  r  r  rx   r   r   r   r  b  s    

zSymbol.find_identifierc          
   C   sF   | }x<|D ]4\}}|j }|j}|j|||ddddd}|s
d S q
W |S )NF)r  r  r  r  )rF  r  r  )r   r   rx   r   rM  rF  r  r   r   r   direct_lookupl  s    zSymbol.direct_lookupc       
      C   sp   dd }| j |||d||||dd	}|d kr0d S y
t|jS  tk
rN   Y nX |jj|jd d |||dd}	|	S )Nc             S   s   d S )Nr   )r  rF  rM  r  r   r   r   r    s    z2Symbol.find_name.<locals>.onMissingQualifiedSymbolF)r  r  r  r  r  r  )r  r  r  r  )r  r  r  r  r  r  rF  )
r   rv  r  r   r  r  r  r  r  r   r   r   r   	find_name|  s(    

zSymbol.find_namec             C   s   |j }|jr|jj}ng }dd }| j|||d||||dd	}	|	d krJd S t|	j}
t|
dkrdd S t|	j|	j	|	j
|	j|dd}| }x*|
D ]"}|j }||kr|  |S qW |  d S )Nc             S   s   d S )Nr   )r  rF  rM  r  r   r   r   r    s    z9Symbol.find_declaration.<locals>.onMissingQualifiedSymbolF)r  r  r  r  r  r  r   ZfakeDocnameForQuery)r=  rF  rM  r  r   r  )r   rn  rZ  r  r  r  r   r  r  rF  rM  r  r  r   r  )r   r   r   r  r  r  rv  r  r  r  r  ZquerySymbolZqueryIdr   r  r   r   r   find_declaration  s@    



zSymbol.find_declarationc             C   s   d| g}| j s|d n| jrJ|t| j |d |d|  | jrb|t| j n|t| j | jr|t| j | jr|d | jr|d |t| j | jr|d || j |d |d d	|S )	N	z::
z: z!!duplicate!! z	(r   r   )
r=  r   rM  r   rF  r   r  r  r  r   )r   indentr   r   r   r   	to_string  s.    






zSymbol.to_stringc             C   s:   |  |g}x"| jD ]}|||d  qW d|S )Nr   r   )r  r  r   r   r   )r   r  r   r\   r   r   r   r     s    zSymbol.dump)N)r   r   r   r  debug_show_treer  r  r   r  r  r  r  r  r?  r  r0  r  r  r  r  r  r  r  r  r  r  r  r	  r  r   r   r   r   r   r  8  s6   
	Dk  
	
&-r  c               @   s  e Zd ZdZdZdd Zdd Zdd Zd	d
 Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zedd Zedd Zedd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Z d9d: Z!d;d< Z"d=d> Z#d?d@ Z$dAdB Z%d|dDdEZ&dFdG Z'dHdI Z(d}dKdLZ)dMdN Z*dOdP Z+dQdR Z,d~dSdTZ-dUdV Z.ddWdXZ/ddZd[Z0dd\d]Z1d^d_ Z2d`da Z3dbdc Z4ddde Z5dfdg Z6dhdi Z7djdk Z8dldm Z9dndo Z:dpdq Z;ddrdsZ<dtdu Z=dvdw Z>dxdy Z?dzd{ Z@dYS )DefinitionParser)
rV   r   r   rX   r   r   r4   r/   r(   r   )r   rH   r+   rR   rQ   c             C   sD   |  | _d| _t| j| _d | _d| _g | _d| _|| _	|| _
d S )Nr   )r   NT)strip
definitionposr   end
last_match_previous_stateotherErrorsallowFallbackExpressionParsingwarnEnvconfig)r   r  r  r  r   r   r   r     s    
zDefinitionParser.__init__c             C   s   t |dkrDt |dkr2t|d |d d j S t|d d jS |dg}x|D ]}t |d dkrd}||d  |d xV|d jdD ]0}t |dkrq|| || |d qW qR||d j qRW td|S )Nr   r   r  z  z:
r   )r   r   r   r   rr  r   )r   errorsheaderresultr   identliner   r   r   _make_multi_error  s$    



z"DefinitionParser._make_multi_errorc             C   s&   d| j  d }td|| j|f  d S )Nri   ro   z%s
%s
%s)r  r  r  )r   r  	indicatorr   r   r   status"  s    zDefinitionParser.statusc             C   sl   g }d| j  d }td|| j | j|f }||df x| jD ]}||df q@W g | _| |dd S )Nri   ro   z.Invalid definition: %s [error at %d]
  %s
  %sz
Main errorzPotential other errorr   )r  r   r  r   r  r  )r   r  r  r   ZexMainerrr   r   r   fail(  s    zDefinitionParser.failc             C   s$   | j r| j | ntd|  d S )NzWarning: %s)r  warnr  )r   r  r   r   r   r$  5  s    zDefinitionParser.warnc             C   s>   | | j| j}|d k	r:| j| jf| _| | _|| _dS dS )NTF)matchr  r  r  r  r  )r   regexr%  r   r   r   r%  <  s    
zDefinitionParser.matchc             C   s   | j \| _| _d S )N)r  r  r  )r   r   r   r   backoutF  s    zDefinitionParser.backoutc             C   s8   t |}| j| j| j|  |kr4|  j|7  _dS dS )NTF)r   r  r  )r   stringZstrlenr   r   r   skip_stringJ  s
    zDefinitionParser.skip_stringc             C   s   |  tdt| S )Nz\b%s\b)r%  recompileescape)r   wordr   r   r   	skip_wordR  s    zDefinitionParser.skip_wordc             C   s
   |  tS )N)r%  _whitespace_re)r   r   r   r   skip_wsV  s    zDefinitionParser.skip_wsc             C   s   |  |r|   dS dS )NTF)r.  r0  )r   r-  r   r   r   skip_word_and_wsZ  s    
z!DefinitionParser.skip_word_and_wsc             C   s   |  |r|   dS dS )NTF)r)  r0  )r   r(  r   r   r   skip_string_and_wsa  s    
z#DefinitionParser.skip_string_and_wsc             C   s   | j | jkS )N)r  r  )r   r   r   r   eofh  s    zDefinitionParser.eofc             C   s&   y| j | j S  tk
r    dS X d S )NZEOF)r  r  
IndexError)r   r   r   r   current_charm  s    zDefinitionParser.current_charc             C   s   | j d k	r| j  S d S d S )N)r  group)r   r   r   r   matched_textu  s    

zDefinitionParser.matched_textc             C   s   | j | jd  }| j| _|S )N)r  r  r  )r   rvr   r   r   	read_rest}  s    zDefinitionParser.read_restc             C   s   |    | js| d d S )NzExpected end of definition.)r0  r3  r#  )r   r   r   r   
assert_end  s    zDefinitionParser.assert_endc             C   s   | j dkrd S | j}|  jd7  _d}xX| jr:| d n4| j dkrZ|sZ|  jd7  _P n| j dkrjd}nd}|  jd7  _q(W | j|| j S )N"r   Fz$Unexpected end during inside string.\T)r5  r  r3  r#  r  )r   startPosr,  r   r   r   _parse_string  s     

zDefinitionParser._parse_stringc             C   s   dddd}| j }g }x| jst|dkr6| j|kr6P | j| krV||| j  n>t|dkrz| j|d krz|  n| jdkr| d| j  |  j d	7  _ qW | jr| d
|  | j|| j  S )Nr   r  rX  )r   r  rW  r   r   z)]}z&Unexpected '%s' in balanced-token-seq.r   z8Could not find end of balanced-token-seq starting at %d.)	r  r3  r   r5  keysr   r  r#  r  )r   r  bracketsr=  r  r   r   r   _parse_balanced_token_seq  s"    

z*DefinitionParser._parse_balanced_token_seqc             C   s  |    | j}| drh| ds*|| _n>| jdgd}| dsL| d | ds`| d t|S | dr&| ds| d | ds| d	 g }xf| t	r| j
}|    | dr| d
 |t|d  | drqq| drP q| d qW | ds| d t|S x&| jjD ]}| |r0t|S q0W xb| jjD ]V}| |slqX| ds| d | jdgd}| ds| d t||S W d S )Nr  r  )r  z!Expected ']' in end of attribute.z-Expected ']' in end of attribute after [[...]Z__attribute__r   z#Expected '(' after '__attribute__'.z$Expected '(' after '__attribute__('.z4Parameterized GNU style attribute not yet supported.rt   r   z2Expected identifier, ')', or ',' in __attribute__.z(Expected ')' after '__attribute__((...)'z0Expected '(' after user-defined paren-attribute.z1Expected ')' to end user-defined paren-attribute.)r0  r  r2  r)  rA  r#  r   r1  r%  _identifier_rer7  r   r   r   r  cpp_id_attributesr   cpp_paren_attributesr   )r   r=  r   r   r   r   r   r   r   _parse_attribute  sZ    

















z!DefinitionParser._parse_attributec          
   C   s2  |    | drt S | dr*tdS | dr<tdS xXtttttgD ]F}| j	}| 
|rLx| jdkr||  j	d7  _	qbW t| j|| j	 S qLW |  }|d k	rt|S | 
tr.| jd}| jd}y
t||S  tk
r } z| d	|  W d d }~X Y n  tk
r,   | d
 Y nX d S )Nr;   rM   Tr.   FZuUlLfFr   r   z8Can not handle character literal. Internal error was: %szJCan not handle character literal resulting in multiple decoded characters.)r0  r.  r   r   _float_literal_re_binary_literal_re_hex_literal_re_integer_literal_re_octal_literal_rer  r%  r5  r   r  r>  r   _char_literal_rer  r6  r   UnicodeDecodeErrorr#  r   )r   r&  r  r(  r   r   r   r   r   r   _parse_literal  s6    




zDefinitionParser._parse_literalc             C   s  | j dkrd S |  jd7  _|   | drp| tsB| d | j}|  }| 	dsd| d t
d ||S | j}yR|   |  }|   | ts| d | j}|   | ds| d W n tk
rb } zz|| _y.| jd	d
}|   | 	ds| d W n< tk
rL } z| |df|dfgdW d d }~X Y nX t|S d }~X Y nX | 	dr|t
||d S | ts| d || jkr| d|| jf  |  }|   | 	ds| d t
|||S )Nr   r   z...z6Expected fold operator after '...' in fold expression.r   z'Expected ')' in end of fold expression.z@Expected fold operator after left expression in fold expression.z6Expected '...' after fold operator in fold expression.F)
inTemplatez0Expected ')' in end of parenthesized expression.zIf fold expressionzIf parenthesized expressionz5Error in fold expression or parenthesized expression.z=Expected fold operator or ')' after '...' in fold expression.z6Operators are different in binary fold: '%s' and '%s'.z+Expected ')' to end binary fold expression.)r5  r  r0  r2  r%  _fold_operator_rer#  r7  _parse_cast_expressionr)  r   r   _parse_expressionr  r   )r   r   r   r  r   ZeFoldr   eExprr   r   r   _parse_fold_or_paren_expression  s`    










z0DefinitionParser._parse_fold_or_paren_expressionc             C   sP   |    |  }|d k	r|S |    | dr4t S |  }|d k	rH|S |  S )NrJ   )r0  rM  r.  r   rS  _parse_nested_name)r   r   r   r   r   _parse_primary_expressionR  s    
z*DefinitionParser._parse_primary_expressionc             C   s   |    | drd}d}n"| dr:d}d}| d ndS g }|    | |sxt|    | jd	d
}|    | dr|t| n
|| |    | |rP | dsV| d||f  qVW ||fS )Nr   r   zparenthesized expression-listrW  rX  zbraced-init-listz*Sorry, braced-init-list not yet supported.)NNF)rN  z...rt   z"Error in %s, expected ',' or '%s'.)r0  r2  r#  r)  rQ  r   r$  )r   closer   r   r   r   r   r   *_parse_expression_list_or_braced_init_listf  s2    






z;DefinitionParser._parse_expression_list_or_braced_init_listc                s  d }d }    d }xtD ]} |r|}P qW |d k	rd} dsV d|   d}     ds d|   ds d|   fd	d
} dg|}     ds҈ d|  t|||}n drd} ds d  j	}y0 d}t
|dd} ds< d W n tk
r }	 z| _	y@ fdd
} dg|}t
|dd} ds d W nb tk
r }
 zB| _	d}|d7 }g }||	df ||
df  ||W d d }
~
X Y nX W d d }	~	X Y nX n j	}y  }d}W n tk
r } z| _	y> dd}d}     jdkr| jdkr| d W nb tk
r } zB| _	d}|d7 }g }||df ||df  ||W d d }~X Y nX W d d }~X Y nX g }x    |d kr. d!rV jdd"}     d#sD d$ |t| q d%r d&r~  j	d'8  _	n6 d(r  j	d)8  _	n  }|t| q d*r d&r܈  j	d)8  _	n  }|t| q d+r|t  q d,r.|t  q  \}}|d k	rz|dkr^|t| n|d-ksltdstqP qW t|d.kr|S t||S d S )/Nr  rq   zExpected '<' afer '%s'.Frr   z Expected '>' after type in '%s'.r   zExpected '(' in '%s'.c                  s    j ddS )NF)rN  )rQ  r   )r   r   r   parser  s    z:DefinitionParser._parse_postfix_expression.<locals>.parserr   zExpected ')' to end '%s'.rP   zExpected '(' after 'typeid'.T)r  z%Expected ')' to end 'typeid' of type.c                  s    j ddS )NF)rN  )rQ  r   )r   r   r   rX    s    z+Expected ')' to end 'typeid' of expression.zError in 'typeid(...)'.z Expected type or expression.zIf typezIf expressionr   operatorCastZtypeOperatorCastrW  z3Expecting '(' or '{' after type in cast expression.zError in postfix expression,z% expected primary expression or type.zIf primary expression)r   r  rP   r  )rN  r  z*Expected ']' in end of postfix expression.r  rj   r   z..r   z->z++z--rX  r   )r0  r  r1  r)  r#  _parse_typer2  _parse_expression_fallbackr  r  r  r   r   r  rU  r5  rQ  r  rT  r  r   r  r  rW  r  r   r   r!  )r   Z
prefixTyper   r  r\   r   rX  r   r  eTyperR  r  r  ZeOuterZeInnerr"  r   lstr   )r   r   _parse_postfix_expression  s    








20




z*DefinitionParser._parse_postfix_expressionc             C   s  |    x(tD ] }| |r|  }t||S qW | dr| dr| dsZ| d | t	sn| d t
| j}|    | ds| d t|S | dr| jdd	}|    | ds| d
 t|S |  }t|S | dr:| ds| d | jdd	}|    | ds2| d t|S | dr| ds\| d | jdd}|    | ds| d t|S | j}| d}|    | ds|| _n|d}| dr| d |r| jd d}| jddd}	n
| d |  \}
}|
r |dks tt||t||	|
|S | j}| d}|    | dsb|| _n:| d}|r| ds| d |  }t|||S |  S )NrE   z...r   z Expecting '(' after 'sizeof...'.z%Expecting identifier for 'sizeof...'.r   z!Expecting ')' to end 'sizeof...'.F)namedzExpecting ')' to end 'sizeof'.r   zExpecting '(' after 'alignof'.zExpecting ')' to end 'alignof'.r9   zExpecting '(' after 'noexcept'.)rN  z Expecting ')' to end 'noexcept'.z::r8   TzYSorry, neither new-placement nor parenthesised type-id in new-epression is supported yet.)r  )r_  	paramModezASorry, parenthesised type-id in new expression not yet supported.z)}r'   r  r  z(Expected ']' in array delete-expression.)r0  _expression_unary_opsr)  rP  r   r1  r2  r#  r%  rB  r'  r7  r  rZ  r  _parse_unary_expressionr  r  rQ  r  r  _parse_decl_specs_parse_declaratorrW  r   r	  r  r  r^  )r   r   r   r  r   r  r
  r  r  r  r]  r  r   r   r   rb     s    























z(DefinitionParser._parse_unary_expressionc             C   s   | j }|   | dry0| d}| ds8| d |  }t||S  tk
r } zb|| _ y|  S  tk
r } z0g }|	|df |	|df | 
|dW d d }~X Y nX W d d }~X Y qX n|  S d S )Nr   Fr   z Expected ')' in cast expression.zIf type cast expressionzIf unary expressionzError in cast expression.)r  r0  r)  rZ  r#  rP  r   r   rb  r   r  )r   r  r   r   ZexCastZexUnaryerrsr   r   r   rP  }  s&    




2z'DefinitionParser._parse_cast_expressionc                s    fdd  | d|dS )Nc       
   	      s   d t tkrfdd}n fdd}g }g }|||d x  |r`jdkr`P j}d}xt  D ]v}|sqt|dkrjdkr jd8  _P y(||d}	||	 || d	}P W qt tk
r   |_Y qtX qtW |sHP qHW t||S )
Nr   c                s      S )N)rP  )rN  )r   r   r   rX    s    zYDefinitionParser._parse_logical_or_expression.<locals>._parse_bin_op_expr.<locals>.parserc                s    d | dS )Nr   )rN  r   )rN  )_parse_bin_op_expropIdr   r   r   rX    s    )rN  rr   Frm   T)	r   _expression_bin_opsr   r0  r5  r  r)  r   r   )
r   rg  rN  rX  r   r   r  oneMorer   r   )rf  )rg  r   r   rf    s:    



zIDefinitionParser._parse_logical_or_expression.<locals>._parse_bin_op_exprr   )rN  r   )r   rN  r   )rf  r   _parse_logical_or_expression  s    #z-DefinitionParser._parse_logical_or_expressionc             C   s   d S )Nr   )r   Z
orExprHeadr   r   r   "_parse_conditional_expression_tail  s    z3DefinitionParser._parse_conditional_expression_tailc             C   s   g }g }| j |d}|| xRd}|   x:tD ]2}| |sBq2|  d}|| || d}q2W |s P q W t|dkr|S t||S d S )N)rN  FTr   )rj  r   r0  _expression_assignment_opsr)  r   r   )r   rN  r   r   orExprri  r   r   r   r   r   _parse_assignment_expression  s&    






z-DefinitionParser._parse_assignment_expressionc             C   s   | j |d}|S )N)rN  )rj  )r   rN  rm  r   r   r   _parse_constant_expression  s    z+DefinitionParser._parse_constant_expressionc             C   s   | j |dS )N)rN  )rn  )r   rN  r   r   r   rQ    s    z"DefinitionParser._parse_expressionTc       
   
   C   sH  | j }y| S  tk
rP } z&|r(| js* | d|j  || _ W d d }~X Y nX |d k	s^t|   | j }| tr~| j	}ndddd}g }	xt| j
st|	dkr| j|krP | j| kr|	|| j  n"t|	dkr| j|	d kr|	  |  j d7  _ qW t|dkr(| j
r(| d	|  | j|| j   }t| S )
NzBParsing of expression failed. Using fallback parser. Error was:
%sr   r  rr   )r   r  rq   r   r   r   z0Could not find end of expression starting at %d.)r  r   r  r$  r   r   r0  r%  
_string_rer7  r3  r   r5  r?  r   r  r#  r  r  r&  )
r   r  rX  allowZprevPosr   r=  r   r@  r  r   r   r   r[    s:    



z+DefinitionParser._parse_expression_fallbackc             C   s   |    | trt| jS x\dD ]T}| |s2q"|    | drp|    | dsh| d| d  |d7 }t|S W | dr|    | ts| d t	| j}t
|S | jd	d
d}t|S )N)r8   r'   r  r  zExpected "]" after  "operator z["z[]z""z%Expected user-defined literal suffix.FrY  )r_  r  )r0  r%  _operator_rer^  r7  r.  r)  r#  rB  r'  rc  rZ  ra  )r   r   r  r   r   r   r   _parse_operator  s*    










z DefinitionParser._parse_operatorc                s       dsd S  dr(tg S g }g }xR j}d}d}yL jdd}     drhd}n drxd}n
 d || W n tk
rp } z||df | _y` fd	d
} 	ddg|}	     drd}n drd}n
 d |t
|	 W nH tk
r^ } z(| _||df d}
 ||
W d d }~X Y nX W d d }~X Y nX |r4|rtP q4W t|S )Nrq   rr   F)r_  Trt   z.Expected ">" or "," in template argument list.zIf type argumentc                  s    j ddS )NT)rN  )ro  r   )r   r   r   rX  Y  s    z>DefinitionParser._parse_template_argument_list.<locals>.parserzIf non-type argumentz(Error in parsing template argument list.)r0  r2  r)  rf  r  rZ  r#  r   r   r[  rd  r  r   )r   
prevErrorsr  r  ZparsedCommaZ	parsedEndr   r   rX  r   r  r   )r   r   _parse_template_argument_list>  sT    







0
z.DefinitionParser._parse_template_argument_listFc          
   C   sP  g }g }|    d}| dr"d}x|    t|dkrF| d}nd}|| d }| drl|  }nR| ts|rt|dkr|  P | 	d | j
}|tkr| 	d|  t|}| j}y|  }	W n: tk
r
 }
 z|| _d }	| j|
 W d d }
~
X Y nX |t||	 |    | ds&|r>| 	d	 P q&W t|||S )
NFz::Tr   rI   r<   z#Expected identifier in nested name.z3Expected identifier in nested name, got keyword: %sz.Expected '::' in pointer to member (function).)r0  r)  r   r1  r   rs  r%  rB  r  r#  r7  	_keywordsr'  r  ru  r   r  r:  r9  )r   memberPointerrE  rZ  r
  rI   rF  r  r  r  exr   r   r   rT  n  sN    







z#DefinitionParser._parse_nested_namec             C   s  |    x | jD ]}| |rt|S qW g }| drD|d n| drX|d x2| drp|d qZ| dr|d qZP qZW | dr|d n*| dr|d n| dr|d t|dkrtd	|S |    | d
rj| ds| 	d | dr8| 
ds2| 	d t S | jdd}|    | 
dsb| 	d t|S d }|    x"| jD ]}| |r~|}P q~W |  }t||S )NrD   rS   rC   r5   r   r4   r(   r   r   r%   r   zExpected '(' after 'decltype'.r   r   z#Expected ')' after 'decltype(auto'.F)rN  z%Expected ')' after 'decltype(<expr>'.)r0  _simple_fundemental_typesr.  rq  r1  r   r   r   r2  r#  r)  rx  rQ  ry  _prefix_keysrT  ru  )r   ry   elementsr   r   krv  r   r   r   _parse_trailing_type_spec  sX    












z*DefinitionParser._parse_trailing_type_specc          	   C   sB  |dkrd S |    | ds6|dkr2| d nd S g }|    | dsx|    | dr|td d |    | ds| d P | jd d	d
}|t| |    | drqNqN| drP qN| d| j  qNW |dkrdrt|d d d d d d d S |    | d}| d}|s4| d}d }| drHd}|s^| dr^d}d }d }d }	d }
|    | drd}|    | dr| d |    | d}| d}	|s| d}|    | dr,|    d}x |D ]}| |r|}
P qW |
s,| dd	|  t|||||||	|
S )Nr8   r   r  z+Expecting "(" in parameters_and_qualifiers.r   z...Tz6Expected ")" after "..." in parameters_and_qualifiers.single)r  r_  rt   z<Expecting "," or ")" in parameters_and_qualifiers, got "%s".Fr!   rW   z&&rm   r9   z)Parameterised "noexcept" not implemented.r  r  rp   )r7  r'   r&   z'Expected "%s" in initializer-specifier.z" or ")
r0  r)  r#  r   rz  _parse_type_with_initr5  r}  r1  r   )r   r`  r   r   r!   rW   r~  r  r  r  r  Zvalidrw   r   r   r    _parse_parameters_and_qualifiers  s    













z1DefinitionParser._parse_parameters_and_qualifiersc             C   s  d}d}d}d}d}d}d}	d}
d}g }xN|    |s|dkr`| drPd}q,| dr`d}q,|dkrx| drxd}q,| drd}q,|s|dkr| d}|rq,|d	kr|s| d
}|rq,|s| d}|rq,|s| d}|rq,|s| d}|rq,|s|dkr| d}|rq,|	s<|r<| d}	|	r<q,|
sZ|rZ| d}
|
rZq,|  }|rt|| q,P q,W t|||||||	|
||
S )zJust parse the simple ones.N)r  r  rF   r-   r  r6   r@   rK   r  r3   r1   rU   r,   r"   rW   r!   )r0  r.  rE  r   r  )r   r  typedr  r  r3   rU   r,   r"   rW   r!   r1   r   r   r   r   r   _parse_decl_specs_simple3  s    













z)DefinitionParser._parse_decl_specs_simplec             C   sT   |r|dkrt d| | ||}d }|rB|  }| ||}nd }t||||S )N)r   r  r  r  z#Internal error, unknown outer "%s".)r   r  r}  r  )r   r  r  r  r  r  r   r   r   rc  ~  s    z"DefinitionParser._parse_decl_specsc                sL  |dkr< j }y  }W q tk
r8   | _ d }Y qX nn|dkr trt j}t|d }t|gdgdd} 	   j
dkr d qd }n|r  }nd }g }x 	  |r. dr. 	   dr|td  q fd	d
}	 dg|	}
 ds d |t|
 qqP qW  |}t|||dS )Nmayber~  F)r
  rg  z Unexpected ':' after identifier.r  r  c                  s    j ddS )NF)rN  )rQ  r   )r   r   r   rX    s    zBDefinitionParser._parse_declarator_name_param_qual.<locals>.parserz&Expected ']' in end of array operator.)r  r  r  )r  rT  r   r%  rB  r'  r7  r:  r9  r0  r5  r#  r)  r   r  r[  r  r  )r   r_  r`  r  r  r  r  rp  r  rX  r   r  r   )r   r   !_parse_declarator_name_param_qual  sJ    







z2DefinitionParser._parse_declarator_name_param_qualc             C   s  |dkrt d| g }|   |r| dr|   d}d}g }xJ|sX| d}|rXqD|sl| d}|rlqD|  }|d k	r|| qDP qDW | |||}	t|	|||dS |r| drg }x |  }|d krP || qW | |||}	t|	|d	S |r$| d
r$| ||d}	t	|	dS |r| j
}
y6| jdd}|   | ds\| d |   W n8 tk
r } z|
| _
||df W d d }~X Y nfX d}d}x<|s| d}|rĐq|s| d}|rސqP qW | |||}	t||||	dS |r$| jdkr$|dkr.td g d dS | j
}
y| |||}|S  tk
r" } z||df |
| _
yZ| jdkst| d | |||}| ds| d | jdd|d}	t||	dS  tk
r } z(|
| _
||df d}| ||W d d }~X Y nX W d d }~X Y nX | j
}
y| |||S  tk
r } z(|
| _
||df d}| ||W d d }~X Y nX d S )N)r   r  rY  r8   z'Internal error, unknown paramMode '%s'.rj   FrW   r!   )r  rW   r!   r   rm   )r  r   z...)r  T)rw  z-Expected '*' in pointer to member declarator.zIf pointer to member declaratorr   rY  )r  r  r  z%If declId, parameters, and qualifiersr   z$Expected ')' in "( ptr-declarator )"r   )r_  r`  r  )r  r  z"If parenthesis in noptr-declaratorzError in declaratorzIf declarator-idz0Error in declarator or parameters and qualifiers)r   r0  r)  r1  rE  r   rd  r  r  r  r  rT  r#  r   r  r5  r  r  r   r  r  )r   r_  r`  r  rt  rW   r!   r   r   r  r  r   r   r   ZexParamQualr  ZexNoPtrParenr  r   r   r   rd    s    





 




0z"DefinitionParser._parse_declaratorNc                s        dsd S |dkr< fdd} jg ||d}nb|dkrf fdd} jdd	g||d}n8|d kr fd
d} jddg||d}n d|  t|S d S )Nrp   r  c                  s    j ddS )NF)rN  )rn  r   )r   r   r   rX  A  s    z3DefinitionParser._parse_initializer.<locals>.parser)rq  r  c                  s    j ddS )NT)rN  )rn  r   )r   r   r   rX  F  s    rt   rr   c                  s    j ddS )NF)rN  )rn  r   )r   r   r   rX  K  s    r   z;Internal error, initializer for outer '%s' not implemented.)r0  r)  r[  r#  r  )r   r  allowFallbackrX  r   r   )r   r   _parse_initializer9  s$    



z#DefinitionParser._parse_initializerc             C   s  |r(|dkrt d| |dkr(|s(t|dkrg }| j}y,| j|dd}| jd|dd}|   W q tk
r } z|d	krd
}n|dkrd}ndst|||f || _y| j|d}| jd|d}W n tk
rp }	 z~|| _|d	krd}n|dkr
d}n
dst||	|f |d	kr:d}
|
d7 }
n|dkrJd}
n
dsTt| ||
W dd}	~	X Y nX W dd}~X Y nX nPd	}|dkrd}n"|dkrd}d}n|dkrd}| j|d}| j||d}t	||S )z
        named=False|'maybe'|True: 'maybe' is e.g., for function objects which
        doesn't need to name the arguments

        outer == operatorCast: annoying case, we should not take the params
        )r   r  r  rY  r  z#Internal error, unknown outer "%s".rY  )r   r  F)r  r  T)r_  r`  r  r   zIf just a namer  z"If the function has no return type)r  )r_  r`  zIf typedef-like declarationz!If the function has a return typez%Type must be either just a name or a ztypedef-like declaration.z(Error when parsing function declaration.Nr  r  r~  )
r   r   r  rc  rd  r:  r   r   r  r  )r   r_  r  rt  r=  r  r  Z	exUntypedZdescZexTypedr  r`  r   r   r   rZ  T  sd    






2


zDefinitionParser._parse_typec          
   C   sf  |r|dkst | j||d}|dkr<| j|d}t||S | j}d }yV| j|dd}|d krht|d S |   | jdkr| jdkr|| _d }n
t||S W n, tk
r } z|| _|}W d d }~X Y nX | d	st|d S y| jdd d
}t	||S  tk
r` }	 zJ|d kr|	g }
|

|df |

|	df d}|d7 }| |
|W d d }	~	X Y nX d S )N)r   r  r  r  )r  r_  r  )r  F)r  r  rt   rr   rp   )r_  r  zIf default is an expressionzIf default is a typez$Error in non-type template parameterz# or constrianted template paramter.)r   rZ  r  r  r  r0  r5  r   r)  r@  r   r  )r   r_  r  r   rA  r  rR  r   ZtypeInitr\  re  r  r   r   r   r    sD    





z&DefinitionParser._parse_type_with_initc             C   s:   |   }|   | ds$t|d S | dd }t||S )Nrp   F)rT  r0  r)  r  rZ  )r   r   r   r   r   r   _parse_type_using  s    

z"DefinitionParser._parse_type_usingc             C   s$   |   }|   | d}t||S )Nr  )rT  r0  r  r  )r   rv  r  r   r   r   _parse_concept  s    
zDefinitionParser._parse_conceptc             C   s   |   }|   | d}g }|   | drx|   d}d}d}| drTd}| trl| j}|   |s~| dr~d}|   }|   | d}|t|||| |   | drq2q2P q2W t	|||S )	Nr  rg  r>   FrU   Tz...rt   )
rT  r0  r1  r)  r%  _visibility_rer7  r   r  r  )r   r   r  r  r  rU   r  ZbaseNamer   r   r   _parse_class  s6    





zDefinitionParser._parse_classc             C   s   |   }t|S )N)rT  r  )r   r   r   r   r   _parse_union  s    zDefinitionParser._parse_unionc             C   sB   d }|    |  }|    d }| dr6| jdd}t|||S )Nrg  F)r_  )r0  rT  r)  rZ  r  )r   r  r   r  r   r   r   _parse_enum  s    
zDefinitionParser._parse_enumc                sP      }   d } drF    fdd} g |}t|}t||S )Nrp   c                  s    j ddS )NF)rN  )ro  r   )r   r   r   rX    s    z2DefinitionParser._parse_enumerator.<locals>.parser)rT  r0  r)  r[  r  r  )r   r   rA  rX  ZinitValr   )r   r   _parse_enumerator  s    
z"DefinitionParser._parse_enumeratorc          
   C   s  g }|    | ds | d xg }|    | drJ|  }d|_nd }|    d }| drjd}n| drzd}n|r| d |r |    | d}|    | trt	| j
}nd }|    |s| d	r| jd
d d}nd }t||||}|rt||}	nt|}	||	 nb| j}
y| dd}	|t|	 W n< tk
r } zd}|||f |
| _W d d }~X Y nX |    | drt|S | drq$q$d}y| d W n2 tk
r } z||df W d d }~X Y nX | ||q$W d S )Nrq   zExpected '<' after 'template'rI   TrQ   r   zFExpected 'typename' or 'class' after template template parameter list.z...rp   F)r_  r  r  r  z@If non-type template parameter or constrained template parameterrr   rt   z!Error in template parameter list.zExpected "=", ",", or ">".r   )r0  r)  r#  r.  _parse_template_parameter_listrI  r1  r%  rB  r'  r7  rZ  r3  rB  r8  r   r  r  rD  r   rG  r  )r   rM  rt  rC  r   r4  r  r&   r   r   r  r   r  r  r   r   r   r     sn    







 z/DefinitionParser._parse_template_parameter_listc             C   s   | j }y|  }W n tk
r,   || _ d S X |   | dsJ|| _ d S g }x|   | d}|   | ts~| d | j}|t	kr| d|  t
|}|t|| |   | drP qP| drqPqP| d qPW t||S )NrW  z...z2Expected identifier in template introduction list.zBExpected identifier in template introduction list, got keyword: %srX  rt   z:Error in template introduction list. Expected ",", or "}".)r  rT  r   r0  r)  r%  rB  r#  r7  rv  r'  r   rS  rU  )r   r  r    rH  r4  Ztxt_identifierr  r   r   r   _parse_template_introductionh  s<    





z-DefinitionParser._parse_template_introductionc          
   C   s   g }x|    | j}| drpy|  }W q~ tk
rl } z$|dkrXt|dkrXtd S |W d d }~X Y q~X n|  }|s~P |dkrt|dkr|| _| d |	| qW t|dkr|dkr| d t|dkrd S t|S d S )NrI   r  r   r    z0More than 1 template parameter list for concept.z,Missing template parameter list for concept.)
r0  r  r.  r  r   r   rY  r  r#  r   )r   r>  rZ  r  rH  r   r   r   r   "_parse_template_declaration_prefix  s.    


z3DefinitionParser._parse_template_declaration_prefixc             C   s   |  }d}|sd}n"|r.|jd kr.d}d}n
t|j}|d |k rV| d||f  ||kr|| }|s|sd|||f }	|	d7 }	|r|	dt| 7 }	|	t|7 }	| |	 g }
xt|D ]}|
tg  qW |r|s|
	|j t
|
}|S )	NFr   Tr   zeToo few template argument lists comapred to parameter lists. Argument lists: %d, Parameter lists: %d.zToo many template argument lists compared to parameter lists. Argument lists: %d, Parameter lists: %d, Extra empty parameters lists prepended: %d.z Declaration:
	z%s
	)rj  rZ  r   r#  r   r$  r   r   rG  r  rY  )r   rv  rn  fullSpecShorthandisMemberZnumArgsZisMemberInstantiationZ	numParamsZnumExtrar  ZnewTemplatesr^   r   r   r   _check_template_consistency  s8    

z,DefinitionParser._check_template_consistencyc       	   
   C   s  |dkrt d| d }d }d }|   | tr8| j}|dkrJ| |}|dkrg }| j}y|sr| jddd}W n6 tk
r } z|	|df || _W d d }~X Y nX | j}y|s| 
 }W nH tk
r
 } z(|| _|	|df d	}| ||W d d }~X Y nX n|d
kr"|  }n|dkr<| jddd}nt|dkrV| jddd}nZ|dkrj|  }nF|dkr~|  }n2|dkr|  }n|dkr|  }n
dst| j|j|d|dkd}t||||S )N)r   r    r  r  r   rR   r+   r  z(Internal error, unknown objectType "%s".)r   r    r  r  r   r   T)r_  r  zIf typedef-like declarationzIf type alias or template aliaszError in type declaration.r    r  r  r   rR   r+   r  F)r  r  )r   r0  r%  r  r7  r  r  rZ  r   r   r  r  r  r  r  r  r  r  r   r  r   r  )	r   r>  r  rn  r   rt  r  r   r  r   r   r   parse_declaration  sb    


 












z"DefinitionParser.parse_declarationc             C   s8   | j dd}|  }| j||dd}t||}d|_|S )Nr7   )r>  F)r  )r  rT  r  r  r>  )r   rn  r   r   r   r   r   parse_namespace_object  s    
z'DefinitionParser.parse_namespace_objectc       
      C   s   | j }yN| jdd}|  }|   | d | j||dd}t||}d|_|dfS  tk
r } zy*|| _ | 	d}|   | d |dfS  tk
r } z4g }|
|df |
|d	f d
}	| ||	W d d }~X Y nX W d d }~X Y nX d S )Nxref)r>  z()T)r  r  FzIf shorthand refzIf full function refzError in cross-reference.)r  r  rT  r0  r)  r  r  r>  r   r  r   r  )
r   r  rn  r   Zres1Ze1Zres2e2re  r  r   r   r   parse_xref_object  s0    



z"DefinitionParser.parse_xref_objectc             C   s   | j }y| d}|   |   W n tk
r } z||| _ y| d}|   |   W nR tk
r } z4d}g }||df ||df | ||W d d }~X Y nX W d d }~X Y nX |S )NFz%Error when parsing (type) expression.zIf expressionzIf type)r  rQ  r0  r:  r   rZ  r   r  )r   r  r   ZexExprZexTyper  re  r   r   r   parse_expression7  s$    

0z!DefinitionParser.parse_expression)T)F)T)T)NT)N)F)Ar   r   r   ry  rz  r   r  r!  r#  r$  r%  r'  r)  r.  r0  r1  r2  r?  r3  r5  r7  r9  r:  r>  rA  rE  rM  rS  rU  rW  r^  rb  rP  rj  rk  rn  ro  rQ  r[  rs  ru  rT  r}  r  r  rc  r  rd  r  rZ  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   r    s|   
<*; ]1 
(!0
18\K
/
p

S,	H'"
&9
r  c              C   s    t tdd } t| gdgddS )NZPhonyNameDueToErrorF)r
  )r:  r'  r9  )rp  r   r   r   _make_phony_error_nameL  s    r  c            	   @   s   e Zd ZdZededdddededd	dded
edddddededdddgZee	j
Z
eje
d< dd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'S )(	CPPObjectz%Description of a C++ language object.	parameterZ
Parameters)r   r  r   ZargumentT)labelrE  can_collapseztemplate parameterzTemplate Parameters)Ztparamztemplate parameter
exceptionsZThrowsz	cpp:class)ZthrowsrL   Z	exception)r  ZrolenamerE  r  ZreturnvalueZReturnsF)ZreturnsrB   )r  Zhas_argrE  ztparam-line-specc             C   s   | j jj|| jd d S )N)r  )state_machinereporterr  lineno)r   r  r   r   r   r$  f  s    zCPPObject.warnc             C   s   |j dkst|j}|st|jd k	s*t|jd ks8t|jd ksFt|j}|sTt|jd krbd S |j}|d krtd S |j dkrd S |jrd S |j}|j	|jddd}|d k	rd S |j
 }||_t||jd d || jjd d S )Nr  r+   FT)r  r  )r=  rF  rM  r  r   r  )r>  r   r   rF  rM  r  r=  r   r  r  r   r  r  r   r  )r   r   r   r  
parentDeclZtargetSymbolrx   Z	declCloner   r   r   _add_enumerator_to_parentj  s6    


z#CPPObject._add_enumerator_to_parentc          	   C   s  g }xRt dtd D ]@}y|j|d}|| W q tk
rR   |tk sNtY qX qW tt|}|d }|sttt	d
|s| dt||f  |j  d}d}	|jj}
x2|
d k	r|
j}|
j}
|d krq|jdkrd	}	P qW |	sP|}x2| jjjD ]$}||r|t|d  }P qW | |}| jd
 d||dd f || jjjkr| jjd d }||kr|jj||< |d | n |st|d | x>|dd  D ].}|sʐq|| jjjkr|d | qW | j  |d< | jj!| d S )Nr   )r   r   z^[a-zA-Z0-9_]*$zMIndex id generation for C++ object "%s" failed, please report as bug (id=%s).rg  Fr    Tentriesr~  r   r+  rE  r`  r   )"r   r  r   r   r   r   r  reversedr*  r+  r%  r$  r   r   r  r   lstripr=  r   r>  r   r  cpp_index_common_prefix
startswithr   get_index_textZ	indexnodestatedocumentr`  
domaindatar  rE  Znote_explicit_target)r   r   sigr   r`  r^   r   newestIdr   ZisInConceptrx   r  ZstrippedNamer   Z	indexTextrE  r   r   r   add_target_and_index  s\    




zCPPObject.add_target_and_indexc             C   s
   t  d S )N)r   )r   rX  r   r   r   parse_definition  s    zCPPObject.parse_definitionc             C   s   | |d| j| d S )Nr   )r   r   )r   r   r   r  r   r   r   r     s    zCPPObject.describe_signaturec             C   s   | j jjj}d|jkr<|jd d }||jd< | |jd< |jd }|j}|d k	r|j	dkr| 
dt|   t }||}||jd< g S t| S )Nzcpp:parent_symbolr+  root_symbolzcpp:parent_keyr  zHC++ declarations inside functions are not supported. Parent function is zcpp:last_symbol)r  r  settingsr   	temp_datar  r0  ref_contextr   r>  r$  r   r  r  r  r	   run)r   r   rootr  r  r   r   r   r   r   r    s    




zCPPObject.runc       
   
   C   s"  | j jd }t|| | j j}y| |}|  W nN tk
r } z0| |j t	 }|
|}|| j jd< tW d d }~X Y nX y"|j|| j jd}|| j jd< W n> tk
r } z |j| j jd< | d|  W d d }~X Y nX |jdkr| | t| j}	d| jk|	d< | |||	 |S )Nzcpp:parent_symbolzcpp:last_symbol)r  zDuplicate declaration, %sr  ztparam-line-spec)r   r  r  r  r  r:  r   r$  r   r  r  
ValueErrorr  r  r   r   r>  r  dictr  r   )
r   r  r   r  rX  r   r   r   r   r  r   r   r   handle_signature  s.    

 


zCPPObject.handle_signaturec             C   sP   | j jd }|st| j jd | _| j jd | _|| j jd< | | j jd< d S )Nzcpp:last_symbolzcpp:parent_symbolzcpp:parent_key)r   r  r   oldParentSymbolr  oldParentKeyr0  )r   Z
lastSymbolr   r   r   before_content  s    zCPPObject.before_contentc             C   s    | j | jjd< | j| jjd< d S )Nzcpp:parent_symbolzcpp:parent_key)r  r   r  r  r  )r   r   r   r   after_content"  s    zCPPObject.after_contentN)r   r   r   r   r   r   r   Zdoc_field_typesr  r	   option_specr   flagr$  r  r  r  r   r  r  r  r  r   r   r   r   r  R  s.   




*<$	r  c               @   s   e Zd Zdd Zdd ZdS )CPPTypeObjectc             C   s   t d| S )Nz%s (C++ type))r   )r   r   r   r   r   r  )  s    zCPPTypeObject.get_index_textc             C   s
   | dS )Nr   )r  )r   rX  r   r   r   r  -  s    zCPPTypeObject.parse_definitionN)r   r   r   r  r  r   r   r   r   r  (  s   r  c               @   s   e Zd Zdd Zdd ZdS )CPPConceptObjectc             C   s   t d| S )Nz%s (C++ concept))r   )r   r   r   r   r   r  3  s    zCPPConceptObject.get_index_textc             C   s
   | dS )Nr    )r  )r   rX  r   r   r   r  7  s    z!CPPConceptObject.parse_definitionN)r   r   r   r  r  r   r   r   r   r  2  s   r  c               @   s   e Zd Zdd Zdd ZdS )CPPMemberObjectc             C   s   t d| S )Nz%s (C++ member))r   )r   r   r   r   r   r  =  s    zCPPMemberObject.get_index_textc             C   s
   | dS )Nr  )r  )r   rX  r   r   r   r  A  s    z CPPMemberObject.parse_definitionN)r   r   r   r  r  r   r   r   r   r  <  s   r  c               @   s   e Zd Zdd Zdd ZdS )CPPFunctionObjectc             C   s   t d| S )Nz%s (C++ function))r   )r   r   r   r   r   r  G  s    z CPPFunctionObject.get_index_textc             C   s
   | dS )Nr  )r  )r   rX  r   r   r   r  K  s    z"CPPFunctionObject.parse_definitionN)r   r   r   r  r  r   r   r   r   r  F  s   r  c               @   s   e Zd Zdd Zdd ZdS )CPPClassObjectc             C   s   t d| S )Nz%s (C++ class))r   )r   r   r   r   r   r  Q  s    zCPPClassObject.get_index_textc             C   s
   | dS )Nr   )r  )r   rX  r   r   r   r  U  s    zCPPClassObject.parse_definitionN)r   r   r   r  r  r   r   r   r   r  P  s   r  c               @   s   e Zd Zdd Zdd ZdS )CPPUnionObjectc             C   s   t d| S )Nz%s (C++ union))r   )r   r   r   r   r   r  [  s    zCPPUnionObject.get_index_textc             C   s
   | dS )NrR   )r  )r   rX  r   r   r   r  _  s    zCPPUnionObject.parse_definitionN)r   r   r   r  r  r   r   r   r   r  Z  s   r  c               @   s   e Zd Zdd Zdd ZdS )CPPEnumObjectc             C   s   t d| S )Nz%s (C++ enum))r   )r   r   r   r   r   r  e  s    zCPPEnumObject.get_index_textc             C   sL   | d}| jdkrd |_n,| jdkr.d|_n| jdkr@d|_ndsHt|S )Nr+   zenum-structrH   z
enum-classr   F)r  objtyper  r   )r   rX  r   r   r   r   r  i  s    



zCPPEnumObject.parse_definitionN)r   r   r   r  r  r   r   r   r   r  d  s   r  c               @   s   e Zd Zdd Zdd ZdS )CPPEnumeratorObjectc             C   s   t d| S )Nz%s (C++ enumerator))r   )r   r   r   r   r   r  y  s    z"CPPEnumeratorObject.get_index_textc             C   s
   | dS )Nr  )r  )r   rX  r   r   r   r  }  s    z$CPPEnumeratorObject.parse_definitionN)r   r   r   r  r  r   r   r   r   r  x  s   r  c               @   s4   e Zd ZdZdZdZdZdZi Zdd Z	dd	 Z
d
S )CPPNamespaceObjectzb
    This directive is just to tell Sphinx that we're documenting stuff in
    namespace foo.
    Fr   r   Tc             C   s   | j jj|| jd d S )N)r  )r  r  r  r  )r   r  r   r   r   r$    s    zCPPNamespaceObject.warnc          
   C   s   | j jd d }| jd  dkr,|}g }n~t| jd | | j}y| }|  W n> tk
r } z | 	|j
 t }t|d }W d d }~X Y nX ||j|j}|g}|| j jd< || j jd< | | j jd< g S )Nr+  r  r   )NULLr7  r;   zcpp:parent_symbolzcpp:namespace_stackzcpp:parent_key)r   r  	argumentsr  r  r  r  r:  r   r$  r   r  r  r  rv  rn  r  r0  r  )r   
rootSymbolr   stackrX  r   r   r   r   r   r   r    s$    zCPPNamespaceObject.runN)r   r   r   r   has_contentrequired_argumentsoptional_argumentsfinal_argument_whitespacer  r$  r  r   r   r   r   r    s   r  c               @   s0   e Zd ZdZdZdZdZi Zdd Zdd Z	d	S )
CPPNamespacePushObjectFr   r   Tc             C   s   | j jj|| jd d S )N)r  )r  r  r  r  )r   r  r   r   r   r$    s    zCPPNamespacePushObject.warnc          
   C   s   | j d  dkrg S t| j d | | j}y| }|  W n> tk
r| } z | |j t	 }t
|d }W d d }~X Y nX | jjdd }|s| jjd d }||j|j}| jjdg }|| || jjd< || jjd< | | jjd< g S )Nr   )r  r7  r;   zcpp:parent_symbolr+  r  zcpp:namespace_stackzcpp:parent_key)r  r  r  r  r  r:  r   r$  r   r  r  r   r  r  r  r  rv  rn  r   r0  r  )r   rX  r   r   r   Z	oldParentr   r  r   r   r   r    s(    
zCPPNamespacePushObject.runN)
r   r   r   r  r  r  r  r  r$  r  r   r   r   r   r    s   r  c               @   s0   e Zd ZdZdZdZdZi Zdd Zdd Z	dS )	CPPNamespacePopObjectFr   Tc             C   s   | j jj|| jd d S )N)r  )r  r  r  r  )r   r  r   r   r   r$    s    zCPPNamespacePopObject.warnc             C   s   | j jdd }|r t|dkr0| d g }n|  t|dkrN|d }n| j jd d }|| j jd< || j jd< | | j jd< g S )	Nzcpp:namespace_stackr   z<C++ namespace pop on empty stack. Defaulting to gobal scope.r   r+  r  zcpp:parent_symbolzcpp:parent_key)	r   r  r  r   r$  r  r  r0  r  )r   r  r   r   r   r   r    s    

zCPPNamespacePopObject.runN)
r   r   r   r  r  r  r  r  r$  r  r   r   r   r   r    s   r  c               @   s   e Zd Zdd ZdS )CPPXRefRolec             C   s   |j |j |s"tdt|}|d dkr^|sH|drH|d d }|dr^|d d }|s|d}|d d dkr|dd  }|d}|d	kr||d
 d  }||fS )Nz[anonymous]r,  anyz()rg   r   z::r   r   )	
attributesupdater  _anon_identifier_resubr   r  r  rfind)r   r   ZrefnodeZhas_explicit_titletitletargetZdcolonr   r   r   process_link  s     


zCPPXRefRole.process_linkN)r   r   r   r  r   r   r   r   r    s   r  c               @   s"   e Zd Zdd Zi g fddZdS )CPPExprRolec             C   s&   |rd| _ tj| _nd| _ tj| _d S )Nzcpp-exprz	cpp-texpr)
class_typer   literal	node_typer3   )r   asCoder   r   r   r     s
    
zCPPExprRole.__init__c          
      s   G  fdddt }t|dd} jjj}	t|| |	j}
dd| j	g}y|

 }W nN tk
r } z0| d|t|jf  | j|||dgg fS d }~X Y nX |	jd	d }|d kr|	jd d
 }| j|d}||d|	| |gg fS )Nc                   s   e Zd Z fddZdS )z$CPPExprRole.__call__.<locals>.Warnerc                s    j j|d d S )N)r  )r  r  )r   r  )inlinerr  r   r   r$    s    z)CPPExprRole.__call__.<locals>.Warner.warnN)r   r   r   r$  r   )r  r  r   r   Warner  s   r  r  r   r  r+  z!Unparseable C++ expression: %r
%s)classeszcpp:parent_symbolr  r   )r  r   Zunescapere  r  r  r   r  r  r  r  r   r$  r   r   r  r  r  r  r   )r   r   Zrawtextr/  r  r  r  Zcontentr  r   rX  r  r   rx  r  r   r   )r  r  r   __call__  s"    
$zCPPExprRole.__call__N)r   r   r   r   r  r   r   r   r   r    s   
r  c               @   s\  e Zd ZdZdZdZeeddddeeddddeeddd	ddeed
d
deedddeedddeeddddeedddZe	e
eeeeeeeeeeeedZe e e edde e e e e e eddedddZeddddddi dZdd Zdd Zdd Zdd Zd*d d!Zd"d# Zd$d% Z d&d' Z!d(d) Z"dS )+	CPPDomainzC++ language domain.r+  zC++r   r   r  rR   r  funcr  varr    r+   r  )r   rR   r  r  r   r    r+   r  )r   rR   r  r  r  r   r    r+   zenum-structz
enum-classr  r7   znamespace-pushznamespace-popT)Z
fix_parens)r  F)r  r   rR   r  r  r  r   r    r+   r  r   ZtexprN)r  rE  c             C   s   t jr4td| td t| jd d td | jd }|| t jr|td t| jd d td td| x2t| jd	  D ]\}}||kr| jd	 |= qW d S )
Nz
clear_doc:z	before:r  r   z	before endz	after:z
	after endzclear_doc end:rE  )r  r  r  r   r   r  r  items)r   r  r  r   ZnDocnamer   r   r   r  ^  s    



zCPPDomain.clear_docc             C   s2   t jr.td| t| jd d td| d S )Nzprocess_doc:r  r   zprocess_doc end:)r  r  r  r   r   )r   r   r  r  r   r   r   process_docr  s    
zCPPDomain.process_docc             C   s   |j | jj d S )N)r  r  r   r  )r   r2  r   r   r   process_field_xrefy  s    zCPPDomain.process_field_xrefc             C   s   t jr\td td t| jd d td td t|d d td td | jd |d || j | jd	 }xX|d	  D ]H\}}||kr||krtd
}||| |f }t	j
||d q|||< qW d S )Nzmerge_domaindata:z	self:r  r   z		self endz	other:z
	other endzmerge_domaindata endrE  zIDuplicate declaration, also defined in '%s'.
Name of declaration is '%s'.)r  )r  r  r  r   r   r  r   r  r   r   r  )r   r  Z	otherdataZourNamesr   r  r  r   r   r   merge_domaindata}  s&    

zCPPDomain.merge_domaindatac	       !   
      s  G fdddt }	|	 dks,dkr4d7 tj}
y|
 \}}|
  W nX tk
r } z:fdd}||\}}d|t|jf  d	S d }~X Y nX 	d
d }j
d }|r||}|std td| t|d |stn|}|rP|}|j}|jr4|jj}ng }|j||dddd}n|}|j}|j|dddd}|d ks|jd krt|}|ds|dkrt d	S drĈdd  dkrd|jj  fdd}| sd|jj| f  |j}|r2| }| d}n| }|j}|sJtdkr|d }d} 	ddsn|jdkrn|r jjrdkr| d7 } jjrʈdkr| dr| d7 } dksވdkrn| drn| drn| d7 } nnjjrZdkr*| dr*| d7 } n.dkrn| drn| dsn|d d  }n| drn| d7 } | dkr|d|  7 }|t!"|7 }t#||||$ |||jfS )!Nc                   s   e Zd Z fddZdS )z-CPPDomain._resolve_xref_inner.<locals>.Warnerc                s    rt j|d d S )N)r  )r   r  )r   r  )emitWarningsnoder   r   r$    s    z2CPPDomain._resolve_xref_inner.<locals>.Warner.warnN)r   r   r   r$  r   )r  r  r   r   r    s   r  r  r  z()c          
      sz   dkrdkr| fS t d d  j}y|  |  W n. tk
rp } zd d |fS d }~X Y nX | fS )Nr  r  r  )r  r  r  r:  r   )r   Zparser2r  )r   r  r   warnerr   r   findWarning  s    z2CPPDomain._resolve_xref_inner.<locals>.findWarningz&Unparseable C++ cross-reference: %r
%s)NNzcpp:parent_keyr  zTarget: zParentKey: r   T)r  r  r  zstd::r*  zcpp:r[   r  c                 sR   dksdkrdS  dkr dS  } | r6 | kS td f  dsNtd S )Nr  r  Tr  zType is %s, declType is %sF)Zobjtypes_for_roler  r   )Zobjtypes)declTypr   r   r   r   	checkType  s    
z0CPPDomain._resolve_xref_inner.<locals>.checkTypezcpp:%s targets a %s (%s).rg  r  r   ZrefexplicitFz
operator()r<   r  )%r  r  r  r  r:  r   r$  r   r   r  r   r  r  r   r   rv  rn  rZ  r  r   r	  r   r  r   r>  r  r   r  r  r  ZastextZadd_function_parenthesesr  r   r   r   r  )!r   r   fromdocnamebuilderr   r  r  contnoder  r  rX  r   ZisShorthandr   r  ry   rx  	parentKeyr  r  nsr   r  rx   r  ZtxtNamer  r   fullNestedNameZdisplayNamer  r  ZaddParenr   )r  r  r   r  r   r  r   r  r   _resolve_xref_inner  s    















zCPPDomain._resolve_xref_innerc          	   C   s   |  |||||||d S )Nr   )r  )r   r   r  r  r   r  r  r  r   r   r   resolve_xref"  s    zCPPDomain.resolve_xrefc          
   C   sL   | j |||d|||dd\}}|rH|dkr4d|fgS d| | |fgS g S )Nr  F)r  r  zcpp:templateParamzcpp:)r  Zrole_for_objtype)r   r   r  r  r  r  r  r  r   r   r   resolve_any_xref(  s    

zCPPDomain.resolve_any_xrefc       	      c   s   | j d }xt| D ]h}|jd kr$q|js.t| }t|d}| d}|jj	}|j}|j
 }|||||dfV  qW d S )Nr  rg  r   )r   r  r   r  r   r  r   r  r   r>  r  )	r   r  r   r  r   Zdispnamer>  r  r  r   r   r   get_objects5  s    



zCPPDomain.get_objectsc             C   sj   | dd }|d krd S | dd }|d ks8t|dkr<d S | jd }||}| }dt||gS )Nr-  zcpp:parent_keyr   r  z::)r  r   r   r  r  r   r   )r   r  r  r  r  r  Z
parentNamer   r   r   get_full_qualified_nameD  s    

z!CPPDomain.get_full_qualified_name)T)#r   r   r   r   r   r  r   r   Zobject_typesr  r  r  r  r  r  r  r  r  r  r  r   r  r  Zrolesr  Zinitial_datar  r  r  r  r  r  r  r  r   r   r   r   r   r  ,  sb   
 r  c             C   sB   |  t | dg d | dg d | dg d dddddS )	Nr  r   rC  rD  Zbuiltinr   T)r   Zenv_versionZparallel_read_safeZparallel_write_safe)Z
add_domainr  Zadd_config_value)Zappr   r   r   setupS  s    
r  )r   r*  copyr   Zdocutilsr   r   Zdocutils.parsers.rstr   Zsixr   r   Zsphinxr   Zsphinx.directivesr	   Zsphinx.domainsr
   r   Zsphinx.environmentr   Zsphinx.localer   r   Zsphinx.rolesr   Zsphinx.utilr   Zsphinx.util.docfieldsr   r   Zsphinx.util.docutilsr   Zsphinx.util.nodesr   Zsphinx.util.pycompatr   Z	getLoggerr   r   r+  rI  rJ  rH  rG  Z_integer_suffix_rerF  rK  r  rB  r/  Srp  r  rr  rO  rv  r  r  rs  rl  r_  rt  r   r   r   rh  ra  rl  r  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r	  r  r  r  r  r  r  r  r  r   r!  r$  r&  r'  r3  r8  r@  rB  rD  rG  rS  rU  rY  r[  r^  ra  rc  rd  rf  r:  r9  rq  ru  rx  ry  rz  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r   r   <module>
   s  
 }









	

"
)
=#"J !F9&)*-293'r!oSO kF<aDWi'!#)#s
     @              g W






'#%  )