B
    .Kc[             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_eqZasmautobitandbitorboolbreakZcaseZcatchcharchar8_tchar16_tchar32_tclasscomplconceptconst	consteval	constexpr	constinit
const_castcontinuedecltypedefaultdeleteZdodoubledynamic_castelseenumexplicitZexportexternfalsefloatforfriendZgotoifinlineintlongmutable	namespacenewnoexceptnotnot_eqnullptroperatororor_eqZprivateZ	protectedpublicregisterreinterpret_castrequiresreturnshortsignedsizeofstaticZstatic_assertstatic_caststructZswitchtemplatethisthread_localthrowtruetrytypedeftypeidtypenameunionunsignedusingvirtualvoidvolatilewchar_twhile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)
rD   zsigned charzunsigned charr`   z
signed intzunsigned intra   zsigned longzunsigned longrB   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)*rd   znew[]rS   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   rB   rD   zsigned charzunsigned charr   rG   rF   rE   rq   z	short intzsigned shortzsigned short intzunsigned shortzunsigned short intr`   rr   z
signed intr   zunsigned intra   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[   rT   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nwZnadldacoplmimlZdvZrmZaneoZaSZpLZmIZmLZdVZrMZaNZoRZeOZlsZrsZlSZrSeqneltgtlegentaaZooppmmcmZpmptclixZdsZqu)8rd   znew[]rS   zdelete[]r   rI   r   r   r   r   r   r   r@   r   rA   r   r   r   z+=z-=z*=z/=z%=z&=r>   z|=rk   z^=r   z<<z>>z<<=z>>=z==z!=rg   r   r   z<=z>=z<=>r   rf   z&&r=   z||rj   z++z--r   z->*z->z()z[]z.*?Zpp_Zmm_deZadZpsZng)
z++z--r   r   r   r   r   rf   r   rI   )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dcZscZccZrc)rU   ru   rO   rn   c               @   s,   e Zd ZddddddZeddd	ZdS )
_DuplicateSymbolErrorSymbolASTDeclarationN)symboldeclarationrp   c             C   s    |st |st || _|| _d S )N)AssertionErrorr   r   )selfr   r    r   1lib/python3.7/site-packages/sphinx/domains/cpp.py__init__?  s    z_DuplicateSymbolError.__init__)rp   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)
identifierrp   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__)rp   c             C   s   | j d dkS )Nr   @)r   )r   r   r   r   is_anonV  s    zASTIdentifier.is_anon)versionrp   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   rp   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   rB   r   r`   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   rp   c             C   s   || _ || _d S )N)r  r   )r   r  r   r   r   r   r     s    zASTNestedNameElement.__init__)rp   c             C   s   dS )NFr   )r   r   r   r   is_operator  s    z ASTNestedNameElement.is_operator)r   rp   c             C   s&   | j |}| jr"|| j|7 }|S )N)r  r   r   )r   r   resr   r   r   r     s    zASTNestedNameElement.get_id)	transformrp   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   rp   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   rB   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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rootedrp   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__)rp   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   	modifiersrp   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  rp   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   rp   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::blahrw    r   r  r   )r   r   markNamer   TFr   zUnknown description mode: %s)r5   r  r   r   Textr#  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nnerw   Ztxt_nner   r   r   r    s    









z ASTNestedName.describe_signature)r   )r   r   r   r   r  rB   r   propertyr  r`   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   rp   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   rp   c             C   s   t t| d S )N)r3  r4  )r   r   r   r   r   r   r   r   r  H  s    z ASTExpression.describe_signature)r   r   r   r`   r   r   r   r  r   r   r   r   r2  D  s   r2  c               @   s   e Zd ZdS )
ASTLiteralN)r   r   r   r   r   r   r   r5  P  s   r5  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  rp   c             C   s   dS )Nrh   r   )r   r  r   r   r   r  U  s    zASTPointerLiteral._stringify)r   rp   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   rp   c             C   s   |t dd7 }d S )Nrh   )r   r+  )r   r   r   r   r   r   r   r   r  [  s    z$ASTPointerLiteral.describe_signature)
r   r   r   r)   r   r  r`   r   r   r  r   r   r   r   r6  T  s   r6  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)valuerp   c             C   s
   || _ d S )N)r8  )r   r8  r   r   r   r   a  s    zASTBooleanLiteral.__init__)r  rp   c             C   s   | j r
dS dS d S )Nr{   rZ   )r8  )r   r  r   r   r   r  d  s    zASTBooleanLiteral._stringify)r   rp   c             C   s   | j r
dS dS d S )NZL1EZL0E)r8  )r   r   r   r   r   r   j  s    zASTBooleanLiteral.get_idr   r   )r   r   r   r   rp   c             C   s   |t t| t| 7 }d S )N)r   r+  r   )r   r   r   r   r   r   r   r   r  p  s    z$ASTBooleanLiteral.describe_signature)r   r   r   rB   r   r)   r   r  r`   r   r   r  r   r   r   r   r7  `  s
   r7  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)datarp   c             C   s
   || _ d S )N)r:  )r   r:  r   r   r   r   v  s    zASTNumberLiteral.__init__)r  rp   c             C   s   | j S )N)r:  )r   r  r   r   r   r  y  s    zASTNumberLiteral._stringify)r   rp   c             C   s   d| j dd S )NzL%sE'r   )r:  replace)r   r   r   r   r   r   |  s    zASTNumberLiteral.get_idr   r   )r   r   r   r   rp   c             C   s   |t | j| j7 }d S )N)r   desc_sig_literal_numberr:  )r   r   r   r   r   r   r   r   r    s    z#ASTNumberLiteral.describe_signature)r   r   r   r   r   r)   r  r`   r   r   r  r   r   r   r   r9  u  s
   r9  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)r:  rp   c             C   s
   || _ d S )N)r:  )r   r:  r   r   r   r     s    zASTStringLiteral.__init__)r  rp   c             C   s   | j S )N)r:  )r   r  r   r   r   r    s    zASTStringLiteral._stringify)r   rp   c             C   s   dt | jd  S )NzLA%d_KcE   )r   r:  )r   r   r   r   r   r     s    zASTStringLiteral.get_idr   r   )r   r   r   r   rp   c             C   s   |t | j| j7 }d S )N)r   desc_sig_literal_stringr:  )r   r   r   r   r   r   r   r   r    s    z#ASTStringLiteral.describe_signature)r   r   r   r   r   r)   r  r`   r   r   r  r   r   r   r   r>    s
   r>  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   r:  rp   c             C   sT   || _ || _|tkstt| | _| d}t|dkrHt|| _	nt
|d S )Nzunicode-escaper   )r   r:  r   r   typeencodedecoder   ordr8  r*   )r   r   r:  Zdecodedr   r   r   r     s    
zASTCharLiteral.__init__)r  rp   c             C   s0   | j d krd| j d S | j d | j d S d S )Nr;  )r   r:  )r   r  r   r   r   r    s    
zASTCharLiteral._stringify)r   rp   c             C   s   | j t| j S )N)rB  r   r8  )r   r   r   r   r   r     s    zASTCharLiteral.get_idr   r   )r   r   r   r   rp   c             C   s@   | j d k	r|t| j | j 7 }d| j d }|t||7 }d S )Nr;  )r   r   r+  r:  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  r`   r   r   r  r   r   r   r   rA    s
   rA  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)rH  rI  )r   rH  rI  r   r   r   r     s    zASTUserDefinedLiteral.__init__)r  rp   c             C   s   || j || j S )N)rH  rI  )r   r  r   r   r   r    s    z ASTUserDefinedLiteral._stringify)r   rp   c             C   s   d | j|| j|S )NzclL_Zli{}E{}E)formatrI  r   rH  )r   r   r   r   r   r     s    zASTUserDefinedLiteral.get_idr   r   N)r   r   r   r   rp   c             C   s,   | j |||| | j|d|dd| d S )Nr  r   )rH  r  rI  )r   r   r   r   r   r   r   r   r    s    z(ASTUserDefinedLiteral.describe_signature)r   r   r   r5  r   r   r)   r   r  r`   r   r   r  r   r   r   r   rG    s
   rG  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  rp   c             C   s   dS )Nrx   r   )r   r  r   r   r   r    s    zASTThisLiteral._stringify)r   rp   c             C   s   dS )NZfpTr   )r   r   r   r   r   r     s    zASTThisLiteral.get_idr   r   N)r   r   r   r   rp   c             C   s   |t dd7 }d S )Nrx   )r   r+  )r   r   r   r   r   r   r   r   r    s    z!ASTThisLiteral.describe_signature)
r   r   r   r)   r   r  r`   r   r   r  r   r   r   r   rK    s   rK  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	rightExprrp   c             C   s*   |d k	s|d k	st || _|| _|| _d S )N)r   rM  rN  rO  )r   rM  rN  rO  r   r   r   r     s    zASTFoldExpr.__init__)r  rp   c             C   s   dg}| j r<||| j  |d || j |d |d | jr||d || j |d ||| j |d d|S )N(r$  z...)r   )rM  r  rN  rO  r!  )r   r  r  r   r   r   r    s    





zASTFoldExpr._stringify)r   rp   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   ZflfrZfLr   )	r   r   rM  r  rO  _id_operator_v2rN  r   r!  )r   r   r  r   r   r   r     s    


zASTFoldExpr.get_idr   r   )r   r   r   r   rp   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 )NrP  z...rQ  )r   r*  rM  r  r,  desc_sig_operatorrN  rO  )r   r   r   r   r   r   r   r   r     s    zASTFoldExpr.describe_signature)r   r   r   r2  r   r   r)   r  r`   r   r   r  r   r   r   r   rL    s   rL  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)rV  )r   rV  r   r   r   r     s    zASTParenExpr.__init__)r  rp   c             C   s   d|| j  d S )NrP  rQ  )rV  )r   r  r   r   r   r    s    zASTParenExpr._stringify)r   rp   c             C   s   | j |S )N)rV  r   )r   r   r   r   r   r     s    zASTParenExpr.get_idr   r   N)r   r   r   r   rp   c             C   s6   |t dd7 }| j|||| |t dd7 }d S )NrP  rQ  )r   r*  rV  r  )r   r   r   r   r   r   r   r   r    s    zASTParenExpr.describe_signature)r   r   r   r2  r   r)   r   r  r`   r   r   r  r   r   r   r   rU    s
   rU  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  rp   c             C   s
   || j S )N)r  )r   r  r   r   r   r  '  s    zASTIdExpression._stringify)r   rp   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   rp   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  r`   r   r   r  r   r   r   r   rW  "  s
   rW  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   rp   c             C   s   t t| d S )N)r3  r4  )r   rY  r   r   r   r   r   6  s    zASTPostfixOp.get_idr   r   N)r   r   r   r   rp   c             C   s   t t| d S )N)r3  r4  )r   r   r   r   r   r   r   r   r  9  s    zASTPostfixOp.describe_signature)r   r   r   r   r`   r   r   r  r   r   r   r   rX  5  s   rX  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)rV  c             C   s
   || _ d S )N)rV  )r   rV  r   r   r   r   ?  s    zASTPostfixArray.__init__)r  rp   c             C   s   d|| j  d S )N[])rV  )r   r  r   r   r   r  B  s    zASTPostfixArray._stringify)rY  r   rp   c             C   s   d| | j | S )Nr   )rV  r   )r   rY  r   r   r   r   r   E  s    zASTPostfixArray.get_idr   r   N)r   r   r   r   rp   c             C   s6   |t dd7 }| j|||| |t dd7 }d S )Nr[  r\  )r   r*  rV  r  )r   r   r   r   r   r   r   r   r  H  s    z"ASTPostfixArray.describe_signature)r   r   r   r2  r   r)   r   r  r`   r   r   r  r   r   r   r   rZ  >  s
   rZ  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  rp   c             C   s   d|| j  S )N.)r  )r   r  r   r   r   r  S  s    zASTPostfixMember._stringify)rY  r   rp   c             C   s   d| | j | S )NZdt)r  r   )r   rY  r   r   r   r   r   V  s    zASTPostfixMember.get_idr   r   N)r   r   r   r   rp   c             C   s&   |t dd7 }| j|d|| d S )Nr^  r   )r   r*  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  r`   r   r   r  r   r   r   r   r]  O  s
   r]  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  rp   c             C   s   d|| j  S )Nz->)r  )r   r  r   r   r   r  c  s    z$ASTPostfixMemberOfPointer._stringify)rY  r   rp   c             C   s   d| | j | S )Nr   )r  r   )r   rY  r   r   r   r   r   f  s    z ASTPostfixMemberOfPointer.get_idr   r   N)r   r   r   r   rp   c             C   s&   |t dd7 }| j|d|| d S )Nz->r   )r   rT  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  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edddZeeddd	d
ddZ	d	S )ASTPostfixInc)r  rp   c             C   s   dS )Nz++r   )r   r  r   r   r   r  p  s    zASTPostfixInc._stringify)rY  r   rp   c             C   s   d| S )Nr   r   )r   rY  r   r   r   r   r   s  s    zASTPostfixInc.get_idr   r   N)r   r   r   r   rp   c             C   s   |t dd7 }d S )Nz++)r   rT  )r   r   r   r   r   r   r   r   r  v  s    z ASTPostfixInc.describe_signature)
r   r   r   r)   r   r  r`   r   r   r  r   r   r   r   r`  o  s   r`  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  rp   c             C   s   dS )Nz--r   )r   r  r   r   r   r  |  s    zASTPostfixDec._stringify)rY  r   rp   c             C   s   d| S )Nr   r   )r   rY  r   r   r   r   r     s    zASTPostfixDec.get_idr   r   N)r   r   r   r   rp   c             C   s   |t dd7 }d S )Nz--)r   rT  )r   r   r   r   r   r   r   r   r    s    z ASTPostfixDec.describe_signature)
r   r   r   r)   r   r  r`   r   r   r  r   r   r   r   ra  {  s   ra  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)lstrp   c             C   s
   || _ d S )N)re  )r   re  r   r   r   r     s    zASTPostfixCallExpr.__init__)r  rp   c             C   s
   || j S )N)re  )r   r  r   r   r   r    s    zASTPostfixCallExpr._stringify)rY  r   rp   c             C   s>   d|g}x | j jD ]}||| qW |d d|S )Nr   r  r   )re  exprsr  r   r!  )r   rY  r   r  r   r   r   r   r     s
    
zASTPostfixCallExpr.get_idr   r   )r   r   r   r   rp   c             C   s   | j |||| d S )N)re  r  )r   r   r   r   r   r   r   r   r    s    z%ASTPostfixCallExpr.describe_signature)r   r   r   r   r   r)   r   r  r`   r   r   r  r   r   r   r   rb    s
   rb  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   ri  )r   r   ri  r   r   r   r     s    zASTPostfixExpr.__init__)r  rp   c             C   s4   || j g}x| jD ]}||| qW d|S )Nr   )r   ri  r  r!  )r   r  r  pr   r   r   r    s    zASTPostfixExpr._stringify)r   rp   c             C   s,   | j |}x| jD ]}|||}qW |S )N)r   r   ri  )r   r   idrj  r   r   r   r     s    zASTPostfixExpr.get_idr   r   N)r   r   r   r   rp   c             C   s6   | j |||| x| jD ]}||||| qW d S )N)r   r  ri  )r   r   r   r   r   rj  r   r   r   r    s    z!ASTPostfixExpr.describe_signature)r   r   r   r   rX  r   r)   r   r  r`   r   r   r  r   r   r   r   rg    s
   rg  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 )ASTExplicitCastrh  )casttyprV  c             C   s"   |t kst|| _|| _|| _d S )N)_id_explicit_castr   rm  rn  rV  )r   rm  rn  rV  r   r   r   r     s    zASTExplicitCast.__init__)r  rp   c             C   sP   | j g}|d ||| j |d ||| j |d d|S )Nr   z>(rQ  r   )rm  r  rn  rV  r!  )r   r  r  r   r   r   r    s    


zASTExplicitCast._stringify)r   rp   c             C   s"   t | j | j| | j| S )N)ro  rm  rn  r   rV  )r   r   r   r   r   r     s    zASTExplicitCast.get_idr   r   N)r   r   r   r   rp   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   rP  rQ  )r   r+  rm  r*  rn  r  rV  )r   r   r   r   r   r   r   r   r    s    z"ASTExplicitCast.describe_signature)r   r   r   r   r2  r   r)   r  r`   r   r   r  r   r   r   r   rl    s
   	rl  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 )	ASTTypeIdrh  )
typeOrExprisTypec             C   s   || _ || _d S )N)rq  rr  )r   rq  rr  r   r   r   r     s    zASTTypeId.__init__)r  rp   c             C   s   d|| j  d S )Nztypeid(rQ  )rq  )r   r  r   r   r   r    s    zASTTypeId._stringify)r   rp   c             C   s   | j r
dnd}|| j| S )NZtite)rr  rq  r   )r   r   r   r   r   r   r     s    zASTTypeId.get_idr   r   N)r   r   r   r   rp   c             C   sF   |t dd7 }|t dd7 }| j|||| |t dd7 }d S )Nr~   rP  rQ  )r   r+  r*  rq  r  )r   r   r   r   r   r   r   r   r    s    zASTTypeId.describe_signature)r   r   r   r   r2  rB   r   r)   r   r  r`   r   r   r  r   r   r   r   rp    s
   rp  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)rN  rV  c             C   s   || _ || _d S )N)rN  rV  )r   rN  rV  r   r   r   r     s    zASTUnaryOpExpr.__init__)r  rp   c             C   s6   | j d dkr"| j d || j S | j || j S d S )Nr   cnr$  )rN  rV  )r   r  r   r   r   r    s    zASTUnaryOpExpr._stringify)r   rp   c             C   s   t | j | j| S )N)_id_operator_unary_v2rN  rV  r   )r   r   r   r   r   r     s    zASTUnaryOpExpr.get_idr   r   N)r   r   r   r   rp   c             C   sZ   | j d dkr0|t| j | j 7 }|t 7 }n|t| j | j 7 }| j|||| d S )Nr   ru  )rN  r   r+  r,  rT  rV  r  )r   r   r   r   r   r   r   r   r    s
    z!ASTUnaryOpExpr.describe_signature)r   r   r   r   r2  r   r)   r  r`   r   r   r  r   r   r   r   rt    s
   rt  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  rp   c             C   s   d|| j  d S )Nz
sizeof...(rQ  )r   )r   r  r   r   r   r    s    zASTSizeofParamPack._stringify)r   rp   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   rp   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 )Nrs   z...rP  r   r   )r   r   r   rQ  )r   r+  r*  r   r  )r   r   r   r   r   r   r   r   r    s    z%ASTSizeofParamPack.describe_signature)r   r   r   r   r   r)   r   r  r`   r   r   r  r   r   r   r   rw    s
   rw  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 )ASTSizeofTyperh  )rn  c             C   s
   || _ d S )N)rn  )r   rn  r   r   r   r     s    zASTSizeofType.__init__)r  rp   c             C   s   d|| j  d S )Nzsizeof(rQ  )rn  )r   r  r   r   r   r    s    zASTSizeofType._stringify)r   rp   c             C   s   d| j | S )Nst)rn  r   )r   r   r   r   r   r     s    zASTSizeofType.get_idr   r   N)r   r   r   r   rp   c             C   sF   |t dd7 }|t dd7 }| j|||| |t dd7 }d S )Nrs   rP  rQ  )r   r+  r*  rn  r  )r   r   r   r   r   r   r   r   r    s    z ASTSizeofType.describe_signature)r   r   r   r   r)   r   r  r`   r   r   r  r   r   r   r   rx    s
   rx  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)rV  c             C   s
   || _ d S )N)rV  )r   rV  r   r   r   r   (  s    zASTSizeofExpr.__init__)r  rp   c             C   s   d|| j  S )Nzsizeof )rV  )r   r  r   r   r   r  +  s    zASTSizeofExpr._stringify)r   rp   c             C   s   d| j | S )NZsz)rV  r   )r   r   r   r   r   r   .  s    zASTSizeofExpr.get_idr   r   N)r   r   r   r   rp   c             C   s2   |t dd7 }|t  7 }| j|||| d S )Nrs   )r   r+  r,  rV  r  )r   r   r   r   r   r   r   r   r  1  s    z ASTSizeofExpr.describe_signature)r   r   r   r2  r   r)   r   r  r`   r   r   r  r   r   r   r   rz  '  s
   rz  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 )ASTAlignofExprrh  )rn  c             C   s
   || _ d S )N)rn  )r   rn  r   r   r   r   9  s    zASTAlignofExpr.__init__)r  rp   c             C   s   d|| j  d S )Nzalignof(rQ  )rn  )r   r  r   r   r   r  <  s    zASTAlignofExpr._stringify)r   rp   c             C   s   d| j | S )NZat)rn  r   )r   r   r   r   r   r   ?  s    zASTAlignofExpr.get_idr   r   N)r   r   r   r   rp   c             C   sF   |t dd7 }|t dd7 }| j|||| |t dd7 }d S )Nr<   rP  rQ  )r   r+  r*  rn  r  )r   r   r   r   r   r   r   r   r  B  s    z!ASTAlignofExpr.describe_signature)r   r   r   r   r)   r   r  r`   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)rV  c             C   s
   || _ d S )N)rV  )r   rV  r   r   r   r   K  s    zASTNoexceptExpr.__init__)r  rp   c             C   s   d|| j  d S )Nz	noexcept(rQ  )rV  )r   r  r   r   r   r  N  s    zASTNoexceptExpr._stringify)r   rp   c             C   s   d| j | S )NZnx)rV  r   )r   r   r   r   r   r   Q  s    zASTNoexceptExpr.get_idr   r   N)r   r   r   r   rp   c             C   sF   |t dd7 }|t dd7 }| j|||| |t dd7 }d S )Nre   rP  rQ  )r   r+  r*  rV  r  )r   r   r   r   r   r   r   r   r  T  s    z"ASTNoexceptExpr.describe_signature)r   r   r   r2  r   r)   r   r  r`   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 )
ASTNewExprrh  )rc  rd  N)r  isNewTypeIdrn  initListrp   c             C   s   || _ || _|| _|| _d S )N)r  r~  rn  r  )r   r  r~  rn  r  r   r   r   r   ]  s    zASTNewExpr.__init__)r  rp   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~  rn  r   r  r!  )r   r  r  r   r   r   r  d  s    


zASTNewExpr._stringify)r   rp   c             C   sT   dg}| d | | j| | jd k	r@| | j| n
| d d|S )Nr   r   r  r   )r  rn  r   r  r!  )r   r   r  r   r   r   r   r  s    


zASTNewExpr.get_idr   r   )r   r   r   r   rp   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::rd   )
r  r   r*  r+  r,  r~  rn  r  r   r  )r   r   r   r   r   r   r   r   r  ~  s    
zASTNewExpr.describe_signature)r   r   r   rB   r   r   r)   r   r  r`   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  arrayrV  c             C   s   || _ || _|| _d S )N)r  r  rV  )r   r  r  rV  r   r   r   r     s    zASTDeleteExpr.__init__)r  rp   c             C   sH   g }| j r|d |d | jr.|d ||| j d|S )Nz::zdelete z[] r   )r  r  r  rV  r!  )r   r  r  r   r   r   r    s    


zASTDeleteExpr._stringify)r   rp   c             C   s    | j rd}nd}|| j| S )Nr   r   )r  rV  r   )r   r   rk  r   r   r   r     s    zASTDeleteExpr.get_idr   r   N)r   r   r   r   rp   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::rS   z[])r  r   r*  r+  r,  r  rV  r  )r   r   r   r   r   r   r   r   r    s    z ASTDeleteExpr.describe_signature)r   r   r   rB   r2  r   r)   r   r  r`   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 )ASTCastExprrh  )rn  rV  c             C   s   || _ || _d S )N)rn  rV  )r   rn  rV  r   r   r   r     s    zASTCastExpr.__init__)r  rp   c             C   s:   dg}| || j | d | || j d|S )NrP  rQ  r   )r  rn  rV  r!  )r   r  r  r   r   r   r    s
    
zASTCastExpr._stringify)r   rp   c             C   s   d| j | | j| S )Ncv)rn  r   rV  )r   r   r   r   r   r     s    zASTCastExpr.get_idr   r   N)r   r   r   r   rp   c             C   sH   |t dd7 }| j|||| |t dd7 }| j|||| d S )NrP  rQ  )r   r*  rn  r  rV  )r   r   r   r   r   r   r   r   r    s    zASTCastExpr.describe_signature)r   r   r   r2  r   r)   r   r  r`   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)rf  opsc             C   s8   t |dkstt |t |d ks(t|| _|| _d S )Nr   r   )r   r   rf  r  )r   rf  r  r   r   r   r     s    zASTBinOpExpr.__init__)r  rp   c             C   sx   g }| || jd  xTtdt| jD ]@}| d | | j|d   | d | || j|  q*W d|S )Nr   r   r$  r   )r  rf  r#  r   r  r!  )r   r  r  r   r   r   r   r    s    

zASTBinOpExpr._stringify)r   rp   c             C   sr   |dkst g }x@tt| jD ].}|t| j|   || j| | q W || jd | d|S )Nr?  r&  r   )	r   r#  r   r  r  rS  rf  r   r!  )r   r   r  r   r   r   r   r     s    zASTBinOpExpr.get_idr   r   N)r   r   r   r   rp   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)
rf  r  r#  r   r   r,  r  rE  r+  rT  )r   r   r   r   r   r   rN  r   r   r   r    s    (zASTBinOpExpr.describe_signature)r   r   r   r   r2  r   r   r)   r  r`   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  rp   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   rp   c             C   s^   |dkst g }|td  || j| || j| || j| d|S )Nr?  r   r   )r   r  rS  r  r   r  r  r!  )r   r   r  r   r   r   r     s    zASTConditionalExpr.get_idr   r   N)r   r   r   r   rp   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,  rT  r  r  )r   r   r   r   r   r   r   r   r    s    z%ASTConditionalExpr.describe_signature)r   r   r   r2  r   r)   r   r  r`   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 )rd  N)rf  trailingCommarp   c             C   s   || _ || _d S )N)rf  r  )r   rf  r  r   r   r   r     s    zASTBracedInitList.__init__)r   rp   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!  rf  )r   r   r   )r   r   r     s    zASTBracedInitList.get_id)r  rp   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, )rf  r  r!  )r   r  rf  r  r   )r  r   r  !  s    zASTBracedInitList._stringifyr   r   )r   r   r   r   rp   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   r*  rf  r,  r  r  )r   r   r   r   r   r.  r   r   r   r   r  &  s    z$ASTBracedInitList.describe_signature)r   r   r   r   r   r2  rB   r   r`   r   r   r)   r  r   r  r   r   r   r   rd    s   rd  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)rM  rN  rO  c             C   s   || _ || _|| _d S )N)rM  rN  rO  )r   rM  rN  rO  r   r   r   r   8  s    zASTAssignmentExpr.__init__)r  rp   c             C   sN   g }| || j | d | | j | d | || j d|S )Nr$  r   )r  rM  rN  rO  r!  )r   r  r  r   r   r   r  >  s    

zASTAssignmentExpr._stringify)r   rp   c             C   sB   g }| t| j  | | j| | | j| d|S )Nr   )r  rS  rN  rM  r   rO  r!  )r   r   r  r   r   r   r   G  s
    zASTAssignmentExpr.get_idr   r   N)r   r   r   r   rp   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  )	rM  r  r   r,  rE  rN  r+  rT  rO  )r   r   r   r   r   r   r   r   r  O  s    ,z$ASTAssignmentExpr.describe_signature)r   r   r   r2  r   r   rd  r   r)   r  r`   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)rf  c             C   s   t |dkst|| _d S )Nr   )r   r   rf  )r   rf  r   r   r   r   \  s    zASTCommaExpr.__init__)r  rp   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!  rf  )r   r  r   )r  r   r  `  s    zASTCommaExpr._stringify)r   rp   c             C   sh   t d }g }x:tt| jd D ]$}|| || j| | q W || jd | d|S )Nr   r   r&  r   )rS  r#  r   rf  r  r   r!  )r   r   id_r  r   r   r   r   r   c  s    
zASTCommaExpr.get_idr   r   N)r   r   r   r   rp   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   )rf  r  r#  r   r   r*  r,  )r   r   r   r   r   r   r   r   r   r  l  s
    zASTCommaExpr.describe_signature)r   r   r   r   r2  r   r)   r   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 )ASTFallbackExpr)rV  c             C   s
   || _ d S )N)rV  )r   rV  r   r   r   r   v  s    zASTFallbackExpr.__init__)r  rp   c             C   s   | j S )N)rV  )r   r  r   r   r   r  y  s    zASTFallbackExpr._stringify)r   rp   c             C   s
   t | jS )N)r   rV  )r   r   r   r   r   r   |  s    zASTFallbackExpr.get_idr   r   N)r   r   r   r   rp   c             C   s   |t | j| j7 }d S )N)r   rH  rV  )r   r   r   r   r   r   r   r   r    s    z"ASTFallbackExpr.describe_signature)r   r   r   r   r   r)   r  r`   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  )rp   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   rp   c             C   s
   t  d S )N)r3  )r   r   r   r   r   r     s    zASTOperator.get_idr   r   N)r   	identnoder   r   rp   c             C   s
   t  dS )zARender the prefix into signode, and the last part into identnode.N)r3  )r   r   r  r   r   r   r   r   _describe_identifier  s    z ASTOperator._describe_identifier)r   r   r   r   r   r   rp   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   rH  astextr)  )r   r   r   r   r   r   r   ZmainNamer	  r
  	containerrF  ZaddNamer   r   r   r    s(    

zASTOperator.describe_signature)r   r   r   rB   r   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 )ASTOperatorBuildInN)rN  rp   c             C   s
   || _ d S )N)rN  )r   rN  r   r   r   r     s    zASTOperatorBuildIn.__init__)r   rp   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_v1rN  r(   rS  r  )r   r   idsr   r   r   r     s    


zASTOperatorBuildIn.get_id)r  rp   c             C   s0   | j dks| j d dkr"d| j  S d| j  S d S )N)rd   znew[]rS   zdelete[]r   abcnoxz	operator ri   )rN  )r   r  r   r   r   r    s    
zASTOperatorBuildIn._stringifyr   r   )r   r  r   r   rp   c             C   sL   |t dd7 }| jdks(| jd dkr4|t  7 }|t | j| j7 }d S )Nri   )rd   znew[]rS   zdelete[]r   r  )r   r+  rN  r,  rT  )r   r   r  r   r   r   r   r   r    s    z'ASTOperatorBuildIn._describe_identifier)r   r   r   r   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 )ASTOperatorLiteralN)r   rp   c             C   s
   || _ d S )N)r   )r   r   r   r   r   r     s    zASTOperatorLiteral.__init__)r   rp   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  rp   c             C   s   d|| j  S )Nz
operator"")r   )r   r  r   r   r   r    s    zASTOperatorLiteral._stringifyr   r   )r   r  r   r   rp   c             C   s:   |t dd7 }|t dd7 }| j|d|dd| d S )Nri   z""r   r   )r   r+  r@  r   r  )r   r   r  r   r   r   r   r   r    s    z'ASTOperatorLiteral._describe_identifier)r   r   r   r   r   r`   r   r   r)   r  r   r  r   r   r   r   r    s
   r  c               @   s`   e Zd Zdd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 )ASTOperatorTyperh  N)rB  rp   c             C   s
   || _ d S )N)rB  )r   rB  r   r   r   r     s    zASTOperatorType.__init__)r   rp   c             C   s,   |dkrd| j | S d| j | S d S )Nr   zcastto-%s-operatorr  )rB  r   )r   r   r   r   r   r     s    zASTOperatorType.get_id)r  rp   c             C   s   d d|| jgS )Nr   z	operator )r!  rB  )r   r  r   r   r   r    s    zASTOperatorType._stringify)rp   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   rp   c             C   s2   |t dd7 }|t  7 }| j|d|| d S )Nri   r   )r   r+  r,  rB  r  )r   r   r  r   r   r   r   r   r    s    z$ASTOperatorType._describe_identifier)r   r   r   r   r`   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)r8  rp   c             C   s
   || _ d S )N)r8  )r   r8  r   r   r   r     s    zASTTemplateArgConstant.__init__)r  rp   c             C   s
   || j S )N)r8  )r   r  r   r   r   r    s    z!ASTTemplateArgConstant._stringify)r   rp   c             C   sD   |dkrt | ddS |dkr0dt |  d S d| j| d S )Nr   r$  r   r?  Xr  )r   r<  r8  r   )r   r   r   r   r   r     s
    zASTTemplateArgConstant.get_idr   r   )r   r   r   r   rp   c             C   s   t | | j|||| d S )N)r5   r8  r  )r   r   r   r   r   r   r   r   r    s    z)ASTTemplateArgConstant.describe_signature)r   r   r   r2  r   r)   r   r  r`   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  rh  N)argspackExpansionrp   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   rp   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  r^  c             3   s   | ]}|  V  qd S )N)r   )r  r   )r   r   r   r     s    z)ASTTemplateArgs.get_id.<locals>.<genexpr>r   Ir   r&  Jr  )r  r!  r  r   r   r  )r   r   r  r   r   )r   r   r     s$    
 





zASTTemplateArgs.get_id)r  rp   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   rp   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   r*  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  rB   r   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 )
ASTTrailingTypeSpec)r   rp   c             C   s   t t| d S )N)r3  r4  )r   r   r   r   r   r   K  s    zASTTrailingTypeSpec.get_idr   r   N)r   r   r   r   rp   c             C   s   t t| d S )N)r3  r4  )r   r   r   r   r   r   r   r   r  N  s    z&ASTTrailingTypeSpec.describe_signature)r   r   r   r`   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  
canonNamesrp   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  rp   c             C   s   d | jS )Nr$  )r!  r  )r   r  r   r   r   r  [  s    z)ASTTrailingTypeSpecFundamental._stringify)r   rp   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   r$  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   rF  r   r   r   r   ^  s    
z%ASTTrailingTypeSpecFundamental.get_idr   r   )r   r   r   r   rp   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  r`   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  rp   c             C   s   dS )Nzdecltype(auto)r   )r   r  r   r   r   r  |  s    z*ASTTrailingTypeSpecDecltypeAuto._stringify)r   rp   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   rp   c             C   sD   |t dd7 }|t dd7 }|t dd7 }|t dd7 }d S )NrQ   rP  r?   rQ  )r   r+  r*  )r   r   r   r   r   r   r   r   r    s    z2ASTTrailingTypeSpecDecltypeAuto.describe_signature)
r   r   r   r)   r   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 )ASTTrailingTypeSpecDecltype)rV  c             C   s
   || _ d S )N)rV  )r   rV  r   r   r   r     s    z$ASTTrailingTypeSpecDecltype.__init__)r  rp   c             C   s   d|| j  d S )Nz	decltype(rQ  )rV  )r   r  r   r   r   r    s    z&ASTTrailingTypeSpecDecltype._stringify)r   rp   c             C   s"   |dkrt  d| j| d S )Nr   ZDTr  )r(   rV  r   )r   r   r   r   r   r     s    z"ASTTrailingTypeSpecDecltype.get_idr   r   N)r   r   r   r   rp   c             C   sF   |t dd7 }|t dd7 }| j|||| |t dd7 }d S )NrQ   rP  rQ  )r   r+  r*  rV  r  )r   r   r   r   r   r   r   r   r    s    z.ASTTrailingTypeSpecDecltype.describe_signature)r   r   r   r2  r   r)   r   r  r`   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placeholderTyperp   c             C   s   || _ || _|| _d S )N)r   r  r  )r   r   r  r  r   r   r   r     s    z ASTTrailingTypeSpecName.__init__)rp   c             C   s   | j S )N)r  )r   r   r   r   r    s    zASTTrailingTypeSpecName.name)r   rp   c             C   s   | j |S )N)r  r   )r   r   r   r   r   r     s    zASTTrailingTypeSpecName.get_id)r  rp   c             C   sZ   g }| j r || j  |d ||| j | jd k	rP|d || j d|S )Nr$  r   )r   r  r  r  r!  )r   r  r  r   r   r   r    s    


z"ASTTrailingTypeSpecName._stringifyr   r   )r   r   r   r   rp   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)rQ   rP  rQ  )	r   r   r+  r,  r  r  r  r*  r   )r   r   r   r   r   r   r   r   r    s    


z*ASTTrailingTypeSpecName.describe_signature)r   r   r   r   r  r   r   r1  r  r`   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ellipsisrp   c             C   s   || _ || _d S )N)r  r  )r   r  r  r   r   r   r     s    zASTFunctionParameter.__init__r   )r   
objectTyper   rp   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  rp   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   rp   c             C   s8   t | | jr |tdd7 }n| jj||||d d S )Nz...)r   )r5   r  r   r*  r  r  )r   r   r   r   r   r   r   r   r    s    z'ASTFunctionParameter.describe_signature)F)NN)r   r   r   r   rB   r   r`   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)rV  c             C   s
   || _ d S )N)rV  )r   rV  r   r   r   r     s    zASTNoexceptSpec.__init__)r  rp   c             C   s   | j rd|| j  d S dS )Nz	noexcept(rQ  re   )rV  )r   r  r   r   r   r    s    zASTNoexceptSpec._stringifyr   r   N)r   r   r   r   rp   c             C   sL   |t dd7 }| jrH|t dd7 }| j|d|| |t dd7 }d S )Nre   rP  r   rQ  )r   r+  rV  r*  r  )r   r   r   r   r   r   r   r   r    s
    z"ASTNoexceptSpec.describe_signature)r   r   r   r   r2  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 )ASTParametersQualifiersrh  N)r  r   rK   refQualexceptionSpectrailingReturnoverridefinalattrsinitializerrp   c             C   s@   || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	d S )N)
r  r   rK   r  r  r  r  r  r  r  )r   r  r   rK   r  r  r  r  r  r  r  r   r   r   r      s    z ASTParametersQualifiers.__init__)rp   c             C   s   | j S )N)r  )r   r   r   r   function_params  s    z'ASTParametersQualifiers.function_params)r   rp   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  rK   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   r^  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  rp   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 )NrP  Tz, FrQ  z	 volatilez constr$  z -> z finalz	 overrider   z = r   )r  r  r   r   rK   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   rp   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   rP  r   Fr   rQ  )r   r   rp   c             S   s    | t  7 } | t ||7 } d S )N)r   r,  r+  )r   r   r   r   r   	_add_annog  s    z=ASTParametersQualifiers.describe_signature.<locals>._add_annor   rK   z->r  r  r   r   )0rS   rR   r  )r5   r   Zdesc_parameterlistr  Zdesc_parameterr  r*  r,  r   r   r   rK   r  r  r  rT  r  r  r   r  r  r   r=  r+  )
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  rB   r   r   r  r#   r   r1  r  r`   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)rV  rp   c             C   s
   || _ d S )N)rV  )r   rV  r   r   r   r     s    zASTExplicitSpec.__init__)r  rp   c             C   s>   dg}| j d k	r4|d ||| j  |d d|S )NrX   rP  rQ  r   )rV  r  r!  )r   r  r  r   r   r   r    s    


zASTExplicitSpec._stringifyr   r   )r   r   r   rp   c             C   sP   |t dd7 }| jd k	rL|t dd7 }| j|d|| |t dd7 }d S )NrX   rP  r   rQ  )r   r+  rV  r*  r  )r   r   r   r   r   r   r   r    s
    
z"ASTExplicitSpec.describe_signature)r   r   r   r   r2  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threadLocalr_   r   explicitSpecrL   rM   rN   r   rK   r]   r  rp   c             C   sL   || _ || _|| _|| _|| _|| _|| _|| _|	| _|
| _	|| _
|| _d S )N)r  r  r_   r   r  rL   rM   rN   r   rK   r]   r  )r   r  r  r_   r   r  rL   rM   rN   r   rK   r]   r  r   r   r   r     s    zASTDeclSpecsSimple.__init__)otherrp   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  r_   r   r  rL   rM   rN   r   rK   r]   r  )r   r  r   r   r   	mergeWith  s    









zASTDeclSpecsSimple.mergeWith)r  rp   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   ry   r_   r]   r   rL   rM   rN   r   rK   r$  )r   r  r  r  r  r_   r]   r   r  rL   rM   rN   r   rK   r!  )r   r  r  r   r   r   r    s4    








zASTDeclSpecsSimple._stringifyr   r   )r   r   r   rp   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   rp   c                s$    r| t  7 } | t ||7 } dS )NT)r   r,  r+  )r   r   )addSpacer   r   _add  s    z3ASTDeclSpecsSimple.describe_signature.<locals>._addry   r_   r]   r   TrL   rM   rN   r   rK   )r  r  r   r   r   rB   r  r  r_   r]   r   r  r   r,  rL   rM   rN   r   rK   )r   r   r   r   r  r   )r  r   r    s8    







z%ASTDeclSpecsSimple.describe_signature)r   r   r   r   rB   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trailingrp   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   rp   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   rK   r!  )r   r   r  r   r   r   r   	  s     





zASTDeclSpecs.get_id)r  rp   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   r$  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   rp   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   r`   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  rp   c             C   s    | j rd|| j  d S dS d S )Nr[  r\  z[])r  )r   r  r   r   r   r  P	  s    zASTArray._stringify)r   rp   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   Ar?  r   ZA_)r  r   r   )r   r   r   r   r   r   V	  s    zASTArray.get_idr   r   N)r   r   r   r   rp   c             C   sD   t | |tdd7 }| jr0| j|d|| |tdd7 }d S )Nr[  r   r\  )r5   r   r*  r  r  )r   r   r   r   r   r   r   r   r  c	  s
    zASTArray.describe_signature)r   r   r   r2  r   r)   r   r  r`   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)rp   c             C   s   t t| d S )N)r3  r4  )r   r   r   r   r  m	  s    zASTDeclarator.nameN)r  rp   c             C   s   t t| d S )N)r3  r4  )r   r  r   r   r   r  q	  s    c             C   s   t t| d S )N)r3  r4  )r   r   r   r   isPacku	  s    zASTDeclarator.isPackc             C   s   t t| d S )N)r3  r4  )r   r   r   r   r  y	  s    zASTDeclarator.function_paramsrh  c             C   s   t t| d S )N)r3  r4  )r   r   r   r   r  }	  s    zASTDeclarator.trailingReturnc             C   s   t t| d S )N)r3  r4  )r   r   r   r   require_space_after_declSpecs	  s    z+ASTDeclarator.require_space_after_declSpecs)r   rp   c             C   s   t t| d S )N)r3  r4  )r   r   r   r   r   r  	  s    zASTDeclarator.get_modifiers_idc             C   s   t t| d S )N)r3  r4  )r   r   r   r   r   r  	  s    zASTDeclarator.get_param_idc             C   s   t t| d S )N)r3  r4  )r   r   r   r   r   get_ptr_suffix_id	  s    zASTDeclarator.get_ptr_suffix_id)r   returnTypeIdrp   c             C   s   t t| d S )N)r3  r4  )r   r   r  r   r   r   get_type_id	  s    zASTDeclarator.get_type_idc             C   s   t t| d S )N)r3  r4  )r   r   r   r   is_function_type	  s    zASTDeclarator.is_function_typer   r   )r   r   r   r   rp   c             C   s   t t| d S )N)r3  r4  )r   r   r   r   r   r   r   r   r  	  s    z ASTDeclarator.describe_signature)r   r   r   r1  r  r  setterrB   r  r   r  r  r  r  r`   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	paramQualrp   c             C   s   || _ || _|| _d S )N)r  r  r  )r   r  r  r  r   r   r   r   	  s    z#ASTDeclaratorNameParamQual.__init__)rp   c             C   s   | j S )N)r  )r   r   r   r   r  	  s    zASTDeclaratorNameParamQual.name)r  rp   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_paramsrh  c             C   s   | j jS )N)r  r  )r   r   r   r   r  	  s    z)ASTDeclaratorNameParamQual.trailingReturn)r   rp   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  rp   c             C   sz   |dkst g }|| | | jrf|| | |d || || | |d n
|| d|S )Nr?  Fr  r   )r   r  r  r  r  r  r!  )r   r   r  r  r   r   r   r  	  s    


z&ASTDeclaratorNameParamQual.get_type_idc             C   s
   | j d k	S )N)r  )r   r   r   r   r  	  s    z8ASTDeclaratorNameParamQual.require_space_after_declSpecsc             C   s
   | j d k	S )N)r  )r   r   r   r   r  	  s    z+ASTDeclaratorNameParamQual.is_function_type)r  rp   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  rN  r   r   r   r  	  s    z%ASTDeclaratorNameParamQual._stringifyr   r   )r   r   r   r   rp   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   rN  r   r   r   r  	  s    z-ASTDeclaratorNameParamQual.describe_signature)r   r   r   r  r   r  r  r   r1  r  r  rB   r  r  r  r  r`   r   r  r  r  r  r  r  r)   r  r   r  r   r   r   r   r  	  s,   
r  c               @   s   e Zd Z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__)rp   c             C   s   | j S )N)r  )r   r   r   r   r  	  s    zASTDeclaratorNameBitField.nameN)r  rp   c             C   s
   || _ d S )N)r  )r   r  r   r   r   r  	  s    )r   rp   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  rp   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   rp   c             C   s^   t | | jr | j|||| |t 7 }|tdd7 }|t 7 }| j|||| d S )Nr  )r5   r  r  r   r,  r*  r  )r   r   r   r   r   r   r   r   r  
  s    z,ASTDeclaratorNameBitField.describe_signature)r   r   r   r  r2  r   r1  r  r  r`   r   r  r  rB   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   rK   r  rp   c             C   s$   |st || _|| _|| _|| _d S )N)r   r  r   rK   r  )r   r  r   rK   r  r   r   r   r   
  s
    zASTDeclaratorPtr.__init__)rp   c             C   s   | j jS )N)r  r  )r   r   r   r   r  '
  s    zASTDeclaratorPtr.name)r  rp   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_paramsrh  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  rp   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   r$  r   rK   r   )r  r  r   r   rK   r  r  r!  )r   r  r  r   r   r   r  >
  s    





zASTDeclaratorPtr._stringify)r   rp   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  rK   r  r  r!  )r   r   r  r   r   r   r  U
  s    





z"ASTDeclaratorPtr.get_ptr_suffix_id)r   r  rp   c             C   sF   dg}| j r|d | jr&|d || | jj|d|dS )Nr  r  r   r   )r  )r   r  rK   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   rp   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   rp   c             S   s   | t ||7 } d S )N)r   r+  )r   r   r   r   r   r  |
  s    z6ASTDeclaratorPtr.describe_signature.<locals>._add_annor   rK   )r5   r   r*  r  r  r   r   rK   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  rB   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  
  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  rp   c             C   s   |st || _|| _d S )N)r   r  r  )r   r  r  r   r   r   r   
  s    zASTDeclaratorRef.__init__)rp   c             C   s   | j jS )N)r  r  )r   r   r   r   r  
  s    zASTDeclaratorRef.name)r  rp   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_paramsrh  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  rp   c             C   sR   dg}| || j t| jdkr8| j r8| d | || j d|S )Nr   r   r$  r   )r  r  r   r  r  r!  )r   r  r  r   r   r   r  
  s    
zASTDeclaratorRef._stringify)r   rp   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  rp   c             C   s    |dkst | jj|d| dS )Nr?  r  )r  )r   r  r  )r   r   r  r   r   r   r  
  s    zASTDeclaratorRef.get_type_idc             C   s
   | j  S )N)r  r  )r   r   r   r   r  
  s    z!ASTDeclaratorRef.is_function_typer   r   )r   r   r   r   rp   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   r*  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   r1  r  r  r  rB   r  r   r  r  r  r  r)   r   r  r`   r  r  r  r  r  r   r  r   r   r   r   r  
  s(   r  c               @   s  e Zd Z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  rp   c             C   s   |st || _d S )N)r   r  )r   r  r   r   r   r   
  s    zASTDeclaratorParamPack.__init__)rp   c             C   s   | j jS )N)r  r  )r   r   r   r   r  
  s    zASTDeclaratorParamPack.name)r  rp   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_paramsrh  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  rp   c             C   s"   || j }| j jrd| }d| S )Nr$  z...)r  r  )r   r  r  r   r   r   r  
  s    
z!ASTDeclaratorParamPack._stringify)r   rp   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  rp   c             C   s    |dkst | jj|d| dS )Nr?  r  )r  )r   r  r  )r   r   r  r   r   r   r  
  s    z"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   rp   c             C   sB   t | |tdd7 }| jjr,|t 7 }| j|||| d S )Nz...)r5   r   r*  r  r  r,  r  )r   r   r   r   r   r   r   r   r    s
    z)ASTDeclaratorParamPack.describe_signature)r   r   r   r  r   r1  r  r  r  r   r  r  r  rB   r  r  r)   r   r  r`   r  r  r  r  r  r   r  r   r   r   r   r  
  s(   r  c               @   s  e Zd Z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)	classNamerK   r   r  rp   c             C   s,   |st |st || _|| _|| _|| _d S )N)r   r  rK   r   r  )r   r  rK   r   r  r   r   r   r     s    zASTDeclaratorMemPtr.__init__)rp   c             C   s   | j jS )N)r  r  )r   r   r   r   r    s    zASTDeclaratorMemPtr.name)r  rp   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_paramsrh  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  rp   c             C   s|   g }| || j | d | jr.| d | jrN| jrD| d | d | j rb| d | || j d|S )Nz::*r   r$  rK   r   )r  r  r   rK   r  r  r!  )r   r  r  r   r   r   r  -  s    





zASTDeclaratorMemPtr._stringify)r   rp   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(   r3  r  r  )r   r   r   r   r   r  H  s    z%ASTDeclaratorMemPtr.get_ptr_suffix_id)r   r  rp   c             C   sZ   |dkst d}| jr|d7 }| jr,|d7 }|d7 }|| j|7 }||7 }| j||S )Nr?  r   r  r  M)r   r   rK   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   rp   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   rp   c             S   s   | t ||7 } d S )N)r   r+  )r   r   r   r   r   r  f  s    z9ASTDeclaratorMemPtr.describe_signature.<locals>._add_annor   rK   )r5   r  r  r   r*  r   r   r   rK   r,  r  r  )r   r   r   r   r   r  r   r   r   r  _  s    


z&ASTDeclaratorMemPtr.describe_signature)r   r   r   r  rB   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    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  rp   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__)rp   c             C   s   | j jS )N)r  r  )r   r   r   r   r  {  s    zASTDeclaratorParen.name)r  rp   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_paramsrh  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  rp   c             C   s:   dg}| || j | d | || j d|S )NrP  rQ  r   )r  r  r  r!  )r   r  r  r   r   r   r    s
    
zASTDeclaratorParen._stringify)r   rp   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  rp   c             C   s*   |dkst | j||}| jj||dS )Nr?  )r  )r   r  r  r  )r   r   r  ZnextIdr   r   r   r    s    zASTDeclaratorParen.get_type_idc             C   s
   | j  S )N)r  r  )r   r   r   r   r    s    z#ASTDeclaratorParen.is_function_typer   r   )r   r   r   r   rp   c             C   sP   t | |tdd7 }| j|||| |tdd7 }| j|d|| d S )NrP  rQ  r   )r5   r   r*  r  r  r  )r   r   r   r   r   r   r   r   r    s
    z%ASTDeclaratorParen.describe_signature)r   r   r   r  r   r1  r  r  r  r  r   r  r  r  rB   r  r)   r   r  r`   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)rV  c             C   s
   || _ d S )N)rV  )r   rV  r   r   r   r     s    zASTPackExpansionExpr.__init__)r  rp   c             C   s   || j d S )Nz...)rV  )r   r  r   r   r   r    s    zASTPackExpansionExpr._stringify)r   rp   c             C   s   | j |}d| S )Nsp)rV  r   )r   r   rk  r   r   r   r     s    zASTPackExpansionExpr.get_idr   r   N)r   r   r   r   rp   c             C   s&   | j |||| |tdd7 }d S )Nz...)rV  r  r   r*  )r   r   r   r   r   r   r   r   r    s    z'ASTPackExpansionExpr.describe_signature)r   r   r   r   r2  rd  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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 )rc  N)rf  rp   c             C   s
   || _ d S )N)rf  )r   rf  r   r   r   r     s    zASTParenExprList.__init__)r   rp   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!  rf  )r   r   r   )r   r   r     s    zASTParenExprList.get_id)r  rp   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, )rf  r!  )r   r  rf  r   )r  r   r    s    zASTParenExprList._stringifyr   r   )r   r   r   r   rp   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 )NrP  Tr   FrQ  )r5   r   r*  rf  r,  r  )r   r   r   r   r   r.  r   r   r   r   r    s    z#ASTParenExprList.describe_signature)r   r   r   r   r   r2  rd  r   r`   r   r   r)   r  r   r  r   r   r   r   rc    s
   rc  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)r8  	hasAssignrp   c             C   s   || _ || _d S )N)r8  r  )r   r8  r  r   r   r   r     s    zASTInitializer.__init__)r  rp   c             C   s    || j }| jrd| S |S d S )Nz = )r8  r  )r   r  valr   r   r   r    s    
zASTInitializer._stringifyr   r   )r   r   r   r   rp   c             C   sL   t | | jr6|t 7 }|tdd7 }|t 7 }| j|d|| d S )Nr   r   )r5   r  r   r,  r*  r8  r  )r   r   r   r   r   r   r   r   r    s    z!ASTInitializer.describe_signature)T)r   r   r   r   r2  rd  rB   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 )rh  N)	declSpecsdeclrp   c             C   s    |st |st || _|| _d S )N)r   r  r  )r   r  r  r   r   r   r      s    zASTType.__init__)rp   c             C   s   | j jS )N)r  r  )r   r   r   r   r    s    zASTType.name)r  rp   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   rp   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CErB  r   r   )r  get_full_nested_namer   r  r  r  r  r  rM   r  r   r  r(   r  r!  r   r(  r  r  )	r   r   r  r   r  r  ZtemplZtypeIdr  r   r   r   r     sT    












zASTType.get_id)r  rp   c             C   sR   g }|| j }|| | j r8t|dkr8|d ||| j d|S )Nr   r$  r   )r  r  r  r  r   r!  )r   r  r  r  r   r   r   r  P  s    


zASTType._stringifyc             C   s   | j jrdS dS d S )Nr}   rB  )r  r  )r   r   r   r   get_type_declaration_prefixY  s    z#ASTType.get_type_declaration_prefixr   )r   r   r   r   rp   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   r1  r  r  r  rB   r  r   r  r  r  r`   r   r   r)   r  r  r   r  r   r   r   r   rh    s"    5	rh  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)rB  initrp   c             C   s   |st || _|| _d S )N)r   rB  r   )r   rB  r   r   r   r   r   n  s    z0ASTTemplateParamConstrainedTypeWithInit.__init__)rp   c             C   s   | j jS )N)rB  r  )r   r   r   r   r  s  s    z,ASTTemplateParamConstrainedTypeWithInit.namec             C   s   | j jS )N)rB  r  )r   r   r   r   r  w  s    z.ASTTemplateParamConstrainedTypeWithInit.isPackr   )r   r  r   rp   c             C   s2   |dkst |r"|jjj|ddS | j|S d S )Nr?  F)r  )r   r  r   r   rB  )r   r   r  r   r   r   r   r   {  s    z.ASTTemplateParamConstrainedTypeWithInit.get_id)r  rp   c             C   s*   || j }| jr&|d7 }||| j7 }|S )Nz = )rB  r   )r   r  r  r   r   r   r    s
    
z2ASTTemplateParamConstrainedTypeWithInit._stringifyr   )r   r   r   r   rp   c             C   sV   | j |||| | jrR|t 7 }|tdd7 }|t 7 }| j|||| d S )Nr   )rB  r  r   r   r,  r*  )r   r   r   r   r   r   r   r   r    s    z:ASTTemplateParamConstrainedTypeWithInit.describe_signature)NN)r   r   r   rh  r   r1  r  r  rB   r  r`   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)rB  r   rp   c             C   s   || _ || _d S )N)rB  r   )r   rB  r   r   r   r   r     s    zASTTypeWithInit.__init__)rp   c             C   s   | j jS )N)rB  r  )r   r   r   r   r    s    zASTTypeWithInit.namec             C   s   | j jS )N)rB  r  )r   r   r   r   r    s    zASTTypeWithInit.isPackr   )r   r  r   rp   c             C   sJ   |dkr| j ||S |dkr<| |d | j | S | |S )Nmemberr   r   )rB  r   r  )r   r   r  r   r   r   r   r     s    zASTTypeWithInit.get_id)r  rp   c             C   s4   g }| || j | jr*| || j d|S )Nr   )r  rB  r   r!  )r   r  r  r   r   r   r    s
    zASTTypeWithInit._stringifyr   )r   r   r   r   rp   c             C   s6   t | | j|||| | jr2| j|||| d S )N)r5   rB  r  r   )r   r   r   r   r   r   r   r   r    s    z"ASTTypeWithInit.describe_signature)NN)r   r   r   rh  r  r   r1  r  r  rB   r  r`   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  rB  rp   c             C   s   || _ || _d S )N)r  rB  )r   r  rB  r   r   r   r     s    zASTTypeUsing.__init__r   )r   r  r   rp   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  rp   c             C   s>   g }| || j | jr4| d | || j d|S )Nz = r   )r  r  rB  r!  )r   r  r  r   r   r   r    s    
zASTTypeUsing._stringify)rp   c             C   s   dS )Nr   r   )r   r   r   r   r    s    z(ASTTypeUsing.get_type_declaration_prefixr   )r   r   r   r   rp   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  rB  r   r,  r*  )r   r   r   r   r   r   r   r   r    s    zASTTypeUsing.describe_signature)NN)r   r   r   r  rh  r   r`   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  rp   c             C   s   || _ || _d S )N)r  r  )r   r  r  r   r   r   r     s    zASTConcept.__init__)rp   c             C   s   | j S )N)r  )r   r   r   r   r    s    zASTConcept.namer   )r   r  r   rp   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  rp   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   rp   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   r1  r  r`   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   packrp   c             C   s   || _ || _|| _|| _d S )N)r  r  r   r  )r   r  r  r   r  r   r   r   r     s    zASTBaseClass.__init__)r  rp   c             C   s^   g }| j d k	r$|| j  |d | jr4|d ||| j | jrT|d d|S )Nr$  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   rp   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   r+  r,  r   r  r  r  r*  )r   r   r   r   r   r   r   r   r    s    


zASTBaseClass.describe_signature)r   r   r   r  r   rB   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  rp   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   rp   c             C   s   |  |S )N)r  r   )r   r   r  r   r   r   r   r   %  s    zASTClass.get_id)r  rp   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   r$  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   rp   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  r+  r  r*  pop)r   r   r   r   r   r   r   r   r   r  :  s$    zASTClass.describe_signature)r   r   r   r  rB   r   r  r#   r   r`   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  rp   c             C   s   || _ || _d S )N)r  r  )r   r  r  r   r   r   r   Q  s    zASTUnion.__init__r   )r   r  r   rp   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  rp   c             C   sF   g }| || j t| jdkr,| d | || j d|S )Nr   r$  r   )r  r  r   r  r!  )r   r  r  r   r   r   r  Z  s    
zASTUnion._stringifyr   )r   r   r   r   rp   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   r`   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  rp   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   rp   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  rp   c             C   s   g }| j r || j  |d ||| j t| jdkrH|d ||| j | jrx|d ||| j d|S )Nr$  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   rp   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  r*  )r   r   r   r   r   r   r   r   r    s    
zASTEnum.describe_signature)r   r   r   r  r   rh  r#   r   r`   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  rp   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   rp   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  rp   c             C   s\   g }| || j t| jdkr<| d | || j | jrR| || j d|S )Nr   r$  r   )r  r  r   r  r   r!  )r   r  r  r   r   r   r    s    
zASTEnumerator._stringifyr   )r   r   r   r   rp   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   r`   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)rp   c             C   s   t t| d S )N)r3  r4  )r   r   r   r   get_identifier  s    zASTTemplateParam.get_identifier)r   rp   c             C   s   t t| d S )N)r3  r4  )r   r   r   r   r   r     s    zASTTemplateParam.get_idr   r   N)
parentNoder   r   r   rp   c             C   s   t t| d S )N)r3  r4  )r   r  r   r   r   r   r   r   r    s    z#ASTTemplateParam.describe_signaturec             C   s   t t| d S )N)r3  r4  )r   r   r   r   r    s    zASTTemplateParam.isPackc             C   s   t t| d S )N)r3  r4  )r   r   r   r   r    s    zASTTemplateParam.name)r   r   r   r   r  r`   r   r   r   r  r1  rB   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   parameterPackrR   rp   c             C   s4   |st |r|d kst || _|| _|| _|| _d S )N)r   r  r   r  rR   )r   r  r   r  rR   r   r   r   r     s    z)ASTTemplateKeyParamPackIdDefault.__init__)rp   c             C   s   | j S )N)r   )r   r   r   r   r    s    z/ASTTemplateKeyParamPackIdDefault.get_identifier)r   rp   c             C   s6   |dkst g }| jr"|d n
|d d|S )Nr?  r  r  r   )r   r  r  r!  )r   r   r  r   r   r   r     s    
z'ASTTemplateKeyParamPackIdDefault.get_id)r  rp   c             C   sx   | j g}| jr(| jr|d |d | jrN| js>|d ||| j | jrn|d ||| j d|S )Nr$  z...z = r   )r  r  r   r  rR   r!  )r   r  r  r   r   r   r    s    



z+ASTTemplateKeyParamPackIdDefault._stringifyr   r   )r   r   r   r   rp   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   r+  r  r  r   r,  r*  r  rR   )r   r   r   r   r   r   r   r   r    s    z3ASTTemplateKeyParamPackIdDefault.describe_signature)r   r   r   r   r   rB   rh  r   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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)r:  rp   c             C   s   |st || _d S )N)r   r:  )r   r:  r   r   r   r     s    zASTTemplateParamType.__init__)rp   c             C   s    |   }tt|d gdgddS )NF)r  )r  r  r  )r   rk  r   r   r   r    s    zASTTemplateParamType.namec             C   s   | j jS )N)r:  r  )r   r   r   r   r    s    zASTTemplateParamType.isPackc             C   s
   | j  S )N)r:  r  )r   r   r   r   r    s    z#ASTTemplateParamType.get_identifierr   )r   r  r   rp   c             C   s2   |dkst |r"|jjj|ddS | j|S d S )Nr?  F)r  )r   r  r   r   r:  )r   r   r  r   r   r   r   r     s    zASTTemplateParamType.get_id)r  rp   c             C   s
   || j S )N)r:  )r   r  r   r   r   r  %  s    zASTTemplateParamType._stringifyr   )r   r   r   r   rp   c             C   s   | j |||| d S )N)r:  r  )r   r   r   r   r   r   r   r   r  (  s    z'ASTTemplateParamType.describe_signature)NN)r   r   r   r  r   r1  r  r  rB   r  r   r  r`   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)nestedParamsr:  rp   c             C   s    |st |st || _|| _d S )N)r   r  r:  )r   r  r:  r   r   r   r   .  s    z%ASTTemplateParamTemplateType.__init__)rp   c             C   s    |   }tt|d gdgddS )NF)r  )r  r  r  )r   rk  r   r   r   r  5  s    z!ASTTemplateParamTemplateType.namec             C   s   | j jS )N)r:  r  )r   r   r   r   r  :  s    z#ASTTemplateParamTemplateType.isPackc             C   s
   | j  S )N)r:  r  )r   r   r   r   r  >  s    z+ASTTemplateParamTemplateType.get_identifierr   )r   r  r   rp   c             C   s>   |dkst |r"|jjj|d dS | j|| j| S d S )Nr?  )r  )r   r  r   r   r  r:  )r   r   r  r   r   r   r   r   A  s    z#ASTTemplateParamTemplateType.get_id)r  rp   c             C   s   || j || j S )N)r  r:  )r   r  r   r   r   r  L  s    z'ASTTemplateParamTemplateType._stringifyr   )r   r   r   r   rp   c             C   s4   | j |d|| |t 7 }| j|||| d S )Nr   )r  r  r   r,  r:  )r   r   r   r   r   r   r   r   r  O  s    z/ASTTemplateParamTemplateType.describe_signature)NN)r   r   r   r  r   r1  r  r  rB   r  r   r  r`   r   r   r   r)   r  r   r  r   r   r   r   r  -  s   	r  c               @   s   e Zd Zd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  rp   c             C   s   |st || _|| _d S )N)r   r  r  )r   r  r  r   r   r   r   W  s    z ASTTemplateParamNonType.__init__)rp   c             C   s    |   }tt|d gdgddS )NF)r  )r  r  r  )r   rk  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   rp   c             C   sH   |dkst |r"|jjj|d dS d}| jr4|d7 }|| j| S d S )Nr?  )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  rp   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   rp   c             C   s,   | j |||| | jr(|tdd7 }d S )Nz...)r  r  r  r   r*  )r   r   r   r   r   r   r   r   r    s    z*ASTTemplateParamNonType.describe_signature)F)NN)r   r   r   r   r  r  rB   r   r1  r  r  r  r   r  r`   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requiresClauserp   c             C   s   |d k	st || _|| _d S )N)r   r  r  )r   r  r  r   r   r   r     s    zASTTemplateParams.__init__F)r   excludeRequiresrp   c             C   s   |dkst g }|d x| jD ]}||| q"W |d |sv| jrv|d || jj| |d d|S )Nr?  r  r  IQr   )r   r  r  r   r  rV  r!  )r   r   r  r  r  r   r   r   r     s    




zASTTemplateParams.get_id)r  rp   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> r$  r   )r  r!  r  r  )r   r  r  r   )r  r   r    s    
 


zASTTemplateParams._stringifyr   r   )r   r   r   r   rp   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 )Nrw   r   Tr   Fr   )r   r+  r*  r  r,  r  r  )r   r   r   r   r   r.  r  r   r   r   r    s    
z$ASTTemplateParams.describe_signature)r  r   r   r   lineSpecrp   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  rp   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>.makeLinerw   r   Tr   Fr   r  r   )
r   r   r!  r+  r*  r  r,  r  r  r"  )r   r  r   r   r   r   r#  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   r`   rB   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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  rp   c             C   s   || _ || _d S )N)r   r  )r   r   r  r   r   r   r     s    z)ASTTemplateIntroductionParameter.__init__)rp   c             C   s    |   }tt|d gdgddS )NF)r  )r  r  r  )r   rk  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   rp   c             C   s4   |dkst |r"|jjj|d dS | jr,dS dS d S )Nr?  )r  r  r  )r   r  r   r   r  )r   r   r  r   r   r   r   r     s    z'ASTTemplateIntroductionParameter.get_id)r   rp   c             C   s.   |dkst | j|}| jr&d| S |S d S )Nr?  r  )r   r   r   r  )r   r   r  r   r   r   get_id_as_arg  s
    z.ASTTemplateIntroductionParameter.get_id_as_arg)r  rp   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   rp   c             C   s0   | j r|tdd7 }| j|||dd| d S )Nz...r   )r  r   r*  r   r  )r   r   r   r   r   r   r   r   r  	  s    z3ASTTemplateIntroductionParameter.describe_signature)NN)r   r   r   r   rB   r   r1  r  r  r  r  r`   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)rJ   r  rp   c             C   s    t |dkst|| _|| _d S )Nr   )r   r   rJ   r  )r   rJ   r  r   r   r   r     s    z ASTTemplateIntroduction.__init__)r   rp   c             C   s   |dkst g }|d x| jD ]}||| q"W |d |d || j| |d x| jD ]}||| qrW |d |d d|S )Nr?  r  r  r  r   )r   r  r  r   rJ   r&  r!  )r   r   r  r  r   r   r   r     s    





zASTTemplateIntroduction.get_id)r  rp   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  rJ   r!  r  )r   r  r  r   )r  r   r  )  s    
 
z"ASTTemplateIntroduction._stringifyr   r   )r  r   r   r   r   rp   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   r!  r"  rJ   r  r*  r  r,  )	r   r  r   r   r   r   r   r.  r  r   r   r   r$  1  s    z8ASTTemplateIntroduction.describe_signature_as_introducer)r   r   r   r  r   r%  r   r`   r   r   r)   r  r   rB   r$  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  rp   c             C   s
   || _ d S )N)r  )r   r  r   r   r   r   G  s    z%ASTTemplateDeclarationPrefix.__init__r  )rp   c             C   s,   | j d krd S | j d }t|ts&d S |jS )Nr&  )r  r  r  r  )r   ZlastListr   r   r   get_requires_clause_in_lastM  s    


z8ASTTemplateDeclarationPrefix.get_requires_clause_in_last)r   rp   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 )Nr?  r   )r  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  rp   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   r   rp   c             C   s.   t | x | jD ]}||d||| qW d S )Nr   )r5   r  r$  )r   r   r   r   r   r   r   r   r   r   r  g  s    z/ASTTemplateDeclarationPrefix.describe_signature)r   r   r   r   r   r  r'  r   r   r)  r`   r   r+  r)   r  r   rB   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 )r  N)rV  rp   c             C   s
   || _ d S )N)rV  )r   rV  r   r   r   r   o  s    zASTRequiresClause.__init__)r  rp   c             C   s   d|| j  S )Nz	requires )rV  )r   r  r   r   r   r  r  s    zASTRequiresClause._stringifyr   r   )r   r   r   r   rp   c             C   s2   |t dd7 }|t  7 }| j|||| d S )Nro   )r   r+  r,  rV  r  )r   r   r   r   r   r   r   r   r  u  s    z$ASTRequiresClause.describe_signature)r   r   r   r2  r   r)   r   r  r   r   r  r   r   r   r   r  n  s   r  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  r(  r   trailingRequiresClause	semicolonrp   c             C   s:   || _ || _|| _|| _|| _|| _|| _d | _d | _d S )N)	r  r,  r  r(  r   r-  r.  r   enumeratorScopedSymbol)r   r  r,  r  r(  r   r-  r.  r   r   r   r     s    zASTDeclaration.__init__)rp   c             C   sJ   | j r| j  nd }| jr$| j nd }t| j| j| j|| j || jS )N)	r(  cloner-  r   r  r,  r  r   r.  )r   ZtemplatePrefixCloneZtrailingRequiresClasueCloner   r   r   r0    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  rp   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   r  r   r  r   )r(  r-  r(   r  r/  r   r   r   
_id_prefixr  r+  r)  rV  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  rp   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 )Nrl   r$  ;r   )r  r  r(  r   r-  r.  r!  )r   r  r  r   r   r   r    s    


zASTDeclaration._stringifyr   )r   r   r   optionsrp   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   r   rl   rB  rJ   r  r  rH   )rH   rv   r   rW   z
enum-classzenum-structrv   r1  r-  r   r5  )r5   r   r   r   r!  r"  isRedeclarationr(  r  getr  r+  r,  r  r   r  r,  r-  r  r.  r*  )	r   r   r   r   r6  ZmainDeclNoder   ZlastDeclNodeZtrailingReqNoder   r   r   r    sr    






z!ASTDeclaration.describe_signature)NNNNNF)T)r   r   r   r   r   r(  r   r  rB   r   r0  r1  r  r  r   r  r  r`   r   r4  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  r(  rp   c             C   s   || _ || _d S )N)r  r(  )r   r  r(  r   r   r   r   (  s    zASTNamespace.__init__)r  rp   c             C   s4   g }| j r||| j  ||| j d|S )Nr   )r(  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   r9  '  s   r9  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   rp   c             C   s"   || _ || _|| _|| _|| _d S )N)r;  r<  r  r-  r   )r   r;  r<  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   r:  5  s   r:  c               @   s2   e Zd Zeeeeeef e	f  ddddZ
dS )	LookupKeyN)r:  rp   c             C   s
   || _ d S )N)r:  )r   r:  r   r   r   r   A  s    zLookupKey.__init__)r   r   r   r   r	   r  r   r  r'  r   r   r   r   r   r   r=  @  s   r=  )r-  r   rp   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   r  r  r#  r   r  endswithr  )	r-  r   r   r  r  Z	paramNameZargTxtZisArgPackExpansionZargNamer   r   r   _is_specializationH  s     




r@  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  rp   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)rp   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  r8  rp   c                s"   |dkrt  nt ||S d S )Nchildren)r   super__setattr__)r   r  r8  )	__class__r   r   rM    s    zSymbol.__setattr__)r  r  r-  r   r   rI  linerp   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  r@  r-  r   r   rI  rO  r7  rJ  	_childrenZ_anonChildrenr  r   !_add_template_and_function_params)r   r  r  r-  r   r   rI  rO  r   r   r   r     s*    
zSymbol.__init__)r   rI  rO  rp   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)rJ  r   r   rI  rO  r   rS  )r   r   rI  rO  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_lookuprG  rH  r-  r  r  r   r   r  r  _add_symbolsrI  rO  r  r  r  r  r   r   r  )r   tpr  r0  nnfpr   r   r   rS    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  rR  r   remove)r   r   r   r   r\    s
    
zSymbol.remove)rI  rp   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)rR  	clear_docr   rI  rO  rP  rQ  r  )r   rI  ZnewChildrensChildr   r   r   r]    s    




zSymbol.clear_docc             c   s(   | V  x| j D ]}| E d H  qW d S )N)rR  get_all_symbols)r   r^  r   r   r   r_    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)rR  r  r   children_recurse_anon)r   r   r   r   r   r`    s
    
zSymbol.children_recurse_anonr=  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-  r4  r=  )r   r;  r   r  r0  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  ra  r  r  r   r  )r   r;  r   r  r  r   r   r   r    s    


zSymbol.get_full_nested_name)r  r-  r   templateShorthand	matchSelfrecurseInAnoncorrectPrimaryTemplateArgsrp   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   rW  rH  _find_named_symbolsr  StopIteration)	r   r  r-  r   rb  rc  rd  re  r  r   r   r   _find_first_named_symbol,  s    

zSymbol._find_first_named_symbol)	r  r-  r   rb  rc  rd  re  rf  rp   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   )rD  zidentOrOp:                  ztemplateParams:             ztemplateArgs:               ztemplateShorthand:          zmatchSelf:                  zrecurseInAnon:              zcorrectPrimaryTemplateAargs:zsearchInSiblings:           r   )r   rp   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-  rb  r   r   matchesX  s     
z+Symbol._find_named_symbols.<locals>.matches)rp   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   )rD  zsearching in sibling:)	r   rW  rH  rE  	to_stringrG  r`  rR  rP  )r   )rc  rd  r   r   r   
candidatesn  s     


z.Symbol._find_named_symbols.<locals>.candidatesz
candidate:rj  r   r?  )	r   rW  rG  rH  rE  rk  r@  rB   r   )r   r  r-  r   rb  rc  rd  re  rf  rj  rl  r   r   )r  rc  rd  r   r   r-  rb  r   rg  <  sD    


 


zSymbol._find_named_symbols)r  templateDeclsonMissingQualifiedSymbolstrictTemplateParamArgListsancestorLookupTyperb  rc  rd  re  rf  rp   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   )rD  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   )rc  rd  rf  rH   zstarting point:r&  )rb  rc  rd  re  r?  Fzhandle last name from:)rb  rc  rd  re  rf  )r   rW  rG  rH  rE  rk  r!  r  r   r   r  r  r  r  find_identifierr  r   ri  rg  listr:  )r   r  rm  rn  ro  rp  rb  rc  rd  re  rf  r  r<  Z	firstNameZiTemplateDeclr  r  r   r-  r   r;  r   r   r   _symbol_lookup  s    














zSymbol._symbol_lookup)r  rm  r   rI  rO  rp   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   )r<  r  r-  r   rp   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:  r?  )r  r  r-  r   r   rI  rO  )r   rW  rG  rH  )r<  r  r-  r   r   r   r   rn     s    
z5Symbol._add_symbols.<locals>.onMissingQualifiedSymbolTF)ro  rp  rb  rc  rd  re  rf  r   z _add_symbols, result, no symbol:ztemplateParams:zidentOrOp:     ztemplateArgs:  zdeclaration:   zlocation:      {}:{})r  r  r-  r   r   rI  rO  r?  z_add_symbols, result, symbols:znumber symbols:zno declarationz
#noDecl:  z
#withDecl:z
#dupDecl: )rp   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   rI  rO  z end:   creating candidate symbol)r   rW  rH  r<  r  r-  r   )r   )r   rI  rO  lookupResultr   r   makeCandSymbolt  s    


z+Symbol._add_symbols.<locals>.makeCandSymbol)r   
candSymbolrp   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redeclarationr?  T)r   rW  rG  rH  r7  r   )r   rv  )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   rW  rG  rH  r!  rJ  r   r   r  r   r  rs  r   rr  r;  r   r-  r  r   r<  r   r  r7  r  r4  r\  rT  )r   r  rm  r   rI  rO  rn  r;  r   ZnoDeclZwithDeclZdupDeclr   ru  rv  rw  candIdZoldIdr   )r   rI  rO  rt  r   rX    s    







	








zSymbol._add_symbolsr   )r  docnamesr   rp   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)rR  r  r  rJ  )r   
otherChildr   r   r   unconditionalAdd  s    z+Symbol.merge_with.<locals>.unconditionalAddzotherChild:
r7  F)r  r-  r   rb  rc  rd  re  rf  zraw candidate symbols:c             S   s   g | ]}|j s|qS r   )r7  )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)rU  rV  z1Internal C++ domain error during symbol merging.
z
ourChild:
z
otherChild:
r?  )r   rW  rG  rH  r   rR  rk  r7  rg  r  r-  r   rr  r   r   r4  rI  rT  rO  r   r   r,  loggerwarningr  r  
merge_with)r   r  ry  r   r{  rz  ZcandiateIterrl  r;  ZourChildqueryIdr   rx  r  msgr   r   r   r    s    














zSymbol.merge_with)r  r(  rp   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   rI  rO  )r   rW  rG  rH  r  rX  )r   r  r(  rm  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   rW  rG  rH  r   r  r(  r  rX  )r   r   rI  rO  r  rm  r  r   r   r   add_declarationA  s    

zSymbol.add_declaration)r  rc  rd  rf  rp   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   )rD  r?  ztrying:)
r   rW  rG  rH  rE  rk  r  r`  rR  rP  )r   r  rc  rd  rf  ZcurrentrK  r   r   r   r   rq  S  s6    




zSymbol.find_identifier)r  rp   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)rb  rc  rd  re  zname:          ztemplateParams:zid:            r   )rD  z	not foundr?  )r   rW  rG  rH  r:  rR  r   r4  r  r   ri  rE  rk  )
r   r  r   r  r-  r  r  Zcandr  r   r   r   r   direct_lookupr  sJ    


zSymbol.direct_lookup)r  rm  rn  rb  rc  rd  rf  rp   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   )rD  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   )r<  r  r-  r   rp   c                s    | j d k	r| j jdkr  d S )NrU  )r   r  )r<  r  r-  r   )r  r   r   rn    s    
z2Symbol.find_name.<locals>.onMissingQualifiedSymbolF)ro  rp  rb  rc  rd  re  rf  )NtemplateParamInQualifiedr?  )NNr   rU  )rb  rc  rd  re  )r   rW  rG  rH  rE  rk  r  r   r   r  r   r  rs  rr  r;  r   r<  r   r  ri  r  )r   r  rm  rn  rb  rc  rd  rf  rn  rt  r  r   r   )r  r   	find_name  sf    








zSymbol.find_name)r   rn  rb  rc  rd  rp   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   )r<  r  r-  r   rp   c             S   s   d S )Nr   )r<  r  r-  r   r   r   r   rn    s    z9Symbol.find_declaration.<locals>.onMissingQualifiedSymbolF)ro  rp  rb  rc  rd  re  rf  r   ZfakeDocnameForQuery*   )r  r  r-  r   r   rI  rO  )r   rW  rG  rH  r  r(  r  r   r   r  r   r  rs  rr  r;  r   r<  r  r-  r   r4  r   r\  )r   r   rn  rb  rc  rd  r  rm  rn  rt  r;  ZquerySymbolr  r   rx  r   r   r   find_declaration  sX    






zSymbol.find_declaration)indentrp   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	(rQ  r   )r   rF  r  r  r-  r   r  r   r   r7  r  rI  r!  )r   r  r  r   r   r   rk    s0    





zSymbol.to_stringc             C   s:   |  |g}x"| jD ]}|||d  qW d|S )Nr   r   )rk  rR  r  r   r!  )r   r  r  r   r   r   r   r   :  s    zSymbol.dump)N)9r   r   r   rG  rF  rW  debug_show_treerA  rC  staticmethodr   rH  rJ  r   rM  r   r   r   r  r  r'  r   r`   r   rT  rS  r\  r]  r   r_  r1  r   r`  r  r  r  r  rB   ri  rg  r   r   r:  rs  rX  r  r(  r  r  rq  r  r	   r  r  rk  r   __classcell__r   r   )rN  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)rp   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)rH  rp   c                s"     ts| S t j}t| |S )N)matchudl_identifier_rer   matched_textrG  )rH  rI  )r   r   r   _udlj  s    

z-DefinitionParser._parse_literal.<locals>._udlrh   r{   TrZ   Fr   r?  z8Can not handle character literal. Internal error was: %szJCan not handle character literal resulting in multiple decoded characters.)r5  skip_ws	skip_wordr6  r7  r  r  r.   r/   r9  r  r,   r0   r2   r4   r3   r  r>  r-   Z
last_matchgrouprA  UnicodeDecodeErrorr  r*   )r   r  r  Z	hasSuffixZfloatLitZregexZintLitstringr   r:  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 )NrP  r   z...z6Expected fold operator after '...' in fold expression.rQ  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_stringrL  r'   _parse_expression_make_multi_errorrU  )r   rN  rO  r  rM  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 )Nrx   )r  r  r  rK  r  _parse_nested_namerW  )r   r  rZ  r   r   r   _parse_primary_expression  s    
z*DefinitionParser._parse_primary_expression)r  opencloserp   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  rf  r  rV  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-listrP  rQ  )r  rc  )r   rf  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  rd  )r   rf  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 )-Nrm  r   zExpected '<' after '%s'.Fr   z Expected '>' after type in '%s'.rP  zExpected '(' in '%s'.)rp   c                  s      S )N)r  r   )r   r   r   parser^  s    z:DefinitionParser._parse_postfix_expression.<locals>.parserrQ  zExpected ')' to end '%s'.r~   zExpected '(' after 'typeid'.T)rr  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 expressionrV  operatorCastZtypeOperatorCastr  z3Expecting '(' or '{' after type in cast expression.zError in postfix expression,z% expected primary expression or type.zIf primary expression)rV  rm  r~   r[  r\  z*Expected ']' in end of postfix expression.r^  r   r?  z..r   z->z++z--)r  ro  skip_word_and_wsr  r  _parse_typer  r2  _parse_expression_fallbackrl  r  rp  r'   r  r  r  r  r  rZ  r  r]  r_  r`  ra  r  rb  rg  )r   Z
prefixTyper   rm  r   rn  r  rV  r  eTyper  headererrorsZeOuterZeInnerri  r  re  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   ru  rs   z...rP  z Expecting '(' after 'sizeof...'.z%Expecting identifier for 'sizeof...'.rQ  z!Expecting ')' to end 'sizeof...'.F)namedzExpecting ')' to end 'sizeof'.r<   zExpecting '(' after 'alignof'.zExpecting ')' to end 'alignof'.re   zExpecting '(' after 'noexcept'.z Expecting ')' to end 'noexcept'.z::rd   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.rS   r[  r\  z(Expected ']' in array delete-expression.)r  _expression_unary_opsr  r  r  rt  r  r  r  r  r1   r   r  rw  r  rx  _parse_unary_expressionrz  r{  r  r|  r  _parse_decl_specs_parse_declaratorr  r}  rh  r  r  )r   rN  r  rV  rI  rn  r  r  r~  r  r  re  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 )NrP  FrQ  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  rn  rV  ZexCastZexUnaryerrsr   r   r   r  (  s(    




.z'DefinitionParser._parse_cast_expression)r  rp   c                s&   t tttd fdd  | d|dS )N)r   opIdr  rp   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  rp   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_opsrB   r2  r  r  r  r  r  r  r'   r  )
r   r  r  r  rf  r  r  oneMorerN  rV  )r  )r  r   r   r  L  s@    




zIDefinitionParser._parse_logical_or_expression.<locals>._parse_bin_op_exprr   )r  )r  r`   rB   r2  )r   r  r   )r  r   _parse_logical_or_expression@  s    'z-DefinitionParser._parse_logical_or_expression)
orExprHeadr  rp   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  rM  condExprrN  rO  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   rf  r   r   r   r    s    
z"DefinitionParser._parse_expressionT)rD  r  allowrp   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:
%srQ  r  r\  r   )rP  r  r[  r   r   r&  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   rD  r  r  ZprevPosr   r  r8  Zbracketsr;  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)rd   rS   r[  r\  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   rN  r   rB  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	parsedEndrB  r   r8  r  r   r   r   _parse_template_argument_list  sj    








2
z.DefinitionParser._parse_template_argument_listF)memberPointerrp   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   rw   ri   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  rw   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   rB   rD   r   rE   rF   rG   r`   r   r   r[   rT   r   r   r   r   zCan not have both {} and {}.)rr   r   rq   r   ra   )Z
_ImaginaryZ_Complex)r?   r   rB   r   rE   rF   rG   r   r   r   r   r$  rD   r`   )r   r   r[   rT   r   z.Can not have {} without a floating point type.zUnhandled type {})r  r  _simple_type_specifiers_rer  r  r  rJ  r   r!  r   extendr  )r   modifierZ
signednesswidthrn  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 )NrQ   rP  zExpected '(' after 'decltype'.r?   rQ  z#Expected ')' after 'decltype(auto'.z%Expected ')' after 'decltype(<expr>'.)rH   rv   rW   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  rV  r   kr  r  r   r   r   _parse_trailing_type_spec  sJ    













z*DefinitionParser._parse_trailing_type_spec)r  rp   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 )Nrd   rP  r  z+Expecting "(" in parameters-and-qualifiers.rQ  z...Tz6Expected ")" after "..." in parameters-and-qualifiers.single)r  r  r   z<Expecting "," or ")" in parameters-and-qualifiers, got "%s".rK   r   z&&r   re   Fz Expecting ')' to end 'noexcept'.z->)r  r  r  r   )r  rS   rR   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  rK   r   r  r  rV  r  r  r  r  r  Zvalidr   r   r   r    _parse_parameters_and_qualifiers  s    















z1DefinitionParser._parse_parameters_and_qualifiers)r  typedrp   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.NrK   r   )r  r  rt   rY   r  rb   rm   )r  r  r_   rM   rN   ry   r  rL   r]   r   rX   rP  F)r  z=Expected constant expression after '(' in explicit specifier.rQ  z'Expected ')' to end explicit specifier.)r  r  r  r  r  r  r  _parse_attributer  r  r#   )r   r  r  r  r  r_   r   r  rL   rM   rN   r   rK   r]   r  rX   rV  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)rB  r  r  rU  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  rp   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.r[  r\  )rp   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   rB  )r  )r  r  )r  r  r  )r  r  r'   r  r1   r   r  r  r  r  r  r  r  r  r  r2  r  r  r   r  r  r  )r   r  r  r  r  r  r   r0  r  r  r8  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)rB  r  r  rd   z'Internal error, unknown paramMode '%s'.r   Fr   rK   )r  r   rK   r  r   )r  r  z...)r  rP  r  )r  r  r  z/If declarator-id with parameters-and-qualifiersrQ  z$Expected ')' in "( ptr-declarator )"rB  )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   rK   ZattrListr  r  r  r  r  ZexParamQualr  ZexNoPtrParenr  r  r   r   r   r   r    s    







2
 

z"DefinitionParser._parse_declaratorN)r  allowFallbackrp   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   rU  r   r   rQ  z;Internal error, initializer for outer '%s' not implemented.)rp   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  r2  r  )r   r  r  Z
bracedInitZfallbackEndr  r8  r   )r  r   r   _parse_initializer  s,    


z#DefinitionParser._parse_initializer)r  r  rp   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
        )rB  r  r  r  rU  z#Internal error, unknown outer "%s".r  )rB  r  F)r  r  T)r  r  r  r  z
requires\b)ZallowSemicolonrB  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  rU  r  )r  r   r  r  r  r  recompiler  r  
assert_endr'   r  r  rh  )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)rB  r  r  rU  )r  r  rU  )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  rB  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  rB  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  Z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   )rp   c                  s    j ddS )NF)r  )r  r   )r   r   r   r  |  s    z2DefinitionParser._parse_enumerator.<locals>.parser)r  r  r  r  r2  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 )Nrw   r   rH   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  rU  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   rR   r:  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  rE  r  )
r   r-  r  errr  ZeParamr  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  rJ   r  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 )Nro   )r   rp   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||Trj   r   r   )	r  r  r  r2  r  r  r   r  r  )r   r  ZorExprsr  r  r   r   r   r    s,    



z'DefinitionParser._parse_requires_clause)r  rp   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 )Nrw   r  r   rJ   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(  r  r  r  r  )r   r  r  r  r  r   r   r   r   "_parse_template_declaration_prefix@  s4    


z3DefinitionParser._parse_template_declaration_prefix)r  r(  fullSpecShorthandisMemberrp   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
	)r  )r  r  r   r  r   r  r#  r  r  r  r(  )r   r  r(  r  r	  ZnumArgsZisMemberInstantiationZ	numParamsZnumExtrar  ZnewTemplatesZ_ir   r   r   _check_template_consistencya  s8    

z,DefinitionParser._check_template_consistency)r  r,  rp   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)rH   r   r  r  rB  rJ   rW   r1  z(Internal error, unknown objectType "%s".)rH   rv   r   r  r  varrB  rJ   rW   zenum-structz
enum-classr1  z+Internal error, unknown directiveType "%s".)rB  rJ   r  r  rH   r   rB  T)r  r  zIf typedef-like declarationzIf type alias or template aliaszError in type declaration.rJ   r  r  rH   r   rW   r1  F)r  r	  r5  )r  r  r  r  r  r  r  r  r'   r  r  r  r  r  r  r  r  r  r   r   r
  r  r  r   )r   r  r,  r  r(  r-  r   r  r  r   r  r.  r   r   r   parse_declaration  sp    


"













z"DefinitionParser.parse_declarationc             C   s8   | j dd}|  }| j||dd}t||}d|_|S )Nrc   )r  F)r  )r  r  r
  r9  r  )r   r(  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
  r9  r  r'   r  r  r  )
r   r  r(  r  Zres1Z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  rV  ZexExprrn  ZexTyper  r  r   r   r   parse_expression  s&    
z!DefinitionParser.parse_expression)T)F)T)T)NT)N)F)_r   r   r   r1  r   r  r  r  r  r5  r  r2  r  r  r	   r   r   rd  rB   r  rc  r  r  r  r  rg  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  rh  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  r9  r  r  r  r   r   r   r   r  A  s|   <;
 _6
"* A2Y-_]6q0Y
+
?"&5"
$A	r  )rp   c              C   s    t tdd } t| gdgddS )NZPhonyNameDueToErrorF)r  )r  r   r  )r0  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)astrp   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 )Nr1  rW   FT)rc  rd  rf  r   )r  r  r-  r   r   rI  rO  )r  r   r   r  r-  r   r  r   r,  rq  r0  r/  r   r   rI  get_source_info)r   r  r   r<  
parentDeclZtargetSymbolr   Z	declCloner   r   r   _add_enumerator_to_parent  s8    



z#CPPObject._add_enumerator_to_parent)r  sigr   rp   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  FrJ   Tr  entriesr  r   r   r  r  )#r#  r3  r   r  r(   r   rr  reversedr  r  r  r}  r~  get_locationr   r  r   lstripr  r   r  r6  r   r  cpp_index_common_prefix
startswithr   get_index_textZ	indexnodestatedocumentr  
domaindatarI  Znote_explicit_target)r   r  r  r   r  r   rk  newestIdr  ZisInConceptr   r  ZstrippedNamer   Z	indexTextr  r   r   r   add_target_and_indexD  sZ    




zCPPObject.add_target_and_index)rp   c             C   s
   t  d S )N)r3  )r   r   r   r   object_type|  s    zCPPObject.object_typec             C   s   | j S )N)r)  )r   r   r   r   display_object_type  s    zCPPObject.display_object_type)r  rp   c             C   s   t d|| jf S )Nz%s (C++ %s))r   r*  )r   r  r   r   r   r#    s    zCPPObject.get_index_text)r  rp   c             C   s   | | j| jS )N)r  r)  objtype)r   r  r   r   r   parse_definition  s    zCPPObject.parse_definition)r   r  r6  rp   c             C   s   | |d| j| d S )Nr   )r  r   )r   r   r  r6  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%  Zsettingsr   	temp_datar&  r  ref_contextr   r  r}  r~  rJ  r   r  r  	argumentsr  r  r  rL  run)r   r   rootr<  r  r  r  r   )rN  r   r   r1    s&    






zCPPObject.run)r  r   rp   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   )rI  rO  zRDuplicate C++ declaration, also defined at %s:%s.
Declaration is '.. cpp:%s:: %s'.r1  ztparam-line-spec)r   r.  r  r  r,  r  r'   r}  r~  r  r  
ValueErrorr  rI  r  rP  r   rQ  r   r   r   rO  r*  r  r  dictr6  r  )r   r  r   r<  r  r  r   r  r   r  r6  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   r.  r   oldParentSymbolr/  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)r6  r   r.  r7  r/  )r   r   r   r   after_content  s    zCPPObject.after_content)"r   r   r   __doc__r7   r   r  r   r6   __annotations__r   flagr  r:   r   r  r   r   r(  r1  r)  r*  r#  r  r,  r   r   r  r   r1  r5  r8  r9  r  r   r   )rN  r   r    s,   

*7%/r  c               @   s   e Zd ZdZdS )CPPTypeObjectrB  N)r   r   r   r)  r   r   r   r   r=    s   r=  c               @   s   e Zd ZdZdS )CPPConceptObjectrJ   N)r   r   r   r)  r   r   r   r   r>    s   r>  c               @   s   e Zd ZdZdS )CPPMemberObjectr  N)r   r   r   r)  r   r   r   r   r?    s   r?  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  rA  r  argumentT)r  r  r  
exceptionsZThrowsrV  )Zthrowsrz   Z	exception)r  Zrolenamer  r  retvalzReturn values)ZretvalsrD  ZreturnvalueZReturnsF)Zreturnsrp   )r  Zhas_argr  N)	r   r   r   r)  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 )CPPClassObjectrH   )rp   c             C   s   | j dkst| j S )N)rH   rv   )r+  r   )r   r   r   r   r*    s    z"CPPClassObject.display_object_typeN)r   r   r   r)  r1  r   r*  r   r   r   r   rE    s   rE  c               @   s   e Zd ZdZdS )CPPUnionObjectr   N)r   r   r   r)  r   r   r   r   rF    s   rF  c               @   s   e Zd ZdZdS )CPPEnumObjectrW   N)r   r   r   r)  r   r   r   r   rG    s   rG  c               @   s   e Zd ZdZdS )CPPEnumeratorObjectr1  N)r   r   r   r)  r   r   r   r   rH    s   rH  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   Tr  )rp   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   r-  r   )NULLr  rh   )r|  r  )r|  zcpp:parent_symbolzcpp:namespace_stackzcpp:parent_key)r   r&  r0  r  r  r  r  r  r  r'   r}  r~  r  r9  r  r  r(  r.  r  r/  )r   
rootSymbolr   stackr  r  r   r  r   r   r   r1  /  s(    

zCPPNamespaceObject.runN)r   r   r   r:  has_contentrequired_argumentsoptional_argumentsfinal_argument_whitespacer  r:   r;  r   r   r1  r   r   r   r   rI  #  s   
rI  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   Tr  )rp   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   )rJ  r  rh   )r|  r  )r|  zcpp:parent_symbolr   r-  zcpp:namespace_stackzcpp:parent_key)r0  r  r  r  r  r  r  r'   r}  r~  r  r9  r   r.  r8  r&  r  r  r(  r  r  r/  )r   r  r  r   r  Z	oldParentr   rL  r   r   r   r1  N  s,    


zCPPNamespacePushObject.runN)r   r   r   rM  rN  rO  rP  r  r:   r;  r   r   r1  r   r   r   r   rQ  G  s   
rQ  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   Tr  )rp   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|  r&  r   r-  zcpp:parent_symbolzcpp:parent_key)r   r.  r8  r   r}  r~  r  r	  r&  r  r/  )r   rL  r   r   r   r   r1  n  s    
zCPPNamespacePopObject.runN)r   r   r   rM  rN  rO  rP  r  r:   r;  r   r   r1  r   r   r   r   rR  g  s   
rR  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   )r  aliasOptionsr   	parentKeyrp   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   r-  zcpp:parent_key)
rL  r   r  rT  r.  r&  r  r/  rU  r   )r   r  rT  r   rU  r2  )rN  r   r   r     s    


zAliasNode.__init__)rp   c             C   s   | j | j| jd | jdS )N)r   rU  )rN  r  rT  rU  )r   r   r   r   copy  s    zAliasNode.copy)NN)	r   r   r   r   r4  r=  r   rV  r  r   r   )rN  r   rS    s    rS  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skipThisrT  renderOptionsr%  rp   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   r%  r   domainaliasr+  desctypeZnoindex)rU  rV  )rX  rY  rT  rZ  r%  )r   r   r  r   r  r   desc_contentr  r%  rR  r  _render_symbolr  r   rK  )r   r   rX  rY  rT  rZ  r%  Zrecurser   r   ZchildContainercontentr  r^  Z
childNodesr   r   r   r_    sF    



zAliasTransform._render_symbolN)kwargsrp   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   r-  zTarget: zParentKey: r   anyTF)r  rm  rn  rb  rc  rd  rf  )rb  rc  rd  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-specrX  noroot)rX  rY  rT  rZ  r%  )'r%  findallrS  r  rU  r  r   r  r  r  r'   r}  r~  r   r   clearr  Zreplace_selfZdomainsr:  r  rE  r   r   r  r9  r  r(  r  r  r   r  r  r  r   r   r_  rT  r  )r   ra  r  r  rU  r  r  isShorthandr   r   rK  r<  r;  nsr  rm  
failReasonr  r   r   rZ  r  r   r   r   apply  s    














zAliasTransform.apply)r   r   r   r!   Zdefault_priorityr   r`   rB   r4  r   r   r   r_  ri  r   r   r   r   rW    s
   
,rW  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)rX  rc  r  )rp   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   r[  r+  r]  rX  rc  )rX  rc  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  splitr[  r+  r   r  r$  r%  r  r6  r8  r}  r~  r  Zget_signaturesr  rS  r   r^  r8  Znested_parser`  Zcontent_offsetr.  r9  )r   r  rT  Z
signaturesr  Zcontentnoder   r   r   r1  "  s.    




zCPPAliasObject.runN)r   r   r   r   Znonnegative_intr<  r  r:   r;  r   r   r1  r   r   r   r   rj    s   
rj  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targetrp   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   rb  z()r   r   z::r&  r?  )	
attributesupdater/  r+   subr   r?  r   rfind)r   r   rn  ro  rp  rq  Zdcolonr   r   r   process_linkL  s     


zCPPXRefRole.process_linkN)	r   r   r   r   r   rB   r   r	   rw  r   r   r   r   rm  K  s   rm  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)asCoderp   c                s    t    |rd| _nd| _d S )Nzcpp-exprz	cpp-texpr)rL  r   
class_type)r   ry  )rN  r   r   r   j  s    
zCPPExprRole.__init__)rp   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  r$  )r|  r  z!Unparseable C++ expression: %r
%s)r|  r   )r  zcpp:parent_symbolr-  r   )r   r<  r  r  r  r  r'   r}  r~  r   Zdesc_inlinerz  r   r.  r8  r&  r  )r   r   r  r  r  r<  r   r   r   r   r1  s  s     

*zCPPExprRole.run)r   r   r   rB   r   r	   r   r   r   r1  r  r   r   )rN  r   rx  i  s   	rx  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++rH   rv   r   rB  r   r  funcr  r  rJ   rW   r1  zfunction parameterztemplate parameter)
rH   r   r  r  rB  rJ   rW   r1  rV  rU  )rH   rv   r   r  r  r  rB  rJ   rW   zenum-structz
enum-classr1  rc   znamespace-pushznamespace-popr\  T)Z
fix_parens)ry  F)rb  rH   rv   r   r|  r  r  rB  rJ   rW   r1  rV  ZtexprN)r-  r  )rI  rp   c             C   s   t jr4td| td t| jd d td | jd }|| t jr|td t| jd d td td| x2t| jd	  D ]\}}||kr| jd	 |= qW d S )
Nz
clear_doc:z	before:r-  r   z	before endz	after:z
	after endzclear_doc end:r  )r   r  rE  r:  r   r]  rr  items)r   rI  rK  r  ZnDocnamer   r   r   r]    s    



zCPPDomain.clear_doc)r   rI  r%  rp   c             C   s2   t jr.td| t| jd d td| d S )Nzprocess_doc:r-  r   zprocess_doc end:)r   r  rE  r:  r   )r   r   rI  r%  r   r   r   process_doc  s    
zCPPDomain.process_doc)r
  rp   c             C   s   |j | jj d S )N)rs  rt  r   r/  )r   r
  r   r   r   process_field_xref  s    zCPPDomain.process_field_xref)ry  	otherdatarp   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:r-  r   z		self endz	other:z
	other endr  z	result:z	result endzmerge_domaindata end)r   r  rE  r:  r   r  r   r}  )r   ry  r  ZourNamesr  rI  r   r   r   merge_domaindata  s(    

zCPPDomain.merge_domaindata)r   fromdocnamebuilderrn  rq  r  contnoderp   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)rb  r|  z())r|  r  )r   rp   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 )Nrb  r|  rr  )r|  r  )r  r  r  r'   )r   Zparser2r  )r   r  rq  rn  r   r   findWarning  s    
z2CPPDomain._resolve_xref_inner.<locals>.findWarningz&Unparseable C++ cross-reference: %r
%s)r|  )NNzcpp:parent_keyr-  zTarget: zParentKey: r   T)rb  rc  rd  rf  r   r  r   )rb  rc  rd  zstd::r   zcpp:r   )rp   c                 s<   dkrdS  } | r" | kS td f  t d S )Nrb  Tz"Type is %s, declaration type is %s)Zobjtypes_for_rolerE  r   )Zobjtypes)declTypr   rn  r   r   	checkTypeW  s    
z0CPPDomain._resolve_xref_inner.<locals>.checkTypezcpp:%s targets a %s (%s).r  ZrefexplicitFr  rb  r|  z
operator()ri   rr  ),r  r  r  r'   r  r	   r   r}  r~  r8  r:  r  rE  r   r   r  r9  r  r(  r  r  r   r  r  r   r   r  r  r   r"  r  rB   r  r   r   rI  r	  r  Zadd_function_parenthesesr?  r   r'  r9   r4  )#r   r   r  r  rn  rq  r  r  r  r  rf  r   r  r   r  rU  rK  r<  rg  r  rm  rf  r;  rh  r   r  ZtxtNamer  r   fullNestedNameZdisplayNamerI  rp  ZaddParenr  r   )r  r   r  r   rq  rn  r   _resolve_xref_inner  s    "



















zCPPDomain._resolve_xref_innerc          	   C   s   |  |||||||d S )Nr   )r  )r   r   r  r  rn  rq  r  r  r   r   r   resolve_xref  s    zCPPDomain.resolve_xref)r   r  r  rq  r  r  rp   c       	   
   C   s\   t    | |||d|||\}}W d Q R X |rX|dkrDd|fgS d| | |fgS g S )Nrb  rU  zcpp:templateParamzcpp:)r"   Zsuppress_loggingr  Zrole_for_objtype)	r   r   r  r  rq  r  r  Zretnoder+  r   r   r   resolve_any_xref  s    


zCPPDomain.resolve_any_xref)rp   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 )Nr-  r  r   )r:  r_  r   rI  r   r  r   r   r   r  r4  )	r   rK  r   r  r  Zdispnamer  rI  r'  r   r   r   get_objects  s    



zCPPDomain.get_objects)r  rp   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   r-  z::)r8  r   r:  r  r  r!  r   )r   r  rq  rU  rK  r<  Z
parentNamer   r   r   get_full_qualified_name  s    

z!CPPDomain.get_full_qualified_name)1r   r   r   r:  r  r  r   r   Zobject_typesrE  rF  r@  r?  r=  r>  rG  rH  rI  rQ  rR  rj  r   rm  rx  Zrolesr   Zinitial_datar   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{    s|     "r{  )apprp   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)ra  )r  r  r   rW  r  r  r!  sort)r  r   r   r   	initStuff  s    

zsetup.<locals>.initStuffzbuilder-initedZbuiltin   T)r   Zenv_versionZparallel_read_safeZparallel_write_safe)Z
add_domainr{  Zadd_config_valueZadd_post_transformrW  Zconnect)r  r  r   r   r   setup  s    

r  )r:  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:   Z	getLoggerr   r}  r;   r  r  Sr  r  r  r  r  r  r3  r2  r  r   r  r  rS  rv  r   r   r;  r  r  r  ro  r  r   r   r   r  r  r2  r5  r6  r7  r9  r>  rA  rG  rK  rL  rU  rW  rX  rZ  r]  r_  r`  ra  rb  rg  rl  rp  rt  rw  rx  rz  r{  r|  r}  r  r  r  r  rd  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  rc  r  rh  r  r  r  r  r  r  r
  r  r  r  r  r  r  r  r  r%  r'  r(  r  r   r9  r:  r=  rB   r@  r   r  r  r  r=  r>  r?  r@  rE  rF  rG  rH  rI  rQ  rR  rS  rW  rj  rm  rx  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