B
    d2]             /   @   s  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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 dd	l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)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lHmIZImJZJmKZK ddlLmMZM ddlNmOZO ddlPmQZQ e3ReSZTedZUed ZVdddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIg/ZWdJdKdLdMdNdOdPdQgZXdRdSgdTdUgdVdWgdXdYgdZd[gd\d]d^gd_d`dadbgdcddgdedfgdgdhdigdjdkggZYdldmdgdZdedfdndodpdqg
ZZdrdsdtdudvdwdxdydzd{d|d}d~dgZ[dZ\dddgZ]e^dej_Z`e^dZaG dd debZcG dd de6ZdG dd de6ZeG dd dedZfG dd dedZgG dd degZhG dd dehZiG dd dehZjG dd dehZkG dd dehZlG dd degZmG dd degZnG dd dedZoG dd deoZpG dd deoZqG dd deoZrG dd deoZsG dd deoZtG dd degZuG dd degZvG dd degZwG dd degZxG dd degZyG dd degZzG dd dedZ{G dd degZ|G dd degZ}G dd dedZ~G dd de~ZG dd de~ZG dd dedZG ddĄ dedZG ddƄ de6ZG ddȄ dedZG ddʄ dedZG dd̄ dedZG dd΄ deZG ddЄ deZG dd҄ deZG ddԄ deZG ddք de7ZG dd؄ dedZG ddڄ dedZG dd܄ dedZG ddބ dedZG dd dedZG dd dedZG dd dedZG dd dedZG dd dedZG dd dedZG dd de6ZG dd dZG dd dZG dd dZG dd de8ZefdddZG dd de"e ZG dd deZeKde)dddd deJde)ddddeIde)dd	d
deIde)dd	ddg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ZG dd deZG dd deZG dd deMZG dd  d eMZG d!d" d"eM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eef d/d0d1ZdS (2  zThe C language domain.    N)AnyCallableDict	GeneratorIteratorListOptionalTupleTypeVarUnioncast)nodes)ElementNodeTextElementsystem_message)
directives)addnodes)pending_xref)Sphinx)Builder)RemovedInSphinx60Warning)ObjectDescription)DomainObjType)BuildEnvironment)___)
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
TypedField)SphinxDirective)make_refnode)
OptionSpecT)	ASTStructASTUnionASTEnumASTEnumeratorASTTypeASTTypeWithInitASTMacroautobreakcasecharconstcontinuedefaultdodoubleelseenumexternfloatforZgotoifinlineintlongregisterrestrictreturnshortsignedsizeofstaticstructswitchtypedefunionZunsignedvoidvolatilewhileZ_AlignasZ_AlignofZ_AtomicZ_BoolZ_ComplexZ
_Decimal32Z
_Decimal64Z_Decimal128Z_GenericZ
_ImaginaryZ	_NoreturnZ_Static_assert_Thread_localZalignasalignofboolcomplex	imaginaryZnoreturnZstatic_assertthread_localz||orz&&and|Zbitor^xor&Zbitandz==z!=Znot_eqz<=z>=<>z<<z>>+-*/%z.*z->*z++z--!not~Zcompl=z*=z/=z%=z+=z-=z>>=z<<=z&=Zand_eqz^=Zxor_eqz|=Zor_eq   zc.zCv2.z>[LuU8]?('([^'\\]*(?:\\.[^'\\]*)*)'|"([^"\\]*(?:\\.[^"\\]*)*)")an  (?x)
    \b(
    void|_Bool
    |signed|unsigned
    |short|long
    |char
    |int
    |__uint128|__int128
    |__int(8|16|32|64|128)  # extension
    |float|double
    |_Decimal(32|64|128)
    |_Complex|_Imaginary
    |__float80|_Float64x|__float128|_Float128|__ibm128  # extension
    |__fp16  # extension
    |_Sat|_Fract|fract|_Accum|accum  # extension
    )\b
c               @   s,   e Zd ZddddddZeddd	ZdS )
_DuplicateSymbolErrorSymbolASTDeclarationN)symboldeclarationrX   c             C   s    |st |st || _|| _d S )N)AssertionErrorr   r   )selfr   r    r   ]/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/sphinx/domains/c.py__init__l   s    z_DuplicateSymbolError.__init__)rX   c             C   s   d| j d S )Nz%Internal C duplicate symbol error:
%sr   )r   dump)r   r   r   r   __str__r   s    z_DuplicateSymbolError.__str__)__name__
__module____qualname__r   strr   r   r   r   r   r|   k   s   r|   c               @   s"   e Zd ZeeddddddZdS )ASTBaser   r}   N)signodemodeenvr   rX   c             C   s   t t| d S )N)NotImplementedErrorrepr)r   r   r   r   r   r   r   r   describe_signaturew   s    zASTBase.describe_signature)r   r   r   r   r   r   r   r   r   r   r   v   s   r   c               @   sn   e Zd ZeddddZeedddZedd	d
ZedddZ	edddZ
eededddddZdS )ASTIdentifierN)
identifierrX   c             C   s&   |d k	st t|dkst || _d S )Nr   )r   lenr   )r   r   r   r   r   r      s    zASTIdentifier.__init__)otherrX   c             C   s   t |tko| j|jkS )N)typer   r   )r   r   r   r   r   __eq__   s    zASTIdentifier.__eq__)rX   c             C   s   | j d dkS )Nr   @)r   )r   r   r   r   is_anon   s    zASTIdentifier.is_anonc             C   s   | j S )N)r   )r   r   r   r   r      s    zASTIdentifier.__str__c             C   s   |   rdS | jS )Nz[anonymous])r   r   )r   r   r   r   get_display_string   s    z ASTIdentifier.get_display_stringr   r}   )r   r   r   prefixr   rX   c       
      C   s   t | |  rtjdd}nt| j| j}|dkrt|| j }tjddd|d d d}| |d< ||7 }||7 }n@|d	krt }	|	|7 }	||	7 }n|d
kr||7 }ntd| d S )Nz[anonymous])textmarkType cr   )Z	refdomainZreftypeZ	reftargetmodname	classnamezc:parent_key
lastIsName
noneIsNamezUnknown description mode: %s)	r5   r   r   desc_sig_namer   r   get_lookup_key	desc_name	Exception)
r   r   r   r   r   r   nodeZ
targetTextpnodeZnameNoder   r   r   r      s(    



z ASTIdentifier.describe_signature)r   r   r   r   r   r   rf   r   r   r   r   r   r   r   r   r   r   r      s   r   c               @   sj   e Zd Zee e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ddddZdS )ASTNestedNameN)namesrootedrX   c             C   s    t |dkst|| _|| _d S )Nr   )r   r   r   r   )r   r   r   r   r   r   r      s    zASTNestedName.__init__)rX   c             C   s   | S )Nr   )r   r   r   r   name   s    zASTNestedName.name)versionrX   c             C   s   d dd | jD S )N.c             s   s   | ]}t |V  qd S )N)r   ).0nr   r   r   	<genexpr>   s    z'ASTNestedName.get_id.<locals>.<genexpr>)joinr   )r   r   r   r   r   get_id   s    zASTNestedName.get_id)	transformrX   c                s0   d  fdd| jD }| jr(d| S |S d S )Nr   c             3   s   | ]} |V  qd S )Nr   )r   r   )r   r   r   r      s    z+ASTNestedName._stringify.<locals>.<genexpr>)r   r   r   )r   r   resr   )r   r   
_stringify   s    zASTNestedName._stringifyr   r}   )r   r   r   r   rX   c             C   s"  t | |dkr| jr,td|td7 }xPtt| jD ]>}|dkr^td|td7 }| j| }||||d| q<W n|dkr| jrtt	| t| jdkst| jd |d|d| nT|dkrd}d	}|d
kr| jd d n| j}	|}
|d
krt
 }
| jrX|d7 }|d
krHt|	dkrH|t
dd7 }n|
t
dd7 }
xltt|	D ]\}|	| }|s|
t
dd7 }
|d7 }d}t	|}|dkr||
d||| ||7 }qfW |d
krt| jdkr|
t
dd7 }
||
7 }| jd |||d| ntd| d S )Nr   zCan this happen?r   r   r   paramr{   )r   r   markNameTr   Fr   zUnknown description mode: %s)r5   r   r   r   Textranger   r   r   r   r   Zdesc_addnamedesc_sig_punctuationr   )r   r   r   r   r   ir   r   firstr   destidentZ	txt_identr   r   r   r      sV    




z ASTNestedName.describe_signature)r   r   r   r   r   rf   r   propertyr   rT   r   r   r)   r   r   r   r   r   r   r   r      s   r   c               @   s   e Zd ZdS )ASTExpressionN)r   r   r   r   r   r   r   r      s   r   c               @   s   e Zd ZdS )
ASTLiteralN)r   r   r   r   r   r   r   r     s   r   c               @   sB   e Zd ZeddddZeedddZeedd	dd
ddZ	dS )ASTBooleanLiteralN)valuerX   c             C   s
   || _ d S )N)r   )r   r   r   r   r   r     s    zASTBooleanLiteral.__init__)r   rX   c             C   s   | j r
dS dS d S )Ntruefalse)r   )r   r   r   r   r   r     s    zASTBooleanLiteral._stringifyr   r}   )r   r   r   r   rX   c             C   s   t | }|t||7 }d S )N)r   r   desc_sig_keyword)r   r   r   r   r   txtr   r   r   r     s    z$ASTBooleanLiteral.describe_signature)
r   r   r   rf   r   r)   r   r   r   r   r   r   r   r   r   
  s   r   c               @   sB   e Zd ZeddddZeedddZeedd	dd
ddZdS )ASTNumberLiteralN)datarX   c             C   s
   || _ d S )N)r   )r   r   r   r   r   r     s    zASTNumberLiteral.__init__)r   rX   c             C   s   | j S )N)r   )r   r   r   r   r   r     s    zASTNumberLiteral._stringifyr   r}   )r   r   r   r   rX   c             C   s   t | }|t||7 }d S )N)r   r   Zdesc_sig_literal_number)r   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     s   r   c               @   sD   e Zd ZeeddddZeedddZeedd	dd
ddZdS )ASTCharLiteralN)r   r   rX   c             C   s>   || _ || _| d}t|dkr2t|| _nt|d S )Nzunicode-escaper{   )r   r   encodedecoder   ordr   r*   )r   r   r   decodedr   r   r   r   (  s    zASTCharLiteral.__init__)r   rX   c             C   s0   | j d krd| j d S | j d | j d S d S )N')r   r   )r   r   r   r   r   r   1  s    
zASTCharLiteral._stringifyr   r}   )r   r   r   r   rX   c             C   s   t | }|t||7 }d S )N)r   r   Zdesc_sig_literal_char)r   r   r   r   r   r   r   r   r   r   7  s    z!ASTCharLiteral.describe_signature)	r   r   r   r   r   r)   r   r   r   r   r   r   r   r   '  s   	r   c               @   sB   e Zd ZeddddZeedddZeedd	dd
ddZdS )ASTStringLiteralN)r   rX   c             C   s
   || _ d S )N)r   )r   r   r   r   r   r   >  s    zASTStringLiteral.__init__)r   rX   c             C   s   | j S )N)r   )r   r   r   r   r   r   A  s    zASTStringLiteral._stringifyr   r}   )r   r   r   r   rX   c             C   s   t | }|t||7 }d S )N)r   r   Zdesc_sig_literal_string)r   r   r   r   r   r   r   r   r   r   D  s    z#ASTStringLiteral.describe_signature)	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 )ASTIdExpression)r   c             C   s
   || _ d S )N)r   )r   r   r   r   r   r   K  s    zASTIdExpression.__init__)r   rX   c             C   s
   || j S )N)r   )r   r   r   r   r   r   O  s    zASTIdExpression._stringify)r   rX   c             C   s   | j |S )N)r   r   )r   r   r   r   r   r   R  s    zASTIdExpression.get_idr   r}   N)r   r   r   r   rX   c             C   s   | j |||| d S )N)r   r   )r   r   r   r   r   r   r   r   r   U  s    z"ASTIdExpression.describe_signature)r   r   r   r   r   r)   r   r   rT   r   r   r   r   r   r   r   r   J  s
   r   c               @   sJ   e Zd Z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 )ASTParenExprc             C   s
   || _ d S )N)expr)r   r   r   r   r   r   [  s    zASTParenExpr.__init__)r   rX   c             C   s   d|| j  d S )N())r   )r   r   r   r   r   r   ^  s    zASTParenExpr._stringify)r   rX   c             C   s   | j |S )N)r   r   )r   r   r   r   r   r   a  s    zASTParenExpr.get_idr   r}   N)r   r   r   r   rX   c             C   s6   |t dd7 }| j|||| |t dd7 }d S )Nr   r   )r   r   r   r   )r   r   r   r   r   r   r   r   r   d  s    zASTParenExpr.describe_signature)r   r   r   r   r)   r   r   rT   r   r   r   r   r   r   r   r   Z  s
   r   c               @   s   e Zd ZdS )ASTPostfixOpN)r   r   r   r   r   r   r   r   n  s   r   c               @   sF   e Zd Zed ddddZeedddZeed	d
ddddZ	dS )ASTPostfixCallExpr)ASTParenExprListASTBracedInitListN)lstrX   c             C   s
   || _ d S )N)r   )r   r   r   r   r   r   s  s    zASTPostfixCallExpr.__init__)r   rX   c             C   s
   || j S )N)r   )r   r   r   r   r   r   v  s    zASTPostfixCallExpr._stringifyr   r}   )r   r   r   r   rX   c             C   s   | j |||| d S )N)r   r   )r   r   r   r   r   r   r   r   r   y  s    z%ASTPostfixCallExpr.describe_signature)
r   r   r   r   r   r)   r   r   r   r   r   r   r   r   r   r  s   r   c               @   sB   e Zd ZeddddZeedddZeedd	dd
ddZ	dS )ASTPostfixArrayN)r   rX   c             C   s
   || _ d S )N)r   )r   r   r   r   r   r     s    zASTPostfixArray.__init__)r   rX   c             C   s   d|| j  d S )N[])r   )r   r   r   r   r   r     s    zASTPostfixArray._stringifyr   r}   )r   r   r   r   rX   c             C   s6   |t dd7 }| j|||| |t dd7 }d S )Nr   r   )r   r   r   r   )r   r   r   r   r   r   r   r   r     s    z"ASTPostfixArray.describe_signature)
r   r   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 )
ASTPostfixInc)r   rX   c             C   s   dS )Nz++r   )r   r   r   r   r   r     s    zASTPostfixInc._stringifyr   r}   N)r   r   r   r   rX   c             C   s   |t dd7 }d S )Nz++)r   desc_sig_operator)r   r   r   r   r   r   r   r   r     s    z ASTPostfixInc.describe_signature)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 )
ASTPostfixDec)r   rX   c             C   s   dS )Nz--r   )r   r   r   r   r   r     s    zASTPostfixDec._stringifyr   r}   N)r   r   r   r   rX   c             C   s   |t dd7 }d S )Nz--)r   r   )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     s   r   c               @   s:   e Zd Zdd ZeedddZeedddd	d
dZdS )ASTPostfixMemberOfPointerc             C   s
   || _ d S )N)r   )r   r   r   r   r   r     s    z"ASTPostfixMemberOfPointer.__init__)r   rX   c             C   s   d|| j  S )Nz->)r   )r   r   r   r   r   r     s    z$ASTPostfixMemberOfPointer._stringifyr   r}   N)r   r   r   r   rX   c             C   s&   |t dd7 }| j|d|| d S )Nz->r   )r   r   r   r   )r   r   r   r   r   r   r   r   r     s    z,ASTPostfixMemberOfPointer.describe_signature)	r   r   r   r   r)   r   r   r   r   r   r   r   r   r     s   r   c               @   sF   e Zd Zeee dddZeedddZ	e
eddd	d
ddZd	S )ASTPostfixExpr)r   	postFixesc             C   s   || _ || _d S )N)r   r   )r   r   r   r   r   r   r     s    zASTPostfixExpr.__init__)r   rX   c             C   s4   || j g}x| jD ]}||| qW d|S )Nr   )r   r   appendr   )r   r   r   pr   r   r   r     s    zASTPostfixExpr._stringifyr   r}   N)r   r   r   r   rX   c             C   s6   | j |||| x| jD ]}||||| qW d S )N)r   r   r   )r   r   r   r   r   r   r   r   r   r     s    z!ASTPostfixExpr.describe_signature)r   r   r   r   r   r   r   r)   r   r   r   r   r   r   r   r   r     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 )ASTUnaryOpExpr)opr   c             C   s   || _ || _d S )N)r   r   )r   r   r   r   r   r   r     s    zASTUnaryOpExpr.__init__)r   rX   c             C   s6   | j d dkr"| j d || j S | j || j S d S )Nr   cn )r   r   )r   r   r   r   r   r     s    zASTUnaryOpExpr._stringifyr   r}   N)r   r   r   r   rX   c             C   sZ   | j d dkr0|t| j | j 7 }|t 7 }n|t| j | j 7 }| j|||| d S )Nr   r   )r   r   r   desc_sig_spacer   r   r   )r   r   r   r   r   r   r   r   r     s
    z!ASTUnaryOpExpr.describe_signature)
r   r   r   r   r   r   r)   r   r   r   r   r   r   r   r     s   r   c               @   s:   e Zd Zdd ZeedddZeedddd	d
dZdS )ASTSizeofTypec             C   s
   || _ d S )N)typ)r   r   r   r   r   r     s    zASTSizeofType.__init__)r   rX   c             C   s   d|| j  d S )Nzsizeof(r   )r   )r   r   r   r   r   r     s    zASTSizeofType._stringifyr   r}   N)r   r   r   r   rX   c             C   sF   |t dd7 }|t dd7 }| j|||| |t dd7 }d S )Nr[   r   r   )r   r   r   r   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     s   r   c               @   s@   e Zd ZedddZeedddZeeddd	d
ddZ	d	S )ASTSizeofExpr)r   c             C   s
   || _ d S )N)r   )r   r   r   r   r   r     s    zASTSizeofExpr.__init__)r   rX   c             C   s   d|| j  S )Nzsizeof )r   )r   r   r   r   r   r     s    zASTSizeofExpr._stringifyr   r}   N)r   r   r   r   rX   c             C   s2   |t dd7 }|t  7 }| j|||| d S )Nr[   )r   r   r   r   r   )r   r   r   r   r   r   r   r   r     s    z ASTSizeofExpr.describe_signature)
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ZeedddZeedd	d
dddZd
S )ASTAlignofExprrA   )r   c             C   s
   || _ d S )N)r   )r   r   r   r   r   r     s    zASTAlignofExpr.__init__)r   rX   c             C   s   d|| j  d S )Nzalignof(r   )r   )r   r   r   r   r   r     s    zASTAlignofExpr._stringifyr   r}   N)r   r   r   r   rX   c             C   sF   |t dd7 }|t dd7 }| j|||| |t dd7 }d S )Nre   r   r   )r   r   r   r   r   )r   r   r   r   r   r   r   r   r     s    z!ASTAlignofExpr.describe_signature)	r   r   r   r   r)   r   r   r   r   r   r   r   r   r     s   r   c               @   sB   e Zd ZdedddZeedddZeedd	d
dddZ	d
S )ASTCastExprrA   )r   r   c             C   s   || _ || _d S )N)r   r   )r   r   r   r   r   r   r     s    zASTCastExpr.__init__)r   rX   c             C   s:   dg}| || j | d | || j d|S )Nr   r   r   )r   r   r   r   )r   r   r   r   r   r   r   	  s
    
zASTCastExpr._stringifyr   r}   N)r   r   r   r   rX   c             C   sH   |t dd7 }| j|||| |t dd7 }| j|||| d S )Nr   r   )r   r   r   r   r   )r   r   r   r   r   r   r   r   r     s    zASTCastExpr.describe_signature)
r   r   r   r   r   r)   r   r   r   r   r   r   r   r   r     s   r   c               @   sJ   e Zd Zee ee dddZeedddZe	eddd	d
ddZ
d	S )ASTBinOpExpr)exprsopsc             C   s8   t |dkstt |t |d ks(t|| _|| _d S )Nr   r{   )r   r   r   r   )r   r   r   r   r   r   r     s    zASTBinOpExpr.__init__)r   rX   c             C   sx   g }| || jd  xTtdt| jD ]@}| d | | j|d   | d | || j|  q*W d|S )Nr   r{   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   r   r     s    

zASTBinOpExpr._stringifyr   r}   N)r   r   r   r   rX   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{   az)
r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   )  s    (zASTBinOpExpr.describe_signature)r   r   r   r   r   r   r   r)   r   r   r   r   r   r   r   r     s   
r   c               @   sJ   e Zd Zee ee dddZeedddZe	eddd	d
ddZ
d	S )ASTAssignmentExpr)r   r   c             C   s8   t |dkstt |t |d ks(t|| _|| _d S )Nr   r{   )r   r   r   r   )r   r   r   r   r   r   r   8  s    zASTAssignmentExpr.__init__)r   rX   c             C   sx   g }| || jd  xTtdt| jD ]@}| d | | j|d   | d | || j|  q*W d|S )Nr   r{   r   r   )r   r   r   r   r   r   )r   r   r   r   r   r   r   r   >  s    

zASTAssignmentExpr._stringifyr   r}   N)r   r   r   r   rX   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   r   )
r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   H  s    (z$ASTAssignmentExpr.describe_signature)r   r   r   r   r   r   r   r)   r   r   r   r   r   r   r   r   7  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)r   c             C   s
   || _ d S )N)r   )r   r   r   r   r   r   W  s    zASTFallbackExpr.__init__)r   rX   c             C   s   | j S )N)r   )r   r   r   r   r   r   Z  s    zASTFallbackExpr._stringify)r   rX   c             C   s
   t | jS )N)r   r   )r   r   r   r   r   r   ]  s    zASTFallbackExpr.get_idr   r}   N)r   r   r   r   rX   c             C   s   |t | j| j7 }d S )N)r   literalr   )r   r   r   r   r   r   r   r   r   `  s    z"ASTFallbackExpr.describe_signature)r   r   r   r   r   r)   r   rT   r   r   r   r   r   r   r   r   V  s
   r   c               @   s   e Zd ZdS )ASTTrailingTypeSpecN)r   r   r   r   r   r   r   r   i  s   r   c               @   sF   e Zd Zee ddddZeedddZeedd	dd
ddZ	dS )ASTTrailingTypeSpecFundamentalN)r   rX   c             C   s   t |dkst|| _d S )Nr   )r   r   r   )r   r   r   r   r   r   n  s    z'ASTTrailingTypeSpecFundamental.__init__)r   rX   c             C   s   d | jS )Nr   )r   r   )r   r   r   r   r   r   r  s    z)ASTTrailingTypeSpecFundamental._stringifyr   r}   )r   r   r   r   rX   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   u  s    z1ASTTrailingTypeSpecFundamental.describe_signature)
r   r   r   r   r   r   r)   r   r   r   r   r   r   r   r   m  s   r   c               @   sV   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 )ASTTrailingTypeSpecNameN)r   
nestedNamerX   c             C   s   || _ || _d S )N)r   r   )r   r   r   r   r   r   r     s    z ASTTrailingTypeSpecName.__init__)rX   c             C   s   | j S )N)r   )r   r   r   r   r     s    zASTTrailingTypeSpecName.name)r   rX   c             C   s:   g }| j r || j  |d ||| j d|S )Nr   r   )r   r   r   r   )r   r   r   r   r   r   r     s    
z"ASTTrailingTypeSpecName._stringifyr   r}   )r   r   r   r   rX   c             C   s>   | j r&|t| j | j 7 }|t 7 }| jj||||d d S )N)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   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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 )ASTFunctionParameterFrB   N)argellipsisrX   c             C   s   || _ || _d S )N)r  r  )r   r  r  r   r   r   r     s    zASTFunctionParameter.__init__r}   )r   
objectTyper   rX   c             C   s   |j jj|ddS )NF)prefixed)parentr   r   )r   r   r  r   r   r   r   r     s    zASTFunctionParameter.get_id)r   rX   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   rX   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)r   r   r   r   rf   r   rT   r   r   r)   r   r   r   r   r   r   r   r     s
   r   c               @   s^   e Zd Z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dddZdS )ASTParametersN)argsattrsrX   c             C   s   || _ || _d S )N)r  r  )r   r  r  r   r   r   r     s    zASTParameters.__init__)rX   c             C   s   | j S )N)r  )r   r   r   r   function_params  s    zASTParameters.function_params)r   rX   c             C   s~   g }| d d}x.| jD ]$}|s,| d d}| t| qW | d t| jdkrt| d | || j d|S )	Nr   Tz, Fr   r   r   r   )r   r  r   r   r  r   )r   r   r   r   r   r   r   r   r     s    



zASTParameters._stringifyr   r}   )r   r   r   r   rX   c       	      C   s   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| j	dkr|t 7 }| j	| d S )Nr   r   T)noemphr   )r   r   ,Fr   r   r   )
r5   r   desc_parameterlistr  desc_parameterr   r   r   r   r  )	r   r   r   r   r   	paramlistr  r   r   r   r   r   r     s(    
z ASTParameters.describe_signature)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eeeeeddddZd d dddZeedd	d
Z	e
e ddddZdS )ASTDeclSpecsSimpleN)storagethreadLocalrS   rW   rb   rH   r  rX   c             C   s.   || _ || _|| _|| _|| _|| _|| _d S )N)r  r  rS   rW   rb   rH   r  )r   r  r  rS   rW   rb   rH   r  r   r   r   r     s    zASTDeclSpecsSimple.__init__)r   rX   c          	   C   sT   |s| S t | jp|j| jp|j| jp(|j| jp2|j| jp<|j| jpF|j| j|j S )N)r  r  r  rS   rb   rH   rW   r  )r   r   r   r   r   	mergeWith  s    




zASTDeclSpecsSimple.mergeWith)r   rX   c             C   s   g }t | jdkr"||| j | jr4|| j | jrF|| j | jrV|d | jrf|d | jrv|d | jr|d d	|S )Nr   rS   rW   rb   rH   r   )
r   r  r   r  r  rS   rW   rb   rH   r   )r   r   r   r   r   r   r     s     



zASTDeclSpecsSimple._stringify)	modifiersrX   c             C   s   t t td ddd}t|dkr>t| jdkr>|t  t	 }| j
| ||j | jrp||| j | jr||| j | jr||d | jr||d | jr||d | jr||d d S )	N)r  r   rX   c             S   s0   t | dkr| t  | t|| d S )Nr   )r   r   r   r   r   )r  r   r   r   r   _add  s    z3ASTDeclSpecsSimple.describe_signature.<locals>._addr   rS   rW   rb   rH   )r   r   r   r   r  r   r   r   r   r   r   extendchildrenr  r  rS   rW   rb   rH   )r   r  r  ZtempNoder   r   r   r     s$    


z%ASTDeclSpecsSimple.describe_signature)r   r   r   r   rf   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 )ASTDeclSpecsN)outer	leftSpecs
rightSpecstrailingrX   c             C   s,   || _ || _|| _| j| j| _|| _d S )N)r  r  r  r  ZallSpecstrailingTypeSpec)r   r  r  r  r  r   r   r   r   &  s
    zASTDeclSpecs.__init__)r   rX   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   lrr   r   r   r   2  s    





zASTDeclSpecs._stringifyr   r}   )r   r   r   r   rX   c             C   s   t | g }| j| x|D ]}||7 }qW | jrt|dkrL|t 7 }| jj||||d g }| j| t|dkr|t 7 }x|D ]}||7 }qW d S )Nr   )r   )r5   r  r   r  r   r   r   r  )r   r   r   r   r   r  mr   r   r   r   B  s     

zASTDeclSpecs.describe_signature)r   r   r   r   r  r   r   r)   r   r   r   r   r   r   r   r  %  s   	r  c               @   sJ   e Zd ZeeeeeedddZeedddZe	eddd	d
ddZ
d	S )ASTArray)r\   rH   rb   rW   vlasizec             C   sH   || _ || _|| _|| _|| _|| _|r4|d ks4t|d k	rD|rDtd S )N)r\   rH   rb   rW   r!  r"  r   )r   r\   rH   rb   rW   r!  r"  r   r   r   r   \  s    zASTArray.__init__)r   rX   c             C   s   g }| j r|d | jr$|d | jr4|d | jrD|d | jr\dd| d S | jrr||| j dd| d S )	Nr\   rW   rb   rH   r   r   z*]r   )r\   r   rW   rb   rH   r!  r   r"  )r   r   elr   r   r   r   i  s    



zASTArray._stringifyr   r}   N)r   r   r   r   rX   c                s   t | |tdd7 }d tttd fdd}| jrB||d | jrR||d | jrb||d | j	rr||d	 | j
r|td
d
7 }n(| jr r|t 7 }| j|d|| |tdd7 }d S )Nr   F)r   r   rX   c                s$    r| t  7 } | t ||7 } dS )NT)r   r   r   )r   r   )addSpacer   r   r    s    z)ASTArray.describe_signature.<locals>._addr\   rW   rb   rH   rt   r   r   )r5   r   r   r   r   rf   r\   rW   rb   rH   r!  r"  r   r   )r   r   r   r   r   r  r   )r$  r   r   y  s&    



zASTArray.describe_signature)r   r   r   rf   r   r   r)   r   r   r   r   r   r   r   r   r   [  s
   r   c               @   sB   e Zd ZeedddZeee dddZe	dddZ
dS )	ASTDeclarator)rX   c             C   s   t t| d S )N)r   r   )r   r   r   r   r     s    zASTDeclarator.namec             C   s   t t| d S )N)r   r   )r   r   r   r   r	    s    zASTDeclarator.function_paramsc             C   s   t t| d S )N)r   r   )r   r   r   r   require_space_after_declSpecs  s    z+ASTDeclarator.require_space_after_declSpecsN)r   r   r   r   r   r   r   r   r	  rf   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e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 )ASTDeclaratorNameParamN)declIdarrayOpsr   rX   c             C   s   || _ || _|| _d S )N)r(  r)  r   )r   r(  r)  r   r   r   r   r     s    zASTDeclaratorNameParam.__init__)rX   c             C   s   | j S )N)r(  )r   r   r   r   r     s    zASTDeclaratorNameParam.namec             C   s   | j jS )N)r   r	  )r   r   r   r   r	    s    z&ASTDeclaratorNameParam.function_paramsc             C   s
   | j d k	S )N)r(  )r   r   r   r   r&    s    z4ASTDeclaratorNameParam.require_space_after_declSpecs)r   rX   c             C   sX   g }| j r||| j  x| jD ]}||| q"W | jrN||| j d|S )Nr   )r(  r   r)  r   r   )r   r   r   r   r   r   r   r     s    z!ASTDeclaratorNameParam._stringifyr   r}   )r   r   r   r   rX   c             C   s\   t | | jr | j|||| x| jD ]}||||| q(W | jrX| j|||| d S )N)r5   r(  r   r)  r   )r   r   r   r   r   r   r   r   r   r     s    z)ASTDeclaratorNameParam.describe_signature)r   r   r   r   r   r   r  r   r   r   r   r	  rf   r&  r)   r   r   r   r   r   r   r   r   r'    s   
r'  c               @   sb   e Zd Zee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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__)rX   c             C   s   | j S )N)r(  )r   r   r   r   r     s    zASTDeclaratorNameBitField.namec             C   s
   | j d k	S )N)r(  )r   r   r   r   r&    s    z7ASTDeclaratorNameBitField.require_space_after_declSpecs)r   rX   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}   N)r   r   r   r   rX   c             C   s^   t | | jr | j|||| |t 7 }|tdd7 }|t 7 }| j|||| d S )N:)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   r   r   r   r   rf   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edddZ	ee
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 )ASTDeclaratorPtrN)nextrW   rb   rH   r  rX   c             C   s*   |st || _|| _|| _|| _|| _d S )N)r   r-  rW   rb   rH   r  )r   r-  rW   rb   rH   r  r   r   r   r     s    zASTDeclaratorPtr.__init__)rX   c             C   s   | j jS )N)r-  r   )r   r   r   r   r     s    zASTDeclaratorPtr.namec             C   s   | j jS )N)r-  r	  )r   r   r   r   r	    s    z ASTDeclaratorPtr.function_paramsc             C   s*   | j p(| jp(| jp(t| jdkp(| j S )Nr   )rH   rb   rW   r   r  r-  r&  )r   r   r   r   r&    s    z.ASTDeclaratorPtr.require_space_after_declSpecs)r   rX   c             C   s   dg}| || j t| jdkr@| js6| js6| jr@| d | jrP| d | jrp| jrf| d | d | jr| js| jr| d | d | js| js| jst| jdkr| j r| d | || j d|S )Nrt   r   r   rW   rb   rH   r   )	r   r  r   rW   rb   rH   r-  r&  r   )r   r   r   r   r   r   r     s&     





 

zASTDeclaratorPtr._stringifyr   r}   )r   r   r   r   rX   c             C   s  t | |tdd7 }| j| t| jdkrP| jsD| jsD| jrP|t	 7 }t
td ddd}| jrr||d | jr| jr|t	 7 }||d | jr| js| jr|t	 7 }||d | js| js| jst| jdkr| j r|t	 7 }| j|||| d S )	Nrt   r   )r   r   rX   c             S   s   | t ||7 } d S )N)r   r   )r   r   r   r   r   	_add_anno!  s    z6ASTDeclaratorPtr.describe_signature.<locals>._add_annorW   rb   rH   )r5   r   r   r  r   r   rW   rb   rH   r   r   r   r-  r&  )r   r   r   r   r   r.  r   r   r   r     s(     


 
z#ASTDeclaratorPtr.describe_signature)r   r   r   r%  rf   r#   r   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d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ZeeddddddZdS )ASTDeclaratorParenN)innerr-  rX   c             C   s    |st |st || _|| _d S )N)r   r0  r-  )r   r0  r-  r   r   r   r   5  s    zASTDeclaratorParen.__init__)rX   c             C   s   | j jS )N)r0  r   )r   r   r   r   r   <  s    zASTDeclaratorParen.namec             C   s   | j jS )N)r0  r	  )r   r   r   r   r	  @  s    z"ASTDeclaratorParen.function_paramsc             C   s   dS )NTr   )r   r   r   r   r&  D  s    z0ASTDeclaratorParen.require_space_after_declSpecs)r   rX   c             C   s:   dg}| || j | d | || j d|S )Nr   r   r   )r   r0  r-  r   )r   r   r   r   r   r   r   G  s
    
zASTDeclaratorParen._stringifyr   r}   )r   r   r   r   rX   c             C   sP   t | |tdd7 }| j|||| |tdd7 }| j|d|| d S )Nr   r   r   )r5   r   r   r0  r   r-  )r   r   r   r   r   r   r   r   r   N  s
    z%ASTDeclaratorParen.describe_signature)r   r   r   r%  r   r   r   r   r   r   r	  rf   r&  r)   r   r   r   r   r   r   r   r   r/  4  s   r/  c               @   sF   e Zd Zee ddddZeedddZe	edd	dd
ddZ
dS )r   N)r   rX   c             C   s
   || _ d S )N)r   )r   r   r   r   r   r   [  s    zASTParenExprList.__init__)r   rX   c                s"    fdd| j D }dd| S )Nc                s   g | ]} |qS r   r   )r   e)r   r   r   
<listcomp>_  s    z/ASTParenExprList._stringify.<locals>.<listcomp>z(%s)z, )r   r   )r   r   r   r   )r   r   r   ^  s    zASTParenExprList._stringifyr   r}   )r   r   r   r   rX   c             C   sv   t | |tdd7 }d}xD| jD ]:}|sJ|tdd7 }|t 7 }nd}||||| q$W |tdd7 }d S )Nr   Tr  Fr   )r5   r   r   r   r   r   )r   r   r   r   r   r   r1  r   r   r   r   b  s    z#ASTParenExprList.describe_signature)r   r   r   r   r   r   r)   r   r   r   r   r   r   r   r   r   Z  s   r   c               @   sH   e Zd Z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 )r   N)r   trailingCommarX   c             C   s   || _ || _d S )N)r   r3  )r   r   r3  r   r   r   r   r  s    zASTBracedInitList.__init__)r   rX   c                s4    fdd| j D }| jrdnd}dd||f S )Nc                s   g | ]} |qS r   r   )r   r1  )r   r   r   r2  w  s    z0ASTBracedInitList._stringify.<locals>.<listcomp>r  r   z{%s%s}z, )r   r3  r   )r   r   r   r3  r   )r   r   r   v  s    zASTBracedInitList._stringifyr   r}   )r   r   r   r   rX   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   r   r   r   r3  )r   r   r   r   r   r   r1  r   r   r   r   {  s    z$ASTBracedInitList.describe_signature)r   r   r   r   r   rf   r   r)   r   r   r   r   r   r   r   r   r   q  s   r   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)r   	hasAssignrX   c             C   s   || _ || _d S )N)r   r7  )r   r   r7  r   r   r   r     s    zASTInitializer.__init__)r   rX   c             C   s    || j }| jrd| S |S d S )Nz = )r   r7  )r   r   valr   r   r   r     s    
zASTInitializer._stringifyr   r}   )r   r   r   r   rX   c             C   sL   t | | jr6|t 7 }|tdd7 }|t 7 }| j|d|| d S )Nrz   r   )r5   r7  r   r   r   r   r   )r   r   r   r   r   r   r   r   r     s    z!ASTInitializer.describe_signature)T)r   r   r   r   r   r   rf   r   r)   r   r   r   r   r   r   r   r   r6    s   r6  c               @   s   e Zd ZeeddddZeedddZe	e
de
d	d
dZe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 )rA   N)	declSpecsdeclrX   c             C   s    |st |st || _|| _d S )N)r   r9  r:  )r   r9  r:  r   r   r   r     s    zASTType.__init__)rX   c             C   s   | j jS )N)r:  r   )r   r   r   r   r     s    zASTType.namer}   )r   r  r   rX   c             C   s   |  |S )N)get_full_nested_namer   )r   r   r  r   r   r   r   r     s    zASTType.get_idc             C   s   | j jS )N)r:  r	  )r   r   r   r   r	    s    zASTType.function_params)r   rX   c             C   sR   g }|| j }|| | j r8t|dkr8|d ||| j d|S )Nr   r   r   )r9  r   r:  r&  r   r   )r   r   r   r9  r   r   r   r     s    


zASTType._stringifyc             C   s   | j jrdS dS d S )Nr_   r   )r9  r  )r   r   r   r   get_type_declaration_prefix  s    z#ASTType.get_type_declaration_prefixr   )r   r   r   r   rX   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   r9  r   r:  r&  r   r   r   r   )r   r   r   r   r   r   r   r   r     s    
zASTType.describe_signature)r   r   r   r  r%  r   r   r   r   rT   r   r   r   r   r	  r)   r   r<  r   r   r   r   r   r   rA     s   	rA   c               @   sj   e Zd ZeeddddZee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 )rB   N)r   initrX   c             C   s   || _ || _d S )N)r   r=  )r   r   r=  r   r   r   r     s    zASTTypeWithInit.__init__)rX   c             C   s   | j jS )N)r   r   )r   r   r   r   r     s    zASTTypeWithInit.namer}   )r   r  r   rX   c             C   s   | j |||S )N)r   r   )r   r   r  r   r   r   r   r     s    zASTTypeWithInit.get_id)r   rX   c             C   s4   g }| || j | jr*| || j d|S )Nr   )r   r   r=  r   )r   r   r   r   r   r   r     s
    zASTTypeWithInit._stringifyr   )r   r   r   r   rX   c             C   s6   t | | j|||| | jr2| j|||| d S )N)r5   r   r   r=  )r   r   r   r   r   r   r   r   r     s    z"ASTTypeWithInit.describe_signature)r   r   r   rA   r6  r   r   r   r   rT   r   r   r)   r   r   r   r   r   r   r   rB     s   rB   c               @   sH   e Zd Zd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 )ASTMacroParameterFN)r  r  variadicrX   c             C   s   || _ || _|| _d S )N)r  r  r?  )r   r  r  r?  r   r   r   r     s    zASTMacroParameter.__init__)r   rX   c             C   s,   | j r
dS | jr|| jd S || jS d S )Nz...)r  r?  r  )r   r   r   r   r   r     s
    zASTMacroParameter._stringifyr   r}   )r   r   r   r   rX   c             C   sX   t | | jr |tdd7 }n4| jr@t| }|t||7 }n| jj||||d d S )Nz...)r   )	r5   r  r   r   r?  r   r   r  r   )r   r   r   r   r   r   r   r   r   r     s    z$ASTMacroParameter.describe_signature)FF)r   r   r   r   rf   r   r)   r   r   r   r   r   r   r   r   r>    s
    r>  c               @   sn   e Zd Zeee ddddZee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 )rC   N)r   r  rX   c             C   s   || _ || _d S )N)r   r  )r   r   r  r   r   r   r   	  s    zASTMacro.__init__)rX   c             C   s   | j S )N)r   )r   r   r   r   r     s    zASTMacro.namer}   )r   r  r   rX   c             C   s   |  |S )N)r;  r   )r   r   r  r   r   r   r   r     s    zASTMacro.get_id)r   rX   c             C   sp   g }| || j | jd k	rf| d d}x.| jD ]$}|sF| d d}| || q4W | d d|S )Nr   Tz, Fr   r   )r   r   r  r   )r   r   r   r   r  r   r   r   r     s    



zASTMacro._stringifyr   )r   r   r   r   rX   c             C   sv   t | | j|||| | jd kr(d S t }x8| jD ].}tjdddd}|j|d||d ||7 }q8W ||7 }d S )Nr   T)r
  r   )r   )r5   r   r   r  r   r  r  )r   r   r   r   r   r  r  r   r   r   r   r   "  s    
zASTMacro.describe_signature)r   r   r   r   r   r>  r   r   r   rT   r   r   r)   r   r   r   r   r   r   r   rC     s   rC   c               @   sV   e Zd Z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 )r=   N)r   rX   c             C   s
   || _ d S )N)r   )r   r   r   r   r   r   1  s    zASTStruct.__init__r}   )r   r  r   rX   c             C   s   |  |S )N)r;  r   )r   r   r  r   r   r   r   r   4  s    zASTStruct.get_id)r   rX   c             C   s
   || j S )N)r   )r   r   r   r   r   r   7  s    zASTStruct._stringifyr   )r   r   r   r   rX   c             C   s    t | | jj||||d d S )N)r   )r5   r   r   )r   r   r   r   r   r   r   r   r   :  s    zASTStruct.describe_signature)r   r   r   r   r   rT   r   r   r)   r   r   r   r   r   r   r   r=   0  s
   r=   c               @   sV   e Zd Z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 )r>   N)r   rX   c             C   s
   || _ d S )N)r   )r   r   r   r   r   r   A  s    zASTUnion.__init__r}   )r   r  r   rX   c             C   s   |  |S )N)r;  r   )r   r   r  r   r   r   r   r   D  s    zASTUnion.get_id)r   rX   c             C   s
   || j S )N)r   )r   r   r   r   r   r   G  s    zASTUnion._stringifyr   )r   r   r   r   rX   c             C   s    t | | jj||||d d S )N)r   )r5   r   r   )r   r   r   r   r   r   r   r   r   J  s    zASTUnion.describe_signature)r   r   r   r   r   rT   r   r   r)   r   r   r   r   r   r   r   r>   @  s
   r>   c               @   sV   e Zd Z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 )r?   N)r   rX   c             C   s
   || _ d S )N)r   )r   r   r   r   r   r   Q  s    zASTEnum.__init__r}   )r   r  r   rX   c             C   s   |  |S )N)r;  r   )r   r   r  r   r   r   r   r   T  s    zASTEnum.get_id)r   rX   c             C   s
   || j S )N)r   )r   r   r   r   r   r   W  s    zASTEnum._stringifyr   )r   r   r   r   rX   c             C   s    t | | jj||||d d S )N)r   )r5   r   r   )r   r   r   r   r   r   r   r   r   Z  s    zASTEnum.describe_signature)r   r   r   r   r   rT   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 )r@   N)r   r=  r  rX   c             C   s   || _ || _|| _d S )N)r   r=  r  )r   r   r=  r  r   r   r   r   a  s    zASTEnumerator.__init__r}   )r   r  r   rX   c             C   s   |  |S )N)r;  r   )r   r   r  r   r   r   r   r   g  s    zASTEnumerator.get_id)r   rX   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   j  s    
zASTEnumerator._stringifyr   )r   r   r   r   rX   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   t  s    z ASTEnumerator.describe_signature)r   r   r   r   r   r6  r#   r   rT   r   r   r)   r   r   r   r   r   r   r   r@   `  s   
r@   c               @   s   e Zd Zdeeeeef 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~   FN)r  directiveTyper   	semicolonrX   c             C   s(   || _ || _|| _|| _d | _d | _d S )N)r  r@  r   rA  r   enumeratorScopedSymbol)r   r  r@  r   rA  r   r   r   r     s    zASTDeclaration.__init__)rX   c             C   s   t | j| j| j | jS )N)r~   r  r@  r   clonerA  )r   r   r   r   rC    s    
zASTDeclaration.clonec             C   s   t t| j}|jS )N)r   DeclarationTyper   r   )r   r:  r   r   r   r     s    zASTDeclaration.namec             C   s    | j dkrd S tt| j}|jS )Nfunction)r  r   rA   r   r	  )r   r:  r   r   r   r	    s    
zASTDeclaration.function_paramsT)r   r  rX   c             C   sL   | j dkr | jr | jj||S | j|| j | j}|rDt| | S |S d S )N
enumerator)r  rB  r   r   r   
_id_prefix)r   r   r  id_r   r   r   r     s    zASTDeclaration.get_idc             C   s   |  tdS )NT)r   _max_id)r   r   r   r   get_newest_id  s    zASTDeclaration.get_newest_id)r   rX   c             C   s   || j }| jr|d7 }|S )N;)r   rA  )r   r   r   r   r   r   r     s    
zASTDeclaration._stringifyr   )r   r   r   optionsrX   c             C   sx  t | | jstd|d< t }d|_| jj |d< ||7 }| jdkrJn| jdkrVn| jdkrbn| 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r|td
d
7 }|t	 7 }nn| jdkr|tdd7 }|t	 7 }nD| jdkrBt
t| j}| }|t||7 }|t	 7 }nt | j|||| j | jrt|tdd7 }d S )NTZis_multilineZ
declaratorZadd_permalinkmemberrE  macror]   r`   rN   rF  r   rK  )r5   r   r   r   Zdesc_signature_lineZsphinx_line_typeisRedeclarationr  r   r   r   rA   r   r<  r   rA  r   )r   r   r   r   rL  ZmainDeclNoder:  r   r   r   r   r     sD    






z!ASTDeclaration.describe_signature)F)T)r   r   r   r   r   rD  r   rf   r   rC  r   r   r   r   r	  rT   r   rJ  r)   r   r   r   r   r   r   r   r   r~     s    
	r~   c               @   s$   e Zd Zed deddddZdS )SymbolLookupResultr}   N)symbolsparentSymbolr   rX   c             C   s   || _ || _|| _d S )N)rQ  rR  r   )r   rQ  rR  r   r   r   r   r     s    zSymbolLookupResult.__init__)r   r   r   r   r   r   r   r   r   r   rP    s   rP  c               @   s6   e Zd Zeeeef  ddddZedddZdS )	LookupKeyN)r   rX   c             C   s
   || _ d S )N)r   )r   r   r   r   r   r     s    zLookupKey.__init__)rX   c             C   s   d ddd | jD S )Nz[{}]z, c             s   s   | ]\}}d  ||V  qdS )z({}, {})N)format)r   r   rH  r   r   r   r     s   z$LookupKey.__str__.<locals>.<genexpr>)rT  r   r   )r   r   r   r   r     s    zLookupKey.__str__)	r   r   r   r   r	   r   r   r   r   r   r   r   r   rS    s   rS  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d 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d  ddd Zeed  dd!d"Zeed  dd#d$Zd%dd&d'Zedd(d)Zeeed d*d+d,Z eeeeed  d-d.d/Z!ee"d egd f eeeee#d0d1d2Z$eeeed d3d4d5Z%d e&e d6dd7d8d9Z'ed d:d;d<Z(eeed dd=d>Z)eeeed d-d?d@Z*d%d dAdBdCZ+eeeed dDdEdFZ,eedGdHdIZ-eedGdJdKZ.  Z/S )Lr}   r   z  Fc             C   s
   t  d S )N)r   )r   r   r   r   __copy__  s    zSymbol.__copy__c             C   s"   | j rt ntd d d d d S d S )N)r  r   r}   )r   memor   r   r   __deepcopy__  s    zSymbol.__deepcopy__N)r  rX   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_print  s    zSymbol.debug_print)rX   c             C   s0   | j s| jrt| jr,tn| jr,| js,td S )N)r  r   r   docname)r   r   r   r   _assert_invariants  s
    
zSymbol._assert_invariants)keyr   rX   c                s"   |dkrt  nt ||S d S )Nr  )r   super__setattr__)r   r_  r   )	__class__r   r   ra    s    zSymbol.__setattr__)r  r   r   r]  linerX   c             C   sr   || _ d | _d | _|| _|| _|| _|| _d| _|   g | _	g | _
| j rX| j j	|  | jrf| | j_|   d S )NF)r  siblingAbovesiblingBelowr   r   r]  rc  rO  r^  	_childrenZ_anonChildrenr   r   _add_function_params)r   r  r   r   r]  rc  r   r   r   r     s     zSymbol.__init__)r   r]  rc  rX   c             C   s   |    | jd kst| jd ks$t| jd ks2t|d k	s>t|d k	sJt|d k	sVt|| _| | j_|| _|| _|    |   d S )N)r^  r   r   r]  rc  r   rg  )r   r   r]  rc  r   r   r   _fill_empty'  s    zSymbol._fill_emptyc             C   s   t jrt  jd7  _t d | jd k	r| jjd k	rxj| jjD ]^}|jd krNq>|jj}|d kr`q>tdd |}|j	rvt
t|jdkst
| ||| j| j q>W t jrt  jd8  _d S )Nr{   z_add_function_params:functionParam)r}   debug_lookupr[  r\  r   r	  r  r   r~   r   r   r   r   _add_symbolsr]  rc  )r   r   nnr:  r   r   r   rg  7  s     


zSymbol._add_function_paramsc             C   s6   | j d krd S | | j jkst| j j|  d | _ d S )N)r  rf  r   remove)r   r   r   r   rm  N  s
    
zSymbol.remove)r]  rX   c             C   st   xn| j D ]d}|| |jr|j|krd |_d |_d |_|jd k	rL|j|j_|jd k	r`|j|j_d |_d |_qW d S )N)rf  	clear_docr   r]  rc  rd  re  )r   r]  sChildr   r   r   rn  U  s    




zSymbol.clear_docc             c   s(   | V  x| j D ]}| E d H  qW d S )N)rf  get_all_symbols)r   ro  r   r   r   rp  c  s    zSymbol.get_all_symbolsc             c   s   | j E d H  d S )N)rf  )r   r   r   r   r  h  s    zSymbol.childrenc             c   s2   x,| j D ]"}|V  |j sq|jE d H  qW d S )N)rf  r   r   children_recurse_anon)r   r   r   r   r   rq  l  s
    
zSymbol.children_recurse_anonrS  c             C   sx   g }| }x|j r"|| |j }q
W |  g }x>|D ]6}|jd k	r\||j|j f q6||jd f q6W t|S )N)r  r   reverser   r   rJ  rS  )r   rQ  sr_  r   r   r   r   t  s    



zSymbol.get_lookup_keyc             C   sV   g }| }x|j r"|| |j }q
W |  g }x|D ]}||j q6W t|ddS )NF)r   )r  r   rr  r   r   )r   rQ  rs  r   r   r   r   r;    s    


zSymbol.get_full_nested_name)r   	matchSelfrecurseInAnonrX   c             C   sD   t jrt d | j|||dd}yt|S  tk
r>   d S X d S )Nz_find_first_named_symbol ->F)searchInSiblings)r}   rj  r\  _find_named_symbolsr-  StopIteration)r   r   rt  ru  r   r   r   r   _find_first_named_symbol  s    

zSymbol._find_first_named_symbol)r   rt  ru  rv  rX   c             #   s<  t jr~t  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
 d fdd}x| D ]~}t jrt d t|t jd dd |j|krt jrt  jd7  _t d t  jd8  _|V  t jrt  jd7  _qW t jr8t  jd8  _d S )Nr{   z_find_named_symbols:zself:r   )rX  zident:            zmatchSelf:        zrecurseInAnon:    zsearchInSiblings: )r}   NN)rX   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   )rX  zsearching in sibling:)	r}   rj  r\  rY  	to_stringr[  rq  rf  rd  )rs  )rt  ru  r   r   r   
candidates  s     


z.Symbol._find_named_symbols.<locals>.candidatesz
candidate:matches      )r}   rj  r[  r\  rY  rz  r   r   )r   r   rt  ru  rv  r{  rs  r   )rt  ru  r   r   rw    s2    




zSymbol._find_named_symbols)r   onMissingQualifiedSymbolancestorLookupTypert  ru  rv  rX   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| t d| t d	| t d
| |j}| }|jrx|jr|j}qW |d k	r|d }	x$|jr|j	|	|||drP |j}qW t jrt d t|t jd dd xf|d d D ]V}
|j
|
||d}|d krf|||
}|d krft jrbt  jd8  _d S d}|}qW t jrt d t|t jd dd |d }
|j|
|||d}t jrt|}t  jd8  _t|||
S )Nr{   z_symbol_lookup:zself:r   )rX  znestedName:        zancestorLookupType:zmatchSelf:         zrecurseInAnon:     zsearchInSiblings:  r   )rt  ru  rv  zstarting point:r   )rt  ru  r~  Fzhandle last name from:)r}   rj  r[  r\  rY  rz  r   r   r  find_identifierry  rw  listrP  )r   r   r  r  rt  ru  rv  r   rR  Z	firstNamer   r   rQ  r   r   r   _symbol_lookup  sf    









zSymbol._symbol_lookup)r   r   r]  rc  rX   c                s  t jrVt  jd7  _t d t  jd7  _t d| t d  t d dtdddd	}| j||d d
d
d
dd k	sttj	}t
|dkr*t jrt d t  jd7  _t dj t d  t d t  jd8  _t jj d}t jr&t  jd8  _|S t jrht 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r t dt
| t dt
|	 t dt
|
 dd fdd}t
|	dkrLd }n| }ddd d fdd} jdkrt
|	dkst||	d |   }t jrt d | x@|	D ]8}|j }t jrt d!| ||kr||| qW t
|dkr<t jr&t d"|d k	 t  jd8  _|d k	r4|S | S nRt jrbt d#|d k	 t  jd8  _|d k	rt|  |d }|  |S d S )$Nr{   z_add_symbols:z
nn:       z
decl:     zlocation: {}:{}r}   )rR  r   rX   c             S   sX   t jrFt  jd7  _t d t  jd7  _t d| t  jd8  _t | |d d d dS )Nr{   z'_add_symbols, onMissingQualifiedSymbol:zident: r~  )r  r   r   r]  rc  )r}   rj  r[  r\  )rR  r   r   r   r   r  (  s    
z5Symbol._add_symbols.<locals>.onMissingQualifiedSymbolF)r  rt  ru  rv  r   z _add_symbols, result, no symbol:zident:       zdeclaration: zlocation:    {}:{})r  r   r   r]  rc  r~  z_add_symbols, result, symbols:znumber symbols:zno declarationz
#noDecl:  z
#withDecl:z
#dupDecl: )rX   c                 s:   t jrt d t jj d} t jr6t d | S )Nz begin: creating candidate symbol)r  r   r   r]  rc  z end:   creating candidate symbol)r}   rj  r\  rR  r   )r   )r   r]  rc  lookupResultr   r   makeCandSymbolo  s    


z+Symbol._add_symbols.<locals>.makeCandSymbol)r   
candSymbolrX   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}   rj  r[  r\  rO  r|   )r   r  )r   r   r   handleDuplicateDeclaration  s    
z7Symbol._add_symbols.<locals>.handleDuplicateDeclarationrE  zcandId:zoldId: z,no match, no empty, candSybmol is not None?:zAno match, but fill an empty declaration, candSybmol is not None?:)r}   rj  r[  r\  rT  r   r  r   r  rQ  r   r   rR  r   r   rO  r  rJ  rm  rh  )r   r   r   r]  rc  r  rQ  r   ZnoDeclZwithDeclZdupDeclrs  r  r  r  ZcandIdZoldIdr   )r   r]  rc  r  r   rk    s    














zSymbol._add_symbolsr   )r   docnamesr   rX   c             C   s  t jrt  jd7  _t d |d k	s*tx|jD ]}| j|jddd}|d krl| j| | |_	|
  q2|jr|j|kr|js||j|j|j nN|j|jkrt|j}td}||j|j|jj|f }tj||j|jfd n |||| q2W t jrt  jd8  _d S )Nr{   zmerge_with:F)r   rt  ru  zNDuplicate C declaration, also defined at %s:%s.
Declaration is '.. c:%s:: %s'.)location)r}   rj  r[  r\  r   rf  ry  r   r   r  r^  r   r]  rh  rc  r   r   r@  loggerwarning
merge_with)r   r   r  r   Z
otherChildZourChildr   msgr   r   r   r    s4    


zSymbol.merge_with)r   rX   c             C   sH   t jrt  jd7  _t d | j|d d d d}t jrDt  jd8  _|S )Nr{   z	add_name:)r   r]  rc  )r}   rj  r[  r\  rk  )r   r   r   r   r   r   add_name  s    
zSymbol.add_namec             C   sp   t jrt  jd7  _t d |d k	s*t|d k	s6t|d k	sBt|j}| ||||}t jrlt  jd8  _|S )Nr{   zadd_declaration:)r}   rj  r[  r\  r   r   rk  )r   r   r]  rc  r   r   r   r   r   add_declaration  s    
zSymbol.add_declarationc             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ident:           zmatchSelf:       zrecurseInAnon:   zsearchInSiblings:r   )rX  r~  ztrying:)
r}   rj  r[  r\  rY  rz  r   rq  rf  rd  )r   r   rt  ru  rv  currentr  rs  r   r   r   r    s6    




zSymbol.find_identifier)r_  rX   c             C   s   t jr,t  jd7  _t d t  jd7  _| }x|jD ]\}}d }x|jD ]}|j|krL|}P qLW |}t jrt d| t d| |d k	rt|t jd dd n
t d |d kr8t jrt  jd8  _d S q8W t jrt  jd8  _|S )	Nr{   zdirect_lookup:zname:          zid:            r   )rX  z	not foundr~  )	r}   rj  r[  r\  r   rf  r   rY  rz  )r   r_  rs  r   rH  r   candr   r   r   direct_lookup  s2    


zSymbol.direct_lookup)r   r   rt  ru  rX   c             C   s   t jrt  jd7  _t d dtdddd}| j|||||dd}t jrZt  jd8  _|d krfd S t|j}t|d	krd S |d	 S )
Nr{   zfind_declaration:r}   )rR  r   rX   c             S   s   d S )Nr   )rR  r   r   r   r   r  7  s    z9Symbol.find_declaration.<locals>.onMissingQualifiedSymbolF)r  rt  ru  rv  r   )	r}   rj  r[  r\  r   r  r  rQ  r   )r   r   r   rt  ru  r  r  rQ  r   r   r   find_declaration0  s&    

zSymbol.find_declaration)indentrX   c             C   s   t j| g}| js|d nX| jr6|t| j n|t| j | jrv|d | jrf|d |t| j | jr|d || j |d |d d	|S )Nz::z: z!!duplicate!! z	(r   
r   )
r}   rZ  r  r   r   r   r   rO  r]  r   )r   r  r   r   r   r   rz  K  s"    




zSymbol.to_stringc             C   s:   |  |g}x"| jD ]}|||d  qW d|S )Nr{   r   )rz  rf  r   r   r   )r   r  r   r   r   r   r   r   `  s    zSymbol.dump)0r   r   r   r[  rZ  rj  debug_show_treerU  rW  staticmethodr   r\  r^  r   ra  r   r~   rT   r   rh  rg  rm  rn  r   rp  r   r  rq  r   r   r;  rf   ry  rw  r   rP  r  rk  r   r  r  r  r  r  r  rz  r   __classcell__r   r   )rb  r   r}     s`   	0E  #	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f dddZedddZed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dd d!Zedd"d#Zedd$d%Zedd&d'Zd_ee e g ef eed)d*d+Z!e"dd,d-Z#e$e dd.d/Z%e&dd0d1Z'e(dd2d3Z)ee$e* d4d5d6Z+eee,d7d8d9Z-d`eee.d7d:d;Z/e0eef eee1d<d=d>Z2dae0eef eee1d<d?d@Z3dbeee4dBdCdDZ5dce0eef e$e e6dEdFdGZ7e0eef ee8dEdHdIZ9e:ddJdKZ;e<ddLdMZ=e>ddNdOZ?e@ddPdQZAeBddRdSZCeDddTdUZEeeeDdVdWdXZFe"ddYdZZGe"dd[d\ZHe0ee6f dd]d^ZIdAS )dDefinitionParser)rX   c             C   s   dS )NCr   )r   r   r   r   languageh  s    zDefinitionParser.languagec             C   s   | j jS )N)configc_id_attributes)r   r   r   r   id_attributesl  s    zDefinitionParser.id_attributesc             C   s   | j jS )N)r  c_paren_attributes)r   r   r   r   paren_attributesp  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_stringt  s     

zDefinitionParser._parse_stringc          
   C   s4  |    | drtdS | dr,tdS | j}| trZ| t t| j|| j S x<t	t
ttgD ],}| |rh| t t| j|| j S qhW |  }|d k	rt|S | tr0| jd}| jd}y
t||S  tk
r } z| d|  W d d }~X Y n  tk
r.   | d Y nX d S )	Nr   Tr   Fr{   r~  z8Can not handle character literal. Internal error was: %szJCan not handle character literal resulting in multiple decoded characters.)skip_ws	skip_wordr   r  matchr.   r/   r   r  r,   r0   r2   r4   r3   r  r   r-   Z
last_matchgroupr   UnicodeDecodeErrorr  r*   )r   r  regexstringr   r   r1  r   r   r   _parse_literal  s6    






zDefinitionParser._parse_literalc             C   sH   | j dkrd S |  jd7  _|  }|   | ds@| d t|S )Nr   r{   r   z0Expected ')' in end of parenthesized expression.)r  r  _parse_expressionr  skip_stringr  r   )r   r   r   r   r   _parse_paren_expression  s    


z(DefinitionParser._parse_paren_expressionc             C   sL   |    |  }|d k	r|S |  }|d k	r0|S |  }|d k	rHt|S d S )N)r  r  r  _parse_nested_namer   )r   r   rl  r   r   r   _parse_primary_expression  s    z*DefinitionParser._parse_primary_expression)r   opencloserX   c             C   s   |    | |sdS | |r(g dfS g }d}x||    |  }|    || |    | |rhP | ds| d||f  | j|kr2|dkr2|  jd7  _d}P q2W ||fS )N)NNFr  z"Error in %s, expected ',' or '%s'.r5  r{   T)r  skip_string_and_wsr  r  r   r  r  r  )r   r   r  r  r   r3  r   r   r   r   _parse_initializer_list  s,    




z(DefinitionParser._parse_initializer_listc             C   s&   |  ddd\}}|d krd S t|S )Nzparenthesized expression-listr   r   )r  r   )r   r   r3  r   r   r   _parse_paren_expression_list  s
    z-DefinitionParser._parse_paren_expression_listc             C   s(   |  ddd\}}|d krd S t||S )Nzbraced-init-listr4  r5  )r  r   )r   r   r3  r   r   r   _parse_braced_init_list  s    z(DefinitionParser._parse_braced_init_listc             C   s   |   }g }x|   | drT|  }|   | dsD| d |t| q| dr| drx|  jd8  _n| 	 }|t
| q| dr|t  q| dr|t  q|  }|d k	r|t| qP qW t||S )	Nr   r   z*Expected ']' in end of postfix expression.z->rt   r}  z++z--)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_postfix_expression  s:    







z*DefinitionParser._parse_postfix_expressionc             C   s   |    xDtD ]<}|d dkr*| |}n
| |}|r|  }t||S qW | dr| dr| jdd}|    | ds| 	d t
|S |  }t|S | d	r| ds| 	d
 | jdd}|    | ds| 	d t|S |  S )Nr   r   r[   r   F)namedr   zExpecting ')' to end 'sizeof'.re   zExpecting '(' after 'alignof'.zExpecting ')' to end 'alignof'.)r  _expression_unary_opsr  r  _parse_cast_expressionr   skip_word_and_wsr  _parse_typer  r   _parse_unary_expressionr   r   r  )r   r   r   r   r   r   r   r   r  '	  s4    	










z(DefinitionParser._parse_unary_expressionc             C   s   | j }|   | dry0| d}| ds8| d |  }t||S  tk
r } zd|| _ y|  S  tk
r } z2g }|	|df |	|df | 
|d|W d d }~X Y nX W d d }~X Y qX n|  S d S )Nr   Fr   z Expected ')' in cast expression.zIf type cast expressionzIf unary expressionzError in cast expression.)r  r  r  r  r  r  r   r'   r  r   _make_multi_error)r   r  r   r   ZexCastZexUnaryerrsr   r   r   r  M	  s(    




.z'DefinitionParser._parse_cast_expressionc                s    fdd  | dS )Nc       	   	      s   d t tkr$tdfdd}ntd fdd}g }g }||  x  j}d}xt  D ]}|d dkr|sqln|sql|d	krjd	kr jd8  _P y$| }|| || d
}P W ql t	k
r   |_Y qlX qlW |sPP qPW t
||S )Nr{   )rX   c                  s      S )N)r  r   )r   r   r   parsers	  s    zYDefinitionParser._parse_logical_or_expression.<locals>._parse_bin_op_expr.<locals>.parserc                  s    d S )Nr{   r   r   )_parse_bin_op_expropIdr   r   r   r  v	  s    Fr   abcnoxro   T)r   _expression_bin_opsr   r   r  r  r  r  r  r'   r   )	r   r  r  r   r   r  oneMorer   r   )r  )r  r   r   r  q	  s<    



zIDefinitionParser._parse_logical_or_expression.<locals>._parse_bin_op_exprr   r   )r   r   )r  r   _parse_logical_or_expressione	  s    %z-DefinitionParser._parse_logical_or_expression)
orExprHeadrX   c             C   s   d S )Nr   )r   r  r   r   r   "_parse_conditional_expression_tail	  s    z3DefinitionParser._parse_conditional_expression_tailc             C   s   g }g }|   }|| xjd}|   xRtD ]J}|d dkrL| |sXq.n| |sXq.|   }|| || d}q.W |sP qW t||S )NFr   r  T)r  r   r  _expression_assignment_opsr  r  r   )r   r   r   orExprr  r   r   r   r   r   _parse_assignment_expression	  s(    





z-DefinitionParser._parse_assignment_expressionc             C   s   |   }|S )N)r  )r   r  r   r   r   _parse_constant_expression	  s    z+DefinitionParser._parse_constant_expressionc             C   s   |   S )N)r  )r   r   r   r   r  	  s    z"DefinitionParser._parse_expressionT)rX  r  allowrX   c       
   
   C   s@  | 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}g }	xn| j	st
|	dkr| j|krP | j|kr|	|| j  n"t
|	dkr| j|	d kr|	  |  j d7  _ qW t
|dkr | j	r | d	|  | j|| j   }t| S )
NzBParsing of expression failed. Using fallback parser. Error was:
%sr   r5  r   )r   r4  r   r   r   r{   z0Could not find end of expression starting at %d.)r  r'   ZallowFallbackExpressionParsingwarnr   r  r  
_string_rematched_textr  r   r  r   popr  r  stripr   )
r   rX  r  r  ZprevPosr1  r  r   ZbracketsrQ  r   r   r   _parse_expression_fallback	  s:    


z+DefinitionParser._parse_expression_fallbackc             C   s   g }|    d}| drd}x|    | ts<| d | j}|tkrX| d|  | j| jjkrd}| || jt	| jjf  t
|}|| |    | ds P q W t||S )NFr   Tz#Expected identifier in nested name.z3Expected identifier in nested name, got keyword: %szExpected identifier, got user-defined keyword: %s. Remove it from c_extra_keywords to allow it as identifier.
Currently c_extra_keywords is %s.)r  r  r  r1   r  r  	_keywordsr  c_extra_keywordsr   r   r   r   )r   r   r   r   r  r   r   r   r   r  	  s.    





z#DefinitionParser._parse_nested_namec             C   s<   |  tr| jS x&dD ]}|| jjkr| |r|S qW d S )N)rf   rg   rh   )r  _simple_type_specifiers_rer  r  r  r  )r   tr   r   r   _parse_simple_type_specifier
  s    


z-DefinitionParser._parse_simple_type_specifierc             C   sN   g }|    x(|  }|d kr P || |    qW t|dkrFd S t|S )Nr   )r  r  r   r   r   )r   r   r  r   r   r   _parse_simple_type_specifiers
  s    
z.DefinitionParser._parse_simple_type_specifiersc             C   sX   |    |  }|d k	r|S d }|    xdD ]}| |r.|}P q.W |  }t||S )N)r]   rN   r`   )r  r  r  r  r   )r   r   r   kr   r   r   r   _parse_trailing_type_spec&
  s    

z*DefinitionParser._parse_trailing_type_spec)	paramModerX   c             C   s   |    | ds*|dkr&| d nd S g }|    | dsx|    | dr|td d |    | ds| d P | jd dd	}|t| |    | d
rqBqB| drP qB| d| j  qBW |  }t||S )Nr   rE  zExpecting "(" in parameters.r   z...Tz'Expected ")" after "..." in parameters.single)r  r  r  z-Expecting "," or ")" in parameters, got "%s".)	r  r  r  r   r   _parse_type_with_initr  _parse_attribute_listr  )r   r  r  r  r  r   r   r   _parse_parameters9
  s8    






z"DefinitionParser._parse_parameters)r  typedrX   c          	   C   sJ  d}d}d}d}d}d}g }	x|    |s||dkrT| drDd}q | drTd}q |dkr|| drld}q | dr|d}q |dkr|s| drd}q | d	rd	}q |d
kr|s| d}|rq |s|r| d}|rq |s|r| d}|rq |s|r| d}|rq |  }
|
r,|	|
 q P q W t||||||t|	S )zJust parse the simple ones.NrM  rD   rV   )rM  rE  r\   rO   ri   rd   rE  rS   rW   rb   rH   )r  r  _parse_attributer   r  r#   )r   r  r  r  r  rS   rW   rb   rH   r  attrr   r   r   _parse_decl_specs_simple_
  sl    










z)DefinitionParser._parse_decl_specs_simplec             C   sT   |r|dkrt d| | ||}d }|rB|  }| ||}nd }t||||S )N)r   rM  rE  z#Internal error, unknown outer "%s".)r   r  r  r  )r   r  r  r  r  r  r   r   r   _parse_decl_specs
  s    z"DefinitionParser._parse_decl_specs)r  r  r  rX   c          	      s@  |dkst |dkr tr jtkr8 d j   j jjkrfd} | jt jjf  t	 j}t
|gdd}qd }n|r  }nd }g }x2   |r̈ dr̈   d}d}	d}
d}x^|s drd	}q|	s d
rd	}	q|
s drd	}
q|s, dr,d	}qP qW |r<dn d}|rh dsb d d }nJ drzd }n8 fdd} dg|}    ds d |t||	|
||| qP qW  |}|d kr2t|dkr2|r2|dkr2|r2    dr2  }t||dS t|||dS )N)TFr  r  z$Expected identifier, got keyword: %szExpected identifier, got user-defined keyword: %s. Remove it from c_extra_keywords to allow it as identifier.
Currently c_extra_keywords is %s.F)r   r   r\   TrH   rb   rW   rt   r   z&Expected ']' in end of array operator.c                  s      S )N)r  r   )r   r   r   r  
  s    z>DefinitionParser._parse_declarator_name_suffix.<locals>.parserr   r   r+  )r(  r"  )r(  r)  r   )r   r  r1   r  r  r  r  r  r   r   r   r  r  r  r  r  r  r   r   r  r   r  r*  r'  )r   r  r  r  r  r   r(  r)  r\   rH   rb   rW   r!  r"  r  r   r   )r   r   _parse_declarator_name_suffix
  s    










z.DefinitionParser._parse_declarator_name_suffixc             C   sd  |dkrt d| g }|   |r| dr|   d}d}d}g }x^|s\| d}|r\qH|sp| d}|rpqH|s| d}|rqH|  }	|	d k	r||	 qHP qHW | |||}
t|
|||t|dS |r | j	d	kr | j
}y| |||}|S  tk
r } zd
}|dkr|d7 }|||f || _
yZ| j	d	ksDt| d	 | |||}| dsr| d | jdd|d}
t||
dS  tk
r } z@|| _
d}|dkr|d7 }|||f d}| |||W d d }~X Y nX W d d }~X Y nX | j
}y| |||S  tk
r^ } z*|| _
||df d}| |||W d d }~X Y nX d S )N)r   rE  z'Internal error, unknown paramMode '%s'.rt   FrW   rb   rH   )r-  rW   rb   rH   r  r   z If declarator-id with parametersrE  z (e.g., 'void f(int arg)')r   z$Expected ')' in "( ptr-declarator )"r   )r  r  r  )r0  r-  z"If parenthesis in noptr-declaratorz% (e.g., 'void (*f(int arg))(double)')zError in declaratorzIf declarator-idz!Error in declarator or parameters)r   r  r  r  r  r   _parse_declaratorr,  r#   r  r  r  r'   r   r  r/  r  )r   r  r  r  
prevErrorsrW   rb   rH   r  r  r-  r  r   ZexParamQualr  r0  ZexNoPtrParenheaderr1  r   r   r   r  
  s    








2z"DefinitionParser._parse_declaratorN)r  allowFallbackrX   c                s       |dkr0dr0  }|d k	r0t|ddS  ds>d S   }|d k	rVt|S |dkrdg }n |d krvddg}n d|   fdd	} j|||d
}t|S )NrM  F)r7  rz   r  r   z;Internal error, initializer for outer '%s' not implemented.c                  s      S )N)r  r   )r   r   r   r  `  s    z3DefinitionParser._parse_initializer.<locals>.parser)r  )r  r  r6  r  r  r  )r   r  r  Z
bracedInitZfallbackEndr  r   r   )r   r   _parse_initializerI  s&    

z#DefinitionParser._parse_initializer)r  r  rX   c             C   st  |r |dkrt d| |s t|dkrg }| j}y.| j|dd}| jd|dd}| jdd W n tk
r } zd	}|||f || _y| j|d
}| jd|d}W nV tk
r }	 z6|| _d}||	|f d}
|
d7 }
| ||
|	W dd}	~	X Y nX W dd}~X Y nX nR|dkr>| j|d
}| jd|d}n,d}|dkrPd}| j|d
}| j||d}t	||S )z
        named=False|'single'|True: 'single' is e.g., for function objects which
        doesn't need to name the arguments, but otherwise is a single name
        )r   rM  rE  z#Internal error, unknown outer "%s".r   F)r  r  T)r  r  r  )ZallowSemicolonzIf just a name)r  )r  r  zIf typedef-like declarationz%Type must be either just a name or a ztypedef-like declaration.NrE  rM  )
r   r   r  r  r  
assert_endr'   r   r  rA   )r   r  r  r  r  r9  r:  Z	exUntypeddescZexTypedr  r  r   r   r   r  f  sF    
4

zDefinitionParser._parse_typec             C   s4   |r|dkst | j||d}| j|d}t||S )N)r   rM  rE  )r  r  )r  )r   r  r  rB   )r   r  r  r   r=  r   r   r   r    s
    z&DefinitionParser._parse_type_with_initc             C   sL  |    |  }|d kr"| d |    | ds>t|d S | drRt|g S g }x|    | dr|td d |    | ds| d P | t	s| d t
t| jgdd	}|    | dr|t|dd |    | ds| d P |t| | d
r$qXqX| dr4P qX| d qXW t||S )Nz(Expected identifier in macro definition.r   r   z...Tz-Expected ")" after "..." in macro parameters.z(Expected identifier in macro parameters.F)r   r  z9Expected identifier, ')', or ',' in macro parameter list.)r  r  r  r  rC   r  r   r>  r  r1   r   r   r  )r   r   r  rl  r   r   r   _parse_macro  sF    










zDefinitionParser._parse_macroc             C   s   |   }t|S )N)r  r=   )r   r   r   r   r   _parse_struct  s    zDefinitionParser._parse_structc             C   s   |   }t|S )N)r  r>   )r   r   r   r   r   _parse_union  s    zDefinitionParser._parse_unionc             C   s   |   }t|S )N)r  r?   )r   r   r   r   r   _parse_enum  s    zDefinitionParser._parse_enumc                s`      }  }   d } drT   td fdd} g |}t|}t|||S )Nrz   )rX   c                  s      S )N)r  r   )r   r   r   r    s    z2DefinitionParser._parse_enumerator.<locals>.parser)r  r  r  r  r   r  r6  r@   )r   r   r  r=  r  ZinitValr   )r   r   _parse_enumerator  s    
z"DefinitionParser._parse_enumeratorc             C   sl   |    d }| dr$d}|  }n:| dr<d}|  }n"| drTd}|  }n
| d t|||dS )Nr]   r`   rN   zTCould not parse pre-v3 type directive. Must start with 'struct', 'union', or 'enum'.F)r  r  r  r  r  r  r~   )r   r   r   r   r   r   parse_pre_v3_type_definition  s    






z-DefinitionParser.parse_pre_v3_type_definition)r  r@  rX   c             C   s  |dkrt d| |dkr(t d| d }|dkrD| jddd}n|dkr\| jddd}nx|d	krn|  }nf|d
kr|  }nT|dkr|  }nB|dkr|  }n0|dkr|  }n|dkr| jddd}nt |d	kr| 	  | 
d}nd}t||||S )N)rE  rM  rN  r]   r`   rN   rF  r   z(Internal error, unknown objectType "%s".)	rE  rM  varrN  r]   r`   rN   rF  r   z+Internal error, unknown directiveType "%s".rM  T)r  r  rE  rN  r]   r`   rN   rF  r   rK  F)r   r  r  r  r  r  r  r  r   r  r  r~   )r   r  r@  r   rA  r   r   r   parse_declaration  s6    




z"DefinitionParser.parse_declarationc             C   s   |   S )N)r  )r   r   r   r   parse_namespace_object  s    z'DefinitionParser.parse_namespace_objectc             C   s&   |   }|   | d |   |S )Nz())r  r  r  r  )r   r   r   r   r   parse_xref_object!  s
    
z"DefinitionParser.parse_xref_objectc             C   s   | j }d }y|  }|   |   W n tk
r } z~|| _ y| d}|   |   W nT tk
r } z6d}g }||df ||df | |||W d d }~X Y nX W d d }~X Y nX |S )NFz%Error when parsing (type) expression.zIf expressionzIf type)r  r  r  r  r'   r  r   r  )r   r  r   ZexExprZexTyper  r  r   r   r   parse_expression)  s&    
2z!DefinitionParser.parse_expression)T)T)T)NT)N)Jr   r   r   r   r   r  r  r  r  r   r  r   r  r  r	   r   rf   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  r6  r  rA   r  rB   r  rC   r  r=   r  r>   r  r?   r  r@   r  r~   r  r  r  r  r  r   r   r   r   r  g  sZ   &,&3	"(	&:PP ;("r  )rX   c               C   s   t tdgddS )NZPhonyNameDueToErrorF)r   )r   r   r   r   r   r   _make_phony_error_name?  s    r   c                   s  e Zd ZU dZ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	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eedd$d%Z  ZS )&CObjectz-
    Description of a C language object.
    )noindexentryZnocontentsentryoption_specN)astrX   c             C   s   |j dkst|j}|st|jd k	s*t|j}|s8t|jd krFd S |j}|d krXd S |j dkrfd S |jdkrtd S |j}|j|jdddd}|d k	rd S |j }||_	t
||j|| jj|  d d d S )NrF  rN   FT)rt  ru  rv  r{   )r  r   r   r]  rc  )r  r   r   r   r  r   r@  r  rC  rB  r}   r   r]  get_source_info)r   r  r   rR  Z
parentDeclZtargetSymbolrs  Z	declCloner   r   r   _add_enumerator_to_parentM  s2    



z!CObject._add_enumerator_to_parent)r  sigr   rX   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|j	 
 d}|| jjjkr|st|d | x6|dd  D ]&}|sq|| jjjkr|d | qW | jj| d| jkr"| |}	| jd d|	|d	d f d S )
Nr{   )r   r   r   idsr  entriesr  r   )r   rI  r   r   r(   r   r  reversedr   r;  r   lstripstatedocumentr  Znote_explicit_targetrL  get_index_textZ	indexnode)
r   r  r  r   r  r   idnewestIdr   Z	indexTextr   r   r   add_target_and_indexr  s.    
zCObject.add_target_and_index)rX   c             C   s
   t  d S )N)r   )r   r   r   r   object_type  s    zCObject.object_typec             C   s   | j S )N)r  )r   r   r   r   display_object_type  s    zCObject.display_object_type)r   rX   c             C   s   t d|| jf S )Nz	%s (C %s))r   r  )r   r   r   r   r   r    s    zCObject.get_index_text)r  rX   c             C   s   | | j| jS )N)r  r  objtype)r   r  r   r   r   parse_definition  s    zCObject.parse_definitionc             C   s   |  S )N)r  )r   r  r   r   r   r    s    z$CObject.parse_pre_v3_type_definition)r   r  rL  rX   c             C   s   | |d| j| d S )Nr   )r   r   )r   r   r  rL  r   r   r   r     s    zCObject.describe_signaturec                sP   | j jjj}d|jkr<|jd d }||jd< | |jd< d |jd< t 	 S )Nzc:parent_symbolr   root_symbolzc:parent_keyzc:last_symbol)
r  r  settingsr   	temp_data
domaindatar   ref_contextr`  run)r   r   root)rb  r   r   r    s    


zCObject.run)r  r   rX   c             C   sN  | j jd }t||| j jd}yy| |}|  W n tk
r } z| j jd sV | jdkrb y| |}|  W n tk
r   |Y nX |j	| _
| j jd rd}|tj||j	||}tj||d W d d }~X Y nX W nT tk
r6 } z4tj||d t }	||	}
|
| j jd< t|W d d }~X Y nX y|j|| j j|  d	 d
}
|
jd ksft|
jd ksvt| j jd |
_|
jd k	r|
jjd kst|
|
j_|
| j jd< W nb tk
r } 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r2| | t| j }| !||| |S )Nzc:parent_symbol)r  r  c_allow_pre_v3r   c_warn_on_allowed_pre_v3zl{}: Pre-v3 C type directive '.. c:type:: {}' converted to '.. c:{}:: {}'.
The original parsing error was:
{})r  zc:last_symbolr{   )r]  rc  zNDuplicate C declaration, also defined at %s:%s.
Declaration is '.. c:%s:: %s'.rF  )"r   r  r  r  r  r  r'   r  r  r  r  rT  r   r   r  r  r   r  
ValueErrorr  r]  r  rd  r   re  r|   r   r   rc  r  r  dictrL  r   )r   r  r   rR  r  r  eOrigr  r1  r   r   rL  r   r   r   handle_signature  s`    



$
 

zCObject.handle_signaturec             C   sP   | j jd }|st| j jd | _| j jd | _|| j jd< | | j jd< d S )Nzc:last_symbolzc:parent_symbolzc:parent_key)r   r  r   oldParentSymbolr  oldParentKeyr   )r   Z
lastSymbolr   r   r   before_content  s    zCObject.before_contentc             C   s    | j | jjd< | j| jjd< d S )Nzc:parent_symbolzc:parent_key)r#  r   r  r$  r  )r   r   r   r   after_content  s    zCObject.after_contentc             C   s   d| S )zGenerate old styled node_id for C objects.

        .. note:: Old Styled node_id was used until Sphinx-3.0.
                  This will be removed in Sphinx-5.0.
        zc.r   )r   r   r   r   r   make_old_id   s    zCObject.make_old_id)r   r   r   __doc__r   flagr  r;   __annotations__r~   r  r   r   r  r   r  r  r  r  r  r  r   r   r   r   r  r"  r%  r&  r'  r  r   r   )rb  r   r  C  s(   
%@r  c               @   s"   e Zd ZdZeedddZdS )CMemberObjectrM  )rX   c             C   s   | j dkst| j S )N)rM  r  )r  r   )r   r   r   r   r    s    z!CMemberObject.display_object_typeN)r   r   r   r  r   r   r  r   r   r   r   r+  	  s   r+  	parameterZ
Parameters)r   r,  r  argumentr   )r   )labelr   ZtyperolenameZ	typenamesretvalzReturn values)Zretvalsr/  T)r.  r   Zcan_collapseZreturnvalueZReturnsF)ZreturnsrX   )r.  has_argr   Z
returntypezReturn type)Zrtypec               @   s   e Zd ZdZe ZdS )CFunctionObjectrE  N)r   r   r   r  _function_doc_field_typescopydoc_field_typesr   r   r   r   r1  !  s   r1  c               @   s   e Zd ZdZe ZdS )CMacroObjectrN  N)r   r   r   r  r2  r3  r4  r   r   r   r   r5  '  s   r5  c               @   s   e Zd ZdZdS )CStructObjectr]   N)r   r   r   r  r   r   r   r   r6  -  s   r6  c               @   s   e Zd ZdZdS )CUnionObjectr`   N)r   r   r   r  r   r   r   r   r7  1  s   r7  c               @   s   e Zd ZdZdS )CEnumObjectrN   N)r   r   r   r  r   r   r   r   r8  5  s   r8  c               @   s   e Zd ZdZdS )CEnumeratorObjectrF  N)r   r   r   r  r   r   r   r   r9  9  s   r9  c               @   s   e Zd ZdZdS )CTypeObjectr   N)r   r   r   r  r   r   r   r   r:  =  s   r:  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 )CNamespaceObjectzb
    This directive is just to tell Sphinx that we're documenting stuff in
    namespace foo.
    Fr{   r   Tr  )rX   c          
   C   s   | j jd d }| jd  dkr,|}g }n|t| jd |  | j jd}y| }|  W n: t	k
r } zt
j||  d t }W d d }~X Y nX ||}|g}|| j jd< || j jd< | | j jd	< g S )
Nr   r  r   )NULL0nullptr)r  r  )r  zc:parent_symbolzc:namespace_stackzc:parent_key)r   r  	argumentsr  r  get_locationr  r  r  r'   r  r  r   r  r  r   r  )r   
rootSymbolr   stackr  r   r1  r   r   r   r  M  s&    

zCNamespaceObject.runN)r   r   r   r(  has_contentrequired_argumentsoptional_argumentsfinal_argument_whitespacer  r;   r*  r   r   r  r   r   r   r   r;  A  s   
r;  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 )
CNamespacePushObjectFr{   r   Tr  )rX   c          
   C   s   | j d  dkrg S t| j d |  | jjd}y| }|  W n: tk
r } zt	j
||  d t }W d d }~X Y nX | jjdd }|s| jjd d }||}| jjdg }|| || jjd< || jjd< | | jjd	< g S )
Nr   )r<  r=  r>  )r  r  )r  zc:parent_symbolr   r  zc:namespace_stackzc:parent_key)r?  r  r  r@  r   r  r  r  r'   r  r  r   r  getr  r  r   r   r  )r   r  r   r1  Z	oldParentr   rB  r   r   r   r  k  s*    


zCNamespacePushObject.runN)r   r   r   rC  rD  rE  rF  r  r;   r*  r   r   r  r   r   r   r   rG  d  s   
rG  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 )	CNamespacePopObjectFr   Tr  )rX   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c:namespace_stackr   z;C namespace pop on empty stack. Defaulting to global scope.)r  r   r   r  zc:parent_symbolzcp:parent_key)r   r  rH  r   r  r  r@  r  r  r   r  )r   rB  r   r   r   r   r    s    
zCNamespacePopObject.runN)r   r   r   rC  rD  rE  rF  r  r;   r*  r   r   r  r   r   r   r   rI    s   
rI  c                   s<   e Zd Zd	eeededd fddZd dddZ  Z	S )
	AliasNodeNr   )r  aliasOptionsr  r   	parentKeyrX   c                sx   t    || _|| _|| _|d k	rbd|jkrT|jd d }||jd< | |jd< |jd | _	n|d k	snt
|| _	d S )Nzc:parent_symbolr   r  zc:parent_key)r`  r   r  rK  r  r  r  r   r  rL  r   )r   r  rK  r  r   rL  r  )rb  r   r   r     s    


zAliasNode.__init__)rX   c             C   s   | j | j| j| jd | jdS )N)r   rL  )rb  r  rK  r  rL  )r   r   r   r   r3    s    zAliasNode.copy)NN)
r   r   r   r   r   r   rS  r   r3  r  r   r   )rb  r   rJ    s    rJ  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{   )rs  maxdepthskipThisrK  renderOptionsr  rX   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< |}
x:|j	D ]0}|jd krq| j
||d|||d}|
| qW |s
t|j	dkr
|| |S )Nr   Tr{   Fr   r   r   domainaliasr  desctypenoindex)rN  rO  rK  rP  r  )r   desc_signaturer   r   r   r   Zdesc_contentr  r  r  _render_symbolr  r   )r   rs  rN  rO  rK  rP  r  recurser   r   ZchildContainercontentr  ro  Z
childNodesr   r   r   rV    sB    



zAliasTransform._render_symbolN)kwargsrX   c             K   s  x| j tD ]}|j}|j}yt||| jjd}| }W n4 t	k
rt } zt
j||d d }W d d }~X Y nX |d krt|d}|  |t||7 }|| q| jjd jd }	|	|}
|
std| td| t|	d |
st|
j|d	d
d
d}|d kr`t|d}|| |  |t||7 }t
jd| |d || q|jd s|jd krt|d}|| |  |t||7 }t
jd| |d || q| j||jd |jd |ji |j d}|| qW d S )N)r  r  )r  r   r   r  zTarget: zParentKey: r{   anyT)rt  ru  z,Could not find C declaration for alias '%s'.norootzACan not render C declaration for alias '%s'. No such declaration.rN  )rN  rO  rK  rP  r  )r  findallrJ  r  rL  r  r   r  r  r'   r  r  r   rU  clearr   Zreplace_selfdomainsr   r  rY  r   r   r  r   rK  r   rV  )r   rY  r   r  rL  r  r   r1  r   rA  rR  rs  r   r   r   r   apply  sd    










zAliasTransform.apply)r   r   r   r!   Zdefault_priorityr}   rT   rf   r   r   r   r   rV  r_  r   r   r   r   rM    s
   
*rM  c               @   s6   e Zd ZU ejejdZeed< e	e
 dddZdS )CAliasObject)rN  r[  r  )rX   c          	   C   s   d| j kr"| j dd\| _| _nd| j  | _| _t }| jj|_| j|d< | j |d< |d< d|d< g | _| j	
d	dd
| j	kd}|d
 r|d	 dkrtjd|  d x,|  D ] }|t||| jj| jd qW |gS )z
        On purpose this doesn't call the ObjectDescription version, but is based on it.
        Each alias signature may expand into multiple real signatures if 'noroot'.
        The code is therefore based on the ObjectDescription version.
        r+  r{   r   rQ  r  rS  TrT  rN  r[  )rN  r[  zError in C alias declaration. Requested 'noroot' but 'maxdepth' 1. When skipping the root declaration, need 'maxdepth' 0 for infinite or at least 2.)r  )r   )r   splitrQ  r  r   r  r  r  r   rL  rH  r  r  r@  Zget_signaturesr   rJ  r   )r   r   rK  r  r   r   r   r  '  s"    


 zCAliasObject.runN)r   r   r   r   Znonnegative_intr)  r  r;   r*  r   r   r  r   r   r   r   r`  !  s   
r`  c                   sR   e Zd Zeeeeeeeef dddZee	e
 e	e f d fddZ  ZS )	CXRefRole)r   refnodehas_explicit_titletitletargetrX   c             C   sv   |j |j |s"tdt|}|sn|d}|dd dkrn|dd  }|d}|dkrn||d d  }||fS )Nz[anonymous]ry   r   r{   r   r   )
attributesupdater  r+   subr   r  rfind)r   r   rc  rd  re  rf  dotr   r   r   process_linkJ  s    

zCXRefRole.process_link)rX   c       	         s>  | j jd r| jrt  S | jdd}t||  | j jd}y|	  t  S  t
k
r8 } zd|_y| }W n t
k
r   t  S X dddg}| j jd	d }|d kr| j jd d
 }tj|d}||d| j | | j jd r"d}|d7 }|tj|||}tj||  d |gg fS d }~X Y nX d S )Nr  r  r   )r  r  r   Zxrefr   zc-texprzcpp:parent_symbolr  )classesr   r  zB{}: Pre-v3 C type role ':c:type:`{}`' converted to ':c:expr:`{}`'.z#
The original parsing error was:
{})r  )r   r  disabledr`  r  r   replacer  r@  r  r'   r  r  r  rH  r  r   rS   r   rT  r   r   r  r  )	r   r   r  r!  r  rm  rR  r   r  )rb  r   r   r  ^  s4    



zCXRefRole.run)r   r   r   r   r   rf   r   r	   rl  r   r   r   r  r  r   r   )rb  r   rb  I  s   rb  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 )	CExprRoleN)asCoderX   c                s    t    |rd| _nd| _d S )Nzc-exprzc-texpr)r`  r   
class_type)r   rq  )rb  r   r   r     s    
zCExprRole.__init__)rX   c          
   C   s   | j dd}t||  | j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   )rm  zc:parent_symbolr  r   )r   ro  r  r@  r   r  r  r'   r  r  r   Zdesc_inlinerr  r  rH  r  r   )r   r   r  r  exrR  r   r   r   r   r    s    

*zCExprRole.run)r   r   r   rf   r   r	   r   r   r   r  r  r   r   )rb  r   rp    s   	rp  c               @   sB  e Zd ZU dZdZdZeedddddeedd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eeddddeedddeedddeedddddd
Ze	e	e
eeeeeeeeeedZe e e edde e e e e e eddedddZedddddi dZeeeeeeeeeef f f f ed< 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e0f  d0d1d2Z1dS )3CDomainzC language domain.r   r  rM  r  r   r   variablerE  funcr   rN  r]   r`   rN   rF  zfunction parameter)
rM  r  rE  rN  r]   r`   rN   rF  r   ri  )rM  r  rE  rN  r]   r`   rN   rF  r   	namespaceznamespace-pushznamespace-poprR  T)Z
fix_parens)rq  F)rM  r   r  rv  rN  r]   r`   rN   rF  r   r   ZtexprN)r  objectsinitial_data)r]  rX   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| d S )	Nz
clear_doc:z	before:r  r{   z	before endz	after:z
	after endzclear_doc end:)r}   r  rY  r   r   rn  )r   r]  rA  r   r   r   rn    s    


zCDomain.clear_doc)r   r]  r  rX   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  rY  r   r   )r   r   r]  r  r   r   r   process_doc  s    
zCDomain.process_doc)r   rX   c             C   s   |j | jj d S )N)rg  rh  r   r  )r   r   r   r   r   process_field_xref  s    zCDomain.process_field_xref)r  	otherdatarX   c             C   s   t jr\td td t| jd d td td t|d d td td | jd |d || j | jd	 }x<|d	  D ],\}\}}}||kr||kr|||f||< qW d S )
Nzmerge_domaindata:z	self:r  r{   z		self endz	other:z
	other endzmerge_domaindata endrx  )r}   r  rY  r   r   r  r   items)r   r  r|  Z
ourObjectsfullnamefnrH  r  r   r   r   merge_domaindata  s     

zCDomain.merge_domaindata)r   fromdocnamebuilderr   rf  r   contnoderX   c          
   C   s
  t |||jd}y| }	W n4 tk
rP }
 ztjd||
|d dS d }
~
X Y nX |dd }| jd }|r||}|st	d| t	d| t	|
d	 |stn|}|j|	|d
d
d}|d ks|jd krdS |j}|	 }|j}|stt|||| |||jfS )N)r  r  z$Unparseable C cross-reference: %r
%s)r  )NNzc:parent_keyr  zTarget: zParentKey: r{   T)rt  ru  )r  r  r  r'   r  r  rH  r   r  rY  r   r   r  r   r   r]  r:   rJ  r  )r   r   r  r  r   rf  r   r  r  r   r1  rL  rA  rR  rs  r   ZdisplayNamer]  r   r   r   _resolve_xref_inner  s8    






zCDomain._resolve_xref_innerc          	   C   s   |  |||||||d S )Nr   )r  )r   r   r  r  r   rf  r   r  r   r   r   resolve_xref+  s    zCDomain.resolve_xref)r   r  r  rf  r   r  rX   c       	   
   C   sJ   t    | |||d|||\}}W d Q R X |rFd| | |fgS g S )NrZ  zc:)r"   suppress_loggingr  Zrole_for_objtype)	r   r   r  r  rf  r   r  Zretnoder  r   r   r   resolve_any_xref1  s    

zCDomain.resolve_any_xref)rX   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   rp  r   r]  r   r;  r   r  r   r  rJ  )	r   rA  r   ZfullNestedNamer   Zdispnamer  r]  r  r   r   r   get_objects;  s    



zCDomain.get_objects)2r   r   r   r(  r   r.  r   r   Zobject_typesr+  r1  r5  r6  r7  r8  r9  r:  r;  rG  rI  r`  r   rb  rp  Zrolesr}   ry  r   r   r   r	   r*  rn  r   r   r  rz  r   r{  r   r  r   r   r   r  r  r  r   rT   r  r   r   r   r   rt    sn   
2 #rt  )apprX   c             C   sh   |  t | dg d | dg d | dtd | t | ddd | ddd d	d
dddS )Nr  r   r  r  r  Fr  Tbuiltinr~  )r   Zenv_versionZparallel_read_safeZparallel_write_safe)Z
add_domainrt  Zadd_config_value_macroKeywordsZadd_post_transformrM  )r  r   r   r   setupJ  s    

r  )r(  retypingr   r   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   Zsphinx.applicationr   Zsphinx.buildersr   Zsphinx.deprecationr   Zsphinx.directivesr   Zsphinx.domainsr   r   Zsphinx.environmentr   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   r8   Zsphinx.util.docutilsr9   Zsphinx.util.nodesr:   Zsphinx.util.typingr;   	getLoggerr   r  r<   rD  r  r  r  r  r  rI  rG  compileSr  r  r   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   r%  r'  r*  r,  r/  r   r   r6  rA   rB   r>  rC   r=   r>   r?   r@   r~   rP  rS  r}   r  r   r  r+  r2  r1  r5  r6  r7  r8  r9  r:  r;  rG  rI  rJ  rM  r`  rb  rp  rt  r   r  r   r   r   r   <module>   s8  4T




	/Q		3A6;)!G&/(Z	            _ G


#n(8  *