B
    0ªaíü  ã               @   s$  d dl mZ d dl mZ d dl mZ d dl mZ d dlZddlmZ ddlmZ dd	l	m
Z
mZmZm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mZmZmZmZ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(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0 ddl1m2Z2 G dd„ de3ƒZ4dS )é    )Úabsolute_import)Údivision)Úprint_function)Úunicode_literalsNé   )Úast)Úmessage)ÚTAG_DEPRECATEDÚ	TAG_SINCEÚTAG_STABILITYÚTAG_RETURNS)ÚANN_ALLOW_NONEÚ	ANN_ARRAYÚANN_ATTRIBUTESÚANN_CLOSUREÚANN_CONSTRUCTORÚANN_DESTROYÚANN_ELEMENT_TYPEÚANN_FOREIGNÚANN_GET_VALUE_FUNCÚANN_INÚ	ANN_INOUTÚ
ANN_METHODÚANN_OUTÚANN_REF_FUNCÚANN_RENAME_TOÚ	ANN_SCOPEÚANN_SET_VALUE_FUNCÚANN_SKIPÚANN_TRANSFERÚANN_TYPEÚANN_UNREF_FUNCÚ	ANN_VALUEÚ	ANN_VFUNCÚANN_NULLABLEÚANN_OPTIONALÚANN_NOT)	ÚOPT_ARRAY_FIXED_SIZEÚOPT_ARRAY_LENGTHÚOPT_ARRAY_ZERO_TERMINATEDÚOPT_OUT_CALLEE_ALLOCATESÚOPT_OUT_CALLER_ALLOCATESÚOPT_TRANSFER_CONTAINERÚOPT_TRANSFER_FLOATINGÚOPT_TRANSFER_NONEÚOPT_NOT_NULLABLE)Úto_underscores_noprefixc               @   sà  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdvdd„Zdwdd„Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Z d>d?„ Z!d@dA„ Z"dBdC„ Z#dDdE„ Z$dFdG„ Z%dHdI„ Z&dJdK„ Z'dLdM„ Z(dNdO„ Z)dPdQ„ Z*dRdS„ Z+dTdU„ Z,dVdW„ Z-dXdY„ Z.dZd[„ Z/d\d]„ Z0d^d_„ Z1d`da„ Z2dbdc„ Z3ddde„ Z4dfdg„ Z5dhdi„ Z6djdk„ Z7dldm„ Z8dndo„ Z9dpdq„ Z:drds„ Z;dtdu„ Z<dS )xÚMainTransformerc             C   s   || _ || _|j| _i | _d S )N)Ú_transformerÚ_blocksÚ	namespaceÚ
_namespaceÚ_uscore_type_names)ÚselfZtransformerZblocks© r8   ú;/usr/lib/gobject-introspection/giscanner/maintransformer.pyÚ__init__.   s    zMainTransformer.__init__c             C   sH  | j jst d¡ | j  | j¡ | j  | j¡ | j  | j¡ | j  | j¡ | j  | j	¡ | j  | j¡ x`| j  
¡ D ]R}t|tjƒrš|jd k	rš|| j|j< qrt|tjtjfƒrrt|jƒ ¡ }|| j|< qrW xHt| j  
¡ ƒD ]6}t|tjƒrò|  |¡ t|tjtjfƒrØ|  |¡ qØW | j  | j¡ | j  | j¡ | j  | j¡ |  ¡  d S )NzjNamespace is empty; likely causes are:
* Not including .h files to be scanned
* Broken --identifier-prefix)r5   Únamesr   ZfatalÚwalkÚ_pass_fixup_hidden_fieldsÚ_pass_type_resolutionÚ_pass_read_annotations_earlyÚ_pass_callable_defaultsÚ_pass_read_annotationsÚvaluesÚ
isinstancer   Ú
RegisteredÚget_typer6   Úc_symbol_prefixÚRecordÚUnionr0   ÚnameÚlowerÚlistÚFunctionÚ_pair_functionÚClassÚ	InterfaceÚ_pair_class_virtualsÚ_pass_read_annotations2Ú_pass3Ú_pair_quarks_with_enums)r7   ÚnodeÚuscoredr8   r8   r9   Ú	transform6   s.    

zMainTransformer.transformc             C   sf   t |tjtjtjtjfƒrbxF|jD ]<}|r"|jdk	r"|j d¡r"|j	dk	r"t |j	tj
ƒr"d|_q"W dS )z^Hide all callbacks starting with _; the typical
        usage is void (*_gtk_reserved1)(void);NÚ_FT)rC   r   rN   rO   rG   rH   ÚfieldsrI   Ú
startswithÚanonymous_nodeÚCallbackZintrospectable)r7   rT   ÚchainÚfieldr8   r8   r9   r=   n   s    


z)MainTransformer._pass_fixup_hidden_fieldsc             C   sp   y|  |¡}W n tk
r&   d }Y nX |d krjt|tjƒrJd|jf }nd}t tj|d|||j	f ¡ |jS )Nzparameter %szreturn valuez0can't find parameter %s referenced by %s of '%s')
Úget_parameterÚ
ValueErrorrC   r   Ú	ParameterÚargnamer   Úlog_nodeÚFATALrI   )r7   ÚparentZ
param_nameÚoriginÚparamÚorigin_namer8   r8   r9   Ú_get_validate_parameter_name{   s    
z,MainTransformer._get_validate_parameter_namec             C   s^   y|  |¡}W n tk
r&   d }Y nX |d krXd|jf }t tj|d|||jf ¡ |jS )Nzfield %sz,can't find field %s referenced by %s of '%s')Z	get_fieldr_   rI   r   rb   rc   )r7   rd   Z
field_namere   r]   rg   r8   r8   r9   Ú_get_validate_field_nameŒ   s    
z(MainTransformer._get_validate_field_namec             C   s    |sd S |j  t¡}|sd S |d }| j |¡}|sHt |d|f ¡ nT|jrjt |d|j|j|f ¡ n2|j	rŒt |d|j|j	|f ¡ n|j
|_|j
|_	d S )Nr   z;Can't find symbol '%s' referenced by "rename-to" annotationzAFunction '%s' already shadowed by '%s', can't overwrite with '%s'zCFunction '%s' already shadows '%s', can't multiply shadow with '%s')ÚannotationsÚgetr   r5   Zget_by_symbolr   Ú	warn_nodeZshadowed_byÚsymbolZshadowsrI   )r7   rT   r\   ÚblockZ	rename_toÚtargetr8   r8   r9   Ú_apply_annotation_rename_toš   s0    z+MainTransformer._apply_annotation_rename_toc             C   s    | j  |j¡}|  |||¡ d S )N)r3   rk   rm   Ú_apply_annotations_callable)r7   rT   r\   rn   r8   r8   r9   Ú_apply_annotations_functionµ   s    z+MainTransformer._apply_annotations_functionc             C   sD   t |tjƒr@|jd k	r&| j |j¡}n| j |j¡}|  ||¡ dS )NT)rC   r   rG   Úctyper3   rk   Úc_nameÚ_apply_annotations_annotated)r7   rT   r\   rn   r8   r8   r9   r?   ¹   s    
z,MainTransformer._pass_read_annotations_earlyc             C   s\   t |tjtjfƒrXx&|jD ]}|jd kr|  ||¡|_qW |jjd krX|  ||j¡|j_dS )NT)rC   r   ÚCallableZSignalÚ
parametersÚtransferÚ_get_transfer_defaultÚretval)r7   rT   r\   rf   r8   r8   r9   r@   Â   s    
z'MainTransformer._pass_callable_defaultsc             C   sr   t |tjtjtjtjtjtjtjtj	tj
f	ƒr`|jd k	r>|jS t |tjƒrZ|jd k	rZ|jS |jS td|f ƒ‚d S )NzUnhandled node '%s')rC   r   rN   rO   rG   rH   ÚEnumÚBitfieldr[   ÚAliasÚConstantrs   rD   Ú
gtype_namert   ÚAssertionError)r7   rT   r8   r8   r9   Ú_get_annotation_nameË   s    
z$MainTransformer._get_annotation_namec             C   s   | j  |  |¡¡S )N)r3   rk   r   )r7   rT   r8   r8   r9   Ú
_get_blockÖ   s    zMainTransformer._get_blockc       
      C   s<  |j s
dS t|tjƒr"|  ||¡ t|tjƒr:|  ||¡ t|tjƒr\| j|||  	|¡d t|tj
tjtjtjtjtjfƒr|  ||  	|¡¡ t|tjtjfƒr´|  ||  	|¡¡ t|tj
tjtjtjfƒr2|  	|¡}x|jD ]}|  |||¡ qâW |  |¡}d| ¡ f }| j |¡}|r2|jr2|j|_t|tj
tjfƒr‚x|jD ]}|  ||¡ qNW x|jD ]}|  ||¡ qlW t|tj
ƒr |  	|¡}|r |j t¡}	|	rº|	d nd |_ |j t!¡}	|	rÚ|	d nd |_"|j t#¡}	|	rú|	d nd |_$|j t%¡}	|	r|	d nd |_&t|tj'ƒr8|  (|¡ dS )NF)rn   z
SECTION:%sr   T))r4   rC   r   r}   Ú_apply_annotations_aliasrL   rr   r[   rq   r‚   rN   rO   rH   r{   r|   ru   Ú_apply_annotations_enum_membersrG   rX   Ú_apply_annotations_fieldr   rJ   r3   rk   ÚdescriptionÚdocÚ
propertiesÚ_apply_annotations_propertyÚsignalsÚ_apply_annotations_signalrj   r!   Z
unref_funcr   Zref_funcr   Zset_value_funcr   Zget_value_funcr~   Ú_apply_annotations_constant)
r7   rT   r\   rn   r]   rI   Zsection_nameÚpropÚsigZ
annotationr8   r8   r9   rA   Ù   sR    



z&MainTransformer._pass_read_annotationsc             C   sN   t |kr|  |||¡ nt|kr.|  |||¡ t|jtjƒrJ|  |j|¡ d S )N)	r   Ú_apply_annotations_arrayr   Ú_apply_annotations_element_typerC   Útyper   ÚArrayÚ_check_array_element_type)r7   rd   rT   rj   r8   r8   r9   Ú_adjust_container_type  s    z&MainTransformer._adjust_container_typeNc                sª   ‡fdd„‰‡fdd„}‡fdd„‰ ‡ ‡fdd„}ˆˆ||ˆ ƒ\}}|rXt  d	ˆf ¡ |js¦d }	|d k	rŠt|tjƒrŠ|j}
ˆ ||¡}	nˆ}
t j|d
|
ˆf |	d |S )Nc                s²   t  d| d¡}t|ƒdkr(|d ddgn|\}}}||ƒg}|dksL|dkrž|dkrXdnd}	xH||	kršˆ ||||ƒ\}
}| |
¡ |d |dd	…  }}q^W n|| }||Ž |fS )
zÙReturn a complete type, and the trailing string part after it.
            Use resolver() on each identifier, and combiner() on the parts of
            each complete type. (top_combiner is used on the top-most type.)z	([,<>()])r   r   Ú ú<ú(ú>ú)N)ÚreÚsplitÚlenÚappend)Útype_strÚresolverÚtop_combinerÚcombinerÚbitsÚfirstÚsepÚrestÚargsZlastsepÚnext)Úgrab_oner8   r9   r¨     s    $


z*MainTransformer._resolve.<locals>.grab_onec                s   ˆ j  | ¡}|S )N)r2   Úcreate_type_from_user_string)ZidentZres)r7   r8   r9   rŸ     s    z*MainTransformer._resolve.<locals>.resolverc                sŽ   |s| S t | tjƒr2t|ƒdkr2tj| jf|žŽ S t | tjƒrXt|ƒdkrX|d | _| S t | tjƒrzt|ƒdkrztj|Ž S t 	dˆ f ¡ | S )Nr   r   é   z.Too many parameters in type specification '%s')
rC   r   ÚListrœ   rI   r’   Úelement_typeÚMapr   Úwarn)Úbaser¥   )rž   r8   r9   r¡   #  s    

z*MainTransformer._resolve.<locals>.combinerc                s*   ˆd k	rt ˆtjƒrˆj| _ˆ | f|žŽ S )N)rC   r   ÚTypeÚis_const)r¯   r¥   )r¡   Ú	type_noder8   r9   r    1  s    z.MainTransformer._resolve.<locals>.top_combinerz.Trailing components in type specification '%s'z%s: Unknown type: '%s')Z	positions)	r   r®   ÚresolvedrC   r   rL   rm   Ú_get_positionrl   )r7   rž   r²   rT   rd   rŸ   r    Úresultr¥   ÚpositionÚtextr8   )r¡   r¨   r7   r²   rž   r9   Ú_resolve  s"    
zMainTransformer._resolvec             C   s&   | j ||||d}|dk	r"|j|_|S )zJLike _resolve(), but attempt to preserve more attributes of original type.)r²   rT   rd   N)r¸   rs   )r7   rž   r²   rT   rd   rµ   r8   r8   r9   Ú_resolve_toplevelF  s    z!MainTransformer._resolve_toplevelc             C   s^   | j  |j¡}|rXt|tjƒr.|j |j¡}nt|tjƒrH|j	 t
¡}nd }|jrX|jS |jS )N)r3   rk   rm   rC   r   r`   Úparamsra   ÚReturnÚtagsr   r¶   )r7   Úfuncrf   rn   Úpartr8   r8   r9   r´   O  s    zMainTransformer._get_positionc             C   s’   |j }|j}|tjjkrL|tjkr,|tjks>t|tjtj	fƒrLt
 d|j¡ |tjjkrŽ|tjkrltj|_n"|tjtjtjgkrŽt
 d|j¡ d S )Nz9invalid (element-type) for a GPtrArray, must be a pointerzNinvalid (element-type) for a GByteArray, must be one of guint8, gint8 or gchar)Ú
array_typer¬   r   r’   ZGLIB_PTRARRAYÚBASIC_GIR_TYPESZPOINTER_TYPESrC   r{   r|   r   r®   r¶   ZGLIB_BYTEARRAYÚTYPE_ANYZ
TYPE_UINT8Z	TYPE_INT8Z	TYPE_CHAR)r7   Zarrayrj   r¿   r¬   r8   r8   r9   r“   ^  s    

z)MainTransformer._check_array_element_typec          	   C   s¤  |  t¡}|r&|  |d |j||¡}nHt|jtjƒr>|jj}n0|j ¡ }|j	d k	rn|j	 
d¡rn|j	d d… |_	t|jtjƒr†|jj}nd }|  t¡}tj|||jj	|jjd}|  td¡dkrÆd|_n$t|ksÜ|  t¡dkräd|_nd|_|  t¡}	|	r`t|tjƒr|  ||	|¡}
n<|  ||	|¡}
|
rT| |
¡}|j|_|jtjkrTtj|_|
r`|
|_|  t¡}|ršyt|ƒ|_W n ttfk
r˜   d S X ||_d S )	Nr   Ú*éÿÿÿÿ)rs   r±   Ú0FÚ1T)rk   r   r¸   r‘   rC   r   r’   r¬   Úcloners   Úendswithr¿   r   r±   r)   Zzeroterminatedr(   ÚCompoundri   rh   r^   Ú	directionÚPARAM_DIRECTION_OUTÚPARAM_TRANSFER_FULLrx   Zlength_param_namer'   ÚintÚsizeÚ	TypeErrorr_   )r7   rd   rT   rj   Úelement_type_optionsZelement_type_noder¿   Zarray_optionsZcontainer_typeÚlengthZ	paramnamerf   Zfixedr8   r8   r9   r   t  sP    








z(MainTransformer._apply_annotations_arrayc             C   sD  |  t¡}|d krd S t|jtjƒrht|ƒdkrLt dt|ƒf |j	¡ d S |  
|d |j||¡|j_nØt|jtjƒrÔt|ƒdkržt dt|ƒf |j	¡ d S |  
|d |j||¡|j_|  
|d |j||¡|j_nlt|jtjƒr*t|ƒdkrt dt|ƒf |j	¡ d S |  
|d |j||¡|j_nt d|jf |j	¡ d S )Nr   zQ"element-type" annotation for a list must have exactly one option, not %d optionsr   rª   zZ"element-type" annotation for a hash table must have exactly two options, not %d option(s)zS"element-type" annotation for an array must have exactly one option, not %d optionsz0Unknown container %r for element-type annotation)rk   r   rC   r‘   r   r«   rœ   r   r®   r¶   r¸   r¬   r­   Zkey_typeÚ
value_typer’   )r7   rd   rT   rj   rÏ   r8   r8   r9   r   ª  sF    








z/MainTransformer._apply_annotations_element_typec             C   s*   |j tjtjgkr$|jrtjS tjS tjS )N)rÉ   r   ÚPARAM_DIRECTION_INOUTrÊ   Úcaller_allocatesÚPARAM_TRANSFER_NONErË   )r7   rd   rT   r8   r8   r9   Ú_get_transfer_default_paramÑ  s    
z+MainTransformer._get_transfer_default_paramc             C   sJ   |  tj¡s$|js$|  tjtjf¡r*tjS |  tj¡r<tjS |j	rFd S d S )N)
Úis_equivr   rÀ   r±   rÁ   Ú	TYPE_NONErÔ   ÚTYPE_STRINGrË   Ztarget_fundamental)r7   Útypevalr8   r8   r9   Ú&_get_transfer_default_returntype_basicÙ  s    z6MainTransformer._get_transfer_default_returntype_basicc             C   s`   | j  |¡}|stt|ƒƒ‚| j  |¡}|s0t‚||kr<dS |jr\|jjdkr\|  |j|¡S dS )NTzGObject.ObjectF)r2   Úlookup_typenoder€   ÚstrÚparent_typeÚtarget_ginameÚ_is_gi_subclass)r7   rÙ   Zsupercls_typeÚclsZsuperclsr8   r8   r9   rß   æ  s    zMainTransformer._is_gi_subclassc       	   
   C   sn  |j }|  |¡}|r|S |js"d S | j |¡}t|tjƒrF|  |j¡S t|tj	ƒstt|tj
tjfƒrz|jd k	st|jrztjS t|tjtjfƒr’tjS t|tjƒrJ|jrJt|tjƒr&tjdd}y| j |¡}W n0 tk
r } zt |d¡ d S d }~X Y nX |r|  ||¡rtjS tjS n"t|tj
tjfƒr@tjS tdƒ‚n t|tjtj
tjfƒrfd S d S d S )NzGObject.InitiallyUnowned)rÞ   z0constructor found but GObject is not in includeszInvalid constructor)r‘   rÚ   rÞ   r2   rÛ   rC   r   r}   ro   ÚBoxedrG   rH   r   ÚforeignrË   r{   r|   rÔ   rL   Úis_constructorrN   r°   ÚKeyErrorr   Z
error_noderß   r€   )	r7   rd   rT   rÙ   Zbasicro   Zinitially_unowned_typeZinitially_unownedÚer8   r8   r9   Ú_get_transfer_default_returnñ  s@    

z,MainTransformer._get_transfer_default_returnc             C   s‚   |j  tj¡st|j tjƒr"tjS t|tjƒr:|  ||¡S t|tj	ƒrR|  
||¡S t|tjƒrdtjS t|tjƒrvtjS t|ƒ‚d S )N)r‘   rÖ   r   r×   rC   ZVarargsrÔ   r`   rÕ   r»   ræ   ÚFieldZPropertyr€   )r7   rd   rT   r8   r8   r9   ry     s    z%MainTransformer._get_transfer_defaultc             C   sr   t |tjƒs"|jtjtjfkr"dS | j |j¡}| j 	|¡}|d krJ|jn|}t |tj
ƒ pp|tjkpp|j d¡S )NTrÂ   )rC   r   r»   rÉ   rÊ   rÒ   r2   rÛ   r‘   Úresolve_aliasesr°   ZBASIC_TYPESrs   rÇ   )r7   rT   rj   ro   r8   r8   r9   Ú_is_pointer_type&  s    

z MainTransformer._is_pointer_typec          
   C   sX  |  t¡}|rt|ƒdkrd S |d }| j |j¡}| j |¡}|d krN|jn|}t|tj	ƒrb|n|j}|t
krªt}t|tjtjfƒs¨|jdkr¨t d |¡|j¡ d S n¤|tkrêt|krèt|tjtjtjfƒsèt d |¡|j¡ d S nd|  ||¡sN|tjtjfkrNt|tjtjtjtjtjtjtjtjfƒsNt d |¡|j¡ d S ||_d S )Nr   r   zGLib.VariantzOinvalid "transfer" annotation for {0}: only valid for object and GVariant typeszEinvalid "transfer" annotation for {0}: only valid for container typeszminvalid "transfer" annotation for {0}: only valid for array, struct, union, boxed, object and interface types)rk   r   rœ   r2   rÛ   r‘   rè   rC   r   r°   r-   r.   rN   rO   rÞ   r   r®   Úformatr¶   r,   r   r’   r«   r­   ré   rØ   ZTYPE_FILENAMErG   rÈ   rá   rx   )r7   rd   rT   rj   Útransfer_annotationrx   ro   Ú	node_typer8   r8   r9   Ú_apply_transfer_annotation4  sB    

z*MainTransformer._apply_transfer_annotationc             C   sÒ  |r
|j ni }| t¡}|r4|  |d |j||¡|_d}d }t|krLtj}n°t|krîtj	}|t }t
|ƒdkrÊ|jjrÄ|jjrÄ| j |jj¡}	| j |	¡}	d|jjk}
t|	tjtjfƒ}|
 oÀ|}qìd}qü|d }|tkràd}qü|tkrüd}nt|krütj}|d k	r,||jkr,||_||_|  ||¡|_|  |||¡ |  |||¡ |j tj¡r^d|_t |kr’|  !||¡r„d|_d|_"nt# $d|j%¡ t&|krÎt|tj'ƒsÀ|jtj	krÀd|_(nt# $d|j%¡ t)|kr |jtj	krüt|tj'ƒsüd|_(n$|  !||¡rd|_nt# $d|j%¡ |jtj	krP|jjdksJ|jjd	krPd|_t*|krfd|_d|_"|r||j+r||j+|_,t-|krŒd|_.|rÎ| t/¡}|d k	rÎx&| 0¡ D ]\}}|r°||j1|< q°W d S )
Nr   Fz**TzNinvalid "nullable" annotation: only valid for pointer types and out parametersz<invalid "optional" annotation: only valid for out parameterszPinvalid "allow-none" annotation: only valid for pointer types and out parameterszGio.AsyncReadyCallbackzGio.Cancellable)2rj   rk   r    r¹   r‘   r   r   rÒ   r   rÊ   rœ   rÞ   rs   r2   Zlookup_ginamerè   rC   rG   rH   r+   r*   r   ZPARAM_DIRECTION_INrÉ   rÓ   ry   rx   rí   r”   rÖ   rÁ   Únullabler$   ré   Únot_nullabler   r®   r¶   r%   r»   Zoptionalr   r&   r†   r‡   r   Úskipr   ÚitemsÚ
attributes)r7   rd   rT   Útagrj   Útype_annotationrÓ   Zannotated_directionZoptionsro   Zhas_double_indirectionZis_structure_or_unionZoptionÚattributes_annotationÚkeyÚvaluer8   r8   r9   Ú#_apply_annotations_param_ret_common_  s    








z3MainTransformer._apply_annotations_param_ret_commonc       	      C   s:  |d krd S |j r|j |_|j t¡}|d k	rJ|jr<|j|_|j rJ|j |_|j t¡}|d k	rz|jrl|j|_	|j rz|j |_
|j t¡}|d k	rª|jrœ|j|_|j rª|j |_|j t¡}|d k	râx"| ¡ D ]\}}|rÈ||j|< qÈW t|jkròd|_t|jkrd|_t|jkr$t|tjƒr$d|_t|jkr6d|_d S )NT)r†   r‡   r¼   rk   r
   r÷   ÚversionZversion_docr	   Z
deprecatedZdeprecated_docr   Z	stabilityZstability_docrj   r   rñ   rò   r   rð   r   râ   r   rC   r   rL   rã   r   Ú	is_method)	r7   rT   rn   Z	since_tagZdeprecated_tagZstability_tagrõ   rö   r÷   r8   r8   r9   ru   Å  sF    
z,MainTransformer._apply_annotations_annotatedc             C   s   |   |¡}|  ||¡ d S )N)r‚   ru   )r7   rT   r\   rn   r8   r8   r9   rƒ   ó  s    
z(MainTransformer._apply_annotations_aliasc       	      C   sò   |r
|j ni }t|tjtjfƒrÄ| t¡}|rLt|ƒdkrL|d |_tj	|_
| t¡}|r”|  ||d |¡|_|jd k	r”tj|_| |j¡}tj|_| t¡}|ràt|ƒdkrà|  ||d |¡|_nt|tjƒràt|krà|j|_|  |||¡ d S )Nr   r   )rj   rC   r   rL   Ú	VFunctionrk   r   rœ   ÚscoperÔ   rx   r   rh   Údestroy_nameÚPARAM_SCOPE_NOTIFIEDr^   r   Úclosure_namer[   ra   rø   )	r7   rd   rf   ró   rj   Zscope_annotationZdestroy_annotationZdestroy_paramZclosure_annotationr8   r8   r9   Ú_apply_annotations_param÷  s0    





z(MainTransformer._apply_annotations_paramc             C   sV   |r|j  t¡}nd }|d k	rD|jtjkrDt d|jf |j	¡ d }|  
|||¡ d S )Nz%s: invalid return annotation)r¼   rk   r   r‘   r   r×   r   r®   rI   r¶   rø   )r7   rd   Zreturn_rn   ró   r8   r8   r9   Ú_apply_annotations_return  s    z)MainTransformer._apply_annotations_returnc             C   s.  t g ƒ}|jrF|r$|j |jj¡}nd }|  ||j|¡ | |jj¡ x>|D ]6}|rd|j |j¡}nd }|  |||¡ | |j¡ qLW |sŽd S t |jƒ}|| }|| }	x€|D ]x}
t|	ƒdkrÄd}n<t|	ƒdkrâ|	\}d|f }ndd dd„ t	|	ƒD ƒ¡f }|j |
¡}t
 d	|j|
|f |j¡ q®W d S )
Nr   r•   r   z, should be '%s'z, should be one of %sz, c             s   s   | ]}d | V  qdS )z'%s'Nr8   )Ú.0Úpr8   r8   r9   ú	<genexpr>J  s    z<MainTransformer._apply_annotations_params.<locals>.<genexpr>z5%s: unknown parameter '%s' in documentation comment%s)ÚsetÚinstance_parameterrº   rk   ra   r   Úaddrœ   ÚjoinÚsortedr   r®   rI   r¶   )r7   rd   rº   rn   Z
declparamsZ	doc_paramrf   Z	docparamsÚunknownZunusedZdoc_namer·   r8   r8   r9   Ú_apply_annotations_params)  s<    


z)MainTransformer._apply_annotations_paramsc             C   s0   |   ||¡ |  ||j|¡ |  ||j|¡ d S )N)ru   r  rw   r  rz   )r7   rT   r\   rn   r8   r8   r9   rq   Q  s    z+MainTransformer._apply_annotations_callablec          
   C   sŒ   |sd S |j  |j¡}|sd S |j t¡}|r@| j |d ¡|_|j|_	y|  
|||j¡ W n* tk
r† } zt|ƒ W d d }~X Y nX d S )Nr   )rº   rk   rI   rj   r    r2   r©   r‘   r†   r‡   r”   ÚAttributeErrorÚprint)r7   rd   rn   r]   ró   rô   Zexr8   r8   r9   r…   V  s    z(MainTransformer._apply_annotations_fieldc             C   sž   |   |¡}| j d||jf ¡}|  ||¡ |s4d S |j t¡}|d k	rd|d }|tkr\t}||_	n|  
||¡|_	|j t¡}|rš|  |d |j||¡|_d S )Nz%s:%sr   )r   r3   rk   rI   ru   rj   r   r-   r.   rx   ry   r    r¹   r‘   )r7   rd   r   Úprefixrn   rë   rx   rô   r8   r8   r9   r‰   e  s    
z+MainTransformer._apply_annotations_propertyc             C   s  g }|   |¡}| j d||jf ¡}|rš|  ||¡ t|jƒt|jƒkr~|j ¡ }xFt	|jƒD ]\}}||d  \|_
}q^W nt|jƒdkršt d|j¡ xjt	|jƒD ]\\}}|rð||d  \}	}|rô|j t¡}
|
rô|  |
d |j||¡|_nd }|  |||¡ q¦W |  ||j|¡ d S )Nz%s::%sr   r   zWincorrect number of parameters in comment block, parameter annotations will be ignored.)r   r3   rk   rI   ru   rœ   rº   rw   rñ   Ú	enumeratera   r   r®   r¶   rj   r    r¹   r‘   r   r  rz   )r7   rd   Úsignalr;   r  rn   Úirf   ró   rI   rô   r8   r8   r9   r‹   w  s.    

z)MainTransformer._apply_annotations_signalc             C   s@   |   |¡}|d krd S |  ||¡ |j t¡}|r<|d |_d S )Nr   )r‚   ru   rj   rk   r"   r÷   )r7   rT   rn   Zvalue_annotationr8   r8   r9   rŒ   š  s    
z+MainTransformer._apply_annotations_constantc             C   sB   |d krd S x0|j D ]&}|j |jd ¡}|r|jr|j|_qW d S )N)Úmembersrº   rk   rm   r†   r‡   )r7   rT   rn   Úmrf   r8   r8   r9   r„   ¥  s    
z/MainTransformer._apply_annotations_enum_membersc       	      C   s°   t |tjƒr¬| j |j¡}|  |||¡ |r4|d nd }|r¬|r¬|j t¡}|r¬|d }d}x6|j	D ],}|j
|krdd}|j
|_|  ||g|¡ P qdW |s¬t |d|tf ¡ dS )NrÃ   r   FTz/Virtual slot '%s' not found for '%s' annotation)rC   r   rL   r3   rk   rm   rp   rj   r#   Úvirtual_methodsrI   Úinvokerrq   r   rl   )	r7   rT   r\   rn   rd   Zvirtual_annotationZinvoker_nameZmatchedÚvfuncr8   r8   r9   rQ   ®  s(    

z'MainTransformer._pass_read_annotations2c             C   s4   t |ƒ}x&|D ]}| j |¡}|s| |¡ qW |S )zhGiven a list of Type instances, return a new list of types with
the ones that failed to resolve removed.)rK   r2   Úresolve_typeÚremove)r7   ZtypelistZnew_typelistrÙ   r³   r8   r8   r9   Ú_resolve_and_filter_type_listÈ  s    
z-MainTransformer._resolve_and_filter_type_listc       
   	   C   s¼  t |tjƒr| j |j¡ t |tjƒrTx|jD ]}| j |j¡ q.W | j |j	j¡ t |tj
ƒrn| j |j¡ t |tjtjtjtjfƒr®x$|jD ]}|jrœq| j |j¡ qW t |tjtjfƒr€xj|jD ]D}y| j |¡ W n tk
rô   wÊY nX | j |¡}|rÊ||_P qÊW t |tjƒr.tjdd|_x|jD ]}| j |j¡ q6W x0|jD ]&}x|jD ]}	| j |	j¡ qbW qVW t |tjƒrœ|  |j¡|_t |tjƒr¸|  |j¡|_dS )NzGObject.Object)rÞ   T)rC   r   r}   r2   r  ro   rv   rw   r‘   rz   r~   rÑ   rN   rO   rG   rH   rX   rZ   Zparent_chainr_   rÛ   rÝ   r°   rˆ   rŠ   r  Z
interfacesZprerequisites)
r7   rT   r\   Z	parameterr]   rd   ro   r   rŽ   rf   r8   r8   r9   r>   Ó  sF    z%MainTransformer._pass_type_resolutionc             C   s  i }x@| j  ¡ D ]2}t|tjƒs"qt|jƒ ¡ }|||< |||j< qW xÂ| j  ¡ D ]´}t|tjƒsdqR|j	d t
dƒ … }| j |j	¡\}}|d t
dƒ … }|dkrÂ| j jdks´t‚| j  d¡}n| j |¡}|d krà| |¡}|d k	rò|j|_qRt |d|j	f ¡ qRW d S )NZ_quarkZ
g_io_errorZGioZIOErrorEnumz+%s: Couldn't find corresponding enumeration)r5   rB   rC   r   r{   r0   rI   rJ   ZErrorQuarkFunctionrm   rœ   r2   Úsplit_csymbolr€   rk   r6   Zerror_domainr   rl   )r7   Zuscore_enumsÚenumrU   rT   ZfullÚnsZshortr8   r8   r9   rS   ú  s.    

z'MainTransformer._pair_quarks_with_enumsc             C   sp   d}d}d}x^|  d|¡}t|ƒ|kr*dS t|ƒ}|d }| j |¡}|r`|d |dd… ¡fS |d7 }qW dS )a1  'uscored' should be an un-prefixed uscore string.  This
function searches through the namespace for the longest type which
prefixes uscored, and returns (type, suffix).  Example, assuming
namespace Gtk, type is TextBuffer:

_split_uscored_by_type(text_buffer_try_new) -> (ast.Class(TextBuffer), 'try_new')Nr   rÃ   rW   r   )Úrsplitrœ   r6   rk   r  )r7   rU   rT   ÚcountZprev_split_countZ
componentsZtype_stringr8   r8   r9   Ú_split_uscored_by_type  s    z&MainTransformer._split_uscored_by_typec             C   s„   |j  d¡s| ¡ rdS | j |j ¡\}}|| jks8t‚|  ||¡rT|  ||¡ dS |  	||¡rp|  
||¡ dS |  ||¡r€dS dS )zXCheck to see whether a toplevel function should be a
method or constructor of some type.rW   N)rm   rY   Zis_type_meta_functionr2   r  r5   r€   Ú_is_constructorÚ_set_up_constructorÚ
_is_methodÚ_setup_methodÚ_pair_static_method)r7   r½   r  Ú	subsymbolr8   r8   r9   rM   0  s    zMainTransformer._pair_functionc             C   s   |  ¡ }t|ƒ ¡ S )z;Given a Type(target_giname='Foo.BarBaz'), return 'bar_baz'.)Z
get_ginamer0   rJ   )r7   rÙ   rI   r8   r8   r9   Ú_uscored_identifier_for_typeC  s    z,MainTransformer._uscored_identifier_for_typec             C   s  |j s$|jr t |d|jf ¡ dS |j d }| j |j¡}t|t	j
t	jt	jt	jt	jfƒsx|jrtt |d|jf ¡ dS |j| jkr¢|jržt |d|jf ¡ dS |jt	jkrÌ|jrÈt |d|jf ¡ dS |jjd k	rî|jj d¡dkrîdS |js|  ||¡}| |¡sdS d	S )
Nz %s: Methods must have parametersFr   z8%s: Methods must have a pointer as their first parameterzI%s: Methods must belong to the same namespace as the class they belong toz;%s: The first argument of methods cannot be an out-argumentrÂ   r   T)rw   rú   r   rl   rm   r2   rÛ   r‘   rC   r   rN   rO   rG   rH   rá   r4   r5   rÉ   rÊ   rs   r  Ú_get_uscored_prefixrY   )r7   r½   r%  r£   ro   Úuscored_prefixr8   r8   r9   r"  H  sD    

zMainTransformer._is_methodc             C   sì   |   ||¡}| j |jd j¡}|jsŽ| |d ¡sŽ| ¡ }|j|_	|j 
d¡|_|j |¡}|j|t|ƒ d d … |_d|_|j |¡ nZ|j 
d¡|_| j |¡ |jsÜ|j |¡}|j|t|ƒ d d … |_d|_|j |¡ d S )Nr   rW   r   T)r'  r2   rÛ   rw   r‘   rú   rY   rÆ   rI   Úmoved_toÚpopr  rm   Úfindrœ   Úmethodsr   r5   Úfloat)r7   r½   r%  r(  ro   ZnewfuncZ
subsym_idxr8   r8   r9   r#  q  s"    zMainTransformer._setup_methodc             C   s^   d}d }|j d }| j |j¡}t|dƒrJ|jd k	rJ| |j¡}|rJ|j}|sZ|  |j¡}|S )NFr   rF   )rw   r2   rÛ   r‘   ÚhasattrrF   rY   r&  )r7   r½   r%  Zprefix_matchesr(  Ú	first_argro   r8   r8   r9   r'  “  s    
z#MainTransformer._get_uscored_prefixc             C   s®   |   |¡}|d krdS |\}}|dkr*dS t|tjƒrX| j |¡ ||_|j |¡ dS t|tj	tj
tjtjtjtjfƒrª| ¡ }||_|j |¡ |jd |j |_dS dS )NFr•   TÚ.)r  rC   r   rN   r5   r-  rI   Zstatic_methodsr   rO   rG   rH   rá   r{   r|   rÆ   r)  )r7   r½   r%  r›   rT   ÚfuncnameÚnew_funcr8   r8   r9   r$  §  s&    
z#MainTransformer._pair_static_methodc             C   sV   | j  |¡ |  ||¡|_|  ||¡}|j |¡ d|_|jj	sR|  
||j¡|j_	d S )NT)r5   r-  Ú_get_constructor_namerI   Ú_get_constructor_classZconstructorsr   rã   rz   rx   ræ   )r7   r½   r%  Úorigin_noder8   r8   r9   r!  Ê  s    z#MainTransformer._set_up_constructorc             C   s:   d }|   |¡}|d kr.|jr6| j |jj¡}n|\}}|S )N)r  rã   r2   rÛ   rz   r‘   )r7   r½   r%  r5  r›   rW   r8   r8   r9   r4  Ù  s    
z&MainTransformer._get_constructor_classc             C   s0   d }|   |¡}|d kr$|jr,|j}n|\}}|S )N)r  rã   rI   )r7   r½   r%  rI   r›   rW   r8   r8   r9   r3  ä  s    
z%MainTransformer._get_constructor_namec             C   s,   |  d¡rdS d|krdS |  d¡r(dS dS )NZ_newTZ_new_Z_newvF)rÇ   )r7   rm   r8   r8   r9   Ú_guess_constructor_by_nameï  s    

z*MainTransformer._guess_constructor_by_namec             C   s  |j s|  |j¡sdS | j |jj¡}t|tj	ƒsvt|tj
tjtjfƒrX|jd k	sv|jsv|j rrt |d|jf ¡ dS |  ||¡}|d kr¨|j r¤t |d|jf ¡ dS t|tj	ƒsÞt|tj
tjtjfƒrÚ|jd k	sÞ|jsÞdS |j| jkr|j rt |d|jf ¡ dS |j sTt|jƒdkrT| j |jd j¡}|d k	rT|j|jkrTdS t|tj	ƒrà|}x®|rÜ|jdksÜ||kr†P |jrž| j |j¡}nd }|d krht |d|jt| ¡ ƒt|jjƒf ¡ dS qhW n6||krt |d|jt| ¡ ƒt|jjƒf ¡ dS d	S )
NFz7%s: Constructors must return an instance of their classz5Can't find matching type for constructor; symbol='%s'zN%s: Constructors must belong to the same namespace as the class they belong tor   zGObject.ObjectzXReturn value is not superclass for constructor; symbol='%s' constructed='%s' return='%s'zIConstructor return type mismatch symbol='%s' constructed='%s' return='%s'T)rã   r6  rm   r2   rÛ   rz   r‘   rC   r   rN   rG   rH   rá   rE   râ   r   rl   r4  r4   r5   rœ   rw   Zgi_namerÝ   rÜ   Úcreate_type)r7   r½   r%  ro   r5  r/  rd   r8   r8   r9   r   û  sp    




zMainTransformer._is_constructorc             C   sî  |j s
dS | ¡ }| j |j ¡}x |jD ]}t|tjƒr(d|_q(W xÚ|jD ]Ð}d}t|j	tj
ƒrh|j	}n*|jdk	rJ| j |j¡}t|tj
ƒs’qJnqJt|jƒdkr¢qJ|jd j}||kr¸qJtj |j|¡}|jd |_| |¡ |  |¡}| j d||jf ¡}	|  ||g|	¡ |j |¡ qJW xÊ|jD ]À}x¸|jD ]®}
|
j|jkrHq2|
jj|jjkr^q2t|
jƒt|jƒkrxq2x>tt|
jƒƒD ],}|
j| j}|j| j}||krˆqˆqˆW |
j|_| j |
j¡}	|  |g |	¡ P q2W q&W dS )z2Look for virtual methods from the class structure.NFr   z%s::%s)Zglib_type_structr7  r2   rÛ   rX   rC   r   rç   ÚwritablerZ   r[   r‘   rœ   rw   rû   Zfrom_callbackrI   r  Zinherit_file_positionsr   r3   rk   rq   r  r   r,  rz   Úranger  rm   )r7   rT   rì   Zclass_structr]   ÚcallbackZfirstparam_typer  r  rn   Úmethodr  Zm_typeZv_typer8   r8   r9   rP   A  sZ    





z$MainTransformer._pair_class_virtualsc             C   s$   t |tjƒr |  |¡ |  |¡ dS )zKPass 3 is after we've loaded GType data and performed type
        closure.T)rC   r   rv   Ú_pass3_callable_callbacksÚ_pass3_callable_throws)r7   rT   r\   r8   r8   r9   rR   „  s    

zMainTransformer._pass3c       	      C   s0  |j }xB|D ]:}| j |j¡}t|tjƒr|jjdkrtj|_	tj
|_qW d}x–|D ]Ž}| j |j¡}d}t|tjƒrŽ|jjdkrˆd}n|}qT|dkr˜qT|r¶|j|_tj|_	tj
|_qT|j tj¡rT|jdk	rT|j d¡rT|j|_qTW xD|D ]<}|jdk	rì| |j¡}|dkst‚|| }|jsìd|_qìW dS )zaCheck to see if we have anything that looks like a
        callback+user_data+GDestroyNotify set.)zGio.AsyncReadyCallbackzGLib.DestroyNotifyNFzGLib.DestroyNotifyTÚdatar   )rw   r2   rÛ   r‘   rC   r   r[   rÞ   ZPARAM_SCOPE_ASYNCrü   rÔ   rx   ra   rý   rþ   rÖ   rÁ   rÇ   rÿ   Zget_parameter_indexr€   rï   rî   )	r7   rT   rº   rf   ZargnodeZcallback_paramZis_destroynotifyÚidxZclosure_paramr8   r8   r9   r<  Œ  sB    





z)MainTransformer._pass3_callable_callbacksc             C   s4   |j s
dS |j d }|jjdkr0|j  ¡  d|_dS )zaCheck to see if we have anything that looks like a
        callback+user_data+GDestroyNotify set.NrÃ   zGError**T)rw   r‘   rs   r*  Zthrows)r7   rT   Z
last_paramr8   r8   r9   r=  ¹  s    

z&MainTransformer._pass3_callable_throws)NNN)NNN)=Ú__name__Ú
__module__Ú__qualname__r:   rV   r=   rh   ri   rp   rr   r?   r@   r   r‚   rA   r”   r¸   r¹   r´   r“   r   r   rÕ   rÚ   rß   ræ   ry   ré   rí   rø   ru   rƒ   r   r  r  rq   r…   r‰   r‹   rŒ   r„   rQ   r  r>   rS   r  rM   r&  r"  r#  r'  r$  r!  r4  r3  r6  r   rP   rR   r<  r=  r8   r8   r8   r9   r1   ,   st   8		+	
9
	6''+f.%(#	'!)"#FC-r1   )5Z
__future__r   r   r   r   rš   r•   r   r   Zannotationparserr	   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/   Zutilsr0   Úobjectr1   r8   r8   r8   r9   Ú<module>   s   p,