B
    d[             Y   @   s  U d Z ddlZddlmZmZmZmZmZmZm	Z	m
Z
mZmZ ddlmZ ddlmZmZ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  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,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZG ddlHmIZImJZJ ddlKmLZL ddlMmNZN ddlOmPZP e3QeRZSedZTeUdZVeUdejWZXeUdZYeUdZZeUdZ[dd 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`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwgYZ\eUdxZ]dyZ^ddzd{d|d}gZ_d~d~ddddddddd
Z`dddddddZaddddddddddddddddddddddddddddddddddddddddddd*Zbddd~ddddddddddddddddddddddddddddddddddddddddddddddddddϜ4ZcddddddddddddddTdTdddddddddddddddddddddddddddddddddddddddddd8Zdddddd dddddԐd
Zed~d~ddddZfee	eg egf ehd< ddTgdd!gdd&gddvgd	d%gd
ddQgdddddgddgddgdddgddggZidddd	ddddPdd0g
Zjddd d!d"d#d$d%d&d"d'd(dwdUgZkd)d*d+d,d-ZlG d.d/ d/emZnG d0d1 d1e6ZoG d2d3 d3eoZpG d4d5 d5eoZqG d6d7 d7eoZrG d8d9 d9eoZsG d:d; d;esZtG d<d= d=etZuG d>d? d?etZvG d@dA dAetZwG dBdC dCetZxG dDdE dEetZyG dFdG dGetZzG dHdI dIesZ{G dJdK dKesZ|G dLdM dMesZ}G dNdO dOesZ~G dPdQ dQeoZG dRdS dSeZG dTdU dUeZG dVdW dWeZG dXdY dYeZG dZd[ d[eZG d\d] d]eZG d^d_ d_esZG d`da daesZG dbdc dcesZG ddde deesZG dfdg dgesZG dhdi diesZG djdk dkesZG dldm dmesZG dndo doesZG dpdq dqesZG drds dsesZG dtdu duesZG dvdw dwesZG dxdy dyesZG dzd{ d{eoZG d|d} d}esZG d~d desZG dd desZG dd deoZG dd deZG dd deZG dd deZG dd deoZG dd deoZG dd deoZG dd deZG dd deZG dd deZG dd deZG dd deoZG dd deoZG dd deoZG dd deoZG dd deoZG dd deoZG dd deoZG dd deo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 desZG dd de7ZG dd deoZG dd deoZG dd deoZG dd deoZG ddÄ deoZG dĐdń deoZG dƐdǄ deoZG dȐdɄ deoZG dʐd˄ deoZG d̐d̈́ deoZG dΐdτ deoZG dАdф deoZG dҐdӄ deZG dԐdՄ deZG d֐dׄ deZG dؐdل deZG dڐdۄ deoZG dܐd݄ deoZG dސd߄ deoZG dd deoZG dd deoZG dd deoZG dd deoZG dd dZG dd dZeeef ee͐dddZG dd dZG dd de8ZerdddZG dd de e ZG dd de҃ZG dd de҃ZG dd de҃ZG dd de҃ZG d d de҃ZG dd de҃ZG dd de҃ZG dd de҃ZG dd	 d	eLZG d
d deLZG dd deLZG dd dejZG dd de/ZG dd de ZG dd de-ZG dd de,ZG dd de"Zeeegef dddZdS (  zThe C++ language domain.    N)
AnyCallableDict	GeneratorIteratorListOptionalTupleTypeVarUnion)nodes)ElementNodeTextElementsystem_message)
directives)addnodes)desc_signaturepending_xref)Sphinx)Builder)ObjectDescription)DomainObjType)BuildEnvironment)NoUri)___)
SphinxRoleXRefRole)SphinxTransform)ReferencesResolver)logging)ASTAttributeListASTBaseBaseASTBaseParenExprList
BaseParserDefinitionErrorNoOldIdErrorStringifyTransform$UnsupportedMultiCharacterCharLiteralanon_identifier_rebinary_literal_rechar_literal_refloat_literal_refloat_literal_suffix_rehex_literal_reidentifier_reinteger_literal_reintegers_literal_suffix_reoctal_literal_reverify_description_mode)FieldGroupedField)SphinxDirective)make_refnode)
OptionSpecTzN(?x)
    [a-zA-Z_][a-zA-Z0-9_]*\b   # note, no word boundary in the beginning
z>[LuU8]?('([^'\\]*(?:\\.[^'\\]*)*)'|"([^"\\]*(?:\\.[^"\\]*)*)")z\b(public|private|protected)\bz(?x)
        \[\s*\]
    |   \(\s*\)
    |   \+\+ | --
    |   ->\*? | \,
    |   (<<|>>)=? | && | \|\|
    |   <=>
    |   [!<>=/*%+|&^~-]=?
    |   (\b(and|and_eq|bitand|bitor|compl|not|not_eq|or|or_eq|xor|xor_eq)\b)
zx(?x)
        ->\*    |    \.\*    |    \,
    |   (<<|>>)=?    |    &&    |    \|\|
    |   !=
    |   [<>=/*%+|&^~-]=?
Zalignasalignofandand_eqasmautobitandbitorboolbreakcaseZcatchcharchar8_tchar16_tchar32_tclasscomplconceptconst	consteval	constexpr	constinit
const_castcontinuedecltypedefaultdeletedodoubledynamic_castelseenumexplicitZexportexternfalsefloatforfriendZgotoifinlineintlongmutable	namespacenewnoexceptnotnot_eqnullptroperatororor_eqprivateZ	protectedpublicregisterreinterpret_castrequiresreturnshortsignedsizeofstaticZstatic_assertstatic_caststructswitchtemplatethisthread_localthrowtruetrytypedeftypeidtypenameunionunsignedusingvirtualvoidvolatilewchar_twhilexorxor_eqa  (?x)
    \b(
    auto|void|bool
    |signed|unsigned
    |short|long
    |char|wchar_t|char(8|16|32)_t
    |int
    |__int(64|128)  # extension
    |float|double
    |__float80|_Float64x|__float128|_Float128  # extension
    |_Complex|_Imaginary  # extension
    )\b
    Z_CPPv2Z_CPPv3Z_CPPv4cCiUlLb)
rF   zsigned charzunsigned charrc   z
signed intzunsigned intrd   zsigned longzunsigned longrC   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)*rg   znew[]rU   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DsZDustjxynofdegZCfZCdZCeZDaDcZDn)4r   rC   rF   zsigned charzunsigned charr   rI   rH   rG   ru   z	short intzsigned shortzsigned short intzunsigned shortzunsigned short intrc   rv   z
signed intr   zunsigned intrd   zlong intzsigned longzsigned long intzunsigned longzunsigned long intz	long longzlong long intzsigned long longzsigned long long int__int64zunsigned long longzunsigned long long int__int128zsigned __int128zunsigned __int128r^   rW   zlong double	__float80	_Float64x
__float128	_Float128z_Complex floatz_Complex doublez_Complex long doublez_Imaginary floatz_Imaginary doublez_Imaginary long doubler@   zdecltype(auto)zstd::nullptr_tnwnadldacoplmimlZdvZrmaneoZaSZpLZmIZmLZdVZrMZaNZoRZeOZlsrsZlSZrSeqneltgtlegentaaZooppmmcmpmptclixZdsZqu)8rg   znew[]rU   zdelete[]r   rK   r   r   r   r   r   r   rA   r   rB   r   r   r   z+=z-=z*=z/=z%=z&=r>   z|=rn   z^=r   z<<z>>z<<=z>>=z==z!=rj   r   r   z<=z>=z<=>r   ri   z&&r=   z||rm   z++z--r   z->*z->z()z[]z.*?Zpp_Zmm_deadZpsng)
z++z--r   r   r   r   r   ri   r   rK   )Nu8ur   r   _id_char_from_prefixz||z&&r   r   r   z==z!=z<=>z<=z>=r   r   z<<z>>r   r   r   r   r   z.*z->*z++z--r   r   r   z*=z/=z%=z+=z-=z>>=z<<=z&=z^=z|=Zdcscccrc)rX   ry   rQ   rr   c               @   s,   e Zd ZddddddZeddd	ZdS )
_DuplicateSymbolErrorSymbolASTDeclarationN)symboldeclarationrt   c             C   s    |st |st || _|| _d S )N)AssertionErrorr   r   )selfr   r    r   _/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/sphinx/domains/cpp.py__init__?  s    z_DuplicateSymbolError.__init__)rt   c             C   s   d| j d S )Nz'Internal C++ duplicate symbol error:
%sr   )r   dump)r   r   r   r   __str__E  s    z_DuplicateSymbolError.__str__)__name__
__module____qualname__r   strr   r   r   r   r   r   >  s   r   c               @   s   e Zd ZdS )ASTBaseN)r   r   r   r   r   r   r   r   I  s   r   c               @   sp   e Zd ZeddddZedddZeedd	d
ZedddZ	edddZ
eedeedddddZdS )ASTIdentifierN)
identifierrt   c             C   s&   |d k	st t|dkst || _d S )Nr   )r   lenr   )r   r   r   r   r   r   Q  s    zASTIdentifier.__init__)rt   c             C   s   | j d dkS )Nr   @)r   )r   r   r   r   is_anonV  s    zASTIdentifier.is_anon)versionrt   c             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 )N      Zsize_tr   stdZStr   r   ZD0zUt%d_%s)r   r(   r   r   r   )r   r   r   r   r   get_idY  s    

 zASTIdentifier.get_idc             C   s   | j S )N)r   )r   r   r   r   r   n  s    zASTIdentifier.__str__c             C   s   |   rdS | jS )Nz[anonymous])r   r   )r   r   r   r   get_display_stringq  s    z ASTIdentifier.get_display_stringr   r   )signodemodeenvprefixtemplateArgsr   rt   c             C   sR  t | |  rtjdd}nt| j| j}|dkrx|| j | }tjddd|d d d}	| |	d< |	|7 }	||	7 }n|d	krt }
|
|7 }
||
7 }n|d
kr||7 }n|dkr|d d ||7 }n|dkrBt	|dkst
t	|dkst
|  rt
d| j }tjddd|d d d}	| |	d< |	|7 }	||	7 }ntd| d S )Nz[anonymous])textmarkTyper   cppr   )	refdomainreftype	reftargetmodname	classnamezcpp:parent_key
lastIsName
noneIsNameparamclassesz	sig-paramudlr   z
operator""zUnknown description mode: %s)r5   r   r   Zdesc_sig_namer   r   get_lookup_key	desc_nameappendr   r   	Exception)r   r   r  r  r  r  r   node
targetTextpnodeZnameNoder   r   r   describe_signaturet  sF    






z ASTIdentifier.describe_signature)r   r   r   r   r   rC   r   rc   r   r   r   r   r  r   r   r   r   r   P  s   r   c               @   sl   e Zd Zeedf dddddZeddd	Zee	d
ddZ
ee	dddZee	de	dddddZdS )ASTNestedNameElementASTOperatorASTTemplateArgsN)	identOrOpr  rt   c             C   s   || _ || _d S )N)r  r  )r   r  r  r   r   r   r     s    zASTNestedNameElement.__init__)rt   c             C   s   dS )NFr   )r   r   r   r   is_operator  s    z ASTNestedNameElement.is_operator)r   rt   c             C   s&   | j |}| jr"|| j|7 }|S )N)r  r   r  )r   r   resr   r   r   r     s    zASTNestedNameElement.get_id)	transformrt   c             C   s"   || j }| jr||| j7 }|S )N)r  r  )r   r   r  r   r   r   
_stringify  s    
zASTNestedNameElement._stringifyr   r   )r   r  r  r  r   rt   c             C   sN   | j d k	rt| j nd}| j|||||| | j d k	rJ| j |d|| d S )Nr   r  )r  r   r  r  )r   r   r  r  r  r   ZtArgsr   r   r   r    s    
z'ASTNestedNameElement.describe_signature)r   r   r   r   r   r   rC   r  rc   r   r   r)   r!  r   r  r   r   r   r   r    s   
r  c               @   s   e Zd Zee ee eddddZed dddZe	ddd	Z
de	eedddZeedddZeeddddddZdS )ASTNestedNameN)names	templatesrootedrt   c             C   s>   t |dkst|| _|| _t | jt | jks4t|| _d S )Nr   )r   r   r#  r$  r%  )r   r#  r$  r%  r   r   r   r     s
    zASTNestedName.__init__)rt   c             C   s   | S )Nr   )r   r   r   r   name  s    zASTNestedName.namec             C   s0   d}x&| j D ]}| rq|jr|d7 }qW |S )Nr   r   )r#  r  r  )r   countr   r   r   r   num_templates  s    zASTNestedName.num_templatesr   )r   	modifiersrt   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   ).0r   )r   r   r   	<genexpr>  s    z'ASTNestedName.get_id.<locals>.<genexpr>r   NEr   )r   _id_shorthands_v1joinr#  r   r  r   )r   r   r)  ttr  r   r   )r   r   r     s    


zASTNestedName.get_id)r   rt   c             C   sl   g }| j r|d xLtt| jD ]:}| j| }| j| rP|d||  q$||| q$W d|S )Nr   z	template z::)r%  r  ranger   r#  r$  r/  )r   r   r  r   r   r   r   r   r!    s    


zASTNestedName._stringifyr   r   )r   r  r  r   rt   c             C   s$  t | |dkr| jr,td|td7 }x~tt| jD ]l}|dkr^td|td7 }| j| }| j| rtd|td7 }|td7 }|	|||d| q<W np|d	kr| jrtt
| t| jd
kst| jd rt| jd 	|d	|d| n|dkrg }|dkrF|d k	s.t|jjd k	rF|jjj}d}d}	d}
d}|dkrn| jd d n| j}|}|dkrt }| jr|
d7 }
|dkrt|dkr|tdd7 }n|tdd7 }xtt|D ]}|| }| j| }|s|tdd7 }|
d7 }
|r8|tdd7 }|t 7 }d}t
|}|dkr|jr||t|k r||	t
|| 7 }	|d
7 }|	|d||	|
 | |
|7 }
qW |dkr t| jd
kr|tdd7 }||7 }| jd r|tdd7 }|t 7 }| jd 	|||d| ntd| d S )Nr  zCan this happen?z::r   z::blahr|    r   r  r   )r  r  markNamer  TFr  zUnknown description mode: %s)r5   r%  r   r   Textr1  r   r#  r$  r  r   r   templatePrefixr   desc_addnamedesc_sig_punctuationdesc_sig_keyworddesc_sig_spacer  r  )r   r   r  r  r   r   r   templateParamsZiTemplateParamsZtemplateParamsPrefixr  firstr#  destnner|   Ztxt_nner   r   r   r    s    









z ASTNestedName.describe_signature)r   )r   r   r   r   r  rC   r   propertyr&  rc   r(  r   r   r)   r!  r   r  r   r   r   r   r"    s   	r"  c               @   s2   e Zd ZeedddZeedddddd	ZdS )
ASTExpression)r   rt   c             C   s   t t| d S )N)NotImplementedErrorrepr)r   r   r   r   r   r   E  s    zASTExpression.get_idr   r   N)r   r  r  r   rt   c             C   s   t t| d S )N)rA  rB  )r   r   r  r  r   r   r   r   r  H  s    z ASTExpression.describe_signature)r   r   r   rc   r   r   r   r  r   r   r   r   r@  D  s   r@  c               @   s   e Zd ZdS )
ASTLiteralN)r   r   r   r   r   r   r   rC  P  s   rC  c               @   sB   e Zd ZeedddZeedddZeeddd	d
ddZ	d	S )ASTPointerLiteral)r   rt   c             C   s   dS )Nrk   r   )r   r   r   r   r   r!  U  s    zASTPointerLiteral._stringify)r   rt   c             C   s   dS )NZLDnEr   )r   r   r   r   r   r   X  s    zASTPointerLiteral.get_idr   r   N)r   r  r  r   rt   c             C   s   |t dd7 }d S )Nrk   )r   r9  )r   r   r  r  r   r   r   r   r  [  s    z$ASTPointerLiteral.describe_signature)
r   r   r   r)   r   r!  rc   r   r   r  r   r   r   r   rD  T  s   rD  c               @   sR   e Zd ZeddddZeedddZeedd	d
Z	e
eddddddZdS )ASTBooleanLiteralN)valuert   c             C   s
   || _ d S )N)rF  )r   rF  r   r   r   r   a  s    zASTBooleanLiteral.__init__)r   rt   c             C   s   | j r
dS dS d S )Nr   r]   )rF  )r   r   r   r   r   r!  d  s    zASTBooleanLiteral._stringify)r   rt   c             C   s   | j r
dS dS d S )NZL1EZL0E)rF  )r   r   r   r   r   r   j  s    zASTBooleanLiteral.get_idr   r   )r   r  r  r   rt   c             C   s   |t t| t| 7 }d S )N)r   r9  r   )r   r   r  r  r   r   r   r   r  p  s    z$ASTBooleanLiteral.describe_signature)r   r   r   rC   r   r)   r   r!  rc   r   r   r  r   r   r   r   rE  `  s
   rE  c               @   sR   e Zd ZeddddZeedddZeedd	d
Ze	eddddddZ
dS )ASTNumberLiteralN)datart   c             C   s
   || _ d S )N)rH  )r   rH  r   r   r   r   v  s    zASTNumberLiteral.__init__)r   rt   c             C   s   | j S )N)rH  )r   r   r   r   r   r!  y  s    zASTNumberLiteral._stringify)r   rt   c             C   s   d| j dd S )NzL%sE'r   )rH  replace)r   r   r   r   r   r   |  s    zASTNumberLiteral.get_idr   r   )r   r  r  r   rt   c             C   s   |t | j| j7 }d S )N)r   desc_sig_literal_numberrH  )r   r   r  r  r   r   r   r   r    s    z#ASTNumberLiteral.describe_signature)r   r   r   r   r   r)   r!  rc   r   r   r  r   r   r   r   rG  u  s
   rG  c               @   sR   e Zd ZeddddZeedddZeedd	d
Ze	eddddddZ
dS )ASTStringLiteralN)rH  rt   c             C   s
   || _ d S )N)rH  )r   rH  r   r   r   r     s    zASTStringLiteral.__init__)r   rt   c             C   s   | j S )N)rH  )r   r   r   r   r   r!    s    zASTStringLiteral._stringify)r   rt   c             C   s   dt | jd  S )NzLA%d_KcE   )r   rH  )r   r   r   r   r   r     s    zASTStringLiteral.get_idr   r   )r   r  r  r   rt   c             C   s   |t | j| j7 }d S )N)r   desc_sig_literal_stringrH  )r   r   r  r  r   r   r   r   r    s    z#ASTStringLiteral.describe_signature)r   r   r   r   r   r)   r!  rc   r   r   r  r   r   r   r   rL    s
   rL  c               @   sT   e Zd ZeeddddZeedddZeedd	d
Ze	eddddddZ
dS )ASTCharLiteralN)r  rH  rt   c             C   sT   || _ || _|tkstt| | _| d}t|dkrHt|| _	nt
|d S )Nzunicode-escaper   )r  rH  r   r   typeencodedecoder   ordrF  r*   )r   r  rH  decodedr   r   r   r     s    
zASTCharLiteral.__init__)r   rt   c             C   s0   | j d krd| j d S | j d | j d S d S )NrI  )r  rH  )r   r   r   r   r   r!    s    
zASTCharLiteral._stringify)r   rt   c             C   s   | j t| j S )N)rP  r   rF  )r   r   r   r   r   r     s    zASTCharLiteral.get_idr   r   )r   r  r  r   rt   c             C   s@   | j d k	r|t| j | j 7 }d| j d }|t||7 }d S )NrI  )r  r   r9  rH  Zdesc_sig_literal_char)r   r   r  r  r   txtr   r   r   r    s    
z!ASTCharLiteral.describe_signature)r   r   r   r   r   r)   r!  rc   r   r   r  r   r   r   r   rO    s
   rO  c               @   sR   e Zd ZeedddZeedddZe	eddd	Z
eed
dddddZdS )ASTUserDefinedLiteral)literalidentc             C   s   || _ || _d S )N)rW  rX  )r   rW  rX  r   r   r   r     s    zASTUserDefinedLiteral.__init__)r   rt   c             C   s   || j || j S )N)rW  rX  )r   r   r   r   r   r!    s    z ASTUserDefinedLiteral._stringify)r   rt   c             C   s   d | j|| j|S )NzclL_Zli{}E{}E)formatrX  r   rW  )r   r   r   r   r   r     s    zASTUserDefinedLiteral.get_idr   r   N)r   r  r  r   rt   c             C   s,   | j |||| | j|d|dd| d S )Nr  r   )rW  r  rX  )r   r   r  r  r   r   r   r   r    s    z(ASTUserDefinedLiteral.describe_signature)r   r   r   rC  r   r   r)   r   r!  rc   r   r   r  r   r   r   r   rV    s
   rV  c               @   sB   e Zd ZeedddZeedddZeeddd	d
ddZ	d	S )ASTThisLiteral)r   rt   c             C   s   dS )Nr}   r   )r   r   r   r   r   r!    s    zASTThisLiteral._stringify)r   rt   c             C   s   dS )NZfpTr   )r   r   r   r   r   r     s    zASTThisLiteral.get_idr   r   N)r   r  r  r   rt   c             C   s   |t dd7 }d S )Nr}   )r   r9  )r   r   r  r  r   r   r   r   r    s    z!ASTThisLiteral.describe_signature)
r   r   r   r)   r   r!  rc   r   r   r  r   r   r   r   rZ    s   rZ  c               @   sV   e Zd ZeeeddddZeedddZeedd	d
Z	e
eddddddZdS )ASTFoldExprN)leftExprop	rightExprrt   c             C   s*   |d k	s|d k	st || _|| _|| _d S )N)r   r\  r]  r^  )r   r\  r]  r^  r   r   r   r     s    zASTFoldExpr.__init__)r   rt   c             C   s   dg}| j r<||| j  |d || j |d |d | jr||d || j |d ||| j |d d|S )N(r2  z...)r   )r\  r  r]  r^  r/  )r   r   r  r   r   r   r!    s    





zASTFoldExpr._stringify)r   rt   c             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| j  | jr~|| j| | jr|| j| d|S )Nr   flfrZfLr   )	r   r   r\  r  r^  _id_operator_v2r]  r   r/  )r   r   r  r   r   r   r     s    


zASTFoldExpr.get_idr   r   )r   r  r  r   rt   c             C   s   |t dd7 }| jrT| j|||| |t  7 }|t | j| j7 }|t  7 }|t dd7 }| jr|t  7 }|t | j| j7 }|t  7 }| j|||| |t dd7 }d S )Nr_  z...r`  )r   r8  r\  r  r:  desc_sig_operatorr]  r^  )r   r   r  r  r   r   r   r   r     s    zASTFoldExpr.describe_signature)r   r   r   r@  r   r   r)   r!  rc   r   r   r  r   r   r   r   r[    s   r[  c               @   sP   e Zd ZedddZeedddZeeddd	Z	e
ed
dddddZdS )ASTParenExpr)exprc             C   s
   || _ d S )N)rf  )r   rf  r   r   r   r     s    zASTParenExpr.__init__)r   rt   c             C   s   d|| j  d S )Nr_  r`  )rf  )r   r   r   r   r   r!    s    zASTParenExpr._stringify)r   rt   c             C   s   | j |S )N)rf  r   )r   r   r   r   r   r     s    zASTParenExpr.get_idr   r   N)r   r  r  r   rt   c             C   s6   |t dd7 }| j|||| |t dd7 }d S )Nr_  r`  )r   r8  rf  r  )r   r   r  r  r   r   r   r   r    s    zASTParenExpr.describe_signature)r   r   r   r@  r   r)   r   r!  rc   r   r   r  r   r   r   r   re    s
   re  c               @   sP   e Zd ZedddZeedddZeeddd	Z	e
ed
dddddZdS )ASTIdExpression)r&  c             C   s
   || _ d S )N)r&  )r   r&  r   r   r   r   #  s    zASTIdExpression.__init__)r   rt   c             C   s
   || j S )N)r&  )r   r   r   r   r   r!  '  s    zASTIdExpression._stringify)r   rt   c             C   s   | j |S )N)r&  r   )r   r   r   r   r   r   *  s    zASTIdExpression.get_idr   r   N)r   r  r  r   rt   c             C   s   | j |||| d S )N)r&  r  )r   r   r  r  r   r   r   r   r  -  s    z"ASTIdExpression.describe_signature)r   r   r   r"  r   r)   r   r!  rc   r   r   r  r   r   r   r   rg  "  s
   rg  c               @   s4   e Zd ZeeedddZeedddddd	ZdS )
ASTPostfixOp)idPrefixr   rt   c             C   s   t t| d S )N)rA  rB  )r   ri  r   r   r   r   r   6  s    zASTPostfixOp.get_idr   r   N)r   r  r  r   rt   c             C   s   t t| d S )N)rA  rB  )r   r   r  r  r   r   r   r   r  9  s    zASTPostfixOp.describe_signature)r   r   r   r   rc   r   r   r  r   r   r   r   rh  5  s   rh  c               @   sR   e Zd ZedddZeedddZeeeddd	Z	e
ed
dddddZdS )ASTPostfixArray)rf  c             C   s
   || _ d S )N)rf  )r   rf  r   r   r   r   ?  s    zASTPostfixArray.__init__)r   rt   c             C   s   d|| j  d S )N[])rf  )r   r   r   r   r   r!  B  s    zASTPostfixArray._stringify)ri  r   rt   c             C   s   d| | j | S )Nr   )rf  r   )r   ri  r   r   r   r   r   E  s    zASTPostfixArray.get_idr   r   N)r   r  r  r   rt   c             C   s6   |t dd7 }| j|||| |t dd7 }d S )Nrk  rl  )r   r8  rf  r  )r   r   r  r  r   r   r   r   r  H  s    z"ASTPostfixArray.describe_signature)r   r   r   r@  r   r)   r   r!  rc   r   r   r  r   r   r   r   rj  >  s
   rj  c               @   sR   e Zd ZedddZeedddZeeeddd	Z	e
ed
dddddZdS )ASTPostfixMember)r&  c             C   s
   || _ d S )N)r&  )r   r&  r   r   r   r   P  s    zASTPostfixMember.__init__)r   rt   c             C   s   d|| j  S )N.)r&  )r   r   r   r   r   r!  S  s    zASTPostfixMember._stringify)ri  r   rt   c             C   s   d| | j | S )Ndt)r&  r   )r   ri  r   r   r   r   r   V  s    zASTPostfixMember.get_idr   r   N)r   r  r  r   rt   c             C   s&   |t dd7 }| j|d|| d S )Nrn  r  )r   r8  r&  r  )r   r   r  r  r   r   r   r   r  Y  s    z#ASTPostfixMember.describe_signature)r   r   r   r"  r   r)   r   r!  rc   r   r   r  r   r   r   r   rm  O  s
   rm  c               @   sR   e Zd ZedddZeedddZeeeddd	Z	e
ed
dddddZdS )ASTPostfixMemberOfPointer)r&  c             C   s
   || _ d S )N)r&  )r   r&  r   r   r   r   `  s    z"ASTPostfixMemberOfPointer.__init__)r   rt   c             C   s   d|| j  S )Nz->)r&  )r   r   r   r   r   r!  c  s    z$ASTPostfixMemberOfPointer._stringify)ri  r   rt   c             C   s   d| | j | S )Nr   )r&  r   )r   ri  r   r   r   r   r   f  s    z ASTPostfixMemberOfPointer.get_idr   r   N)r   r  r  r   rt   c             C   s&   |t dd7 }| j|d|| d S )Nz->r  )r   rd  r&  r  )r   r   r  r  r   r   r   r   r  i  s    z,ASTPostfixMemberOfPointer.describe_signature)r   r   r   r"  r   r)   r   r!  rc   r   r   r  r   r   r   r   rp  _  s
   rp  c               @   sD   e Zd ZeedddZeeedddZeeddd	d
ddZ	d	S )ASTPostfixInc)r   rt   c             C   s   dS )Nz++r   )r   r   r   r   r   r!  p  s    zASTPostfixInc._stringify)ri  r   rt   c             C   s   d| S )Nr   r   )r   ri  r   r   r   r   r   s  s    zASTPostfixInc.get_idr   r   N)r   r  r  r   rt   c             C   s   |t dd7 }d S )Nz++)r   rd  )r   r   r  r  r   r   r   r   r  v  s    z ASTPostfixInc.describe_signature)
r   r   r   r)   r   r!  rc   r   r   r  r   r   r   r   rq  o  s   rq  c               @   sD   e Zd ZeedddZeeedddZeeddd	d
ddZ	d	S )ASTPostfixDec)r   rt   c             C   s   dS )Nz--r   )r   r   r   r   r   r!  |  s    zASTPostfixDec._stringify)ri  r   rt   c             C   s   d| S )Nr   r   )r   ri  r   r   r   r   r     s    zASTPostfixDec.get_idr   r   N)r   r  r  r   rt   c             C   s   |t dd7 }d S )Nz--)r   rd  )r   r   r  r  r   r   r   r   r    s    z ASTPostfixDec.describe_signature)
r   r   r   r)   r   r!  rc   r   r   r  r   r   r   r   rr  {  s   rr  c               @   sX   e Zd Zed ddddZeedddZeeed	d
dZ	e
eddddddZdS )ASTPostfixCallExpr)ASTParenExprListASTBracedInitListN)lstrt   c             C   s
   || _ d S )N)rv  )r   rv  r   r   r   r     s    zASTPostfixCallExpr.__init__)r   rt   c             C   s
   || j S )N)rv  )r   r   r   r   r   r!    s    zASTPostfixCallExpr._stringify)ri  r   rt   c             C   s>   d|g}x | j jD ]}||| qW |d d|S )Nr   r-  r   )rv  exprsr  r   r/  )r   ri  r   r  r   r   r   r   r     s
    
zASTPostfixCallExpr.get_idr   r   )r   r  r  r   rt   c             C   s   | j |||| d S )N)rv  r  )r   r   r  r  r   r   r   r   r    s    z%ASTPostfixCallExpr.describe_signature)r   r   r   r   r   r)   r   r!  rc   r   r   r  r   r   r   r   rs    s
   rs  c               @   sV   e Zd Zdee dddZeedddZe	edd	d
Z
eeddddddZdS )ASTPostfixExprASTType)r  	postFixesc             C   s   || _ || _d S )N)r  rz  )r   r  rz  r   r   r   r     s    zASTPostfixExpr.__init__)r   rt   c             C   s4   || j g}x| jD ]}||| qW d|S )Nr   )r  rz  r  r/  )r   r   r  pr   r   r   r!    s    zASTPostfixExpr._stringify)r   rt   c             C   s,   | j |}x| jD ]}|||}qW |S )N)r  r   rz  )r   r   idr{  r   r   r   r     s    zASTPostfixExpr.get_idr   r   N)r   r  r  r   rt   c             C   s6   | j |||| x| jD ]}||||| qW d S )N)r  r  rz  )r   r   r  r  r   r{  r   r   r   r    s    z!ASTPostfixExpr.describe_signature)r   r   r   r   rh  r   r)   r   r!  rc   r   r   r  r   r   r   r   rx    s
   rx  c               @   sT   e Zd ZededddZeedddZeedd	d
Z	e
eddddddZdS )ASTExplicitCastry  )casttyprf  c             C   s"   |t kst|| _|| _|| _d S )N)_id_explicit_castr   r~  r  rf  )r   r~  r  rf  r   r   r   r     s    zASTExplicitCast.__init__)r   rt   c             C   sP   | j g}|d ||| j |d ||| j |d d|S )Nr   z>(r`  r   )r~  r  r  rf  r/  )r   r   r  r   r   r   r!    s    


zASTExplicitCast._stringify)r   rt   c             C   s"   t | j | j| | j| S )N)r  r~  r  r   rf  )r   r   r   r   r   r     s    zASTExplicitCast.get_idr   r   N)r   r  r  r   rt   c             C   s|   |t | j| j7 }|t dd7 }| j|||| |t dd7 }|t dd7 }| j|||| |t dd7 }d S )Nr   r   r_  r`  )r   r9  r~  r8  r  r  rf  )r   r   r  r  r   r   r   r   r    s    z"ASTExplicitCast.describe_signature)r   r   r   r   r@  r   r)   r!  rc   r   r   r  r   r   r   r   r}    s
   	r}  c               @   sZ   e Zd Zedef edddZeedddZ	e
edd	d
ZeeddddddZdS )	ASTTypeIdry  )
typeOrExprisTypec             C   s   || _ || _d S )N)r  r  )r   r  r  r   r   r   r     s    zASTTypeId.__init__)r   rt   c             C   s   d|| j  d S )Nztypeid(r`  )r  )r   r   r   r   r   r!    s    zASTTypeId._stringify)r   rt   c             C   s   | j r
dnd}|| j| S )Ntite)r  r  r   )r   r   r  r   r   r   r     s    zASTTypeId.get_idr   r   N)r   r  r  r   rt   c             C   sF   |t dd7 }|t dd7 }| j|||| |t dd7 }d S )Nr   r_  r`  )r   r9  r8  r  r  )r   r   r  r  r   r   r   r   r    s    zASTTypeId.describe_signature)r   r   r   r   r@  rC   r   r)   r   r!  rc   r   r   r  r   r   r   r   r    s
   r  c               @   sR   e Zd ZeedddZeedddZeeddd	Z	e
ed
dddddZdS )ASTUnaryOpExpr)r]  rf  c             C   s   || _ || _d S )N)r]  rf  )r   r]  rf  r   r   r   r     s    zASTUnaryOpExpr.__init__)r   rt   c             C   s6   | j d dkr"| j d || j S | j || j S d S )Nr   cnr2  )r]  rf  )r   r   r   r   r   r!    s    zASTUnaryOpExpr._stringify)r   rt   c             C   s   t | j | j| S )N)_id_operator_unary_v2r]  rf  r   )r   r   r   r   r   r     s    zASTUnaryOpExpr.get_idr   r   N)r   r  r  r   rt   c             C   sZ   | j d dkr0|t| j | j 7 }|t 7 }n|t| j | j 7 }| j|||| d S )Nr   r  )r]  r   r9  r:  rd  rf  r  )r   r   r  r  r   r   r   r   r    s
    z!ASTUnaryOpExpr.describe_signature)r   r   r   r   r@  r   r)   r!  rc   r   r   r  r   r   r   r   r    s
   r  c               @   sP   e Zd ZedddZeedddZeeddd	Z	e
ed
dddddZdS )ASTSizeofParamPack)r   c             C   s
   || _ d S )N)r   )r   r   r   r   r   r     s    zASTSizeofParamPack.__init__)r   rt   c             C   s   d|| j  d S )Nz
sizeof...(r`  )r   )r   r   r   r   r   r!    s    zASTSizeofParamPack._stringify)r   rt   c             C   s   d| j | S )NZsZ)r   r   )r   r   r   r   r   r     s    zASTSizeofParamPack.get_idr   r   N)r   r  r  r   rt   c             C   s\   |t dd7 }|t dd7 }|t dd7 }| jj|d||ddd |t dd7 }d S )Nrw   z...r_  r  r   )r   r  r  r`  )r   r9  r8  r   r  )r   r   r  r  r   r   r   r   r    s    z%ASTSizeofParamPack.describe_signature)r   r   r   r   r   r)   r   r!  rc   r   r   r  r   r   r   r   r    s
   r  c               @   sP   e Zd ZddddZeedddZeedd	d
Ze	eddddddZ
dS )ASTSizeofTypery  )r  c             C   s
   || _ d S )N)r  )r   r  r   r   r   r     s    zASTSizeofType.__init__)r   rt   c             C   s   d|| j  d S )Nzsizeof(r`  )r  )r   r   r   r   r   r!    s    zASTSizeofType._stringify)r   rt   c             C   s   d| j | S )Nst)r  r   )r   r   r   r   r   r     s    zASTSizeofType.get_idr   r   N)r   r  r  r   rt   c             C   sF   |t dd7 }|t dd7 }| j|||| |t dd7 }d S )Nrw   r_  r`  )r   r9  r8  r  r  )r   r   r  r  r   r   r   r   r    s    z ASTSizeofType.describe_signature)r   r   r   r   r)   r   r!  rc   r   r   r  r   r   r   r   r    s
   r  c               @   sP   e Zd ZedddZeedddZeeddd	Z	e
ed
dddddZdS )ASTSizeofExpr)rf  c             C   s
   || _ d S )N)rf  )r   rf  r   r   r   r   (  s    zASTSizeofExpr.__init__)r   rt   c             C   s   d|| j  S )Nzsizeof )rf  )r   r   r   r   r   r!  +  s    zASTSizeofExpr._stringify)r   rt   c             C   s   d| j | S )Nsz)rf  r   )r   r   r   r   r   r   .  s    zASTSizeofExpr.get_idr   r   N)r   r  r  r   rt   c             C   s2   |t dd7 }|t  7 }| j|||| d S )Nrw   )r   r9  r:  rf  r  )r   r   r  r  r   r   r   r   r  1  s    z ASTSizeofExpr.describe_signature)r   r   r   r@  r   r)   r   r!  rc   r   r   r  r   r   r   r   r  '  s
   r  c               @   sP   e Zd ZddddZeedddZeedd	d
Ze	eddddddZ
dS )ASTAlignofExprry  )r  c             C   s
   || _ d S )N)r  )r   r  r   r   r   r   9  s    zASTAlignofExpr.__init__)r   rt   c             C   s   d|| j  d S )Nzalignof(r`  )r  )r   r   r   r   r   r!  <  s    zASTAlignofExpr._stringify)r   rt   c             C   s   d| j | S )Nat)r  r   )r   r   r   r   r   r   ?  s    zASTAlignofExpr.get_idr   r   N)r   r  r  r   rt   c             C   sF   |t dd7 }|t dd7 }| j|||| |t dd7 }d S )Nr<   r_  r`  )r   r9  r8  r  r  )r   r   r  r  r   r   r   r   r  B  s    z!ASTAlignofExpr.describe_signature)r   r   r   r   r)   r   r!  rc   r   r   r  r   r   r   r   r  8  s
   r  c               @   sP   e Zd ZedddZeedddZeeddd	Z	e
ed
dddddZdS )ASTNoexceptExpr)rf  c             C   s
   || _ d S )N)rf  )r   rf  r   r   r   r   K  s    zASTNoexceptExpr.__init__)r   rt   c             C   s   d|| j  d S )Nz	noexcept(r`  )rf  )r   r   r   r   r   r!  N  s    zASTNoexceptExpr._stringify)r   rt   c             C   s   d| j | S )Nnx)rf  r   )r   r   r   r   r   r   Q  s    zASTNoexceptExpr.get_idr   r   N)r   r  r  r   rt   c             C   sF   |t dd7 }|t dd7 }| j|||| |t dd7 }d S )Nrh   r_  r`  )r   r9  r8  rf  r  )r   r   r  r  r   r   r   r   r  T  s    z"ASTNoexceptExpr.describe_signature)r   r   r   r@  r   r)   r   r!  rc   r   r   r  r   r   r   r   r  J  s
   r  c               @   s\   e Zd Zeeded ddddZeeddd	Ze	ed
ddZ
eeddddddZdS )
ASTNewExprry  )rt  ru  N)r%  isNewTypeIdr  initListrt   c             C   s   || _ || _|| _|| _d S )N)r%  r  r  r  )r   r%  r  r  r  r   r   r   r   ]  s    zASTNewExpr.__init__)r   rt   c             C   s`   g }| j r|d |d | jr6||| j nt | jd k	rV||| j d|S )Nz::znew r   )r%  r  r  r  r   r  r/  )r   r   r  r   r   r   r!  d  s    


zASTNewExpr._stringify)r   rt   c             C   sT   dg}| d | | j| | jd k	r@| | j| n
| d d|S )Nr   r   r-  r   )r  r  r   r  r/  )r   r   r  r   r   r   r   r  s    


zASTNewExpr.get_idr   r   )r   r  r  r   rt   c             C   sr   | j r|tdd7 }|tdd7 }|t 7 }| jrL| j|||| nt | j	d k	rn| j	|||| d S )Nz::rg   )
r%  r   r8  r9  r:  r  r  r  r   r  )r   r   r  r  r   r   r   r   r  ~  s    
zASTNewExpr.describe_signature)r   r   r   rC   r   r   r)   r   r!  rc   r   r   r  r   r   r   r   r  \  s   r  c               @   sT   e Zd ZeeedddZeedddZe	eddd	Z
eed
dddddZdS )ASTDeleteExpr)r%  arrayrf  c             C   s   || _ || _|| _d S )N)r%  r  rf  )r   r%  r  rf  r   r   r   r     s    zASTDeleteExpr.__init__)r   rt   c             C   sH   g }| j r|d |d | jr.|d ||| j d|S )Nz::zdelete z[] r   )r%  r  r  rf  r/  )r   r   r  r   r   r   r!    s    


zASTDeleteExpr._stringify)r   rt   c             C   s    | j rd}nd}|| j| S )Nr   r   )r  rf  r   )r   r   r|  r   r   r   r     s    zASTDeleteExpr.get_idr   r   N)r   r  r  r   rt   c             C   sj   | j r|tdd7 }|tdd7 }|t 7 }| jrT|tdd7 }|t 7 }| j|||| d S )Nz::rU   z[])r%  r   r8  r9  r:  r  rf  r  )r   r   r  r  r   r   r   r   r    s    z ASTDeleteExpr.describe_signature)r   r   r   rC   r@  r   r)   r   r!  rc   r   r   r  r   r   r   r   r    s
   
r  c               @   sR   e Zd ZdedddZeedddZeedd	d
Z	e
eddddddZdS )ASTCastExprry  )r  rf  c             C   s   || _ || _d S )N)r  rf  )r   r  rf  r   r   r   r     s    zASTCastExpr.__init__)r   rt   c             C   s:   dg}| || j | d | || j d|S )Nr_  r`  r   )r  r  rf  r/  )r   r   r  r   r   r   r!    s
    
zASTCastExpr._stringify)r   rt   c             C   s   d| j | | j| S )Ncv)r  r   rf  )r   r   r   r   r   r     s    zASTCastExpr.get_idr   r   N)r   r  r  r   rt   c             C   sH   |t dd7 }| j|||| |t dd7 }| j|||| d S )Nr_  r`  )r   r8  r  r  rf  )r   r   r  r  r   r   r   r   r    s    zASTCastExpr.describe_signature)r   r   r   r@  r   r)   r   r!  rc   r   r   r  r   r   r   r   r    s
   r  c               @   sZ   e Zd Zee ee dddZeedddZe	eddd	Z
eed
dddddZdS )ASTBinOpExpr)rw  opsc             C   s8   t |dkstt |t |d ks(t|| _|| _d S )Nr   r   )r   r   rw  r  )r   rw  r  r   r   r   r     s    zASTBinOpExpr.__init__)r   rt   c             C   sx   g }| || jd  xTtdt| jD ]@}| d | | j|d   | d | || j|  q*W d|S )Nr   r   r2  r   )r  rw  r1  r   r  r/  )r   r   r  r   r   r   r   r!    s    

zASTBinOpExpr._stringify)r   rt   c             C   sr   |dkst g }x@tt| jD ].}|t| j|   || j| | q W || jd | d|S )NrM  r4  r   )	r   r1  r   r  r  rc  rw  r   r/  )r   r   r  r   r   r   r   r     s    zASTBinOpExpr.get_idr   r   N)r   r  r  r   rt   c             C   s   | j d |||| xtdt| j D ]}|t 7 }| j|d  }t|d tdkrt|d tdkr|t||7 }n|t	||7 }|t 7 }| j | |||| q(W d S )Nr   r   r   z)
rw  r  r1  r   r   r:  r  rS  r9  rd  )r   r   r  r  r   r   r]  r   r   r   r    s    (zASTBinOpExpr.describe_signature)r   r   r   r   r@  r   r   r)   r!  rc   r   r   r  r   r   r   r   r    s
   
	r  c               @   sT   e Zd ZeeedddZeedddZeeddd	Z	e
ed
dddddZdS )ASTConditionalExpr)ifExprthenExprelseExprc             C   s   || _ || _|| _d S )N)r  r  r  )r   r  r  r  r   r   r   r     s    zASTConditionalExpr.__init__)r   rt   c             C   sR   g }| || j | d | || j | d | || j d|S )Nz ? z : r   )r  r  r  r  r/  )r   r   r  r   r   r   r!    s    

zASTConditionalExpr._stringify)r   rt   c             C   s^   |dkst g }|td  || j| || j| || j| d|S )NrM  r   r   )r   r  rc  r  r   r  r  r/  )r   r   r  r   r   r   r     s    zASTConditionalExpr.get_idr   r   N)r   r  r  r   rt   c             C   s   | j |||| |t 7 }|tdd7 }|t 7 }| j|||| |t 7 }|tdd7 }|t 7 }| j|||| d S )Nr   :)r  r  r   r:  rd  r  r  )r   r   r  r  r   r   r   r   r    s    z%ASTConditionalExpr.describe_signature)r   r   r   r@  r   r)   r   r!  rc   r   r   r  r   r   r   r   r    s   		r  c               @   s`   e Zd Zeeed f  eddddZee	dddZ
ee	dd	d
Zee	ddddddZdS )ru  N)rw  trailingCommart   c             C   s   || _ || _d S )N)rw  r  )r   rw  r  r   r   r   r     s    zASTBracedInitList.__init__)r   rt   c                s   dd  fdd| jD  S )Nzil%sEr   c             3   s   | ]}|  V  qd S )N)r   )r*  r   )r   r   r   r+    s    z+ASTBracedInitList.get_id.<locals>.<genexpr>)r/  rw  )r   r   r   )r   r   r     s    zASTBracedInitList.get_id)r   rt   c                s4    fdd| j D }| jrdnd}dd||f S )Nc                s   g | ]} |qS r   r   )r*  r   )r   r   r   
<listcomp>"  s    z0ASTBracedInitList._stringify.<locals>.<listcomp>r   r   z{%s%s}z, )rw  r  r/  )r   r   rw  r  r   )r   r   r!  !  s    zASTBracedInitList._stringifyr   r   )r   r  r  r   rt   c             C   s   t | |tdd7 }d}xD| jD ]:}|sJ|tdd7 }|t 7 }nd}||||| q$W | jrx|tdd7 }|tdd7 }d S )N{Tr   F})r5   r   r8  rw  r:  r  r  )r   r   r  r  r   r<  r   r   r   r   r  &  s    z$ASTBracedInitList.describe_signature)r   r   r   r   r   r@  rC   r   rc   r   r   r)   r!  r   r  r   r   r   r   ru    s   ru  c               @   s\   e Zd Zeeeeef dddZeedddZ	e
eddd	Zeed
dddddZdS )ASTAssignmentExpr)r\  r]  r^  c             C   s   || _ || _|| _d S )N)r\  r]  r^  )r   r\  r]  r^  r   r   r   r   8  s    zASTAssignmentExpr.__init__)r   rt   c             C   sN   g }| || j | d | | j | d | || j d|S )Nr2  r   )r  r\  r]  r^  r/  )r   r   r  r   r   r   r!  >  s    

zASTAssignmentExpr._stringify)r   rt   c             C   sB   g }| t| j  | | j| | | j| d|S )Nr   )r  rc  r]  r\  r   r^  r/  )r   r   r  r   r   r   r   G  s
    zASTAssignmentExpr.get_idr   r   N)r   r  r  r   rt   c             C   s   | j |||| |t 7 }t| jd tdkr`t| jd tdkr`|t| j| j7 }n|t| j| j7 }|t 7 }| j|||| d S )Nr   r   r  )	r\  r  r   r:  rS  r]  r9  rd  r^  )r   r   r  r  r   r   r   r   r  O  s    ,z$ASTAssignmentExpr.describe_signature)r   r   r   r@  r   r   ru  r   r)   r!  rc   r   r   r  r   r   r   r   r  7  s   	r  c               @   sT   e Zd Zee dddZeedddZe	eddd	Z
eed
dddddZdS )ASTCommaExpr)rw  c             C   s   t |dkst|| _d S )Nr   )r   r   rw  )r   rw  r   r   r   r   \  s    zASTCommaExpr.__init__)r   rt   c                s   d  fdd| jD S )Nz, c             3   s   | ]} |V  qd S )Nr   )r*  r   )r   r   r   r+  a  s    z*ASTCommaExpr._stringify.<locals>.<genexpr>)r/  rw  )r   r   r   )r   r   r!  `  s    zASTCommaExpr._stringify)r   rt   c             C   sh   t d }g }x:tt| jd D ]$}|| || j| | q W || jd | d|S )Nr   r   r4  r   )rc  r1  r   rw  r  r   r/  )r   r   id_r  r   r   r   r   r   c  s    
zASTCommaExpr.get_idr   r   N)r   r  r  r   rt   c             C   sf   | j d |||| xJtdt| j D ]6}|tdd7 }|t 7 }| j | |||| q(W d S )Nr   r   r   )rw  r  r1  r   r   r8  r:  )r   r   r  r  r   r   r   r   r   r  l  s
    zASTCommaExpr.describe_signature)r   r   r   r   r@  r   r)   r   r!  rc   r   r   r  r   r   r   r   r  [  s
   	r  c               @   sP   e Zd ZedddZeedddZeeddd	Ze	ed
dddddZ
dS )ASTFallbackExpr)rf  c             C   s
   || _ d S )N)rf  )r   rf  r   r   r   r   v  s    zASTFallbackExpr.__init__)r   rt   c             C   s   | j S )N)rf  )r   r   r   r   r   r!  y  s    zASTFallbackExpr._stringify)r   rt   c             C   s
   t | jS )N)r   rf  )r   r   r   r   r   r   |  s    zASTFallbackExpr.get_idr   r   N)r   r  r  r   rt   c             C   s   |t | j| j7 }d S )N)r   rW  rf  )r   r   r  r  r   r   r   r   r    s    z"ASTFallbackExpr.describe_signature)r   r   r   r   r   r)   r!  rc   r   r   r  r   r   r   r   r  u  s
   r  c               @   sh   e Zd ZedddZedddZeedddZe	e	d	d
ddddZ
e	ed	eed
ddddZdS )r  )rt   c             C   s   dS )NFr   )r   r   r   r   r     s    zASTOperator.is_anonc             C   s   dS )NTr   )r   r   r   r   r    s    zASTOperator.is_operator)r   rt   c             C   s
   t  d S )N)rA  )r   r   r   r   r   r     s    zASTOperator.get_idr   r   N)r   	identnoder  r   rt   c             C   s
   t  dS )zARender the prefix into signode, and the last part into identnode.N)rA  )r   r   r  r  r   r   r   r   _describe_identifier  s    z ASTOperator._describe_identifier)r   r  r  r  r  r   rt   c             C   s   t | |dkr2t }| |||| ||7 }n|dkr|t|  | }tjddd|d d d}	| |	d< t }
| ||
|| |
	 }|	t||7 }	||	7 }n t
 }| |||| ||7 }d S )Nr  r  r   r  r   )r  r	  r
  r  r  zcpp:parent_key)r5   r   r  r  r   r   r  r   rW  astextr7  )r   r   r  r  r  r  r   ZmainNamer  r  	containerrU  ZaddNamer   r   r   r    s(    

zASTOperator.describe_signature)r   r   r   rC   r   r  rc   r   r   r   r  r  r   r   r   r   r    s   r  c               @   sR   e Zd ZeddddZeedddZeedd	d
Ze	e	ddddddZ
dS )ASTOperatorBuildInN)r]  rt   c             C   s
   || _ d S )N)r]  )r   r]  r   r   r   r     s    zASTOperatorBuildIn.__init__)r   rt   c             C   sD   |dkrt }| j|kr"t nt}| j|kr:td| j || j S )Nr   zBInternal error: Built-in operator "%s" can not be mapped to an id.)_id_operator_v1r]  r(   rc  r  )r   r   idsr   r   r   r     s    


zASTOperatorBuildIn.get_id)r   rt   c             C   s0   | j dks| j d dkr"d| j  S d| j  S d S )N)rg   znew[]rU   zdelete[]r   abcnoxz	operator rl   )r]  )r   r   r   r   r   r!    s    
zASTOperatorBuildIn._stringifyr   r   )r   r  r  r   rt   c             C   sL   |t dd7 }| jdks(| jd dkr4|t  7 }|t | j| j7 }d S )Nrl   )rg   znew[]rU   zdelete[]r   r  )r   r9  r]  r:  rd  )r   r   r  r  r   r   r   r   r    s    z'ASTOperatorBuildIn._describe_identifier)r   r   r   r   r   rc   r   r)   r!  r   r  r   r   r   r   r    s
   r  c               @   sR   e Zd ZeddddZeedddZeedd	d
Z	e
e
ddddddZdS )ASTOperatorLiteralN)r   rt   c             C   s
   || _ d S )N)r   )r   r   r   r   r   r     s    zASTOperatorLiteral.__init__)r   rt   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_id)r   rt   c             C   s   d|| j  S )Nz
operator"")r   )r   r   r   r   r   r!    s    zASTOperatorLiteral._stringifyr   r   )r   r  r  r   rt   c             C   s:   |t dd7 }|t dd7 }| j|d|dd| d S )Nrl   z""r  r   )r   r9  rN  r   r  )r   r   r  r  r   r   r   r   r    s    z'ASTOperatorLiteral._describe_identifier)r   r   r   r   r   rc   r   r   r)   r!  r   r  r   r   r   r   r    s
   r  c               @   s`   e Zd ZdddddZeedddZeed	d
dZedddZ	e
e
ddddddZdS )ASTOperatorTypery  N)rP  rt   c             C   s
   || _ d S )N)rP  )r   rP  r   r   r   r     s    zASTOperatorType.__init__)r   rt   c             C   s,   |dkrd| j | S d| j | S d S )Nr   zcastto-%s-operatorr  )rP  r   )r   r   r   r   r   r     s    zASTOperatorType.get_id)r   rt   c             C   s   d d|| jgS )Nr   z	operator )r/  rP  )r   r   r   r   r   r!    s    zASTOperatorType._stringify)rt   c             C   s   t | S )N)r   )r   r   r   r   get_name_no_template  s    z$ASTOperatorType.get_name_no_templater   r   )r   r  r  r   rt   c             C   s2   |t dd7 }|t  7 }| j|d|| d S )Nrl   r  )r   r9  r:  rP  r  )r   r   r  r  r   r   r   r   r    s    z$ASTOperatorType._describe_identifier)r   r   r   r   rc   r   r   r)   r!  r  r   r  r   r   r   r   r    s   r  c               @   sR   e Zd ZeddddZeedddZeedd	d
Z	e
eddddddZdS )ASTTemplateArgConstantN)rF  rt   c             C   s
   || _ d S )N)rF  )r   rF  r   r   r   r     s    zASTTemplateArgConstant.__init__)r   rt   c             C   s
   || j S )N)rF  )r   r   r   r   r   r!    s    z!ASTTemplateArgConstant._stringify)r   rt   c             C   sD   |dkrt | ddS |dkr0dt |  d S d| j| d S )Nr   r2  r   rM  Xr-  )r   rJ  rF  r   )r   r   r   r   r   r     s
    zASTTemplateArgConstant.get_idr   r   )r   r  r  r   rt   c             C   s   t | | j|||| d S )N)r5   rF  r  )r   r   r  r  r   r   r   r   r    s    z)ASTTemplateArgConstant.describe_signature)r   r   r   r@  r   r)   r   r!  rc   r   r   r  r   r   r   r   r    s
   r  c               @   s`   e Zd Zeedef  eddddZee	dddZ
ee	d	d
dZee	ddddddZdS )r  ry  N)argspackExpansionrt   c             C   s   |d k	st || _|| _d S )N)r   r  r  )r   r  r  r   r   r   r     s    zASTTemplateArgs.__init__)r   rt   c                s    dkrJg }| d | d fdd| jD  | d d|S g }| d t| jdkrx&| jd d	 D ]}| |  qvW | jr| d
 | | jd	   | jr| d | d d|S )Nr   r  rn  c             3   s   | ]}|  V  qd S )N)r   )r*  r   )r   r   r   r+     s    z)ASTTemplateArgs.get_id.<locals>.<genexpr>r   Ir   r4  Jr-  )r  r/  r  r   r   r  )r   r   r  r   r   )r   r   r     s$    
 





zASTTemplateArgs.get_id)r   rt   c                s4   d  fdd| jD }| jr(|d7 }d| d S )Nz, c             3   s   | ]} |V  qd S )Nr   )r*  r   )r   r   r   r+  2  s    z-ASTTemplateArgs._stringify.<locals>.<genexpr>z...r   r   )r/  r  r  )r   r   r  r   )r   r   r!  1  s    zASTTemplateArgs._stringifyr   r   )r   r  r  r   rt   c             C   s   t | |tdd7 }d}xD| jD ]:}|sH|tdd7 }|t 7 }d}|j|d||d q$W | jrx|tdd7 }|tdd7 }d S )	Nr   Tr   Fr  )r   z...r   )r5   r   r8  r  r:  r  r  )r   r   r  r  r   r<  r   r   r   r   r  7  s    z"ASTTemplateArgs.describe_signature)r   r   r   r   r   r  rC   r   rc   r   r   r)   r!  r   r  r   r   r   r   r    s   r  c               @   s2   e Zd ZeedddZeedddddd	ZdS )
ASTTrailingTypeSpec)r   rt   c             C   s   t t| d S )N)rA  rB  )r   r   r   r   r   r   K  s    zASTTrailingTypeSpec.get_idr   r   N)r   r  r  r   rt   c             C   s   t t| d S )N)rA  rB  )r   r   r  r  r   r   r   r   r  N  s    z&ASTTrailingTypeSpec.describe_signature)r   r   r   rc   r   r   r   r  r   r   r   r   r  J  s   r  c               @   s\   e Zd Zee ee ddddZeedddZeedd	d
Z	e
eddddddZdS )ASTTrailingTypeSpecFundamentalN)r#  
canonNamesrt   c             C   s<   t |dkstt |t |ks,t||f|| _|| _d S )Nr   )r   r   r#  r  )r   r#  r  r   r   r   r   T  s    z'ASTTrailingTypeSpecFundamental.__init__)r   rt   c             C   s   d | jS )Nr2  )r/  r#  )r   r   r   r   r   r!  [  s    z)ASTTrailingTypeSpecFundamental._stringify)r   rt   c             C   sp   |dkrHg }x0| j D ]&}|tkr0|t|  q|| qW d|S d| j }|tkrhtd| t| S )Nr   r   r2  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  _id_fundamental_v1r  r/  _id_fundamental_v2r  )r   r   r  r   rU  r   r   r   r   ^  s    
z%ASTTrailingTypeSpecFundamental.get_idr   r   )r   r  r  r   rt   c             C   s>   d}x4| j D ]*}|s"|t 7 }nd}|t||7 }qW d S )NTF)r#  r   r:  Zdesc_sig_keyword_type)r   r   r  r  r   r<  r   r   r   r   r  p  s    z1ASTTrailingTypeSpecFundamental.describe_signature)r   r   r   r   r   r   r)   r!  rc   r   r   r  r   r   r   r   r  S  s
   r  c               @   sB   e Zd ZeedddZeedddZeeddd	d
ddZ	d	S )ASTTrailingTypeSpecDecltypeAuto)r   rt   c             C   s   dS )Nzdecltype(auto)r   )r   r   r   r   r   r!  |  s    z*ASTTrailingTypeSpecDecltypeAuto._stringify)r   rt   c             C   s   |dkrt  dS )Nr   r   )r(   )r   r   r   r   r   r     s    z&ASTTrailingTypeSpecDecltypeAuto.get_idr   r   N)r   r  r  r   rt   c             C   sD   |t dd7 }|t dd7 }|t dd7 }|t dd7 }d S )NrS   r_  r@   r`  )r   r9  r8  )r   r   r  r  r   r   r   r   r    s    z2ASTTrailingTypeSpecDecltypeAuto.describe_signature)
r   r   r   r)   r   r!  rc   r   r   r  r   r   r   r   r  {  s   r  c               @   sP   e Zd ZedddZeedddZeeddd	Z	e
ed
dddddZdS )ASTTrailingTypeSpecDecltype)rf  c             C   s
   || _ d S )N)rf  )r   rf  r   r   r   r     s    z$ASTTrailingTypeSpecDecltype.__init__)r   rt   c             C   s   d|| j  d S )Nz	decltype(r`  )rf  )r   r   r   r   r   r!    s    z&ASTTrailingTypeSpecDecltype._stringify)r   rt   c             C   s"   |dkrt  d| j| d S )Nr   ZDTr-  )r(   rf  r   )r   r   r   r   r   r     s    z"ASTTrailingTypeSpecDecltype.get_idr   r   N)r   r  r  r   rt   c             C   sF   |t dd7 }|t dd7 }| j|||| |t dd7 }d S )NrS   r_  r`  )r   r9  r8  rf  r  )r   r   r  r  r   r   r   r   r    s    z.ASTTrailingTypeSpecDecltype.describe_signature)r   r   r   r@  r   r)   r   r!  rc   r   r   r  r   r   r   r   r    s
   r  c               @   sl   e Zd Zeeee ddddZeedddZe	edd	d
Z
eedddZeeddddddZdS )ASTTrailingTypeSpecNameN)r  
nestedNameplaceholderTypert   c             C   s   || _ || _|| _d S )N)r  r  r  )r   r  r  r  r   r   r   r     s    z ASTTrailingTypeSpecName.__init__)rt   c             C   s   | j S )N)r  )r   r   r   r   r&    s    zASTTrailingTypeSpecName.name)r   rt   c             C   s   | j |S )N)r  r   )r   r   r   r   r   r     s    zASTTrailingTypeSpecName.get_id)r   rt   c             C   sZ   g }| j r || j  |d ||| j | jd k	rP|d || j d|S )Nr2  r   )r  r  r  r  r/  )r   r   r  r   r   r   r!    s    


z"ASTTrailingTypeSpecName._stringifyr   r   )r   r  r  r   rt   c             C   s   | j r&|t| j | j 7 }|t 7 }| jj||||d | jd k	r|t 7 }| jdkrl|tdd7 }nV| jdkr|tdd7 }|tdd7 }|tdd7 }|tdd7 }n
t| jd S )N)r   r@   zdecltype(auto)rS   r_  r`  )	r  r   r9  r:  r  r  r  r8  r   )r   r   r  r  r   r   r   r   r    s    


z*ASTTrailingTypeSpecName.describe_signature)r   r   r   r   r"  r   r   r?  r&  rc   r   r)   r!  r   r  r   r   r   r   r    s   r  c               @   s`   e Zd Zded eddddZdeededd	d
Ze	edddZ
eeddddddZdS )ASTFunctionParameterF)ASTTypeWithInit'ASTTemplateParamConstrainedTypeWithInitN)argellipsisrt   c             C   s   || _ || _d S )N)r  r  )r   r  r  r   r   r   r     s    zASTFunctionParameter.__init__r   )r   
objectTyper   rt   c             C   s0   |r|j jj|ddS | jr dS | j|S d S )NF)prefixedr  )parentr   r   r  r  )r   r   r  r   r   r   r   r     s
    zASTFunctionParameter.get_id)r   rt   c             C   s   | j r
dS || jS d S )Nz...)r  r  )r   r   r   r   r   r!    s    zASTFunctionParameter._stringifyr   )r   r  r  r   rt   c             C   s8   t | | jr |tdd7 }n| jj||||d d S )Nz...)r   )r5   r  r   r8  r  r  )r   r   r  r  r   r   r   r   r    s    z'ASTFunctionParameter.describe_signature)F)NN)r   r   r   r   rC   r   rc   r   r   r)   r!  r   r  r   r   r   r   r    s
   r  c               @   sD   e Zd Zee dddZeedddZe	eddd	d
ddZ
d	S )ASTNoexceptSpec)rf  c             C   s
   || _ d S )N)rf  )r   rf  r   r   r   r     s    zASTNoexceptSpec.__init__)r   rt   c             C   s   | j rd|| j  d S dS )Nz	noexcept(r`  rh   )rf  )r   r   r   r   r   r!    s    zASTNoexceptSpec._stringifyr   r   N)r   r  r  r   rt   c             C   sL   |t dd7 }| jrH|t dd7 }| j|d|| |t dd7 }d S )Nrh   r_  r  r`  )r   r9  rf  r8  r  )r   r   r  r  r   r   r   r   r    s
    z"ASTNoexceptSpec.describe_signature)r   r   r   r   r@  r   r)   r   r!  r   r  r   r   r   r   r    s   r  c               @   s   e Zd Zee eeee edeee	ee ddddZ
eee dddZeed	d
dZeed	ddZeedddZeeddddddZdS )ASTParametersQualifiersry  N)r  r   rM   refQualexceptionSpectrailingReturnoverridefinalattrsinitializerrt   c             C   s@   || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	d S )N)
r  r   rM   r  r  r  r  r  r  r  )r   r  r   rM   r  r  r  r  r  r  r  r   r   r   r      s    z ASTParametersQualifiers.__init__)rt   c             C   s   | j S )N)r  )r   r   r   r   function_params  s    z'ASTParametersQualifiers.function_params)r   rt   c             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&&Or   Rr   )r   r  rM   r  r/  )r   r   r  r   r   r   get_modifiers_id  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   rn  c             3   s   | ]}|  V  qd S )N)r   )r*  r   )r   r   r   r+  (  s    z7ASTParametersQualifiers.get_param_id.<locals>.<genexpr>r   c             3   s   | ]}|  V  qd S )N)r   )r*  r   )r   r   r   r+  ,  s    )r   r  r/  )r   r   r   )r   r   get_param_id#  s    z$ASTParametersQualifiers.get_param_id)r   rt   c             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 | || j | jr| d	 | || j | jr| d
 | j	r| d t
| jdkr| d | || j | jr0| d | | j d|S )Nr_  Tz, Fr`  z	 volatilez constr2  z -> z finalz	 overrider   z = r   )r  r  r   r   rM   r  r  r  r  r  r   r  r  r/  )r   r   r  r<  r   r   r   r   r!  .  sB    











z"ASTParametersQualifiers._stringifyr   r   )r   r  r  r   rt   c       
      C   sJ  t | |dkr\t }x8| jD ].}tjdddd}|j|d||d ||7 }q W ||7 }nj|tdd7 }d}xD| jD ]:}|s|tdd7 }|t 7 }d	}|j|d
||d qxW |tdd7 }tt	d ddd}	| j
r|	|d | jr|	|d | jr |t 7 }|t| j| j7 }| jrF|t 7 }| j|||| | jr|t 7 }|tdd7 }|t 7 }| j|||| | jr|	|d | jr|	|d t| jdkr|t 7 }| j| | jrF|t 7 }|tdd7 }|t 7 }| jdkst| jdkr2|tdd7 }n|t| j| j7 }d S )Nr  r   T)Znoemphr  )r   r_  r   Fr  r`  )r   r  rt   c             S   s    | t  7 } | t ||7 } d S )N)r   r:  r9  )r   r  r   r   r   	_add_annog  s    z=ASTParametersQualifiers.describe_signature.<locals>._add_annor   rM   z->r  r  r   r   )0rU   rT   r  )r5   r   Zdesc_parameterlistr  Zdesc_parameterr  r8  r:  r   r   r   rM   r  r  r  rd  r  r  r   r  r  r   rK  r9  )
r   r   r  r  r   Z	paramlistr  r  r<  r  r   r   r   r  Q  s`    




z*ASTParametersQualifiers.describe_signature)r   r   r   r   r  rC   r   r   r  r#   r   r?  r  rc   r  r  r)   r!  r   r  r   r   r   r   r    s   
#r  c               @   sD   e Zd Zee ddddZeedddZe	dd	dd
ddZ
dS )ASTExplicitSpecN)rf  rt   c             C   s
   || _ d S )N)rf  )r   rf  r   r   r   r     s    zASTExplicitSpec.__init__)r   rt   c             C   s>   dg}| j d k	r4|d ||| j  |d d|S )Nr[   r_  r`  r   )rf  r  r/  )r   r   r  r   r   r   r!    s    


zASTExplicitSpec._stringifyr   r   )r   r  r   rt   c             C   sP   |t dd7 }| jd k	rL|t dd7 }| j|d|| |t dd7 }d S )Nr[   r_  r  r`  )r   r9  rf  r8  r  )r   r   r  r   r   r   r   r    s
    
z"ASTExplicitSpec.describe_signature)r   r   r   r   r@  r   r)   r   r!  r   r  r   r   r   r   r    s   r  c               @   sj   e Zd Zeeeeee eeeeeeeddddZd d dddZ	e
edd	d
ZeddddddZdS )ASTDeclSpecsSimpleN)storagethreadLocalrb   r   explicitSpecrN   rO   rP   r   rM   r`   r  rt   c             C   sL   || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	|| _
|| _d S )N)r  r  rb   r   r  rN   rO   rP   r   rM   r`   r  )r   r  r  rb   r   r  rN   rO   rP   r   rM   r`   r  r   r   r   r     s    zASTDeclSpecsSimple.__init__)otherrt   c             C   s   |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
pn|j
| jpx|j| j|j S )N)r  r  r  rb   r   r  rN   rO   rP   r   rM   r`   r  )r   r  r   r   r   	mergeWith  s    









zASTDeclSpecsSimple.mergeWith)r   rt   c             C   s   g }t | jdkr"||| j | jr4|| j | jrD|d | jrT|d | jrd|d | jrt|d | jr||| j | j	r|d | j
r|d | jr|d | jr|d	 | jr|d
 d|S )Nr   r~   rb   r`   r   rN   rO   rP   r   rM   r2  )r   r  r  r  r  rb   r`   r   r  rN   rO   rP   r   rM   r/  )r   r   r  r   r   r   r!    s4    








zASTDeclSpecsSimple._stringifyr   r   )r   r  r   rt   c                s   | j | t| j dk tttd fdd}| jrB||| j | jrR||d | jrb||d | j	rr||d | j
r||d | jr r|t 7 }| j||| d	 | jr||d
 | jr||d | jr||d | jr||d | jr||d d S )Nr   )r   r  rt   c                s$    r| t  7 } | t ||7 } dS )NT)r   r:  r9  )r   r  )addSpacer   r   _add  s    z3ASTDeclSpecsSimple.describe_signature.<locals>._addr~   rb   r`   r   TrN   rO   rP   r   rM   )r  r  r   r   r   rC   r  r  rb   r`   r   r  r   r:  rN   rO   rP   r   rM   )r   r   r  r   r  r   )r  r   r    s8    







z%ASTDeclSpecsSimple.describe_signature)r   r   r   r   rC   r   r  r#   r   r  r)   r!  r   r  r   r   r   r   r    s   r  c               @   sX   e Zd ZeeeeddddZeedddZe	edd	d
Z
eeddddddZdS )ASTDeclSpecsN)outer	leftSpecs
rightSpecstrailingrt   c             C   s,   || _ || _|| _| j| j| _|| _d S )N)r  r  r  r  allSpecstrailingTypeSpec)r   r  r  r  r  r   r   r   r   	  s
    zASTDeclSpecs.__init__)r   rt   c             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  r   rM   r/  )r   r   r  r   r   r   r   	  s     





zASTDeclSpecs.get_id)r   rt   c             C   s   g }|| j }t|dkr$|| | jrt|dkr@|d ||| j t| j}t|dkrt|dkr||d || d|S )Nr   r2  r   )r  r   r  r  r   r  r/  )r   r   r  r   rr   r   r   r!  $	  s    





zASTDeclSpecs._stringifyr   r   )r   r  r  r   rt   c             C   s   t | t|}| j||| t||k}| jr|rB|t 7 }t|}| jj||||d t||k}tt| jdkr|r|t 7 }| j||| d S )N)r   r   )	r5   r   r  r  r  r   r:  r   r  )r   r   r  r  r   ZnumChildrenr  r   r   r   r  4	  s    zASTDeclSpecs.describe_signature)r   r   r   r   r  r  r   rc   r   r)   r!  r   r  r   r   r   r   r  	  s   	r  c               @   sP   e Zd ZedddZeedddZeeddd	Z	e
ed
dddddZdS )ASTArray)sizec             C   s
   || _ d S )N)r  )r   r  r   r   r   r   M	  s    zASTArray.__init__)r   rt   c             C   s    | j rd|| j  d S dS d S )Nrk  rl  z[])r  )r   r   r   r   r   r!  P	  s    zASTArray._stringify)r   rt   c             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   ArM  r   ZA_)r  r   r   )r   r   r   r   r   r   V	  s    zASTArray.get_idr   r   N)r   r  r  r   rt   c             C   sD   t | |tdd7 }| jr0| j|d|| |tdd7 }d S )Nrk  r  rl  )r5   r   r8  r  r  )r   r   r  r  r   r   r   r   r  c	  s
    zASTArray.describe_signature)r   r   r   r@  r   r)   r   r!  rc   r   r   r  r   r   r   r   r  L	  s
   r  c               @   s   e Zd ZeedddZejeddddZeedddZee	e
 dd	d
ZeddddZedddZeedddZeedddZeedddZeeedddZedddZeedddddd ZdS )!ASTDeclarator)rt   c             C   s   t t| d S )N)rA  rB  )r   r   r   r   r&  m	  s    zASTDeclarator.nameN)r&  rt   c             C   s   t t| d S )N)rA  rB  )r   r&  r   r   r   r&  q	  s    c             C   s   t t| d S )N)rA  rB  )r   r   r   r   isPacku	  s    zASTDeclarator.isPackc             C   s   t t| d S )N)rA  rB  )r   r   r   r   r  y	  s    zASTDeclarator.function_paramsry  c             C   s   t t| d S )N)rA  rB  )r   r   r   r   r  }	  s    zASTDeclarator.trailingReturnc             C   s   t t| d S )N)rA  rB  )r   r   r   r   require_space_after_declSpecs	  s    z+ASTDeclarator.require_space_after_declSpecs)r   rt   c             C   s   t t| d S )N)rA  rB  )r   r   r   r   r   r  	  s    zASTDeclarator.get_modifiers_idc             C   s   t t| d S )N)rA  rB  )r   r   r   r   r   r  	  s    zASTDeclarator.get_param_idc             C   s   t t| d S )N)rA  rB  )r   r   r   r   r   get_ptr_suffix_id	  s    zASTDeclarator.get_ptr_suffix_id)r   returnTypeIdrt   c             C   s   t t| d S )N)rA  rB  )r   r   r  r   r   r   get_type_id	  s    zASTDeclarator.get_type_idc             C   s   t t| d S )N)rA  rB  )r   r   r   r   is_function_type	  s    zASTDeclarator.is_function_typer   r   )r   r  r  r   rt   c             C   s   t t| d S )N)rA  rB  )r   r   r  r  r   r   r   r   r  	  s    z ASTDeclarator.describe_signature)r   r   r   r?  r"  r&  setterrC   r  r   r  r  r  r  rc   r   r  r  r  r  r  r   r  r   r   r   r   r  l	  s$   r  c               @   s
  e Zd Zeee eddddZeedddZ	e	j
eddd	dZ	eedd
dZeee dddZeddddZeedddZeedddZeedddZeeedddZedddZedddZeedd d!Zeed"d#dd$d%d&ZdS )'ASTDeclaratorNameParamQualN)declIdarrayOps	paramQualrt   c             C   s   || _ || _|| _d S )N)r  r  r  )r   r  r  r  r   r   r   r   	  s    z#ASTDeclaratorNameParamQual.__init__)rt   c             C   s   | j S )N)r  )r   r   r   r   r&  	  s    zASTDeclaratorNameParamQual.name)r&  rt   c             C   s
   || _ d S )N)r  )r   r&  r   r   r   r&  	  s    c             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_paramsry  c             C   s   | j jS )N)r  r  )r   r   r   r   r  	  s    z)ASTDeclaratorNameParamQual.trailingReturn)r   rt   c             C   s"   | j r| j |S td|  d S )Nz,This should only be called on a function: %s)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   )r*  r   )r   r   r   r+  	  s    z?ASTDeclaratorNameParamQual.get_ptr_suffix_id.<locals>.<genexpr>)r/  r  )r   r   r   )r   r   r  	  s    z,ASTDeclaratorNameParamQual.get_ptr_suffix_id)r   r  rt   c             C   sz   |dkst g }|| | | jrf|| | |d || || | |d n
|| d|S )NrM  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_type)r   rt   c             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._stringifyr   r   )r   r  r  r   rt   c             C   s\   t | | jr | j|||| x| jD ]}||||| q(W | jrX| j|||| d S )N)r5   r  r  r  r  )r   r   r  r  r   r]  r   r   r   r  	  s    z-ASTDeclaratorNameParamQual.describe_signature)r   r   r   r"  r   r  r  r   r?  r&  r  rC   r  r  r  r  rc   r   r  r  r  r  r  r  r)   r!  r   r  r   r   r   r   r  	  s,   
r  c               @   s   e Zd ZeedddZeedddZejeddd	dZe	e
d
ddZe	e
d
ddZedddZedddZee
dddZee
ddddddZdS )ASTDeclaratorNameBitField)r  r  c             C   s   || _ || _d S )N)r  r  )r   r  r  r   r   r   r   	  s    z"ASTDeclaratorNameBitField.__init__)rt   c             C   s   | j S )N)r  )r   r   r   r   r&  	  s    zASTDeclaratorNameBitField.nameN)r&  rt   c             C   s
   || _ d S )N)r  )r   r&  r   r   r   r&  	  s    )r   rt   c             C   s   dS )Nr   r   )r   r   r   r   r   r  	  s    z&ASTDeclaratorNameBitField.get_param_idc             C   s   dS )Nr   r   )r   r   r   r   r   r   
  s    z+ASTDeclaratorNameBitField.get_ptr_suffix_idc             C   s
   | j d k	S )N)r  )r   r   r   r   r  
  s    z7ASTDeclaratorNameBitField.require_space_after_declSpecsc             C   s   dS )NFr   )r   r   r   r   r  
  s    z*ASTDeclaratorNameBitField.is_function_type)r   rt   c             C   s>   g }| j r||| j  |d ||| j d|S )Nz : r   )r  r  r  r/  )r   r   r  r   r   r   r!  
  s    
z$ASTDeclaratorNameBitField._stringifyr   r   )r   r  r  r   rt   c             C   s^   t | | jr | j|||| |t 7 }|tdd7 }|t 7 }| j|||| d S )Nr  )r5   r  r  r   r:  r8  r  )r   r   r  r  r   r   r   r   r  
  s    z,ASTDeclaratorNameBitField.describe_signature)r   r   r   r"  r@  r   r?  r&  r  rc   r   r  r  rC   r  r  r)   r!  r   r  r   r   r   r   r  	  s   r  c               @   s  e Zd ZeeeeddddZeedddZ	e	j
eddd	dZ	eedd
dZeee dddZeddddZedddZeedddZeedddZeedddZeedddZeeedddZedd d!Zeed"d#dd$d%d&ZdS )'ASTDeclaratorPtrN)nextr   rM   r  rt   c             C   s$   |st || _|| _|| _|| _d S )N)r   r  r   rM   r  )r   r  r   rM   r  r   r   r   r   
  s
    zASTDeclaratorPtr.__init__)rt   c             C   s   | j jS )N)r  r&  )r   r   r   r   r&  '
  s    zASTDeclaratorPtr.name)r&  rt   c             C   s   || j _d S )N)r  r&  )r   r&  r   r   r   r&  +
  s    c             C   s   | j jS )N)r  r  )r   r   r   r   r  /
  s    zASTDeclaratorPtr.isPackc             C   s   | j jS )N)r  r  )r   r   r   r   r  3
  s    z ASTDeclaratorPtr.function_paramsry  c             C   s   | j jS )N)r  r  )r   r   r   r   r  7
  s    zASTDeclaratorPtr.trailingReturnc             C   s
   | j  S )N)r  r  )r   r   r   r   r  ;
  s    z.ASTDeclaratorPtr.require_space_after_declSpecs)r   rt   c             C   s   dg}| || j t| jdkr:| js0| jr:| d | jrJ| d | jrj| jr`| d | d | js| jst| jdkr| j r| d | || j d|S )Nr   r   r2  r   rM   r   )r  r  r   r   rM   r  r  r/  )r   r   r  r   r   r   r!  >
  s    





zASTDeclaratorPtr._stringify)r   rt   c             C   s   | j |S )N)r  r  )r   r   r   r   r   r  O
  s    z!ASTDeclaratorPtr.get_modifiers_idc             C   s   | j |S )N)r  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   )r   r  rM   r  r  r/  )r   r   r  r   r   r   r  U
  s    





z"ASTDeclaratorPtr.get_ptr_suffix_id)r   r  rt   c             C   sF   dg}| j r|d | jr&|d || | jj|d|dS )Nr  r  r   r   )r  )r   r  rM   r  r  r/  )r   r   r  r  r   r   r   r  g
  s    


zASTDeclaratorPtr.get_type_idc             C   s
   | j  S )N)r  r  )r   r   r   r   r  q
  s    z!ASTDeclaratorPtr.is_function_typer   r   )r   r  r  r   rt   c             C   s   t | |tdd7 }| j| t| jdkrJ| js>| jrJ|t 7 }t	t
d ddd}| jrl||d | jr| jr|t 7 }||d | js| jst| jdkr| j r|t 7 }| j|||| d S )Nr   r   )r   r  rt   c             S   s   | t ||7 } d S )N)r   r9  )r   r  r   r   r   r  |
  s    z6ASTDeclaratorPtr.describe_signature.<locals>._add_annor   rM   )r5   r   r8  r  r  r   r   rM   r:  r   r   r  r  )r   r   r  r  r   r  r   r   r   r  t
  s     


z#ASTDeclaratorPtr.describe_signature)r   r   r   r  rC   r#   r   r?  r"  r&  r  r  r   r  r  r  r  r)   r   r!  rc   r  r  r  r  r  r   r  r   r   r   r   r   
  s*   
r   c               @   s  e Zd ZeeddddZeedddZej	eddd	dZee
dd
dZeee dddZeddddZe
dddZeedddZeedddZeedddZeedddZeeedddZe
dd d!Zeed"d#dd$d%d&ZdS )'ASTDeclaratorRefN)r  r  rt   c             C   s   |st || _|| _d S )N)r   r  r  )r   r  r  r   r   r   r   
  s    zASTDeclaratorRef.__init__)rt   c             C   s   | j jS )N)r  r&  )r   r   r   r   r&  
  s    zASTDeclaratorRef.name)r&  rt   c             C   s   || j _d S )N)r  r&  )r   r&  r   r   r   r&  
  s    c             C   s   | j jS )N)r  r  )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_paramsry  c             C   s   | j jS )N)r  r  )r   r   r   r   r  
  s    zASTDeclaratorRef.trailingReturnc             C   s
   | j  S )N)r  r  )r   r   r   r   r  
  s    z.ASTDeclaratorRef.require_space_after_declSpecs)r   rt   c             C   sR   dg}| || j t| jdkr8| j r8| d | || j d|S )Nr   r   r2  r   )r  r  r   r  r  r/  )r   r   r  r   r   r   r!  
  s    
zASTDeclaratorRef._stringify)r   rt   c             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_id)r   r  rt   c             C   s    |dkst | jj|d| dS )NrM  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_typer   r   )r   r  r  r   rt   c             C   s^   t | |tdd7 }| j| t| jdkrH| j rH|t 7 }| j|||| d S )Nr   r   )	r5   r   r8  r  r  r   r  r  r:  )r   r   r  r  r   r   r   r   r  
  s    z#ASTDeclaratorRef.describe_signature)r   r   r   r  r#   r   r?  r"  r&  r  rC   r  r   r  r  r  r  r)   r   r!  rc   r  r  r  r  r  r   r  r   r   r   r   r  
  s(   r  c               @   s  e Zd ZeddddZeedddZejeddd	dZee	e
 dd
dZeddddZeedddZedddZeedddZeedddZeedddZeedddZeeedddZedd d!Zeed"d#dd$d%d&ZdS )'ASTDeclaratorParamPackN)r  rt   c             C   s   |st || _d S )N)r   r  )r   r  r   r   r   r   
  s    zASTDeclaratorParamPack.__init__)rt   c             C   s   | j jS )N)r  r&  )r   r   r   r   r&  
  s    zASTDeclaratorParamPack.name)r&  rt   c             C   s   || j _d S )N)r  r&  )r   r&  r   r   r   r&  
  s    c             C   s   | j jS )N)r  r  )r   r   r   r   r  
  s    z&ASTDeclaratorParamPack.function_paramsry  c             C   s   | j jS )N)r  r  )r   r   r   r   r  
  s    z%ASTDeclaratorParamPack.trailingReturnc             C   s   dS )NTr   )r   r   r   r   r  
  s    zASTDeclaratorParamPack.isPackc             C   s   dS )NFr   )r   r   r   r   r  
  s    z4ASTDeclaratorParamPack.require_space_after_declSpecs)r   rt   c             C   s"   || j }| j jrd| }d| S )Nr2  z...)r  r&  )r   r   r  r   r   r   r!  
  s    
z!ASTDeclaratorParamPack._stringify)r   rt   c             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   Dp)r  r  )r   r   r   r   r   r  
  s    z(ASTDeclaratorParamPack.get_ptr_suffix_id)r   r  rt   c             C   s    |dkst | jj|d| dS )NrM  r  )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     s    z'ASTDeclaratorParamPack.is_function_typer   r   )r   r  r  r   rt   c             C   sB   t | |tdd7 }| jjr,|t 7 }| j|||| d S )Nz...)r5   r   r8  r  r&  r:  r  )r   r   r  r  r   r   r   r   r    s
    z)ASTDeclaratorParamPack.describe_signature)r   r   r   r  r   r?  r"  r&  r  r   r  r  r  rC   r  r  r)   r   r!  rc   r  r  r  r  r  r   r  r   r   r   r   r  
  s(   r  c               @   s  e Zd ZeeeeddddZeedddZej	eddd	dZed
d Z
eee dddZeddddZedddZeedddZeedddZeedddZeedddZeeedddZedd d!Zeed"d#dd$d%d&ZdS )'ASTDeclaratorMemPtrN)	classNamerM   r   r  rt   c             C   s,   |st |st || _|| _|| _|| _d S )N)r   r  rM   r   r  )r   r  rM   r   r  r   r   r   r     s    zASTDeclaratorMemPtr.__init__)rt   c             C   s   | j jS )N)r  r&  )r   r   r   r   r&    s    zASTDeclaratorMemPtr.name)r&  rt   c             C   s   || j _d S )N)r  r&  )r   r&  r   r   r   r&    s    c             C   s   | j jS )N)r  r  )r   r   r   r   r    s    zASTDeclaratorMemPtr.isPackc             C   s   | j jS )N)r  r  )r   r   r   r   r  "  s    z#ASTDeclaratorMemPtr.function_paramsry  c             C   s   | j jS )N)r  r  )r   r   r   r   r  &  s    z"ASTDeclaratorMemPtr.trailingReturnc             C   s   dS )NTr   )r   r   r   r   r  *  s    z1ASTDeclaratorMemPtr.require_space_after_declSpecs)r   rt   c             C   s|   g }| || j | d | jr.| d | jrN| jrD| d | d | j rb| d | || j d|S )Nz::*r   r2  rM   r   )r  r  r   rM   r  r  r/  )r   r   r  r   r   r   r!  -  s    





zASTDeclaratorMemPtr._stringify)r   rt   c             C   s    |dkrt  n| j|S d S )Nr   )r(   r  r  )r   r   r   r   r   r  <  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  B  s    z ASTDeclaratorMemPtr.get_param_idc             C   s*   |dkrt  nt | j|d S d S )Nr   r  )r(   rA  r  r  )r   r   r   r   r   r  H  s    z%ASTDeclaratorMemPtr.get_ptr_suffix_id)r   r  rt   c             C   sZ   |dkst d}| jr|d7 }| jr,|d7 }|d7 }|| j|7 }||7 }| j||S )NrM  r   r  r  M)r   r   rM   r  r   r  r  )r   r   r  ZnextReturnTypeIdr   r   r   r  O  s    zASTDeclaratorMemPtr.get_type_idc             C   s
   | j  S )N)r  r  )r   r   r   r   r  \  s    z$ASTDeclaratorMemPtr.is_function_typer   r   )r   r  r  r   rt   c             C   s   t | | j|d|| |tdd7 }|tdd7 }ttd ddd}| jr\||d | jr~| jrt|t	 7 }||d | j
 r|t	 7 }| j
|||| d S )	Nr  z::r   )r   r  rt   c             S   s   | t ||7 } d S )N)r   r9  )r   r  r   r   r   r  f  s    z9ASTDeclaratorMemPtr.describe_signature.<locals>._add_annor   rM   )r5   r  r  r   r8  r   r   r   rM   r:  r  r  )r   r   r  r  r   r  r   r   r   r  _  s    


z&ASTDeclaratorMemPtr.describe_signature)r   r   r   r"  rC   r  r   r?  r&  r  r  r   r  r  r  r  r)   r   r!  rc   r  r  r  r  r  r   r  r   r   r   r   r    s(   r  c               @   s   e Zd ZeeddddZeedddZejeddd	dZed
d Z	ee
e dddZeddddZedddZeedddZeedddZeedddZeedddZeeedddZedd d!Zeed"d#dd$d%d&ZdS )'ASTDeclaratorParenN)innerr  rt   c             C   s    |st |st || _|| _d S )N)r   r
  r  )r   r
  r  r   r   r   r   t  s    zASTDeclaratorParen.__init__)rt   c             C   s   | j jS )N)r
  r&  )r   r   r   r   r&  {  s    zASTDeclaratorParen.name)r&  rt   c             C   s   || j _d S )N)r
  r&  )r   r&  r   r   r   r&    s    c             C   s   | j jp| jjS )N)r
  r  r  )r   r   r   r   r    s    zASTDeclaratorParen.isPackc             C   s   | j jS )N)r
  r  )r   r   r   r   r    s    z"ASTDeclaratorParen.function_paramsry  c             C   s   | j jS )N)r
  r  )r   r   r   r   r    s    z!ASTDeclaratorParen.trailingReturnc             C   s   dS )NTr   )r   r   r   r   r    s    z0ASTDeclaratorParen.require_space_after_declSpecs)r   rt   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ASTDeclaratorParen._stringify)r   rt   c             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_id)r   r  rt   c             C   s*   |dkst | j||}| jj||dS )NrM  )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_typer   r   )r   r  r  r   rt   c             C   sP   t | |tdd7 }| j|||| |tdd7 }| j|d|| d S )Nr_  r`  r  )r5   r   r8  r
  r  r  )r   r   r  r  r   r   r   r   r    s
    z%ASTDeclaratorParen.describe_signature)r   r   r   r  r   r?  r"  r&  r  r  r   r  r  r  rC   r  r)   r   r!  rc   r  r  r  r  r  r   r  r   r   r   r   r	  s  s&   	r	  c               @   sX   e Zd Zeeef dddZeedddZ	e
eddd	Zeed
dddddZdS )ASTPackExpansionExpr)rf  c             C   s
   || _ d S )N)rf  )r   rf  r   r   r   r     s    zASTPackExpansionExpr.__init__)r   rt   c             C   s   || j d S )Nz...)rf  )r   r   r   r   r   r!    s    zASTPackExpansionExpr._stringify)r   rt   c             C   s   | j |}d| S )Nsp)rf  r   )r   r   r|  r   r   r   r     s    zASTPackExpansionExpr.get_idr   r   N)r   r  r  r   rt   c             C   s&   | j |||| |tdd7 }d S )Nz...)rf  r  r   r8  )r   r   r  r  r   r   r   r   r    s    z'ASTPackExpansionExpr.describe_signature)r   r   r   r   r@  ru  r   r)   r   r!  rc   r   r   r  r   r   r   r   r    s
   r  c               @   s^   e Zd Zeeeef  ddddZee	dddZ
ee	dd	d
Zee	ddddddZdS )rt  N)rw  rt   c             C   s
   || _ d S )N)rw  )r   rw  r   r   r   r     s    zASTParenExprList.__init__)r   rt   c                s   dd  fdd| jD  S )Nzpi%sEr   c             3   s   | ]}|  V  qd S )N)r   )r*  r   )r   r   r   r+    s    z*ASTParenExprList.get_id.<locals>.<genexpr>)r/  rw  )r   r   r   )r   r   r     s    zASTParenExprList.get_id)r   rt   c                s"    fdd| j D }dd| S )Nc                s   g | ]} |qS r   r   )r*  r   )r   r   r   r    s    z/ASTParenExprList._stringify.<locals>.<listcomp>z(%s)z, )rw  r/  )r   r   rw  r   )r   r   r!    s    zASTParenExprList._stringifyr   r   )r   r  r  r   rt   c             C   sv   t | |tdd7 }d}xD| jD ]:}|sJ|tdd7 }|t 7 }nd}||||| q$W |tdd7 }d S )Nr_  Tr   Fr`  )r5   r   r8  rw  r:  r  )r   r   r  r  r   r<  r   r   r   r   r    s    z#ASTParenExprList.describe_signature)r   r   r   r   r   r@  ru  r   rc   r   r   r)   r!  r   r  r   r   r   r   rt    s
   rt  c               @   sN   e Zd Zdeeef eddddZee	dddZ
ee	d	d
ddddZdS )ASTInitializerTN)rF  	hasAssignrt   c             C   s   || _ || _d S )N)rF  r  )r   rF  r  r   r   r   r     s    zASTInitializer.__init__)r   rt   c             C   s    || j }| jrd| S |S d S )Nz = )rF  r  )r   r   valr   r   r   r!    s    
zASTInitializer._stringifyr   r   )r   r  r  r   rt   c             C   sL   t | | jr6|t 7 }|tdd7 }|t 7 }| j|d|| d S )Nr   r  )r5   r  r   r:  r8  rF  r  )r   r   r  r  r   r   r   r   r    s    z!ASTInitializer.describe_signature)T)r   r   r   r   r@  ru  rC   r   r)   r   r!  r   r  r   r   r   r   r    s   r  c               @   s   e Zd ZeeddddZeedddZej	eddd	dZee
dd
dZeee dddZed dddZdeededddZeedddZedddZeeddddddZdS )ry  N)	declSpecsdeclrt   c             C   s    |st |st || _|| _d S )N)r   r  r  )r   r  r  r   r   r   r      s    zASTType.__init__)rt   c             C   s   | j jS )N)r  r&  )r   r   r   r   r&    s    zASTType.name)r&  rt   c             C   s   || j _d S )N)r  r&  )r   r&  r   r   r   r&  
  s    c             C   s   | j jS )N)r  r  )r   r   r   r   r    s    zASTType.isPackc             C   s   | j jS )N)r  r  )r   r   r   r   r    s    zASTType.function_paramsc             C   s   | j jS )N)r  r  )r   r   r   r   r    s    zASTType.trailingReturnr   )r   r  r   rt   c       	      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
|nF| j rt | | j| | | j| | | j| d|S g }|r|dkr| j|}| | || |dkr|jj}|d k	r| j|}| jrd| j|}n| j|}| | | | | | j| n(|dkr| | | nt
|n$| j|}| j||}| | d|S )Nr   functionZCErP  r   r   )r  get_full_nested_namer   r  r  r  r  r  rO   r  r   r  r(   r  r/  r   r6  r  r  )	r   r   r  r   r  r)  ZtemplZtypeIdr  r   r   r   r     sT    












zASTType.get_id)r   rt   c             C   sR   g }|| j }|| | j r8t|dkr8|d ||| j d|S )Nr   r2  r   )r  r  r  r  r   r/  )r   r   r  r  r   r   r   r!  P  s    


zASTType._stringifyc             C   s   | j jrdS dS d S )Nr   rP  )r  r  )r   r   r   r   get_type_declaration_prefixY  s    z#ASTType.get_type_declaration_prefixr   )r   r  r  r   rt   c             C   sd   t | | j|d|| | j rBtt| jdkrB|t 7 }|dkrNd}| j|||| d S )Nr  r   r  )	r5   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  rC   r  r   r  r  r  rc   r   r   r)   r!  r  r   r  r   r   r   r   ry    s"    5	ry  c               @   s~   e Zd ZeeddddZeedddZeeddd	Z	de
ed
edddZeedddZeedd
ddddZdS )r  N)rP  initrt   c             C   s   |st || _|| _d S )N)r   rP  r  )r   rP  r  r   r   r   r   n  s    z0ASTTemplateParamConstrainedTypeWithInit.__init__)rt   c             C   s   | j jS )N)rP  r&  )r   r   r   r   r&  s  s    z,ASTTemplateParamConstrainedTypeWithInit.namec             C   s   | j jS )N)rP  r  )r   r   r   r   r  w  s    z.ASTTemplateParamConstrainedTypeWithInit.isPackr   )r   r  r   rt   c             C   s2   |dkst |r"|jjj|ddS | j|S d S )NrM  F)r  )r   r  r   r   rP  )r   r   r  r   r   r   r   r   {  s    z.ASTTemplateParamConstrainedTypeWithInit.get_id)r   rt   c             C   s*   || j }| jr&|d7 }||| j7 }|S )Nz = )rP  r  )r   r   r  r   r   r   r!    s
    
z2ASTTemplateParamConstrainedTypeWithInit._stringifyr   )r   r  r  r   rt   c             C   sV   | j |||| | jrR|t 7 }|tdd7 }|t 7 }| j|||| d S )Nr   )rP  r  r  r   r:  r8  )r   r   r  r  r   r   r   r   r    s    z:ASTTemplateParamConstrainedTypeWithInit.describe_signature)NN)r   r   r   ry  r   r?  r"  r&  rC   r  rc   r   r   r)   r!  r   r  r   r   r   r   r  m  s   	r  c               @   s~   e Zd ZeeddddZeedddZee	ddd	Z
deed
edddZeedddZeedd
ddddZdS )r  N)rP  r  rt   c             C   s   || _ || _d S )N)rP  r  )r   rP  r  r   r   r   r     s    zASTTypeWithInit.__init__)rt   c             C   s   | j jS )N)rP  r&  )r   r   r   r   r&    s    zASTTypeWithInit.namec             C   s   | j jS )N)rP  r  )r   r   r   r   r    s    zASTTypeWithInit.isPackr   )r   r  r   rt   c             C   sJ   |dkr| j ||S |dkr<| |d | j | S | |S )Nmemberr   r   )rP  r   r  )r   r   r  r   r   r   r   r     s    zASTTypeWithInit.get_id)r   rt   c             C   s4   g }| || j | jr*| || j d|S )Nr   )r  rP  r  r/  )r   r   r  r   r   r   r!    s
    zASTTypeWithInit._stringifyr   )r   r  r  r   rt   c             C   s6   t | | j|||| | jr2| j|||| d S )N)r5   rP  r  r  )r   r   r  r  r   r   r   r   r    s    z"ASTTypeWithInit.describe_signature)NN)r   r   r   ry  r  r   r?  r"  r&  rC   r  rc   r   r   r)   r!  r   r  r   r   r   r   r    s    r  c               @   sh   e Zd ZeeddddZdeededddZe	ed	d
dZ
edddZeeddddddZdS )ASTTypeUsingN)r&  rP  rt   c             C   s   || _ || _d S )N)r&  rP  )r   r&  rP  r   r   r   r     s    zASTTypeUsing.__init__r   )r   r  r   rt   c             C   s   |dkrt  | |S )Nr   )r(   r  r   )r   r   r  r   r   r   r   r     s    zASTTypeUsing.get_id)r   rt   c             C   s>   g }| || j | jr4| d | || j d|S )Nz = r   )r  r&  rP  r/  )r   r   r  r   r   r   r!    s    
zASTTypeUsing._stringify)rt   c             C   s   dS )Nr   r   )r   r   r   r   r    s    z(ASTTypeUsing.get_type_declaration_prefixr   )r   r  r  r   rt   c             C   sb   t | | jj||||d | jr^|t 7 }|tdd7 }|t 7 }| jj|d||d d S )N)r   r   r  )r5   r&  r  rP  r   r:  r8  )r   r   r  r  r   r   r   r   r    s    zASTTypeUsing.describe_signature)NN)r   r   r   r"  ry  r   rc   r   r   r)   r!  r  r   r  r   r   r   r   r    s    r  c               @   sl   e Zd ZeeddddZeedddZdee	de	d	d
dZ
ee	dddZee	ddddddZdS )
ASTConceptN)r  r  rt   c             C   s   || _ || _d S )N)r  r  )r   r  r  r   r   r   r     s    zASTConcept.__init__)rt   c             C   s   | j S )N)r  )r   r   r   r   r&    s    zASTConcept.namer   )r   r  r   rt   c             C   s   |dkrt  | |S )Nr   )r(   r  r   )r   r   r  r   r   r   r   r     s    zASTConcept.get_id)r   rt   c             C   s"   || j }| jr||| j7 }|S )N)r  r  )r   r   r  r   r   r   r!    s    
zASTConcept._stringifyr   )r   r  r  r   rt   c             C   s.   | j |||| | jr*| j|||| d S )N)r  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&  rc   r   r   r)   r!  r   r  r   r   r   r   r    s    r  c               @   sH   e Zd ZeeeeddddZeedddZe	edd	dd
ddZ
dS )ASTBaseClassN)r&  
visibilityr   packrt   c             C   s   || _ || _|| _|| _d S )N)r&  r  r   r  )r   r&  r  r   r  r   r   r   r     s    zASTBaseClass.__init__)r   rt   c             C   s^   g }| j d k	r$|| j  |d | jr4|d ||| j | jrT|d d|S )Nr2  zvirtual z...r   )r  r  r   r&  r  r/  )r   r   r  r   r   r   r!    s    



zASTBaseClass._stringifyr   r   )r   r  r  r   rt   c             C   s   t | | jd k	r2|t| j| j7 }|t 7 }| jrT|tdd7 }|t 7 }| jj|d||d | jr~|t	dd7 }d S )Nr   r  )r   z...)
r5   r  r   r9  r:  r   r&  r  r  r8  )r   r   r  r  r   r   r   r   r    s    


zASTBaseClass.describe_signature)r   r   r   r"  r   rC   r   r)   r!  r   r  r   r   r   r   r    s
   r  c               @   s`   e Zd Zeeee eddddZe	e
de
dddZee
d	d
dZee
ddddddZdS )ASTClassN)r&  r  basesr  rt   c             C   s   || _ || _|| _|| _d S )N)r&  r  r  r  )r   r&  r  r  r  r   r   r   r     s    zASTClass.__init__r   )r   r  r   rt   c             C   s   |  |S )N)r  r   )r   r   r  r   r   r   r   r   %  s    zASTClass.get_id)r   rt   c             C   s   g }| || j t| jdkr,| d | || j | jrL| d t| jdkr| d d}x.| jD ]$}|s| d d}| || qpW d|S )	Nr   r2  z finalz : Tz, Fr   )r  r  r   r&  r  r  r/  )r   r   r  r<  r   r   r   r   r!  (  s     



zASTClass._stringifyr   )r   r  r  r   rt   c             C   s   t | | j| t| jdkr.|t 7 }| jj||||d | jrd|t 7 }|tdd7 }t| j	dkr|t 7 }|t
dd7 }|t 7 }x<| j	D ]2}|j||||d |t
dd7 }|t 7 }qW |  |  d S )Nr   )r   r  r  r   )r5   r  r  r   r   r:  r&  r  r9  r  r8  pop)r   r   r  r  r   r   r   r   r   r  :  s$    zASTClass.describe_signature)r   r   r   r"  rC   r   r  r#   r   rc   r   r   r)   r!  r   r  r   r   r   r   r    s   
r  c               @   sX   e Zd ZeeddddZeededddZe	ed	d
dZ
eeddddddZdS )ASTUnionN)r&  r  rt   c             C   s   || _ || _d S )N)r&  r  )r   r&  r  r   r   r   r   Q  s    zASTUnion.__init__r   )r   r  r   rt   c             C   s   |dkrt  | |S )Nr   )r(   r  r   )r   r   r  r   r   r   r   r   U  s    zASTUnion.get_id)r   rt   c             C   sF   g }| || j t| jdkr,| d | || j d|S )Nr   r2  r   )r  r  r   r&  r/  )r   r   r  r   r   r   r!  Z  s    
zASTUnion._stringifyr   )r   r  r  r   rt   c             C   sF   t | | j| t| jdkr.|t 7 }| jj||||d d S )Nr   )r   )r5   r  r  r   r   r:  r&  )r   r   r  r  r   r   r   r   r  b  s
    zASTUnion.describe_signature)r   r   r   r"  r#   r   rc   r   r   r)   r!  r   r  r   r   r   r   r  P  s
   r  c               @   s\   e Zd ZeeeeddddZeededddZ	e
ed	d
dZeeddddddZdS )ASTEnumN)r&  scopedunderlyingTyper  rt   c             C   s   || _ || _|| _|| _d S )N)r&  r!  r"  r  )r   r&  r!  r"  r  r   r   r   r   l  s    zASTEnum.__init__r   )r   r  r   rt   c             C   s   |dkrt  | |S )Nr   )r(   r  r   )r   r   r  r   r   r   r   r   s  s    zASTEnum.get_id)r   rt   c             C   s   g }| j r || j  |d ||| j t| jdkrH|d ||| j | jrx|d ||| j d|S )Nr2  r   z : r   )r!  r  r  r   r&  r"  r/  )r   r   r  r   r   r   r!  x  s    


zASTEnum._stringifyr   )r   r  r  r   rt   c             C   s   t | | j| t| jdkr.|t 7 }| jj||||d | jr|t 7 }|tdd7 }|t 7 }| jj|d||d d S )Nr   )r   r  r  )	r5   r  r  r   r   r:  r&  r"  r8  )r   r   r  r  r   r   r   r   r    s    
zASTEnum.describe_signature)r   r   r   r"  r   ry  r#   r   rc   r   r)   r!  r   r  r   r   r   r   r   k  s   r   c               @   s^   e Zd Zeee eddddZee	de	dddZ
ee	d	d
dZee	ddddddZdS )ASTEnumeratorN)r&  r  r  rt   c             C   s   || _ || _|| _d S )N)r&  r  r  )r   r&  r  r  r   r   r   r     s    zASTEnumerator.__init__r   )r   r  r   rt   c             C   s   |dkrt  | |S )Nr   )r(   r  r   )r   r   r  r   r   r   r   r     s    zASTEnumerator.get_id)r   rt   c             C   s\   g }| || j t| jdkr<| d | || j | jrR| || j d|S )Nr   r2  r   )r  r&  r   r  r  r/  )r   r   r  r   r   r   r!    s    
zASTEnumerator._stringifyr   )r   r  r  r   rt   c             C   s\   t | | j|||| t| jdkr@|t 7 }| j| | jrX| j|d|| d S )Nr   r  )r5   r&  r  r   r  r   r:  r  )r   r   r  r  r   r   r   r   r    s    z ASTEnumerator.describe_signature)r   r   r   r"  r   r  r#   r   rc   r   r   r)   r!  r   r  r   r   r   r   r#    s   
r#  c               @   sd   e Zd ZedddZeedddZeeddd	d
ddZ	e
edddZe
edddZd	S )ASTTemplateParam)rt   c             C   s   t t| d S )N)rA  rB  )r   r   r   r   get_identifier  s    zASTTemplateParam.get_identifier)r   rt   c             C   s   t t| d S )N)rA  rB  )r   r   r   r   r   r     s    zASTTemplateParam.get_idr   r   N)
parentNoder  r  r   rt   c             C   s   t t| d S )N)rA  rB  )r   r&  r  r  r   r   r   r   r    s    z#ASTTemplateParam.describe_signaturec             C   s   t t| d S )N)rA  rB  )r   r   r   r   r    s    zASTTemplateParam.isPackc             C   s   t t| d S )N)rA  rB  )r   r   r   r   r&    s    zASTTemplateParam.name)r   r   r   r   r%  rc   r   r   r   r  r?  rC   r  r"  r&  r   r   r   r   r$    s   r$  c               @   sf   e Zd ZeeeeddddZedddZe	edd	d
Z
eedddZeeddddddZdS ) ASTTemplateKeyParamPackIdDefaultN)keyr   parameterPackrT   rt   c             C   s4   |st |r|d kst || _|| _|| _|| _d S )N)r   r(  r   r)  rT   )r   r(  r   r)  rT   r   r   r   r     s    z)ASTTemplateKeyParamPackIdDefault.__init__)rt   c             C   s   | j S )N)r   )r   r   r   r   r%    s    z/ASTTemplateKeyParamPackIdDefault.get_identifier)r   rt   c             C   s6   |dkst g }| jr"|d n
|d d|S )NrM  r  r  r   )r   r)  r  r/  )r   r   r  r   r   r   r     s    
z'ASTTemplateKeyParamPackIdDefault.get_id)r   rt   c             C   sx   | j g}| jr(| jr|d |d | jrN| js>|d ||| j | jrn|d ||| j d|S )Nr2  z...z = r   )r(  r)  r   r  rT   r/  )r   r   r  r   r   r   r!    s    



z+ASTTemplateKeyParamPackIdDefault._stringifyr   r   )r   r  r  r   rt   c             C   s   |t | j| j7 }| jr<| jr,|t  7 }|t dd7 }| jrj| jsT|t  7 }| j|||dd| | jr|t  7 }|t dd7 }|t  7 }| j|d|| d S )Nz...r   r   r  )	r   r9  r(  r)  r   r:  r8  r  rT   )r   r   r  r  r   r   r   r   r    s    z3ASTTemplateKeyParamPackIdDefault.describe_signature)r   r   r   r   r   rC   ry  r   r%  rc   r   r)   r!  r   r  r   r   r   r   r'    s   	
r'  c               @   s   e Zd ZeddddZeedddZeeddd	Z	e
dd
dZdeededddZeedddZeeddddddZdS )ASTTemplateParamTypeN)rH  rt   c             C   s   |st || _d S )N)r   rH  )r   rH  r   r   r   r     s    zASTTemplateParamType.__init__)rt   c             C   s    |   }tt|d gdgddS )NF)r%  )r%  r"  r  )r   r|  r   r   r   r&    s    zASTTemplateParamType.namec             C   s   | j jS )N)rH  r)  )r   r   r   r   r    s    zASTTemplateParamType.isPackc             C   s
   | j  S )N)rH  r%  )r   r   r   r   r%    s    z#ASTTemplateParamType.get_identifierr   )r   r  r   rt   c             C   s2   |dkst |r"|jjj|ddS | j|S d S )NrM  F)r  )r   r  r   r   rH  )r   r   r  r   r   r   r   r     s    zASTTemplateParamType.get_id)r   rt   c             C   s
   || j S )N)rH  )r   r   r   r   r   r!  %  s    zASTTemplateParamType._stringifyr   )r   r  r  r   rt   c             C   s   | j |||| d S )N)rH  r  )r   r   r  r  r   r   r   r   r  (  s    z'ASTTemplateParamType.describe_signature)NN)r   r   r   r'  r   r?  r"  r&  rC   r  r   r%  rc   r   r   r)   r!  r   r  r   r   r   r   r*    s   	r*  c               @   s   e Zd ZdeddddZeedddZeedd	d
Z	e
dddZdeee ed edddZeedddZeeddddddZdS )ASTTemplateParamTemplateTypeASTTemplateParamsN)nestedParamsrH  rt   c             C   s    |st |st || _|| _d S )N)r   r-  rH  )r   r-  rH  r   r   r   r   .  s    z%ASTTemplateParamTemplateType.__init__)rt   c             C   s    |   }tt|d gdgddS )NF)r%  )r%  r"  r  )r   r|  r   r   r   r&  5  s    z!ASTTemplateParamTemplateType.namec             C   s   | j jS )N)rH  r)  )r   r   r   r   r  :  s    z#ASTTemplateParamTemplateType.isPackc             C   s
   | j  S )N)rH  r%  )r   r   r   r   r%  >  s    z+ASTTemplateParamTemplateType.get_identifierr   )r   r  r   rt   c             C   s>   |dkst |r"|jjj|d dS | j|| j| S d S )NrM  )r  )r   r  r   r   r-  rH  )r   r   r  r   r   r   r   r   A  s    z#ASTTemplateParamTemplateType.get_id)r   rt   c             C   s   || j || j S )N)r-  rH  )r   r   r   r   r   r!  L  s    z'ASTTemplateParamTemplateType._stringifyr   )r   r  r  r   rt   c             C   s4   | j |d|| |t 7 }| j|||| d S )Nr  )r-  r  r   r:  rH  )r   r   r  r  r   r   r   r   r  O  s    z/ASTTemplateParamTemplateType.describe_signature)NN)r   r   r   r'  r   r?  r"  r&  rC   r  r   r%  rc   r   r   r   r)   r!  r   r  r   r   r   r   r+  -  s   	r+  c               @   s   e Zd Zdeeef eddddZee	dddZ
eedd	d
ZedddZdeededddZeedddZeeddddddZdS )ASTTemplateParamNonTypeFN)r  r)  rt   c             C   s   |st || _|| _d S )N)r   r  r)  )r   r  r)  r   r   r   r   W  s    z ASTTemplateParamNonType.__init__)rt   c             C   s    |   }tt|d gdgddS )NF)r%  )r%  r"  r  )r   r|  r   r   r   r&  _  s    zASTTemplateParamNonType.namec             C   s   | j jp| jS )N)r  r  r)  )r   r   r   r   r  d  s    zASTTemplateParamNonType.isPackc             C   sd   | j j}|r\t|jdkst|jd js.t|jd jr>t|jd j}t|tsXt|S d S d S )Nr   r   )	r  r&  r   r#  r   r  r  
isinstancer   )r   r&  r  r   r   r   r%  h  s    z&ASTTemplateParamNonType.get_identifierr   )r   r  r   rt   c             C   sH   |dkst |r"|jjj|d dS d}| jr4|d7 }|| j| S d S )NrM  )r  r   r  )r   r  r   r   r)  r  )r   r   r  r   r  r   r   r   r   t  s    zASTTemplateParamNonType.get_id)r   rt   c             C   s   || j }| jr|d7 }|S )Nz...)r  r)  )r   r   r  r   r   r   r!    s    
z"ASTTemplateParamNonType._stringifyr   )r   r  r  r   rt   c             C   s,   | j |||| | jr(|tdd7 }d S )Nz...)r  r  r)  r   r8  )r   r   r  r  r   r   r   r   r    s    z*ASTTemplateParamNonType.describe_signature)F)NN)r   r   r   r   r  r  rC   r   r?  r"  r&  r  r   r%  rc   r   r   r)   r!  r   r  r   r   r   r   r.  V  s   r.  c               @   sx   e Zd Zee ed ddddZdeee	ddd	Z
ee	d
ddZee	ddddddZee	ddeddddZdS )r,  ASTRequiresClauseN)paramsrequiresClausert   c             C   s   |d k	st || _|| _d S )N)r   r1  r2  )r   r1  r2  r   r   r   r     s    zASTTemplateParams.__init__F)r   excludeRequiresrt   c             C   s   |dkst g }|d x| jD ]}||| q"W |d |sv| jrv|d || jj| |d d|S )NrM  r  r-  IQr   )r   r  r1  r   r2  rf  r/  )r   r   r3  r  r  r   r   r   r     s    




zASTTemplateParams.get_id)r   rt   c                sf   g }| d | d fdd| jD  | d | jd k	r\|  | j | d d|S )Nz	template<z, c             3   s   | ]} |V  qd S )Nr   )r*  r   )r   r   r   r+    s    z/ASTTemplateParams._stringify.<locals>.<genexpr>z> r2  r   )r  r/  r1  r2  )r   r   r  r   )r   r   r!    s    
 


zASTTemplateParams._stringifyr   r   )r   r  r  r   rt   c             C   s   |t dd7 }|t dd7 }d}xB| jD ]8}|sP|t dd7 }|t  7 }d}||||| q,W |t dd7 }| jd k	r|t  7 }| j|||| d S )Nr|   r   Tr   Fr   )r   r9  r8  r1  r:  r  r2  )r   r   r  r  r   r<  r  r   r   r   r    s    
z$ASTTemplateParams.describe_signature)r&  r  r  r   lineSpecrt   c             C   s   t tjddd}||}|tdd7 }|tdd7 }d}xN| jD ]D}	|sj|tdd7 }|t 7 }d}|rz||}|	|||| qFW |r|s||}|td	d	7 }| jrt }
d
|
_	||
7 }| j|
d|| d S )N)r&  rt   c             S   s   t  }| |7 } d|_|S )Nr;  )r   desc_signature_linesphinx_line_type)r&  r   r   r   r   makeLine  s    zDASTTemplateParams.describe_signature_as_introducer.<locals>.makeLiner|   r   Tr   Fr   r2  r  )
r   r   r6  r9  r8  r1  r:  r  r2  r7  )r   r&  r  r  r   r5  r8  ZlineNoder<  r  ZreqNoder   r   r    describe_signature_as_introducer  s*    z2ASTTemplateParams.describe_signature_as_introducer)F)r   r   r   r   r$  r   r   rc   rC   r   r   r)   r!  r   r  r   r9  r   r   r   r   r,    s   
r,  c               @   s   e Zd ZeeddddZeedddZeeddd	Z	edd
dZ
deededddZeedddZeedddZeeddddddZdS ) ASTTemplateIntroductionParameterN)r   r)  rt   c             C   s   || _ || _d S )N)r   r)  )r   r   r)  r   r   r   r     s    z)ASTTemplateIntroductionParameter.__init__)rt   c             C   s    |   }tt|d gdgddS )NF)r%  )r%  r"  r  )r   r|  r   r   r   r&    s    z%ASTTemplateIntroductionParameter.namec             C   s   | j S )N)r)  )r   r   r   r   r    s    z'ASTTemplateIntroductionParameter.isPackc             C   s   | j S )N)r   )r   r   r   r   r%    s    z/ASTTemplateIntroductionParameter.get_identifierr   )r   r  r   rt   c             C   s4   |dkst |r"|jjj|d dS | jr,dS dS d S )NrM  )r  r  r  )r   r  r   r   r)  )r   r   r  r   r   r   r   r     s    z'ASTTemplateIntroductionParameter.get_id)r   rt   c             C   s.   |dkst | j|}| jr&d| S |S d S )NrM  r  )r   r   r   r)  )r   r   r  r   r   r   get_id_as_arg  s
    z.ASTTemplateIntroductionParameter.get_id_as_arg)r   rt   c             C   s.   g }| j r|d ||| j d|S )Nz...r   )r)  r  r   r/  )r   r   r  r   r   r   r!    s
    
z+ASTTemplateIntroductionParameter._stringifyr   )r   r  r  r   rt   c             C   s0   | j r|tdd7 }| j|||dd| d S )Nz...r   )r)  r   r8  r   r  )r   r   r  r  r   r   r   r   r  	  s    z3ASTTemplateIntroductionParameter.describe_signature)NN)r   r   r   r   rC   r   r?  r"  r&  r  r%  rc   r   r   r;  r)   r!  r   r  r   r   r   r   r:    s   	r:  c               @   sZ   e Zd Zeee ddddZeedddZ	e
edd	d
ZeeddeddddZdS )ASTTemplateIntroductionN)rL   r1  rt   c             C   s    t |dkst|| _|| _d S )Nr   )r   r   rL   r1  )r   rL   r1  r   r   r   r     s    z ASTTemplateIntroduction.__init__)r   rt   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 )NrM  r  r-  r  r   )r   r  r1  r   rL   r;  r/  )r   r   r  r  r   r   r   r     s    





zASTTemplateIntroduction.get_id)r   rt   c                sR   g }|  | j | d | d fdd| jD  | d d|S )Nr  z, c             3   s   | ]} |V  qd S )Nr   )r*  r  )r   r   r   r+  -  s    z5ASTTemplateIntroduction._stringify.<locals>.<genexpr>z} r   )r  rL   r/  r1  )r   r   r  r   )r   r   r!  )  s    
 
z"ASTTemplateIntroduction._stringifyr   r   )r&  r  r  r   r5  rt   c       	      C   s   t  }||7 }d|_| j|d|| |t dd7 }d}xB| jD ]8}|sh|t dd7 }|t  7 }d}||||| qDW |t dd7 }d S )NZtemplateIntroductionr  r  Tr   Fr  )r   r6  r7  rL   r  r8  r1  r:  )	r   r&  r  r  r   r5  r   r<  r  r   r   r   r9  1  s    z8ASTTemplateIntroduction.describe_signature_as_introducer)r   r   r   r"  r   r:  r   rc   r   r   r)   r!  r   rC   r9  r   r   r   r   r<    s   	r<  c               @   sr   e Zd Zeeeef  ddddZed dddZ	e
ed	d
dZeedddZeeddeddddZdS )ASTTemplateDeclarationPrefixN)r$  rt   c             C   s
   || _ d S )N)r$  )r   r$  r   r   r   r   G  s    z%ASTTemplateDeclarationPrefix.__init__r0  )rt   c             C   s,   | j d krd S | j d }t|ts&d S |jS )Nr4  )r$  r/  r,  r2  )r   ZlastListr   r   r   get_requires_clause_in_lastM  s    


z8ASTTemplateDeclarationPrefix.get_requires_clause_in_last)r   rt   c             C   st   |dkst g }t| jd }xJt| jD ]<\}}t|trV||j|||kd q*||| q*W d|S )NrM  r   )r3  r   )	r   r   r$  	enumerater/  r,  r  r   r/  )r   r   r  Z	lastIndexr   r   r   r   r   %get_id_except_requires_clause_in_lastU  s    
zBASTTemplateDeclarationPrefix.get_id_except_requires_clause_in_last)r   rt   c             C   s,   g }x| j D ]}||| qW d|S )Nr   )r$  r  r/  )r   r   r  r   r   r   r   r!  a  s    z'ASTTemplateDeclarationPrefix._stringifyr   r   )r   r  r  r   r5  rt   c             C   s.   t | x | jD ]}||d||| qW d S )Nr  )r5   r$  r9  )r   r   r  r  r   r5  r   r   r   r   r  g  s    z/ASTTemplateDeclarationPrefix.describe_signature)r   r   r   r   r   r,  r<  r   r   r>  rc   r   r@  r)   r!  r   rC   r  r   r   r   r   r=  F  s   r=  c               @   sD   e Zd ZeddddZeedddZej	edd	dd
ddZ
dS )r0  N)rf  rt   c             C   s
   || _ d S )N)rf  )r   rf  r   r   r   r   o  s    zASTRequiresClause.__init__)r   rt   c             C   s   d|| j  S )Nz	requires )rf  )r   r   r   r   r   r!  r  s    zASTRequiresClause._stringifyr   r   )r   r  r  r   rt   c             C   s2   |t dd7 }|t  7 }| j|||| d S )Nrs   )r   r9  r:  rf  r  )r   r   r  r  r   r   r   r   r  u  s    z$ASTRequiresClause.describe_signature)r   r   r   r@  r   r)   r   r!  r   r   r  r   r   r   r   r0  n  s   r0  c            
   @   s   e Zd Zdeee ee ee eee eddddZ	d dddZ
eedd	d
Zeee dddZdeeedddZedddZeedddZeededdddZdS )r   NF)r  directiveTyper  r6  r   trailingRequiresClause	semicolonrt   c             C   s:   || _ || _|| _|| _|| _|| _|| _d | _d | _d S )N)	r  rA  r  r6  r   rB  rC  r   enumeratorScopedSymbol)r   r  rA  r  r6  r   rB  rC  r   r   r   r     s    zASTDeclaration.__init__)rt   c             C   sJ   | j r| j  nd }| jr$| j nd }t| j| j| j|| j || jS )N)	r6  clonerB  r   r  rA  r  r   rC  )r   ZtemplatePrefixCloneZtrailingRequiresClasueCloner   r   r   rE    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_paramsT)r   r  rt   c             C   sD  |dkrL| j s| jrt | jdkr8| jr8| jj|S | j|| j| jS | jdkrl| jrl| jj||S |r|t| g}ng }| j d k	r|	| j 
| | j  }nd }|s| jr |dk rt |	d |r| jr|	d |r|	|j| | jr|	| jj| |	d |	| j|| j| j d|S )Nr   
enumeratorr   r4  r   r-  r   )r6  rB  r(   r  rD  r   r   r   
_id_prefixr  r@  r>  rf  r/  )r   r   r  r  ZrequiresClauseInLastr   r   r   r     s8    




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_id)r   rt   c             C   s   g }| j r*| j dkr*|| j  |d | jr@||| j ||| j | jrp|d ||| j | jr|d d|S )Nrp   r2  ;r   )r  r  r6  r   rB  rC  r/  )r   r   r  r   r   r   r!    s    


zASTDeclaration._stringifyr   )r   r  r  optionsrt   c       	      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
| j
7 }|t 7 }| jdkr| j }|t||7 }|t 7 }nx| jd	kr|td	d	7 }|t 7 }nN| jd
krn@| jdkrn0| jdkrL| jdks*t|t| j| j7 }|t 7 }n| jdkrv|tdd7 }|t 7 }n| jdkr
|tdd7 }|t 7 }| jdkr|tdd7 }|t 7 }n@| jdkr|tdd7 }|t 7 }n| jdks>t| jn4| jdkr4|tdd7 }|t 7 }n
t| j| j|||| j |}| jrt }d|_|| |}| j|d|| j | jr|tdd7 }d S )NTZis_multilineZ
declaratorZadd_permalinkztparam-line-spec)r   r5  rp   rP  rL   r  r  rJ   )rJ   rz   r   rZ   z
enum-classzenum-structrz   rF  rB  r  rJ  )r5   r   r   r   r6  r7  isRedeclarationr6  r  getr  r9  r:  r  r   r  rA  rB  r  rC  r8  )	r   r   r  r  rK  ZmainDeclNoder  ZlastDeclNodeZtrailingReqNoder   r   r   r    sr    






z!ASTDeclaration.describe_signature)NNNNNF)T)r   r   r   r   r   r=  r   r0  rC   r   rE  r?  r"  r&  r   r  r  rc   r   rI  r)   r!  r   r   r  r   r   r   r   r     s         .	-r   c               @   s.   e Zd ZeeddddZeedddZdS )ASTNamespaceN)r  r6  rt   c             C   s   || _ || _d S )N)r  r6  )r   r  r6  r   r   r   r   (  s    zASTNamespace.__init__)r   rt   c             C   s4   g }| j r||| j  ||| j d|S )Nr   )r6  r  r  r/  )r   r   r  r   r   r   r!  -  s
    zASTNamespace._stringify)	r   r   r   r"  r=  r   r)   r   r!  r   r   r   r   rN  '  s   rN  c               @   s0   e Zd Zed deeef eeddddZ	dS )SymbolLookupResultr   N)symbolsparentSymbolr  r;  r  rt   c             C   s"   || _ || _|| _|| _|| _d S )N)rP  rQ  r  r;  r  )r   rP  rQ  r  r;  r  r   r   r   r   6  s
    zSymbolLookupResult.__init__)
r   r   r   r   r   r   r  r   r  r   r   r   r   r   rO  5  s   rO  c               @   s2   e Zd Zeeeeeef e	f  ddddZ
dS )	LookupKeyN)rH  rt   c             C   s
   || _ d S )N)rH  )r   rH  r   r   r   r   A  s    zLookupKey.__init__)r   r   r   r   r	   r  r   r,  r<  r   r   r   r   r   r   rR  @  s   rR  )r;  r  rt   c       	      C   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   r1  r  r1  r   r&  endswithr  )	r;  r  r   r  r  Z	paramNameZargTxtZisArgPackExpansionZargNamer   r   r   _is_specializationH  s     




rU  c                   s  e Zd ZdZdZdZdZdd Zdd Ze	e
dd	d
dZddddZee
dd fddZed  eeedf eeedf e
ee ee ee ddddZeeeddddZddddZddddZeddddZee
 ddd Zeed! dd"d#Z d$dd%d&Z!e"dd'd(Z#eeef e
e$e%e%e%e%d d)d*d+Z&eeef e
e$e%e%e%e%e%ed  d,	d-d.Z'e"e(e
 e)d eeef e
e$gd f e%ee%e%e%e%e%e*d/d0d1Z+e"e(e
 eeed d2d3d4Z,d e(e d5dd6d7d8Z-dOe"e.d d9d:d;Z/eeed dd<d=Z0eeef e%e%e%d d>d?d@Z1d$d dAdBdCZ2e"e(e
 ee%e%e%e%e3e(d  ef dDdEdFZ4eee%e%e%d dGdHdIZ5eedJdKdLZ6eedJdMdNZ7  Z8S )Pr   r   z  Fc             C   s
   t  d S )N)r   )r   r   r   r   __copy__g  s    zSymbol.__copy__c             C   s&   | j rt ntd d d d d d d S d S )N)r  r   r   )r   memor   r   r   __deepcopy__j  s    zSymbol.__deepcopy__N)r  rt   c              G   s    t tjtj dd t |   d S )Nr   )end)printr   debug_indent_stringdebug_indent)r  r   r   r   debug_printq  s    zSymbol.debug_print)rt   c             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  r  r   r;  r  r   docname)r   r   r   r   _assert_invariantsv  s    



zSymbol._assert_invariants)r(  rF  rt   c                s"   |dkrt  nt ||S d S )Nchildren)r   super__setattr__)r   r(  rF  )	__class__r   r   rb    s    zSymbol.__setattr__)r  r  r;  r  r   r^  linert   c             C   s   || _ d | _d | _|| _|d k	r.t||s.d }|| _|| _|| _|| _|| _	d| _
|   g | _g | _| j rz| j j|  | jr| | j_|   d S )NF)r  siblingAbovesiblingBelowr  rU  r;  r  r   r^  rd  rL  r_  	_childrenZ_anonChildrenr  r   !_add_template_and_function_params)r   r  r  r;  r  r   r^  rd  r   r   r   r     s*    
zSymbol.__init__)r   r^  rd  rt   c             C   s   |    | jd kst| jd ks$t| jd ks2t|d k	s>t|d k	sJt|d k	sVt|| _| | j_|| _|| _|    |   d S )N)r_  r   r   r^  rd  r   rh  )r   r   r^  rd  r   r   r   _fill_empty  s    zSymbol._fill_emptyc             C   s0  t jrt  jd7  _t d | jrxh| jjD ]\}| s<q.| jrPtd|d}nd }t	| d }t
|gdgdd}| |g || j| j q.W | jd k	r| jjd k	rxl| jjD ]`}|jd krq|jj}|d krqtd|d}|jrtt|jdkst| |g || j| j qW t jr,t  jd8  _d S )Nr   z"_add_template_and_function_params:templateParam)r  r   F)r%  functionParam)r   debug_lookupr\  r]  r;  r1  r%  r   r   r  r"  _add_symbolsr^  rd  r  r  r&  r%  r   r   r#  )r   tpr  r>  nnfpr   r   r   rh    s4    


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  rg  r   remove)r   r   r   r   rq    s
    
zSymbol.remove)r^  rt   c             C   s   g }xx| j D ]n}|| |jrp|j|krpd |_d |_d |_|jd k	rP|j|j_|jd k	rd|j|j_d |_d |_|| qW || _ d S )N)rg  	clear_docr   r^  rd  re  rf  r  )r   r^  ZnewChildrensChildr   r   r   rr    s    




zSymbol.clear_docc             c   s(   | V  x| j D ]}| E d H  qW d S )N)rg  get_all_symbols)r   rs  r   r   r   rt    s    zSymbol.get_all_symbols)r   NNc             c   s2   x,| j D ]"}|V  |j sq|jE d H  qW d S )N)rg  r  r   children_recurse_anon)r   r   r   r   r   ru    s
    
zSymbol.children_recurse_anonrR  c             C   s   g }| }x|j r"|| |j }q
W |  g }xP|D ]H}t|j|j}|jd k	rl|||j|j f q6|||jd f q6W t	|S )N)
r  r  reverser  r  r  r   r;  rI  rR  )r   rP  r   r(  r>  r   r   r   r  
  s    



zSymbol.get_lookup_keyc             C   sn   g }| }x|j r"|| |j }q
W |  g }g }x*|D ]"}|t|j|j |d q:W t||ddS )NF)r%  )r  r  rv  r  r  r  r"  )r   rP  r   r#  r$  r   r   r   r    s    


zSymbol.get_full_nested_name)r  r;  r  templateShorthand	matchSelfrecurseInAnoncorrectPrimaryTemplateArgsrt   c       	   
   C   sL   t jrt d | j|||||||dd}yt|S  tk
rF   d S X d S )Nz_find_first_named_symbol ->F)searchInSiblings)r   rl  r]  _find_named_symbolsr  StopIteration)	r   r  r;  r  rw  rx  ry  rz  r  r   r   r   _find_first_named_symbol,  s    

zSymbol._find_first_named_symbol)	r  r;  r  rw  rx  ry  rz  r{  rt   c	             #   s  t jrt  jd7  _t d t  jd7  _t d tt jd dd t d  t d t d t d	 t d
 t d t d| t d| |rЈd k	rЈd k	rtsd dtd fdd}	tt d d f dfdd}
x|
 D ]}t jr@t d t|t jd dd |	|rt jrxt  jd7  _t d t  jd8  _|V  t jrt  jd7  _qW t jrt  jd8  _d S )Nr   z_find_named_symbols:zself:r   )rY  zidentOrOp:                  ztemplateParams:             ztemplateArgs:               ztemplateShorthand:          zmatchSelf:                  zrecurseInAnon:              zcorrectPrimaryTemplateAargs:zsearchInSiblings:           r   )r   rt   c                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)r  r;  r   r  )r   )r  r  r;  rw  r   r   matchesX  s     
z+Symbol._find_named_symbols.<locals>.matches)rt   c              3   s   } t jr,t d t| t jd dd xf r8| V  rJ| jE d H  n| jE d H  | jd krbP | j} t jr.t d t| t jd dd q.W d S )Nzsearching in self:r   r   )rY  zsearching in sibling:)	r   rl  r]  rZ  	to_stringr\  ru  rg  re  )r   )rx  ry  r   r   r   
candidatesn  s     


z.Symbol._find_named_symbols.<locals>.candidatesz
candidate:r  r   rM  )	r   rl  r\  r]  rZ  r  rU  rC   r   )r   r  r;  r  rw  rx  ry  rz  r{  r  r  r   r   )r  rx  ry  r   r  r;  rw  r   r|  <  sD    


 


zSymbol._find_named_symbols)r  templateDeclsonMissingQualifiedSymbolstrictTemplateParamArgListsancestorLookupTyperw  rx  ry  rz  r{  rt   c          
   C   s  t jrt  jd7  _t d t  jd7  _t d t| t jd dd t d| t ddd	d
 |D  t d| t d| t d| t d| t d| t d|	 t d|
 |r| t|ks| d t|kst	nt|| d kst	|j
}| }|jr:x|jr8|j}q&W |d k	r|d }| sxd|jr|j|j|||
drt|dkr|dkr|r|jr|jj|jkrnP |j}qXW t jrt d t|t jd dd d}x|d d D ]}|j}|j}|r>|r8|t|k s&t	|| }|d7 }nd }n*|rd|t|k rd|| }|d7 }nd }|j|||||||	d}|d kr|||||}|d krt jrt  jd8  _d S d}|}qW t jrt d t|t jd dd |d }|j}|j}|t|k r6|d t|ks,t	|| }n|t|ksHt	d }|j||||||d|
d}t jrt|}t  jd8  _t|||||S )Nr   z_symbol_lookup:zself:r   )rY  znestedName:        ztemplateDecls:     r   c             s   s   | ]}t |V  qd S )N)r   )r*  r   r   r   r   r+    s    z(Symbol._symbol_lookup.<locals>.<genexpr>zstrictTemplateParamArgLists:zancestorLookupType:ztemplateShorthand: zmatchSelf:         zrecurseInAnon:     zcorrectPrimaryTemplateArgs: zsearchInSiblings:  r   )rx  ry  r{  rJ   zstarting point:r4  )rw  rx  ry  rz  rM  Fzhandle last name from:)rw  rx  ry  rz  r{  )r   rl  r\  r]  rZ  r  r/  r(  r   r   r#  r%  r  r  find_identifierr  r  r~  r|  listrO  )r   r  r  r  r  r  rw  rx  ry  rz  r{  r#  rQ  Z	firstNameZiTemplateDeclr&  r  r  r;  r   rP  r   r   r   _symbol_lookup  s    














zSymbol._symbol_lookup)r  r  r   r^  rd  rt   c                s  t jrrt  jd7  _t d t  jd7  _t dddd |D  t d| t d  t d	 d
tttf t	t
d
ddd}| j|||dd dddddd
d k	sttj}t|dkrt jrHt d t  jd7  _t dj t dj t dj t d  t d t  jd8  _t jjjj d}t jr|t  jd8  _|S t jrt d t  jd7  _t dt| t  jd8  _ st jrt d t  jd8  _|d S g }	g }
g }xD|D ]<}|jd kr|	| n|jr.|| n
|
| qW t jrvt dt|	 t dt|
 t dt| d
d  fd!d"}t|
dkrd }n| }d
d
d d# fd$d%} jd&krt|
dkst||
d |   }t jrt d'| xX|
D ]P}|jjd&kr(||| |j }t jrFt d(| ||kr||| qW t|	dkrt jrt d) |d k	rt d* n
t d+ t  jd8  _|d k	r|S | S nRt jrt d,|d k	 t  jd8  _|d k	r|  |	d }|  |S d S )-Nr   z_add_symbols:ztdecls:r   c             s   s   | ]}t |V  qd S )N)r   )r*  r   r   r   r   r+    s    z&Symbol._add_symbols.<locals>.<genexpr>z
nn:       z
decl:     zlocation: {}:{}r   )rQ  r  r;  r  rt   c          	   S   st   t jr^t  jd7  _t d t  jd7  _t d| t d| t d| t  jd8  _t | |||d d d dS )Nr   z'_add_symbols, onMissingQualifiedSymbol:ztemplateParams:zidentOrOp:     ztemplateARgs:  rM  )r  r  r;  r  r   r^  rd  )r   rl  r\  r]  )rQ  r  r;  r  r   r   r   r     s    
z5Symbol._add_symbols.<locals>.onMissingQualifiedSymbolTF)r  r  rw  rx  ry  rz  r{  r   z _add_symbols, result, no symbol:ztemplateParams:zidentOrOp:     ztemplateArgs:  zdeclaration:   zlocation:      {}:{})r  r  r;  r  r   r^  rd  rM  z_add_symbols, result, symbols:znumber symbols:zno declarationz
#noDecl:  z
#withDecl:z
#dupDecl: )rt   c           	      sB   t jrt d t jjjj d} t jr>t d | S )Nz begin: creating candidate symbol)r  r  r;  r  r   r^  rd  z end:   creating candidate symbol)r   rl  r]  rQ  r  r;  r  )r   )r   r^  rd  lookupResultr   r   makeCandSymbolt  s    


z+Symbol._add_symbols.<locals>.makeCandSymbol)r   
candSymbolrt   c                sN   t jr:t  jd7  _t d t  jd8  _t  jd8  _d|_t|  d S )Nr   ZredeclarationrM  T)r   rl  r\  r]  rL  r   )r   r  )r   r   r   handleDuplicateDeclaration  s    
z7Symbol._add_symbols.<locals>.handleDuplicateDeclarationr  zcandId:zoldId: zno match, no emptyz$result is already created candSymbolzresult is makeCandSymbol()zAno match, but fill an empty declaration, candSybmol is not None?:)r   rl  r\  r]  r/  rY  r   r   r  r   r  r  r   r  rP  r   r;  r  r  rQ  r   r  rL  r  rI  rq  ri  )r   r  r  r   r^  rd  r  rP  r   ZnoDeclZwithDeclZdupDeclr   r  r  r  candIdZoldIdr   )r   r^  rd  r  r   rm    s    







	








zSymbol._add_symbolsr   )r  docnamesr  rt   c             C   s4  t jrt  jd7  _t d |d k	s*tdd }t jrFt  jd7  _x|jD ]}t jr~t d|t j t  jd7  _|jr|| | t jrPt d t  jd8  _qP| j|j	|j
|jdddddd}t|}t jrt d	t| d
d |D }t jrt dt| t|dkr@|| | t jrPt  jd8  _qPd }	|jd krlt jrbt d |d }	n|j }
t jrt d|
 xb|D ]Z}|jd krt jrt d |}	q|j }t jrt d| ||
kr|}	P qW t jrt  jd8  _|	d kr|| | qP|jr|j|kr|	jsL|	|j|j|j n|	j|jkrt|	j}td}||	j|	j|	jj|f }tj||j|jfd nl|jj|	jjkr|jjdkr|	jj|jjkrn8d}|d|	d 7 }|d|d 7 }tj||jd |	||| qPW t jr0t  jd8  _d S )Nr   zmerge_with:c             S   s   | j | | |_|  d S )N)rg  r  r  r_  )r   
otherChildr   r   r   unconditionalAdd  s    z+Symbol.merge_with.<locals>.unconditionalAddzotherChild:
rL  F)r  r;  r  rw  rx  ry  rz  r{  zraw candidate symbols:c             S   s   g | ]}|j s|qS r   )rL  )r*  r   r   r   r   r    s    z%Symbol.merge_with.<locals>.<listcomp>z non-duplicate candidate symbols:r   zno declaration in other childz
queryId:  zempty candidatez
candidate:zRDuplicate C++ declaration, also defined at %s:%s.
Declaration is '.. cpp:%s:: %s'.)location)rj  rk  z1Internal C++ domain error during symbol merging.
z
ourChild:
z
otherChild:
rM  )r   rl  r\  r]  r   rg  r  rL  r|  r  r;  r  r  r   r   rI  r^  ri  rd  r   r   rA  loggerwarningr  r  
merge_with)r   r  r  r  r  r  ZcandiateIterr  rP  ZourChildqueryIdr   r  r&  msgr   r   r   r    s    














zSymbol.merge_with)r  r6  rt   c             C   sZ   t jrt  jd7  _t d |r*|j}ng }| j||d d d d}t jrVt  jd8  _|S )Nr   z	add_name:)r   r^  rd  )r   rl  r\  r]  r$  rm  )r   r  r6  r  r  r   r   r   add_name2  s    
zSymbol.add_namec             C   s   t jrt  jd7  _t d |d k	s*t|d k	s6t|d k	sBt|j}|jrX|jj}ng }| |||||}t jrt  jd8  _|S )Nr   zadd_declaration:)	r   rl  r\  r]  r   r&  r6  r$  rm  )r   r   r^  rd  r  r  r  r   r   r   add_declarationA  s    

zSymbol.add_declaration)r  rx  ry  r{  rt   c             C   s*  t jrt  jd7  _t d t  jd7  _t d| t d| t d| t d| t| t jd dd t  jd	8  _| }x|d k	r$t jrt  jd	7  _t d
 t|t jd dd t  jd	8  _|r|j|kr|S |r|jn|j}x|D ]}|j|kr|S qW |sP |j	}qW d S )Nr   zfind_identifier:zidentOrOp:       zmatchSelf:       zrecurseInAnon:   zsearchInSiblings:r   )rY  rM  ztrying:)
r   rl  r\  r]  rZ  r  r  ru  rg  re  )r   r  rx  ry  r{  currentr`  r   r   r   r   r  S  s6    




zSymbol.find_identifier)r(  rt   c       
   
   C   s>  t jr,t  jd7  _t d t  jd7  _| }x|jD ]\}}}|d k	rd }x.|jD ]$}|jd krfqV|j |krV|}P qVW |}n$|j}|j	}	|j
|||	ddddd}t jrt d| t d| t d| |d k	rt|t jd dd	 n
t d
 |d kr8t jrt  jd8  _d S q8W t jr:t  jd8  _|S )Nr   zdirect_lookup:F)rw  rx  ry  rz  zname:          ztemplateParams:zid:            r   )rY  z	not foundrM  )r   rl  r\  r]  rH  rg  r   rI  r  r  r~  rZ  r  )
r   r(  r   r&  r;  r  r  candr  r  r   r   r   direct_lookupr  sJ    


zSymbol.direct_lookup)r  r  r  rw  rx  ry  r{  rt   c                s  t jrt  jd7  _t d t  jd7  _t d t| t jd dd t d| t d| t d| t d	| t d
| t d| t d| G dd dt dttt	f t
tdd fdd}y"| j|||d||||d|d
}	W n  k
r   dS X |	d kr2t jr.t  jd8  _dS t|	j}
t|
dkrht jr`t  jd8  _|
d fS |	jjd k	r|	jjjdkrdS |	jj|	jd d |||dd}t jrt  jd8  _|d k	r|gd fS dS d S )Nr   z
find_name:zself:r   )rY  znestedName:       ztemplateDecls:    ztyp:              ztemplateShorthand:zmatchSelf:        zrecurseInAnon:    zsearchInSiblings: c               @   s   e Zd ZdS )z8Symbol.find_name.<locals>.QualifiedSymbolIsTemplateParamN)r   r   r   r   r   r   r   QualifiedSymbolIsTemplateParam  s   r  r   )rQ  r  r;  r  rt   c                s    | j d k	r| j jdkr  d S )Nrj  )r   r  )rQ  r  r;  r  )r  r   r   r    s    
z2Symbol.find_name.<locals>.onMissingQualifiedSymbolF)r  r  rw  rx  ry  rz  r{  )NtemplateParamInQualifiedrM  )NNr   rj  )rw  rx  ry  rz  )r   rl  r\  r]  rZ  r  r  r   r   r  r   r  r  r  rP  r   rQ  r   r  r~  r  )r   r  r  r  rw  rx  ry  r{  r  r  r  r   r   )r  r   	find_name  sf    








zSymbol.find_name)r   r  rw  rx  ry  rt   c             C   s  t jrt  jd7  _t d |j}|jr4|jj}ng }dttt	f t
tdddd}| j|||d||||ddd
}	t jrt  jd8  _|	d krd S t|	j}
t|
d	krd S t |	j|	j|	j|	j|d
dd}| }x6|
D ].}|jd krq|j }||kr|  |S qW |  d S )Nr   zfind_declaration:r   )rQ  r  r;  r  rt   c             S   s   d S )Nr   )rQ  r  r;  r  r   r   r   r    s    z9Symbol.find_declaration.<locals>.onMissingQualifiedSymbolF)r  r  rw  rx  ry  rz  r{  r   ZfakeDocnameForQuery*   )r  r  r;  r  r   r^  rd  )r   rl  r\  r]  r&  r6  r$  r   r   r  r   r  r  r  rP  r   rQ  r  r;  r  rI  r   rq  )r   r   r  rw  rx  ry  r  r  r  r  rP  ZquerySymbolr  r   r  r   r   r   find_declaration  sX    






zSymbol.find_declaration)indentrt   c             C   s  t j| g}| js|d n| jrN|t| j |d |t j|  | jrf|t| j n|t| j | jr|t| j | jr|d | j	r|d |d| jj
 d  |t| j | jr|d || j |d |d d	|S )
Nz::
z: z!!duplicate!! r  z} z	(r`  r   )r   r[  r  r  r;  r   r  r   r  rL  r  r^  r/  )r   r  r  r   r   r   r    s0    





zSymbol.to_stringc             C   s:   |  |g}x"| jD ]}|||d  qW d|S )Nr   r   )r  rg  r  r   r/  )r   r  r  r   r   r   r   r   :  s    zSymbol.dump)N)9r   r   r   r\  r[  rl  debug_show_treerV  rX  staticmethodr   r]  r_  r   rb  r   r   r   r  r,  r<  r   rc   r   ri  rh  rq  rr  r   rt  r?  r   ru  r  r"  r  r  rC   r~  r|  r   r   rO  r  rm  r  r=  r  r  r  r  r	   r  r  r  r   __classcell__r   r   )rc  r   r   a  sv   $$

Q| 5k
)K5r   c               @   s  e Zd ZeedddZedd Zedd Zeddd	Ze	dd
dZ
edddZedddZeeeeeeeef  ef dddZedddZeeef dddZedddZeeef dddZedddZedddZeddd Zeed!d"d#Zeeee d$d%d&Z eed!d'd(Z!eed!d)d*Z"edd+d,Z#dvee e$g ef eed.d/d0Z%e&dd1d2Z'e(dd3d4Z)dwee*d6d7d8Z+e,dd9d:Z-e.dd;d<Z/ee0d=d>d?Z1eee2d@dAdBZ3dxeee4d@dCdDZ5eeef eeee6e7f dEdFdGZ8dyeeef eee9dEdHdIZ:dzeee;dKdLdMZ<d{eeef ee=dNdOdPZ>eeef eee?e@f dNdQdRZAeBddSdTZCeDddUdVZEeFddWdXZGeHddYdZZIeJdd[d\ZKeLdd]d^ZMeNdd_d`ZOePddadbZQeRddcddZSeeT ddedfZUeeeV dgdhdiZWd|e*eVeeeVdjdkdlZXeeeYdmdndoZZe[ddpdqZ\eee[eYf ef ddrdsZ]eee=f ddtduZ^dJS )}DefinitionParser)rt   c             C   s   dS )NzC++r   )r   r   r   r   languageB  s    zDefinitionParser.languagec             C   s   | j jS )N)configcpp_id_attributes)r   r   r   r   id_attributesF  s    zDefinitionParser.id_attributesc             C   s   | j jS )N)r  cpp_paren_attributes)r   r   r   r   paren_attributesJ  s    z!DefinitionParser.paren_attributesc             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)current_charposeoffail
definition)r   startPosescaper   r   r   _parse_stringN  s     

zDefinitionParser._parse_stringc          
      s  t t d fdd}    dr,t S  dr>tdS  drPtdS  j} tr t}t	 j
| j }|r|S ||S xLttttgD ]<} |r t}t	 j
| j }|r|S ||S qW   }|d k	r|t|S  tr jd	} jd
}	yt||	}
W nP tk
r\ } z d|  W d d }~X Y n  tk
rz    d Y nX ||
S d S )N)rW  rt   c                s"     ts| S t j}t| |S )N)matchudl_identifier_rer   matched_textrV  )rW  rX  )r   r   r   _udlj  s    

z-DefinitionParser._parse_literal.<locals>._udlrk   r   Tr]   Fr   rM  z8Can not handle character literal. Internal error was: %szJCan not handle character literal resulting in multiple decoded characters.)rC  skip_ws	skip_wordrD  rE  r  r  r.   r/   rG  r  r,   r0   r2   r4   r3   r  rL  r-   Z
last_matchgrouprO  UnicodeDecodeErrorr  r*   )r   r  r  Z	hasSuffixZfloatLitregexZintLitstringr  rH  ZcharLitr   r   )r   r   _parse_literala  sJ    	






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
r` } zx|| _y*|  }|   | 	ds
| d	 W n> tk
rJ } z| |d
f|dfgd|W d d }~X Y nX t|S d }~X Y nX | 	drzt
||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.z0Expected ')' 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.)r  r  r  skip_string_and_wsr  _fold_operator_rer  r  _parse_cast_expressionskip_stringr[  r'   _parse_expression_make_multi_errorre  )r   r]  r^  r  r\  ZeFoldr  eExprr   r   r   _parse_fold_or_paren_expression  s`    










z0DefinitionParser._parse_fold_or_paren_expressionc             C   sd   |    |  }|d k	r|S |    | dr4t S |  }|d k	rH|S |  }|d k	r`t|S d S )Nr}   )r  r  r  rZ  r  _parse_nested_namerg  )r   r  ro  r   r   r   _parse_primary_expression  s    
z*DefinitionParser._parse_primary_expression)r&  openclosert   c             C   s   |    | |sdS | |r(g dfS g }d}x|    |  }|    | drd|t| n
|| |    | |rP | ds| d||f  | j|kr2|dkr2|  jd7  _d}P q2W ||fS )	N)NNFz...r   z"Error in %s, expected ',' or '%s'.r  r   T)	r  r  r  _parse_initializer_clauser  r  r  r  r  )r   r&  r  r  rw  r  rf  r   r   r   _parse_initializer_list  s0    





z(DefinitionParser._parse_initializer_listc             C   s&   |  ddd\}}|d krd S t|S )Nzparenthesized expression-listr_  r`  )r  rt  )r   rw  r  r   r   r   _parse_paren_expression_list  s
    z-DefinitionParser._parse_paren_expression_listc             C   s    |   }|d k	r|S | jddS )NF)
inTemplate)_parse_braced_init_list_parse_assignment_expression)r   ZbracedInitListr   r   r   r    s    z*DefinitionParser._parse_initializer_clausec             C   s(   |  ddd\}}|d krd S t||S )Nzbraced-init-listr  r  )r  ru  )r   rw  r  r   r   r   r  $  s    z(DefinitionParser._parse_braced_init_listc             C   s   |   }|d k	r|S |  S )N)r  r  )r   Zparenr   r   r   *_parse_expression_list_or_braced_init_list,  s    z;DefinitionParser._parse_expression_list_or_braced_init_listc                sp  d }d }    d }xtD ]} |r|}P qW |d k	rd} dsV d|   d}     ds d|   ds d|  td	 fd
d} dg|}     ds؈ d|  t	|||}n drd} ds d  j
}y0 d}t|dd} dsB d W n tk
r }	 z| _
yFtd	 fdd} dg|}t|dd} ds d W nd tk
r }
 zD| _
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 nd tk
r } zD| _
d}|d7 }g }||d f ||df  |||W d d }~X Y nX W d d }~X Y nX g }xZ    |d!kr: d"rb  }     d#sP 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	r^|t| qP qW t||S )-Nr~  r   zExpected '<' after '%s'.Fr   z Expected '>' after type in '%s'.r_  zExpected '(' in '%s'.)rt   c                  s      S )N)r  r   )r   r   r   parser^  s    z:DefinitionParser._parse_postfix_expression.<locals>.parserr`  zExpected ')' to end '%s'.r   zExpected '(' after 'typeid'.T)r  z%Expected ')' to end 'typeid' of type.c                  s      S )N)r  r   )r   r   r   r  s  s    z+Expected ')' to end 'typeid' of expression.zError in 'typeid(...)'.z Expected type or expression.zIf typezIf expressionrf  operatorCastZtypeOperatorCastr  z3Expecting '(' or '{' after type in cast expression.zError in postfix expression,z% expected primary expression or type.zIf primary expression)rf  r~  r   rk  rl  z*Expected ']' in end of postfix expression.rn  r   rM  z..r   z->z++z--)r  r  skip_word_and_wsr  r  _parse_typer  r@  _parse_expression_fallbackr}  r  r  r'   r  r  r  r  r  rj  r  rm  rp  rq  rr  r  rs  rx  )r   Z
prefixTyper  r~  r   r  r  rf  r  eTyper  headererrorsZeOuterZeInnerrz  r&  rv  r   )r   r   _parse_postfix_expression4  s    








42


z*DefinitionParser._parse_postfix_expressionc             C   s  |    xDtD ]<}|d dkr*| |}n
| |}|r|  }t||S qW | dr| dr| dsx| d | 	t
s| d t| j}|    | ds| d	 t|S | dr| jd
d}|    | ds| d t|S |  }t|S | drX| ds&| d | jd
d}|    | dsP| d t|S | dr| dsz| d |  }|    | ds| d t|S | j}| d}|    | ds|| _nbd}| dr| d |r| jd d}	| jd
dd}
n
| d |  }t||t|	|
|S | j}| d}|    | dsb|| _n:| d}|r| ds| d |  }t|||S |  S )Nr   r  rw   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'.rh   zExpecting '(' after 'noexcept'.z Expecting ')' to end 'noexcept'.z::rg   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.rU   rk  rl  z(Expected ']' in array delete-expression.)r  _expression_unary_opsr  r  r  r  r  r  r  r  r1   r   r  r  r  r  _parse_unary_expressionr  r  r  r  r  _parse_decl_specs_parse_declaratorr  r  ry  r  r  )r   r]  r  rf  rX  r  r  r%  r  r  r  rv  r  r   r   r   r    s    






















z(DefinitionParser._parse_unary_expressionc             C   s   | j }|   | dry0| d}| ds8| d |  }t||S  tk
r } zd|| _ y|  S  tk
r } z2g }|	|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  r  r  r  r  r  r  r'   r  r  r  )r   r  r  rf  ZexCastZexUnaryerrsr   r   r   r  (  s(    




.z'DefinitionParser._parse_cast_expression)r  rt   c                s&   t tttd fdd  | d|dS )N)r   opIdr  rt   c       
   	      s.   d t tkr&ttdfdd}nttd fdd}g }g }|||d ẍ  |rpjdkrpP j}d}xt  D ]}|d	 d
kr|sqn	|sq|dkrЈjdkrЈ jd8  _P y(||d}	||	 || d}P W q t
k
r   |_Y qX qW |sXP qXW t||S )Nr   )r  rt   c                s      S )N)r  )r  )r   r   r   r  O  s    zYDefinitionParser._parse_logical_or_expression.<locals>._parse_bin_op_expr.<locals>.parserc                s    d | dS )Nr   )r  r   )r  )_parse_bin_op_exprr  r   r   r   r  R  s    )r  r   Fr   r  r   T)r   _expression_bin_opsrC   r@  r  r  r  r  r  r  r'   r  )
r   r  r  r  rw  r  r  oneMorer]  rf  )r  )r  r   r   r  L  s@    




zIDefinitionParser._parse_logical_or_expression.<locals>._parse_bin_op_exprr   )r  )r  rc   rC   r@  )r   r  r   )r  r   _parse_logical_or_expression@  s    'z-DefinitionParser._parse_logical_or_expression)
orExprHeadr  rt   c             C   sP   |    | dsd S |  }|    | ds:| d | |}t|||S )Nr   r  z=Expected ":" after then-expression in conditional expression.)r  r  r  r  r  r  )r   r  r  r  r  r   r   r   "_parse_conditional_expression_tailv  s    



z3DefinitionParser._parse_conditional_expression_tailc             C   sn   | j |d}| ||}|d k	r$|S xDtD ]<}|d dkrH| |sTq*n| |sTq*|  }t|||S W |S )N)r  r   Zanox)r  r  _expression_assignment_opsr  r  r  r  )r   r  r\  condExprr]  r^  r   r   r   r    s    


z-DefinitionParser._parse_assignment_expressionc             C   s(   | j |d}| ||}|d k	r$|S |S )N)r  )r  r  )r   r  ZorExprr  r   r   r   _parse_constant_expression  s
    z+DefinitionParser._parse_constant_expressionc             C   sZ   | j ddg}x*|   | ds$P || j dd qW t|dkrN|d S t|S d S )NF)r  r   r   r   )r  r  r  r  r   r  )r   rw  r   r   r   r    s    
z"DefinitionParser._parse_expressionT)rY  r  allowrt   c       
   
   C   sD  | j }y| S  tk
rN } z$|r(| js* | d|  || _ W d d }~X Y nX |d k	s\t|   | j }| tr|| j}nddddd}g }	xp| j	 st
|	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  rl  r   )r_  r  rk  r   r   r4  r   z0Could not find end of expression starting at %d.)r  r'   ZallowFallbackExpressionParsingwarnr   r  r  
_string_rer  r  r   r  r  r  r  r  stripr  )
r   rY  r  r  ZprevPosr   r  rF  ZbracketsrP  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)rg   rU   rk  rl  zExpected "]" after  "operator z["z[]z""z%Expected user-defined literal suffix.Fr  )r  r  )r  r  _operator_rer  r  r  r  r  r1   r   r  r  r  )r   r]  r   rP  r   r   r   _parse_operator  s*    










z DefinitionParser._parse_operatorc             C   s  |    | dsd S | dr*tg dS g }g }d}x| j}d}d}yv| jdd}|    | drd}d}| ds| d n*| drd}n| drd}n
| d	 || W n tk
r } z||d
f || _y| j	dd}	|    | dr(d}d}| dsV| d n.| dr:d}n| drLd}n
| d	 |t
|	 W nJ tk
r } z*|| _||df d}
| ||
|W d d }~X Y nX W d d }~X Y nX |r|rtP q:|r:tq:W t||S )Nr   r   F)r  z...Tz3Expected ">" after "..." in template argument list.r   z6Expected "...>", ">" or "," in template argument list.zIf type argument)r  zIf non-type argumentz(Error in parsing template argument list.)r  r  r  r  r  r  r  r  r'   r  r  r  r   )r   
prevErrorsr  r  r  ZparsedCommaZ	parsedEndrP  r   rF  r  r   r   r   _parse_template_argument_list  sj    








2
z.DefinitionParser._parse_template_argument_listF)memberPointerrt   c          
   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   r|   rl   z#Expected identifier in nested name.z3Expected identifier in nested name, got keyword: %sz.Expected '::' in pointer to member (function).)r  r  r   r  r  r  r  r1   r  r  r  	_keywordsr   r  r  r'   otherErrorsr  r"  )r   r  r#  r$  r%  r|   r  r   r  r  exr   r   r   r  I  sN    







z#DefinitionParser._parse_nested_namec             C   s  d }d }g }d }g }|    x| tr:| j}|| |dkrd|d k	r^| d|| |}n|dkr|d k	r| d|| |}n|dkrt|dkr| d||d  || nn|dkrt|dkr|d dkr| d||d  || n*|dkr0|d k	r,| d|| |}|    q W t|dkrNd S |dkr|d k	rt| d|| |d k	r| d|| t|dkr| d|d	| n|d
kr
|d k	r| d|| t|dkr| d|d	| n~|dkr4|d k	r| d|| nT|dkr|d k	rZ| d|| t|dkr| d|d	| n|dkr|d k	r| d|| t|dkr| d|d	| n|dkrT|d k	r| d|| t|dkr| d|d	| t|dkr|d dkr| d|d	| n4|d krz|d k	r| d| nt	d|g }|d k	r|| |d k	r|| |
| |d k	r|| t||S )N)r@   r   rC   rF   r   rG   rH   rI   rc   r   r   r^   rW   r   r   r   r   zCan not have both {} and {}.)rv   r   ru   r   rd   )Z
_ImaginaryZ_Complex)r@   r   rC   r   rG   rH   rI   r   r   r   r   r2  rF   rc   )r   r   r^   rW   r   z.Can not have {} without a floating point type.zUnhandled type {})r  r  _simple_type_specifiers_rer  r  r  rY  r   r/  r   extendr  )r   modifierZ
signednesswidthr  r#  r   r  r   r   r   _parse_simple_type_specifiers{  s    

























z.DefinitionParser._parse_simple_type_specifiersc             C   s>  |    |  }|d k	r|S |    | dr| dsB| d | drf| ds`| d t S |  }|    | ds| d t|S d }|    xdD ]}| |r|}P qW | 	 }|    d }| 
drd}nR| dr2| ds| d	 | ds| d
 | ds.| d d}t|||S )NrS   r_  zExpected '(' after 'decltype'.r@   r`  z#Expected ')' after 'decltype(auto'.z%Expected ')' after 'decltype(<expr>'.)rJ   rz   rZ   r   r   z<Expected '(' after 'decltype' in placeholder type specifier.z@Expected 'auto' after 'decltype(' in placeholder type specifier.zAExpected ')' after 'decltype(auto' in placeholder type specifier.zdecltype(auto))r  r  r  r  r  r  r  r  r  r  r  r  )r   r  rf  r  kr  r  r   r   r   _parse_trailing_type_spec  sJ    













z*DefinitionParser._parse_trailing_type_spec)r  rt   c             C   st  |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}| d}|s| d}d }| dr"d}|s8| dr8d}d }|    | dr| dr| 	d}|    | ds| d t
|}nt
d }|    | dr| jdd}	nd }	|    | d}
| d}|
s| d}
|  }|    d }|dkrZ| drZ|    d}x |D ]}| |r$|}P q$W |sZ| dd|  t||||||	|
|||
S )Nrg   r_  r  z+Expecting "(" in parameters-and-qualifiers.r`  z...Tz6Expected ")" after "..." in parameters-and-qualifiers.single)r  r  r   z<Expecting "," or ")" in parameters-and-qualifiers, got "%s".rM   r   z&&r   rh   Fz Expecting ')' to end 'noexcept'.z->)r  r  r  r   )r  rU   rT   z'Expected "%s" in initializer-specifier.z" or ")r  r  r  r  r  _parse_type_with_initr  r  r  r  r  r  _parse_attribute_listr/  r  )r   r  r  r  rM   r   r  r  rf  r  r  r  r  r  Zvalidr   r   r   r    _parse_parameters_and_qualifiers  s    















z1DefinitionParser._parse_parameters_and_qualifiers)r  typedrt   c             C   s0  d}d}d}d}d}d}d}	d}
d}d}d}g }x|    |sT|rT| d}|rTq4|sl|rl| d}|rlq4|s|dkr| drd}q4| drd}q4|dkr| drd}q4| d	rd	}q4|s|d
kr| d}|rq4|	s|dkr| d}	|	rq4|dkr2|
s| d}
|
rq4|s2| d}|r2q4|dkr|sT| d}|rTq4|sl| d}|rlq4|s| d}|rq4|s| d}|rd}| dr| jdd}|s| d |    | ds| d t|}q4|  }|r|| q4P q4W t	|||||||	|
|||t
|S )zJust parse the simple ones.NrM   r   )r  r  rx   r\   r  re   rq   )r  r  rb   rO   rP   r~   r  rN   r`   r   r[   r_  F)r  z=Expected constant expression after '(' in explicit specifier.r`  z'Expected ')' to end explicit specifier.)r  r  r  r  r  r  r  _parse_attributer  r  r#   )r   r  r  r  r  rb   r   r  rN   rO   rP   r   rM   r`   r  r[   rf  attrr   r   r   _parse_decl_specs_simple`  s    



















z)DefinitionParser._parse_decl_specs_simplec             C   sT   |r|dkrt d| | ||}d }|rB|  }| ||}nd }t||||S )N)rP  r  r  rj  z#Internal error, unknown outer "%s".)r  r	  r  r  )r   r  r  r  r  r  r   r   r   r    s    z"DefinitionParser._parse_decl_specs)r  r  r  rt   c                s  |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 	  |r4 dr4 	   dr|td  qtd	 fd
d}	 dg|	}
 ds" d |t|
 qqP qW  |}|d krt|dkr|r|dkr|r 	   dr jdd}t||dS t|||dS )Nmayber  F)r%  r  z Unexpected ':' after identifier.rk  rl  )rt   c                  s      S )N)r  r   )r   r   r   r    s    z>DefinitionParser._parse_declarator_name_suffix.<locals>.parserz&Expected ']' in end of array operator.r   rP  )r  )r  r  )r  r  r  )r  r  r'   r  r1   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  rF  r  r  r   )r   r   _parse_declarator_name_suffix  sV    







z.DefinitionParser._parse_declarator_name_suffixc             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|	||t|dS |r| dr| 	 }
| |||}	t
|	|
d	S |r
| d
r
| ||d}	t|	dS |r,| jdkr,|dkr4t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 |r| j}y6| jdd}|   | dsd| 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 | j}y2| |||}| jdkrB| j| |d |S  tk
r } z*|| _||df d}| |||W d d }~X Y nX d S )N)rP  r  r  rg   z'Internal error, unknown paramMode '%s'.r   Fr   rM   )r  r   rM   r  r   )r  r  z...)r  r_  r  )r  r  r  z/If declarator-id with parameters-and-qualifiersr`  z$Expected ')' in "( ptr-declarator )"rP  )r  r  r  )r
  r  z"If parenthesis in noptr-declaratorzError in declaratorT)r  z-Expected '*' in pointer to member declarator.zIf pointer to member declaratorr   r   zIf declarator-idz0Error in declarator or parameters-and-qualifiers)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   rM   ZattrListr  r  r  r  r  ZexParamQualr
  ZexNoPtrParenr  r&  r   r   r   r   r    s    







2
 

z"DefinitionParser._parse_declaratorN)r  allowFallbackrt   c                s      |dkr, }|d k	r,t|ddS ds:d S  }|d k	rRt|S |dkr`g }n2|dkrrddg}n |d krddg}nd	|  |dk td
 fdd}j|||d}t|S )Nr  F)r  r   rj  r   r   r`  z;Internal error, initializer for outer '%s' not implemented.)rt   c                  s   j  dS )N)r  )r  r   )r  r   r   r   r    s    z3DefinitionParser._parse_initializer.<locals>.parser)r  )r  r  r  r  r  r@  r  )r   r  r  Z
bracedInitZfallbackEndr  rF  r   )r  r   r   _parse_initializer  s,    


z#DefinitionParser._parse_initializer)r  r  rt   c             C   s  |r(|dkrt d| |dkr(|s(t|dkrg }| j}yb| j|dd}| jd|dd}d}|d	kr|   td
| j	| jrd}|r| j
dd W q tk
r } z|dkrd}	n|d	krd}	nt |||	f || _y| j|d}| jd|d}W n tk
r }
 zz|| _|dkr0d}	n|d	kr@d}	nt ||
|	f |dkrld}|d7 }n|d	kr|d}nt | |||
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
        )rP  r  r  r  rj  z#Internal error, unknown outer "%s".r  )rP  r  F)r  r  T)r  r  r  r  z
requires\b)ZallowSemicolonrP  zIf just a namez"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  rj  r  )r  r   r  r  r  r  recompiler  r  
assert_endr'   r  r  ry  )r   r  r  r  r  r  r  ZmustEndZ	exUntypeddescZexTypedr  r  r   r   r   r    sp    





4


zDefinitionParser._parse_typec          
   C   sh  |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
rb }	 zL|d kr|	g }
|

|df |

|	df d}|d7 }| |
||	W d d }	~	X Y nX d S )N)rP  r  r  rj  )r  r  rj  )r  F)r  r  r   r   r   )r  r  z-If default template argument is an expressionz&If default template argument is a typez$Error in non-type template parameterz# or constrained template parameter.)r   r  r  r  r  r  r  r'   r  r  r  r  )r   r  r  rP  r  r  r  r   ZtypeInitr  r  r  r   r   r   r    sD    





z&DefinitionParser._parse_type_with_initc             C   s:   |   }|   | ds$t|d S | dd }t||S )Nr   F)r  r  r  r  r  )r   r&  rP  r   r   r   _parse_type_using8  s    

z"DefinitionParser._parse_type_usingc             C   s$   |   }|   | d}t||S )Nr  )r  r  r  r  )r   r  r  r   r   r   _parse_concept@  s    
zDefinitionParser._parse_conceptc       	      C   s   |   }|  }|   | d}g }|   | drx|   d }d}d}| dr\d}| trt| j}|   |s| drd}|  }|   | d}|t	|||| |   | drq:q:P q:W t
||||S )Nr  r  Fr   Tz...r   )r  r  r  r  r  r  _visibility_rer  r  r  r  )	r   r  r&  r  r  r  r   r  baseNamer   r   r   _parse_classF  s8    





zDefinitionParser._parse_classc             C   s   |   }|  }t||S )N)r  r  r  )r   r  r&  r   r   r   _parse_unione  s    zDefinitionParser._parse_unionc             C   sD   d }|   }|  }|   d }| dr6| jdd}t||||S )Nr  F)r  )r  r  r  r  r  r   )r   r!  r  r&  r"  r   r   r   _parse_enumj  s    
zDefinitionParser._parse_enumc                s`      }  }   d } drT   td fdd} g |}t|}t|||S )Nr   )rt   c                  s    j ddS )NF)r  )r  r   )r   r   r   r  |  s    z2DefinitionParser._parse_enumerator.<locals>.parser)r  r  r  r  r@  r  r  r#  )r   r&  r  r  r  ZinitValr   )r   r   _parse_enumeratort  s    
z"DefinitionParser._parse_enumeratorc             C   s  |    | dr|  }nd }| j}yd }|    | drDd}n*| drTd}n|rd| d n
| d |    | d}|    | trt	| j
}nd }|    |s| dr| jdd d	}nd }| jd
kr| d t||||}|rt||S t|S W n tk
r } z|r" y.|| _| dd}	|    | d}t|	|S  tk
r }
 z:|| _d}g }||df ||
df | ||W d d }
~
X Y nX W d d }~X Y nX d S )Nr|   r   rJ   zFExpected 'typename' or 'class' after template template parameter list.zKExpected 'typename' or 'class' in the beginning of template type parameter.z...r   F)r  r  z,>z4Expected "," or ">" after (template) type parameter.r
  rj  z&Error when parsing template parameter.z:If unconstrained type parameter or template type parameterz3If constrained type parameter or non-type parameter)r  r  _parse_template_parameter_listr  r  r  r  r  r1   r   r  r  r  r'  r+  r*  r'   r  r.  r  r  )r   r-  r  r(  r)  r   rT   rH  r  r  ZeNonTyper  r  r   r   r   _parse_template_parameter  sd    













z*DefinitionParser._parse_template_parameterc       
   
   C   s  g }|    | ds | d x| j}d }y|  }|| W n, tk
rn } z|| _|}W d d }~X Y nX |    | dr|  }t||S | drq"q"d}g }|r||df y| d W n0 tk
r }	 z||	df W d d }	~	X Y nX t	| | 
||q"W d S )	Nr   zExpected '<' after 'template'r   r   z!Error in template parameter list.zIf parameterzExpected "," or ">".zIf no parameter)r  r  r  r  r  r  r'   _parse_requires_clauser,  rZ  r  )
r   r;  r  errr  ZeParamr2  r  r  r   r   r   r   r    s:    




 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 )Nr  z...z2Expected identifier in template introduction list.zBExpected identifier in template introduction list, got keyword: %sr  r   z:Error in template introduction list. Expected ",", or "}".)r  r  r  r  r  r  r1   r  r  r  r   r  r:  r<  )r   r  rL   r1  r)  Ztxt_identifierr   r   r   r   _parse_template_introduction  s<    





z-DefinitionParser._parse_template_introductionc             C   s   |    | dsd S ttddd}g }g }|||  xV|    d}| drdd}|d n| dr|d}|d |sP |||  q>W t|d	krt|d
 S tt||S d S )Nrs   )r   rt   c             S   s   g }g }| |   xV|   d}| dr>d}| d n| drVd}| d |s\P | |   qW t|dkr|d S t||S d S )NFz&&Tr=   r   r   )r  r  r  r  r  r   r  )r   ZandExprsr  r  r   r   r   parse_and_expr  s$    


z?DefinitionParser._parse_requires_clause.<locals>.parse_and_exprFz||Trm   r   r   )	r  r  r  r@  r  r  r   r0  r  )r   r  ZorExprsr  r  r   r   r   r    s,    



z'DefinitionParser._parse_requires_clause)r  rt   c          
   C   s  g }x|    d }| j}| dry|  }W nB tk
rp } z$|dkr\t|dkr\td S |W d d }~X Y nX |dkr|jd k	r| d n| 	 }|sP |dkrt|dkr|| _| d |
| qW t|dkr|dkr| d t|dkr d S t|S d S )Nr|   r  r   rL   z'requires-clause not allowed for conceptz0More than 1 template parameter list for concept.z,Missing template parameter list for concept.)r  r  r  r  r'   r   r=  r2  r  r  r  )r   r  r$  r1  r  r   r   r   r   "_parse_template_declaration_prefix@  s4    


z3DefinitionParser._parse_template_declaration_prefix)r  r6  fullSpecShorthandisMemberrt   c             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| 7 }	|	t|7 }	| |	 g }
x"t|D ]}|
tg d d	 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
	)r2  )r(  r$  r   r  r   r  r1  r  r,  r  r=  )r   r  r6  r!  r"  ZnumArgsZisMemberInstantiationZ	numParamsZnumExtrar  ZnewTemplatesZ_ir   r   r   _check_template_consistencya  s8    

z,DefinitionParser._check_template_consistency)r  rA  rt   c          
   C   s  |dkrt d| |dkr(t d| d }d }d }d }|   | trP| j}|dkrb| |}|dkr(g }| j}y|s| jddd}W n6 tk
r }	 z|	|	d	f || _W d d }	~	X Y nX | j}y|s| 
 }W nJ tk
r$ }	 z*|| _|	|	d
f d}
| ||
|	W d d }	~	X Y nX n|dkr<|  }n|dkrV| jddd}nx|dkrx| jddd}|  }nV|dkr|  }nB|dkr|  }n.|dkr|  }n|dkr|  }nt | j|j|d|dkd}|   | d}t|||||||S )N)rJ   r   r  r  rP  rL   rZ   rF  z(Internal error, unknown objectType "%s".)rJ   rz   r   r  r  varrP  rL   rZ   zenum-structz
enum-classrF  z+Internal error, unknown directiveType "%s".)rP  rL   r  r  rJ   r   rP  T)r  r  zIf typedef-like declarationzIf type alias or template aliaszError in type declaration.rL   r  r  rJ   r   rZ   rF  F)r!  r"  rJ  )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  rA  r  r6  rB  r   r  r  r   r  rC  r   r   r   parse_declaration  sp    


"













z"DefinitionParser.parse_declarationc             C   s8   | j dd}|  }| j||dd}t||}d|_|S )Nrf   )r  F)r!  )r   r  r#  rN  r  )r   r6  r&  r  r   r   r   parse_namespace_object  s    
z'DefinitionParser.parse_namespace_objectc       
      C   s  | j }yV| jdd}|  }|   | d |   | j||dd}t||}d|_|dfS  t	k
r } zy4|| _ | 
dd}|   | d |   |dfS  t	k
 r } z6g }||df ||d	f d
}	| ||	|W d d }~X Y nX W d d }~X Y nX d S )NZxref)r  z()T)r!  r  FzIf shorthand refzIf full function refzError in cross-reference.)r  r   r  r  r  r  r#  rN  r  r'   r%  r  r  )
r   r  r6  r&  Zres1e1Zres2e2r  r  r   r   r   parse_xref_object  s4    


z"DefinitionParser.parse_xref_objectc             C   s   | j }y|  }|   |   |S  tk
r } z~|| _ y| d}|   |   |S  tk
r } z6d}g }||df ||df | |||W d d }~X Y nX W d d }~X Y nX d S )NFz%Error when parsing (type) expression.zIf expressionzIf type)r  r  r  r  r'   r  r  r  )r   r  rf  ZexExprr  ZexTyper  r  r   r   r   parse_expression  s&    
z!DefinitionParser.parse_expression)T)F)T)T)NT)N)F)_r   r   r   r?  r   r  r  r  r  rC  r  r@  r  r  r	   r   r   ru  rC   r  rt  r  r  r  r  rx  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  ry  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r#  r  r$  r  r,  r  r<  r  r0  r  r=  r   r#  r   r%  rN  r&  r)  r*  r   r   r   r   r  A  s|   <;
 _6
"* A2Y-_]6q0Y
+
?"&5"
$A	r  )rt   c              C   s    t tdd } t| gdgddS )NZPhonyNameDueToErrorF)r%  )r  r   r"  )r>  r   r   r   _make_phony_error_name  s    r+  c                   s  e Zd ZU dZededdddgZee e	d< e
je
je
jdZee	d	< ed
dddZeeed
dddZeedddZeedddZeedddZeedddZeeed
dddZee d fdd Zeeed!d"d#Zd
dd$d%Zd
dd&d'Z   Z!S )(	CPPObjectz%Description of a C++ language object.ztemplate parameterzTemplate Parameters)Ztparamztemplate parameterT)labelr#  can_collapsedoc_field_types)noindexentryZnocontentsentryztparam-line-specoption_specN)astrt   c          	   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dkrd S |j}|j	|jdddd}|d k	rd S |j
 }||_t||jd d || jj|  d d d S )NrF  rZ   FT)rx  ry  r{  r   )r  r  r;  r  r   r^  rd  )r  r   r   r  r;  r  r  r   rA  r  rE  rD  r   r  r^  get_source_info)r   r2  r   rQ  
parentDeclZtargetSymbolr   Z	declCloner   r   r   _add_enumerator_to_parent  s8    



z#CPPObject._add_enumerator_to_parent)r2  sigr   rt   c          	   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
|stjd|||  d |j  d}d}	|jj}
x2|
d k	r|
j}|
j}
|d krq|jd	krd
}	P qW |	s\d| jkr\|}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!||< |st|d | x>|dd  D ].}|sƐq|| jjjkr|d | qW | 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).)r  r  FrL   Tr0  entriesr  r   r  r#  r  )#r1  rH  r   r  r(   r   r  reversedr  r  r  r  r  get_locationr   r  r   lstripr  r   r  rK  r  r  cpp_index_common_prefix
startswithr   get_index_textZ	indexnodestatedocumentr  
domaindatar^  Znote_explicit_target)r   r2  r6  r   r  r   r|  newestIdr&  ZisInConceptr   r  ZstrippedNamer  Z	indexTextr#  r   r   r   add_target_and_indexD  sZ    




zCPPObject.add_target_and_index)rt   c             C   s
   t  d S )N)rA  )r   r   r   r   object_type|  s    zCPPObject.object_typec             C   s   | j S )N)rC  )r   r   r   r   display_object_type  s    zCPPObject.display_object_type)r&  rt   c             C   s   t d|| jf S )Nz%s (C++ %s))r   rD  )r   r&  r   r   r   r=    s    zCPPObject.get_index_text)r  rt   c             C   s   | | j| jS )N)r%  rC  objtype)r   r  r   r   r   parse_definition  s    zCPPObject.parse_definition)r   r2  rK  rt   c             C   s   | |d| j| d S )Nr  )r  r  )r   r   r2  rK  r   r   r   r    s    zCPPObject.describe_signaturec                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rd}t
j|t| | j| jd |  d t }||}||jd	< g S d |jd	< t  S )
Nzcpp:parent_symbolr  root_symbolzcpp:parent_keyr  zmC++ declarations inside functions are not supported. Parent function: {}
Directive name: {}
Directive arg: {}r   )r  zcpp:last_symbol)r>  r?  settingsr  	temp_datar@  r  ref_contextr   r  r  r  rY  r   r  r&  	argumentsr9  r+  r  ra  run)r   r  rootrQ  r4  r  r&  r   )rc  r   r   rL    s&    






zCPPObject.run)r6  r   rt   c          
   C   s  | j jd }t||| j jd}y| |}|  W nR tk
r } z4tj||d t	 }|
|}|| j jd< t|W d d }~X Y nX yx|j|| j j|  d d}|jd kst|jd kst| j jd |_|jd k	r|jjd kst||j_|| j jd< W nb tk
rb } zB|j| j jd< td}	|	|jj|jj| j|f }	tj|	|d W d d }~X Y nX |jdkrz| | t| j}
d	| jk|
d	< | |||
 |S )
Nzcpp:parent_symbol)r  r  )r  zcpp:last_symbolr   )r^  rd  zRDuplicate C++ declaration, also defined at %s:%s.
Declaration is '.. cpp:%s:: %s'.rF  ztparam-line-spec)r  rI  r  r  rF  r  r'   r  r  r+  r  
ValueErrorr  r^  r3  re  r   rf  r   r   r   rd  rD  r  r5  dictrK  r  )r   r6  r   rQ  r  r2  r   r&  r   r  rK  r   r   r   handle_signature  sB    


 

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  rI  r   oldParentSymbolrJ  oldParentKeyr  )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)rQ  r  rI  rR  rJ  )r   r   r   r   after_content  s    zCPPObject.after_content)"r   r   r   __doc__r7   r   r/  r   r6   __annotations__r   flagr1  r:   r   r5  r   r   rB  r?  rC  rD  r=  r  rF  r   r   r  r   rL  rP  rS  rT  r  r   r   )rc  r   r,    s,   

*7%/r,  c               @   s   e Zd ZdZdS )CPPTypeObjectrP  N)r   r   r   rC  r   r   r   r   rX    s   rX  c               @   s   e Zd ZdZdS )CPPConceptObjectrL   N)r   r   r   rC  r   r   r   r   rY    s   rY  c               @   s   e Zd ZdZdS )CPPMemberObjectr  N)r   r   r   rC  r   r   r   r   rZ    s   rZ  c            
   @   sd   e Zd ZdZejededdddededd	d
ddededdddededdddg ZdS )CPPFunctionObjectr  	parameterZ
Parameters)r  r\  r  argumentT)r-  r#  r.  
exceptionsZThrowsrf  )Zthrowsr   	exception)r-  Zrolenamer#  r.  retvalzReturn values)Zretvalsr`  ZreturnvalueZReturnsF)Zreturnsrt   )r-  has_argr#  N)	r   r   r   rC  r,  r/  r7   r   r6   r   r   r   r   r[    s   

r[  c               @   s"   e Zd ZdZeedddZdS )CPPClassObjectrJ   )rt   c             C   s   | j dkst| j S )N)rJ   rz   )rE  r   )r   r   r   r   rD    s    z"CPPClassObject.display_object_typeN)r   r   r   rC  r?  r   rD  r   r   r   r   rb    s   rb  c               @   s   e Zd ZdZdS )CPPUnionObjectr   N)r   r   r   rC  r   r   r   r   rc    s   rc  c               @   s   e Zd ZdZdS )CPPEnumObjectrZ   N)r   r   r   rC  r   r   r   r   rd    s   rd  c               @   s   e Zd ZdZdS )CPPEnumeratorObjectrF  N)r   r   r   rC  r   r   r   r   re    s   re  c               @   s@   e Zd ZU dZdZdZdZdZi Ze	e
d< ee ddd	Zd
S )CPPNamespaceObjectzb
    This directive is just to tell Sphinx that we're documenting stuff in
    namespace foo.
    Fr   r   Tr1  )rt   c          
   C   s   | j jd d }| jd  dkr,|}g }nt| jd |  | jd}y| }|  W nD t	k
r } z&t
j||  d 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  rG  r   )NULLr  rk   )r  r  )r  zcpp:parent_symbolzcpp:namespace_stackzcpp:parent_key)r  r@  rK  r  r  r9  r  r&  r  r'   r  r  r+  rN  r  r  r6  rI  r  rJ  )r   
rootSymbolr   stackr  r2  r   r&  r   r   r   rL  /  s(    

zCPPNamespaceObject.runN)r   r   r   rU  has_contentrequired_argumentsoptional_argumentsfinal_argument_whitespacer1  r:   rV  r   r   rL  r   r   r   r   rf  #  s   
rf  c               @   s<   e Zd ZU dZdZdZdZi Zee	d< e
e dddZd	S )
CPPNamespacePushObjectFr   r   Tr1  )rt   c          
   C   s  | j d  dkrg S t| j d |  | jd}y| }|  W nD tk
r } z&tj	||  d 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   )rg  r  rk   )r  r  )r  zcpp:parent_symbolr  rG  zcpp:namespace_stackzcpp:parent_key)rK  r  r  r9  r  r&  r  r'   r  r  r+  rN  r  rI  rM  r@  r  r  r6  r  r  rJ  )r   r  r2  r   r&  Z	oldParentr   ri  r   r   r   rL  N  s,    


zCPPNamespacePushObject.runN)r   r   r   rj  rk  rl  rm  r1  r:   rV  r   r   rL  r   r   r   r   rn  G  s   
rn  c               @   s<   e Zd ZU dZdZdZdZi Zee	d< e
e dddZdS )	CPPNamespacePopObjectFr   Tr1  )rt   c             C   s   | j jdd }|r t|dkr8tjd|  d g }n|  t|dkrV|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 global scope.)r  r4  r  rG  zcpp:parent_symbolzcpp:parent_key)r  rI  rM  r   r  r  r9  r  r@  r  rJ  )r   ri  r   r   r   r   rL  n  s    
zCPPNamespacePopObject.runN)r   r   r   rj  rk  rl  rm  r1  r:   rV  r   r   rL  r   r   r   r   ro  g  s   
ro  c                   s:   e Zd Zd	eededd fddZd dddZ  ZS )
	AliasNodeNr   )r6  aliasOptionsr  	parentKeyrt   c                sr   t    || _|| _|d k	r\d|jkrN|jd d }||jd< | |jd< |jd | _n|d k	sht	|| _d S )Nzcpp:parent_symbolr  rG  zcpp:parent_key)
ra  r   r6  rq  rI  r@  r  rJ  rr  r   )r   r6  rq  r  rr  rM  )rc  r   r   r     s    


zAliasNode.__init__)rt   c             C   s   | j | j| jd | jdS )N)r  rr  )rc  r6  rq  rr  )r   r   r   r   copy  s    zAliasNode.copy)NN)	r   r   r   r   rO  rR  r   rs  r  r   r   )rc  r   rp    s    rp  c               @   sD   e Zd Zejd Zeeeeee	e
e dddZe	ddddZdS )	AliasTransformr   )r   maxdepthskipThisrq  renderOptionsr?  rt   c          	   C   s  |dkrd}n|dkrd}n|d8 }d}g }|sZt dd}	||	 |j|	d| j| |r|rj|}
nDt  }t  }|| ||_d|d< d	 |d
< |d< d|d< |}
xH|j	D ]>}|jd krq|jj
dkrq| j||d|||d}|
| qW |st|jdkr|| |S )Nr   Tr   Fr   r3  r  domainaliasrE  desctypeZnoindex)rj  rk  )ru  rv  rq  rw  r?  )r   r   r  r   r  r  desc_contentr  r?  rg  r  _render_symbolr  r   r`  )r   r   ru  rv  rq  rw  r?  recurser   r   ZchildContainercontentr  rs  Z
childNodesr   r   r   r|    sF    



zAliasTransform._render_symbolN)kwargsrt   c             K   s  x| j tD ]p}|j}|j}y*t||| jjd}| \}}|	  W n8 t
k
r } ztj||d d\}}W d d }~X Y nX |d krt|d}	|	  |	t||7 }	||	 q| jjd jd }
|
|}|std| td| t|
d	 |stg }|rrt|ts&t|}|j}|jrB|jj}ng }|j||d
ddddd\}}|d krg }nBt|tst|}|j}|j |d
dddd}|d k	r|!| dd |D }t"|dkrt|d}	|!|	 |	  |	t||7 }	tjd| |d ||	 qg }ddi}xN|D ]F}|j#d k	sBt| j$||j%d |j%d |j%||j d}|&| q.W || qW d S )N)r  r  )r  )NNr   r  rG  zTarget: zParentKey: r   anyTF)r  r  r  rw  rx  ry  r{  )rw  rx  ry  c             S   s   g | ]}|j d k	r|qS )N)r   )r*  r   r   r   r   r     s    z(AliasTransform.apply.<locals>.<listcomp>r   z,Can not find C++ declaration for alias '%s'.ztparam-line-specru  noroot)ru  rv  rq  rw  r?  )'r?  findallrp  r6  rr  r  r  r  r)  r  r'   r  r  r   r   clearr  Zreplace_selfdomainsrH  r  rZ  r   r   r/  rN  r  r6  r$  r  r   r&  r  r  r   r   r|  rq  r  )r   r  r  r6  rr  r  r2  isShorthandr   r   rh  rQ  rP  nsr&  r  
failReasonr  r   r   rw  r  r   r   r   apply  s    














zAliasTransform.apply)r   r   r   r!   Zdefault_priorityr   rc   rC   rO  r   r   r   r|  r  r   r   r   r   rt    s
   
,rt  c               @   s6   e Zd ZU ejejdZeed< e	e
 dddZdS )CPPAliasObject)ru  r  r1  )rt   c             C   s  d| j kr"| j dd\| _| _nd| j  | _| _t }| jj|_| j|d< | j |d< |d< g | _| j	
ddd| j	kd	}|d r|d dkrtjd
|  d |  }x"|D ]}|t||| jd qW t }|| |   | j| j| j| d| jjd< |   |gS )a   
        On purpose this doesn't call the ObjectDescription version, but is based on it.
        Each alias signature may expand into multiple real signatures (an overload set).
        The code is therefore based on the ObjectDescription version.
        r  r   r   rx  rE  rz  ru  r  )ru  r  zError in C++ alias declaration. Requested 'noroot' but 'maxdepth' 1. When skipping the root declaration, need 'maxdepth' 0 for infinite or at least 2.)r  )r  Nobject)r&  splitrx  rE  r   r  r>  r?  r#  rK  rM  r  r  r9  Zget_signaturesr  rp  r  r{  rS  Znested_parser~  Zcontent_offsetrI  rT  )r   r  rq  Z
signaturesr6  Zcontentnoder   r   r   rL  "  s.    




zCPPAliasObject.runN)r   r   r   r   Znonnegative_intrW  r1  r:   rV  r   r   rL  r   r   r   r   r    s   
r  c               @   s,   e Zd Zeeeeeeeef dddZdS )CPPXRefRole)r  refnodehas_explicit_titletitletargetrt   c             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	  r  z()r   r   z::r4  rM  )	
attributesupdaterJ  r+   subr   rT  r:  rfind)r   r  r  r  r  r  Zdcolonr   r   r   process_linkL  s     


zCPPXRefRole.process_linkN)	r   r   r   r   r   rC   r   r	   r  r   r   r   r   r  K  s   r  c                   sB   e Zd Zedd fddZeee ee f dddZ	  Z
S )CPPExprRoleN)asCodert   c                s    t    |rd| _nd| _d S )Nzcpp-exprz	cpp-texpr)ra  r   
class_type)r   r  )rc  r   r   r   j  s    
zCPPExprRole.__init__)rt   c          
   C   s   | j dd}t||  | jd}y| }W nP tk
r~ } z2tjd|||  d t	j
d||| jgdgg fS d }~X Y nX | jjdd }|d kr| jjd d	 }t	j
d| jgd}||d
| j| |gg fS )Nr  r2  )r  r  z!Unparseable C++ expression: %r
%s)r  r  )r  zcpp:parent_symbolrG  r  )r  rJ  r  r9  r  r*  r'   r  r  r   Zdesc_inliner  r  rI  rM  r@  r  )r   r  r  r2  r  rQ  r   r   r   r   rL  s  s     

*zCPPExprRole.run)r   r   r   rC   r   r	   r   r   r   rL  r  r   r   )rc  r   r  i  s   	r  c               @   s8  e Zd ZdZdZdZeedddddeeddddeed	d
ddeeddddeedddeedddeeddddeedddeeddddeeddddddddd
Ze	e	e
eeeeeeeeeeeeedZe 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di dZeddddZeeejdddd Z e!dd!d"d#Z"e#e e$dd$d%d&Z%eee&eee!e'e(e)e' e)e f d'd(d)Z*eee&eee!e'e)e' d'd*d+Z+eee&ee!e'e#e(ee'f  d,d-d.Z,e-e(eeeeee.f  d/d0d1Z/e'ed2d3d4Z0dS )5	CPPDomaina  C++ language domain.

    There are two 'object type' attributes being used::

    - Each object created from directives gets an assigned .objtype from ObjectDescription.run.
      This is simply the directive name.
    - Each declaration (see the distinction in the directives dict below) has a nested .ast of
      type ASTDeclaration. That object has .objectType which corresponds to the keys in the
      object_types dict below. They are the core different types of declarations in C++ that
      one can document.
    r  zC++rJ   rz   r   rP  r   r  funcr  r$  rL   rZ   rF  zfunction parameterztemplate parameter)
rJ   r   r  r  rP  rL   rZ   rF  rk  rj  )rJ   rz   r   r  r  r$  rP  rL   rZ   zenum-structz
enum-classrF  rf   znamespace-pushznamespace-popry  T)Z
fix_parens)r  F)r  rJ   rz   r   r  r  r$  rP  rL   rZ   rF  rf  ZtexprN)rG  r#  )r^  rt   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:rG  r   z	before endz	after:z
	after endzclear_doc end:r#  )r   r  rZ  rH  r   rr  r  items)r   r^  rh  r&  ZnDocnamer   r   r   rr    s    



zCPPDomain.clear_doc)r  r^  r?  rt   c             C   s2   t jr.td| t| jd d td| d S )Nzprocess_doc:rG  r   zprocess_doc end:)r   r  rZ  rH  r   )r   r  r^  r?  r   r   r   process_doc  s    
zCPPDomain.process_doc)r  rt   c             C   s   |j | jj d S )N)r  r  r  rJ  )r   r  r   r   r   process_field_xref  s    zCPPDomain.process_field_xref)r  	otherdatart   c             C   s   t jrTtd td t| jd d td td t|d d td | jd |d || j | jd }x0|d  D ] \}}||kr||kr|||< qW t jrtd	 t| jd d td
 td d S )Nzmerge_domaindata:z	self:rG  r   z		self endz	other:z
	other endr#  z	result:z	result endzmerge_domaindata end)r   r  rZ  rH  r   r  r  r  )r   r  r  ZourNamesr&  r^  r   r   r   merge_domaindata  s(    

zCPPDomain.merge_domaindata)r  fromdocnamebuilderr  r  r  contnodert   c       #   
      s  dkrd7 t jd}y| \}	}
W nb tk
r } zDttttf dfdd}||\}}tjd||d d	S d }~X Y nX 	d
d }j
d }|r||}|std td|j
 t|d |stn|}|
rt|	tst|	}|j}|jr |jj}ng }|j o:t|jdk}|j||ddd|d\}}|d krdkr|dkrtt|d }n|d }n.t|	tst|	}|j}|j|dddd}|d ks|jd krt|}|ds|dkr t|d	S drdd  |jj td fdd}| s^tjd|jj|  d |j}|
r|  }|! "d}n|! }|j#}|stdkr|$d% } d}!	dds|jd kr|
rFjj&rd!kr|!d7 }!jj&rd"kr| 'd#r|!d7 }!dkr| 'd$r|'d#r|!d7 }!nnjj&rd!krp|'drp|!d7 }!n.d"kr| 'dr|'ds| d d% } n|'dr|!d7 }!|!dkr| d|! 7 } |t()| 7 }t*||||+ |||jf}"|"S )&N)r  r  z())r  r  )r   rt   c          
      st   dkrdkr| fS t d d  jd}y|  W n. tk
rj } zd d |fS d }~X Y nX | fS )Nr  r  r  )r  r  )r  r  r)  r'   )r   Zparser2r(  )r  r  r  r  r   r   findWarning  s    
z2CPPDomain._resolve_xref_inner.<locals>.findWarningz&Unparseable C++ cross-reference: %r
%s)r  )NNzcpp:parent_keyrG  zTarget: zParentKey: r   T)rw  rx  ry  r{  r   r  r   )rw  rx  ry  zstd::r   zcpp:r   )rt   c                 s<   dkrdS  } | r" | kS td f  t d S )Nr  Tz"Type is %s, declaration type is %s)Zobjtypes_for_rolerZ  r   )Zobjtypes)declTypr   r  r   r   	checkTypeW  s    
z0CPPDomain._resolve_xref_inner.<locals>.checkTypezcpp:%s targets a %s (%s).r  ZrefexplicitFr  r  r  z
operator()rl   r  ),r  r  r)  r'   r  r	   r   r  r  rM  rH  r  rZ  r   r   r/  rN  r  r6  r$  r%  r   r#  r  r   r   r&  r  r   r<  r  rC   r  r   r:  r^  r  r  Zadd_function_parenthesesrT  r   r5  r9   rI  )#r   r  r  r  r  r  r  r  r  r2  r  r   r  r   r  rr  rh  rQ  r  r&  r  r{  rP  r  r   r  ZtxtNamer  r   fullNestedNameZdisplayNamer^  r  ZaddParenr  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_xref)r  r  r  r  r  r  rt   c       	   
   C   s\   t    | |||d|||\}}W d Q R X |rX|dkrDd|fgS d| | |fgS g S )Nr  rj  zcpp:templateParamzcpp:)r"   suppress_loggingr  Zrole_for_objtype)	r   r  r  r  r  r  r  ZretnoderE  r   r   r   resolve_any_xref  s    


zCPPDomain.resolve_any_xref)rt   c       	      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 )NrG  r  r   )rH  rt  r   r^  r   r  r   r:  r   r  rI  )	r   rh  r   r  r&  Zdispnamer  r^  rA  r   r   r   get_objects  s    



zCPPDomain.get_objects)r  rt   c             C   sl   | dd }|d krd S | dd }|d ks:t|jdkr>d S | jd }||}| }dt||gS )Nr
  zcpp:parent_keyr   rG  z::)rM  r   rH  r  r  r/  r   )r   r  r  rr  rh  rQ  Z
parentNamer   r   r   get_full_qualified_name  s    

z!CPPDomain.get_full_qualified_name)1r   r   r   rU  r&  r-  r   r   Zobject_typesrb  rc  r[  rZ  rX  rY  rd  re  rf  rn  ro  r  r   r  r  Zrolesr   Zinitial_datar   rr  r   r   r?  r  r   r  r   r   r  r   r   r	   r   r  r  r  r   rc   r  r  r   r   r   r   r    s|     "r  )apprt   c             C   s|   |  t | dg d | dg d | dg d | t | ddd | ddd d	d
 }| d| dddddS )Nr;  r  r  r  cpp_debug_lookupFr   cpp_debug_show_treec             S   s(   | j jt_| j jt_| j jjdd d S )NT)rv  )r  r  r   rl  r  r  r;  sort)r  r   r   r   	initStuff  s    

zsetup.<locals>.initStuffzbuilder-initedbuiltin   T)r   Zenv_versionZparallel_read_safeZparallel_write_safe)Z
add_domainr  Zadd_config_valueZadd_post_transformrt  connect)r  r  r   r   r   setup  s    

r  )rU  r  typingr   r   r   r   r   r   r   r	   r
   r   Zdocutilsr   Zdocutils.nodesr   r   r   r   Zdocutils.parsers.rstr   Zsphinxr   Zsphinx.addnodesr   r   Zsphinx.applicationr   Zsphinx.buildersr   Zsphinx.directivesr   Zsphinx.domainsr   r   Zsphinx.environmentr   Zsphinx.errorsr   Zsphinx.localer   r   Zsphinx.rolesr   r   Zsphinx.transformsr    Z!sphinx.transforms.post_transformsr!   Zsphinx.utilr"   Zsphinx.util.cfamilyr#   r$   r%   r&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   Zsphinx.util.docfieldsr6   r7   Zsphinx.util.docutilsr8   Zsphinx.util.nodesr9   Zsphinx.util.typingr:   	getLoggerr   r  r;   r  r  Sr  r  r  r  r  r  rH  rG  r  r.  r  r  rc  r  r   r   rV  r  r  r  r  r  r   r   r   r  r"  r@  rC  rD  rE  rG  rL  rO  rV  rZ  r[  re  rg  rh  rj  rm  rp  rq  rr  rs  rx  r}  r  r  r  r  r  r  r  r  r  r  r  r  ru  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  rt  r  ry  r  r  r  r  r  r  r  r   r#  r$  r'  r*  r+  r.  r,  r:  r<  r=  r0  r   rN  rO  rR  rC   rU  r   r  r+  r,  rX  rY  rZ  r[  rb  rc  rd  re  rf  rn  ro  rp  rt  r  r  r  r  r  r   r   r   r   <module>   s  0T
   
	

		$

(N 
>	 1&(&$-5	(,! eF ,X.lC?gJn(%$#3+(9")7O46( )
       g               T e
$  /!  A