B
    0ªaih  ã               @   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 dd
lmZ dZdZdZdd„ Zdd„ Zdd„ ZG dd„ deƒZdS )é    )Úabsolute_import)Údivision)Úprint_function)Úunicode_literalsN)Úparseé   )Úast)ÚCOMPATIBLE_GIR_VERSION)ÚOrderedDictz)http://www.gtk.org/introspection/core/1.0z&http://www.gtk.org/introspection/c/1.0z)http://www.gtk.org/introspection/glib/1.0c             C   s   dt | f S )Nz{%s}%s)ÚCORE_NS)Útag© r   ú5/usr/lib/gobject-introspection/giscanner/girparser.pyÚ_corens'   s    r   c             C   s   dt | f S )Nz{%s}%s)ÚGLIB_NS)r   r   r   r   Ú_glibns+   s    r   c             C   s   dt | f S )Nz{%s}%s)ÚC_NS)r   r   r   r   Ú_cns/   s    r   c               @   s  e Zd ZdAd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dd„ Zd d!„ Zd"d#„ ZdBd%d&„Zd'd(„ Zd)d*„ ZdCd+d,„ZdDd-d.„Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Zd=d>„ Z d?d@„ Z!d$S )EÚ	GIRParserFc             C   s   || _ d | _g | _d S )N)Ú_types_onlyÚ
_namespaceÚ_filename_stack)ÚselfZ
types_onlyr   r   r   Ú__init__5   s    zGIRParser.__init__c             C   s8   t j |¡}| j |¡ t|ƒ}|  |¡ | j ¡  d S )N)ÚosÚpathÚabspathr   Úappendr   Ú
parse_treeÚpop)r   ÚfilenameÚtreer   r   r   r   <   s
    
zGIRParser.parsec             C   s6   d | _ tƒ | _tƒ | _tƒ | _d | _|  | ¡ ¡ d S )N)r   ÚsetÚ_pkgconfig_packagesÚ	_includesÚ_c_includesZ	_c_prefixÚ
_parse_apiZgetroot)r   r!   r   r   r   r   C   s    zGIRParser.parse_treec             C   s   | j S )N)r   )r   r   r   r   Úget_namespaceK   s    zGIRParser.get_namespacec             C   sP   t |tƒr,x@| ¡ D ]}|j|kr|S qW n x| ¡ D ]}|j|kr6|S q6W d S )N)Ú
isinstanceÚstrÚgetchildrenr   )r   ÚnodeZname_or_namesÚchildr   r   r   Ú_find_first_childP   s    



zGIRParser._find_first_childc                s   ‡ fdd„|  ¡ D ƒS )Nc                s   g | ]}|j ˆ kr|‘qS r   )r   )Ú.0r,   )Únamer   r   ú
<listcomp>\   s    z,GIRParser._find_children.<locals>.<listcomp>)r*   )r   r+   r/   r   )r/   r   Ú_find_children[   s    zGIRParser._find_childrenc             C   s@   | j s
d S t ¡ tj }| j d }| |¡r<|t|ƒd … S |S )Néÿÿÿÿ)r   r   ÚgetcwdÚsepÚ
startswithÚlen)r   ÚcwdZcurfiler   r   r   Ú_get_current_file^   s    

zGIRParser._get_current_filec       	      C   sæ  |j d }|tkr(td|  ¡ |tf ƒ‚x\| ¡ D ]P}|jtdƒkrP|  |¡ q2|jtdƒkrj|  |¡ q2|jt	dƒkr2|  
|¡ q2W | tdƒ¡}|j  t	dƒ¡}|r²| d¡}|j  t	dƒ¡}|rÐ| d¡}tj|j d	 |j d ||d
| _d|j kr|j d  d¡| j_| j| j_| j| j_| j| j_tdƒ| jtdƒ| jtdƒ| jtdƒ| jtdƒ| jtdƒ| jtdƒ| jtdƒ| jtdƒ| ji	}| j s°| j!|tdƒ< | j"|tdƒ< x0| ¡ D ]$}| |j¡}|d k	rº||ƒ qºW d S )NÚversionz+%s: Incompatible version %s (supported: %s)ÚincludeÚpackageÚ	namespacezidentifier-prefixesú,zsymbol-prefixesr/   )Úidentifier_prefixesÚsymbol_prefixeszshared-libraryÚaliasÚbitfieldÚcallbackÚclassÚenumerationÚ	interfaceÚrecordÚunionZboxedÚconstantÚfunction)#Úattribr	   Ú
SystemExitr8   r*   r   r   Ú_parse_includeÚ_parse_pkgconfig_packager   Ú_parse_c_includeÚfindÚgetÚsplitr   Z	Namespacer   Zshared_librariesr$   Zincludesr%   Z
c_includesr#   Zexported_packagesÚ_parse_aliasÚ_parse_enumeration_bitfieldÚ_parse_callbackÚ_parse_object_interfaceÚ_parse_recordÚ_parse_unionr   Ú_parse_boxedr   Ú_parse_constantÚ_parse_function)	r   Úrootr9   r+   Únsr>   r?   Zparser_methodsÚmethodr   r   r   r&   g   sV    















zGIRParser._parse_apic             C   s(   t  |jd |jd ¡}| j |¡ d S )Nr/   r9   )r   ZIncluderJ   r$   Úadd)r   r+   r:   r   r   r   rL   œ   s    zGIRParser._parse_includec             C   s   | j  |jd ¡ d S )Nr/   )r#   r^   rJ   )r   r+   r   r   r   rM       s    z"GIRParser._parse_pkgconfig_packagec             C   s   | j  |jd ¡ d S )Nr/   )r%   r^   rJ   )r   r+   r   r   r   rN   £   s    zGIRParser._parse_c_includec             C   sF   |   |¡}t |jd ||j tdƒ¡¡}|  ||¡ | j |¡ d S )Nr/   Útype)	Ú_parse_typer   ZAliasrJ   rP   r   Ú_parse_generic_attribsr   r   )r   r+   Útypevalr@   r   r   r   rR   ¦   s    
 zGIRParser._parse_aliasc             C   s¶  |j  d¡}|r>yt|ƒdk|_W n tk
r<   d|_Y nX |j  d¡}|r|yt|ƒdk|_W n tk
rz   d|_Y nX | jr†d S | tdƒ¡}|d k	rª|j	rª|j	|_
|j  d¡}|rÀ||_| tdƒ¡}|d k	rä|j	rä|j	|_|j  d¡}|rú||_| td	ƒ¡}	|	d k	r"|	j	r"|	j	|_|j  d
¡}
|
r:|
|_| tdƒ¡}|d k	rb|j	rb|j	|_| tdƒ¡}|r²tƒ }x.|D ]&}|j  d¡}|j  d¡}|||< q‚W ||_d S )NÚskipr   FÚintrospectableÚdocr9   zdoc-versionzdeprecated-versionzdoc-deprecatedÚ	stabilityzdoc-stabilityÚ	attributer/   Úvalue)rJ   rP   Úintrc   Ú
ValueErrorrd   r   rO   r   Útextre   r9   Úversion_docÚ
deprecatedÚdeprecated_docrf   Ústability_docÚfindallr
   Ú
attributes)r   r+   Úobjrc   rd   re   r9   rl   rm   rn   rf   ro   rq   Zattributes_rg   r/   rh   r   r   r   ra   ¬   s^    


z GIRParser._parse_generic_attribsc          	   C   sl  |j  d¡}|r| j |¡}nd }|j d ||j tdƒ |j tdƒ |j  tdƒ¡|j  tdƒ¡dœ}|jtdƒkr|tj	}n>|jtd	ƒkr²tj
}|j  d
¡}|o¦|dk}||d< nt|ƒ‚|f |Ž}|  ||¡ |j  tdƒ¡}|rò| j |¡|_|tj
krV|j  tdƒ¡}	|	r$|	dkr$d|_x0dD ](}
|j  t|
ƒ¡}||j|
 dd¡< q*W | jrn| j |¡ d S x4|  |tdƒ¡D ] }|j | j |j d ¡¡ q€W x4|  |tdƒ¡D ] }|j | j |j d ¡¡ q¶W x6|  |tdƒ¡D ]"}|  |tj|¡}|j |¡ qìW x<|  |tdƒ¡D ](}|  |tj|¡}d|_|j |¡ q$W xT|  |tdƒ¡D ]@}|  |tj|¡}|  ||¡ d|_| d¡|_|j |¡ qbW x<|  |tdƒ¡D ](}|  |tj|¡}d|_|j |¡ q¸W |j  !|  "||¡¡ x.|  |tdƒ¡D ]}|j# |  $||¡¡ q
W x2|  |tdƒ¡D ]}|j% |  |tj&|¡¡ q:W | j |¡ d S )NÚparentr/   z	type-namezget-typezsymbol-prefixr_   )r/   Úparent_typeÚ
gtype_nameÚget_typeÚc_symbol_prefixÚctyperE   rC   ZabstractÚ0Úis_abstractztype-structÚfundamentalT)zref-funcz
unref-funczset-value-funczget-value-funcú-Ú_Z
implementsZprerequisiterI   r]   zvirtual-methodÚinvokerÚconstructorÚpropertyÚsignal)'rJ   rP   r   Útype_from_namer   r   r   r   r   Z	InterfaceZClassÚAssertionErrorra   Zglib_type_structr{   Ú__dict__Úreplacer   r   r1   Z
interfacesZprerequisitesÚ_parse_function_commonÚFunctionÚstatic_methodsÚ	is_methodÚmethodsÚ	VFunctionr~   Zvirtual_methodsÚis_constructorÚconstructorsÚfieldsÚextendÚ_parse_fieldsZ
propertiesÚ_parse_propertyZsignalsÚSignal)r   r+   rs   rt   Zctor_kwargsÚklassrz   rr   Ztype_structZis_fundamentalZfunc_idZ	func_nameZifaceÚ	func_nodeÚfuncr]   ÚctorÚpropr   r   r   r   rU   Þ   sx    


  z!GIRParser._parse_object_interfacec             C   s   |   |tj¡}| j |¡ d S )N)r†   r   ÚCallbackr   r   )r   r+   rB   r   r   r   rT   $  s    zGIRParser._parse_callbackc             C   s   |   |tj¡}| j |¡ d S )N)r†   r   r‡   r   r   )r   r+   rI   r   r   r   rZ   (  s    zGIRParser._parse_functionc             C   sŠ   |   |¡}t |j d¡||j d¡p*tj|j d¡|j d¡dk|j d¡dk|j d¡dk|j d¡|j d	¡dk¡	}|  ||¡ |S )
Nr/   Ú	directionztransfer-ownershipÚnullableÚ1Zoptionalz
allow-noneZscopezcaller-allocates)r`   r   Z	ParameterrJ   rP   ZPARAM_DIRECTION_INra   )r   r+   rb   Úparamr   r   r   Ú_parse_parameter,  s    


zGIRParser._parse_parameterNc             C   s¦  |j d }| tdƒ¡}|s*td|f ƒ‚|j  d¡}|j  d¡dk}t |  |¡|d|¡}|  ||¡ g }	|j  d¡dk}
|tj	kr¤||||	|
|j  t
d	ƒ¡ƒ}n¬|tjkrÐ|j  t
d
ƒ¡}||||	|
|ƒ}n€|tjkrê||||	|
ƒ}nf|tjkrP||||	|j  d¡|j  dd¡dk|j  dd¡dk|j  dd¡dk|j  dd¡dkd}n |j  dd ¡|_|j  dd ¡|_|j  dd ¡|_||_| tdƒ¡}|d k	rt|  |tdƒ¡}|rÀ|  |¡|_x*|  |tdƒ¡D ]}|	 |  |¡¡ qÒW x†t|  |tdƒ¡ƒD ]n\}}|	| }|  |	||j¡ |j  d¡}|rHt|ƒ}|	| j|_|j  d¡}|rt|ƒ}|	| j|_qW |  |	||j¡ |	|_|  ||¡ | j  |¡ |S )Nr/   zreturn-valueznode %r has no return-valueztransfer-ownershiprš   r›   FÚthrowsr_   Ú
identifierÚwhenz
no-recursery   ÚdetailedÚactionzno-hooks)r    Z
no_recurser¡   r¢   Zno_hooksÚshadowszshadowed-byzmoved-toÚ
parameterszinstance-parameterZ	parameterÚclosureÚdestroy)!rJ   rO   r   rj   rP   r   ZReturnr`   ra   r˜   r   r‡   r‹   r’   r£   Zshadowed_byZmoved_tors   r-   r   Zinstance_parameterr1   r   Ú	enumerateÚ_parse_type_array_lengthr_   ri   ÚargnameZclosure_nameZdestroy_namer¤   r   Ztrack)r   r+   r“   rs   r/   Z
returnnodeZtransferrš   Zretvalr¤   rž   r•   rŸ   Zparameters_nodeZ	paramnodeÚirœ   r¥   Úidxr¦   r   r   r   r†   :  sj    







z GIRParser._parse_function_commonc             C   sV   g }t dƒt dƒt dƒt dƒf}x0| ¡ D ]$}|j|kr*|  ||¡}| |¡ q*W |S )NÚfieldrF   rG   rB   )r   r*   r   Ú_parse_fieldr   )r   r+   rr   ZresÚnamesr,   Zfieldobjr   r   r   r   ~  s    
zGIRParser._parse_fieldsc       
   
   C   s†  ||j  d¡|j  tdƒ¡|j  d¡dk|j  tdƒ¡|j  tdƒ¡|j  tdƒ¡d}|j  d	¡dkrnd
|_|  ||¡ | js‚|j |  	||¡¡ x:|  
|tdƒ¡D ]&}|  |tj|¡}d
|_|j |¡ q¨W x<t|  
|tdƒ¡ƒD ]$\}}|j| }|  |j||j¡ qèW x2|  
|tdƒ¡D ]}|j |  |tj|¡¡ q"W x<|  
|tdƒ¡D ](}	|  |	tj|¡}d
|_|j |¡ qVW |S )Nr/   r_   Ú	disguisedr›   z	type-namezget-typezsymbol-prefix)rx   r¯   ru   rv   rw   ÚforeignTr]   r¬   rI   r   )rJ   rP   r   r   r°   ra   r   rŽ   r   r   r1   r   r†   r   r‡   r‰   rŠ   r   r§   r¨   r_   rˆ   rŒ   r   )
r   Úclsr+   Zcompoundr]   r•   rª   Z	fieldnoder¬   r–   r   r   r   Ú_parse_compound‡  s4    
zGIRParser._parse_compoundc             C   sH   |   tj|¡}|j tdƒ¡}|d k	r4| j |¡|_|sD| j 	|¡ |S )Nzis-gtype-struct-for)
r²   r   ZRecordrJ   rP   r   r   r‚   Úis_gtype_struct_forr   )r   r+   Ú	anonymousZstructr³   r   r   r   rV   £  s    zGIRParser._parse_recordc             C   s"   |   tj|¡}|s| j |¡ |S )N)r²   r   ZUnionr   r   )r   r+   r´   rG   r   r   r   rW   ¬  s    zGIRParser._parse_unionc             C   sä  |j tdƒkr6| j |jd ¡}|j tdƒ¡|_|S |j tdƒkr¶|j d¡}|  |¡}|j tdƒ¡}t	j
|||d}|j d¡}|r˜|dkr˜d|_|j d	¡}|r²t|ƒ|_|S |j td
ƒkrÌt	 ¡ S |j tdƒkrà|j d¡}	|j tdƒ¡}
|	d kr |
d krt	 ¡ S t	j|
dS |	dkrl|  |tttdƒƒ¡}|d k	rV|  |¡}nt	j}t	j|	||
dS |	dkrÐ|  |tdƒ¡}tt| j|ƒƒ}x t|ƒdk r¶| t	j¡ q˜W t	j|d |d |
dS | j |	|
¡S n d S )NrB   r/   r_   Úarray)rx   zzero-terminatedry   Fz
fixed-sizeÚvarargs)z	GLib.Listz
GLib.SList)rB   rµ   z    varargsr_   zGLib.HashTableé   r   r   )r   r   r   r‚   rJ   rP   r   rx   r`   r   ZArrayZzeroterminatedri   ÚsizeZVarargsZTypeUnknownZTyper-   ÚlistÚmapZTYPE_ANYZListr1   Ú_parse_type_simpler6   r   ZMap)r   Útypenoderb   Z
array_typeZelement_typeZarray_ctypeZretZzeroZ
fixed_sizer/   rx   ZsubchildZsubchildrenZsubchildren_typesr   r   r   r»   ²  sP    






zGIRParser._parse_type_simplec             C   s4   x.t tdƒD ] }| |¡}|d k	r|  |¡S qW d S )N)rB   rµ   r¶   r_   )rº   r   rO   r»   )r   r+   r/   r¼   r   r   r   r`   ä  s
    
zGIRParser._parse_typec             C   sd   |  tdƒ¡}|dkrdS |j d¡}|dk	r`t|ƒ}t|| tjƒrT|| j|_	n|| j
|_	dS )zYA hack necessary to handle the integer parameter/field indexes on
           array types.rµ   NÚlength)rO   r   rJ   rP   ri   r(   r   ÚFieldr/   Zlength_param_namer©   )r   Zsiblingsr+   rb   r¼   Zlenidxr«   r   r   r   r¨   ë  s    z"GIRParser._parse_type_array_lengthc             C   s  t j|jtdƒ |jtdƒ |jtdƒ |j tdƒ¡d}|  ||¡ | jr^| j 	|¡ d S x:|  
|tdƒ¡D ]&}|  |t j|¡}d|_|j 	|¡ qpW x0|  
|tdƒ¡D ]}|j 	|  |t j|¡¡ q¬W x0|  
|td	ƒ¡D ]}|j 	|  |t j|¡¡ qÞW | j 	|¡ d S )
Nr/   z	type-namezget-typezsymbol-prefix)ru   rv   rw   r]   Tr   rB   )r   ZBoxedrJ   r   rP   r   ra   r   r   r   r1   r   r†   r‡   r‰   rŠ   r   rŽ   r˜   )r   r+   rr   r]   r•   r–   rB   r   r   r   rX   ú  s&    zGIRParser._parse_boxedc             C   s  d }d }|j ttdƒkr|}n|  |tdƒ¡}|d k	r’|j tdƒkrT|  |tj¡}qœ|j tdƒkrr| j|dd}qœ|j tdƒkrœ| j|dd}qœn
|  	|¡}tj
|j d¡||j d¡d	k|j d
¡dk|j d¡|d}|j d¡dk|_||_|  ||¡ |S )N)rF   rG   rB   rF   T)r´   rG   r/   Úreadablery   Úwritabler›   Úbits)Úanonymous_nodeÚprivate)r   rº   r   r-   r†   r   r˜   rV   rW   r`   r¾   rJ   rP   rÃ   rs   ra   )r   r+   rs   Ú	type_noderÂ   Zanonymous_eltr¬   r   r   r   r­     s0    

zGIRParser._parse_fieldc             C   sp   t  |jd |  |¡|j d¡dk|j d¡dk|j d¡dk|j d¡dk|j d¡¡}|  ||¡ ||_|S )	Nr/   r¿   ry   rÀ   r›   Z	constructzconstruct-onlyztransfer-ownership)r   ZPropertyrJ   r`   rP   ra   rs   )r   r+   rs   r—   r   r   r   r‘   /  s    zGIRParser._parse_propertyc          	   C   sD   t  |jd |jd |j tdƒ¡|j tdƒ¡¡}|  ||¡ |S )Nr/   rh   rŸ   Znick)r   ZMemberrJ   rP   r   r   ra   )r   r+   Úmemberr   r   r   Ú_parse_member;  s    zGIRParser._parse_memberc          	   C   sN   |   |¡}t |jd ||jd |j tdƒ¡¡}|  ||¡ | j |¡ d S )Nr/   rh   r_   )	r`   r   ZConstantrJ   rP   r   ra   r   r   )r   r+   rÄ   rH   r   r   r   rY   C  s    
zGIRParser._parse_constantc             C   s*  |j  d¡}|j  tdƒ¡}|j  tdƒ¡}|j  tdƒ¡}|j  tdƒ¡}|jtdƒkrbtj}ntj}g }||||||d}	||	_	||	_
|  ||	¡ | jr¬| j |	¡ d S x2|  |tdƒ¡D ]}
|  |
¡}|	|_| |¡ q¾W x8|  |td	ƒ¡D ]$}|  |tj¡}|	|_|	j |¡ qòW | j |	¡ d S )
Nr/   r_   zget-typez	type-namezerror-domainrA   )Úmembersru   rv   rÅ   rI   )rJ   rP   r   r   r   r   r   ZBitfieldÚEnumZerror_domainrx   ra   r   r   r   r1   rÆ   rs   r†   r‡   rˆ   )r   r+   r/   rx   rv   Z	type_nameZglib_error_domainr“   rÇ   rr   Zmember_noderÅ   r”   r•   r   r   r   rS   L  s8    
z%GIRParser._parse_enumeration_bitfield)F)N)F)F)"Ú__name__Ú
__module__Ú__qualname__r   r   r   r'   r-   r1   r8   r&   rL   rM   rN   rR   ra   rU   rT   rZ   r   r†   r   r²   rV   rW   r»   r`   r¨   rX   r­   r‘   rÆ   rY   rS   r   r   r   r   r   3   s>   
	52F
D	
	
2	r   )Z
__future__r   r   r   r   r   Zxml.etree.cElementTreer   Ú r   Z	girwriterr	   Úcollectionsr
   r   r   r   r   r   r   Úobjectr   r   r   r   r   Ú<module>   s   