B
    0ªaP¨  ã               @   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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dl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& G dd„ de'ƒZ(G dd„ de)ƒZ*dS )é    )Úabsolute_import)Údivision)Úprint_function)Úunicode_literalsNé   )Úast)Úmessage)Úutils)Ú
CacheStore)Ú	GIRParser)ÚSourceSymbolÚ
ctype_nameÚCTYPE_POINTERÚCTYPE_BASIC_TYPEÚCTYPE_UNIONÚCTYPE_ARRAYÚCTYPE_TYPEDEFÚ
CTYPE_VOIDÚ
CTYPE_ENUMÚCTYPE_FUNCTIONÚCTYPE_STRUCTÚCSYMBOL_TYPE_FUNCTIONÚCSYMBOL_TYPE_TYPEDEFÚCSYMBOL_TYPE_STRUCTÚCSYMBOL_TYPE_ENUMÚCSYMBOL_TYPE_UNIONÚCSYMBOL_TYPE_OBJECTÚCSYMBOL_TYPE_MEMBERÚCSYMBOL_TYPE_ELLIPSISÚCSYMBOL_TYPE_CONSTÚTYPE_QUALIFIER_CONSTÚTYPE_QUALIFIER_VOLATILEc               @   s   e Zd ZdS )ÚTransformerExceptionN)Ú__name__Ú
__module__Ú__qualname__© r&   r&   ú7/usr/lib/gobject-introspection/giscanner/transformer.pyr"   -   s   r"   c               @   sÚ  e Zd Zedd„ ƒZdpd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edqd d!„ƒZdrd"d#„Zd$d%„ Zd&d'„ Zdsd(d)„Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zdtd4d5„Zd6d7„ Zd8d9„ Zd:d;„ Z d<d=„ Z!d>d?„ Z"d@dA„ Z#dBdC„ Z$dudDdE„Z%dFdG„ Z&dHdI„ Z'dvdJdK„Z(dwdLdM„Z)dxdNdO„Z*dPdQ„ Z+dRdS„ Z,dTdU„ Z-dydVdW„Z.dXdY„ Z/dZd[„ Z0d\d]„ Z1d^d_„ Z2dzd`da„Z3dbdc„ Z4ddde„ Z5dfdg„ Z6dhdi„ Z7djdk„ Z8dldm„ Z9dndo„ Z:dS ){ÚTransformerc             C   s   | j S )N)Ú
_namespace)Úselfr&   r&   r'   Ú<lambda>2   ó    zTransformer.<lambda>FÚ c             C   sJ   t ƒ | _|| _|| _tƒ | _i | _i | _g | _d| _	|| _
|| _i | _d S )NF)r
   Ú_cachestoreÚ_accept_unprefixedr)   ÚsetÚ_pkg_config_packagesZ_typedefs_nsÚ_parsed_includesÚ_includepathsÚ_passthrough_modeÚ_identifier_filter_cmdÚ_symbol_filter_cmdÚ_tag_ns)r*   Ú	namespaceZaccept_unprefixedZidentifier_filter_cmdZsymbol_filter_cmdr&   r&   r'   Ú__init__4   s    zTransformer.__init__c             C   s   | j S )N)r1   )r*   r&   r&   r'   Úget_pkgconfig_packagesF   s    z"Transformer.get_pkgconfig_packagesc             C   s
   d | _ d S )N)r.   )r*   r&   r&   r'   Údisable_cacheI   s    zTransformer.disable_cachec             C   s
   d| _ d S )NT)r4   )r*   r&   r&   r'   Úset_passthrough_modeL   s    z Transformer.set_passthrough_modec             C   sz   | j  |j¡}t|tjƒr(t|tjƒr(nN||kr2nD|rjtƒ }| |j¡ | |j¡ t	 
d|jf |¡ n| j  |¡ d S )NzNamespace conflict for '%s')r)   ÚgetÚnameÚ
isinstancer   ÚConstantr0   ÚupdateZfile_positionsr   ZfatalÚappend)r*   ÚnodeZoriginalZ	positionsr&   r&   r'   Ú_append_new_nodeO   s    zTransformer._append_new_nodec             C   s
  x–|D ]Ž}|j dkrqy|  |¡}W n0 tk
rT } zt ||¡ wW d d }~X Y nX |rj|jrj|  |¡ t|tj	ƒr|j
r|j
| jkr|| j|j
< qW xl| j ¡ D ]^\}}|js¤y|  |¡}||_|  |¡ W q¤ tk
r  } zt ||¡ W d d }~X Y q¤X q¤W d S )N)Zgst_g_error_get_type)ÚidentÚ_traverse_oner"   r   Úwarn_symbolr>   rD   r?   r   ZCompoundÚtag_namer7   ÚitemsÚstrip_identifierZ	warn_node)r*   ZsymbolsÚsymbolrC   ÚerH   Zstructr>   r&   r&   r'   Úparsef   s*    




zTransformer.parsec             C   s   t |ƒ| _d S )N)Úlistr3   )r*   Úpathsr&   r&   r'   Úset_include_paths…   s    zTransformer.set_include_pathsc             C   s6   || j jkrd S | j j |¡ |  |¡}|  |¡ d S )N)r)   ÚincludesÚaddÚ_find_includeÚ_parse_include)r*   ÚincludeÚfilenamer&   r&   r'   Úregister_includeˆ   s
    
zTransformer.register_includec             C   sl   t j |¡}| d¡s$td|f ƒ‚|d d… }tj |¡}|| jj	krLd S | jj	 
|¡ | j|dd d S )Nz.girz8Include path '%s' must be a filename path ending in .giréüÿÿÿT)Úuninstalled)ÚosÚpathÚbasenameÚendswithÚ
SystemExitr   ZIncludeZfrom_stringr)   rQ   rR   rT   )r*   Zinclude_pathr\   ÚgirnamerU   r&   r&   r'   Úregister_include_uninstalled   s    

z(Transformer.register_include_uninstalledc             C   sˆ   d|kr| j  |¡S | dd¡\}}|| j jkr<| j  |¡S || j jkrp|| jkrpt d||f ¡ | j  |¡S | j| }| |¡S dS )z›Given a name of the form Foo or Bar.Foo,
return the corresponding ast.Node, or None if none
available.  Will throw KeyError however for unknown
namespaces.Ú.r   z9Deprecated reference to identifier prefix %s in GIName %sN)r)   r=   Úsplitr>   Úidentifier_prefixesr2   r   Úwarn)r*   r>   ÚnsZginamerU   r&   r&   r'   Úlookup_giname›   s    
zTransformer.lookup_ginamec             C   s   |j r|  |j ¡S dS )ziGiven a Type object, if it points to a giname,
calls lookup_giname() on the name.  Otherwise return
None.N)Útarget_ginamerf   )r*   Ztypeobjr&   r&   r'   Úlookup_typenode®   s    zTransformer.lookup_typenodec             C   s*   t  ¡ }| t¡ tjdkr&| d¡ |S )NÚntz
/usr/share)r	   Zget_system_data_dirsrB   ÚDATADIRrZ   r>   )r*   Z	data_dirsr&   r&   r'   Ú_get_gi_data_dirs¸   s
    


zTransformer._get_gi_data_dirsc             C   s¦   | j d d … }x$|  ¡ D ]}| tj |d¡¡ qW | tj td¡¡ d|j|jf }x*|D ]"}tj ||¡}tj 	|¡r^|S q^W t
j d||f ¡ t
 d¡ d S )Nzgir-1.0z	%s-%s.girz/Couldn't find include '%s' (search path: '%s')
r   )r3   rk   rB   rZ   r[   Újoinrj   r>   ÚversionÚexistsÚsysÚstderrÚwriteÚexit)r*   rU   Z
searchdirsr[   r_   Údr&   r&   r'   rS   À   s    
zTransformer._find_includeNc             C   sF   | d ƒ}|d k	r|  |¡ | ¡  | |¡}| ¡ |_|j|jj= |S )N)rP   r<   rT   Úget_namespacer)   r2   r>   )ÚclsrV   Zextra_include_dirsr*   Úparserr&   r&   r'   Úparse_from_girÏ   s    


zTransformer.parse_from_girc             C   sÂ   d }| j d k	r| j  |¡}|d krRt| j d}| |¡ | j d k	rR| j  ||¡ x2| ¡ jD ]$}|j| j	kr^|  
|¡}|  |¡ q^W |sªx| ¡ jD ]}| j |¡ q–W | ¡ }|| j	|j< |S )N)Z
types_only)r.   Úloadr   r4   rM   Zstorert   rQ   r>   r2   rS   rT   Zexported_packagesr1   rR   )r*   rV   rY   rv   rU   Zdep_filenameZpkgr8   r&   r&   r'   rT   Ú   s$    



zTransformer._parse_includec             c   s&   | j V  x| j ¡ D ]
}|V  qW dS )zZReturn an iterator over all included namespaces; the
currently-scanned namespace is first.N)r)   r2   Úvalues)r*   re   r&   r&   r'   Ú_iter_namespacesð   s    zTransformer._iter_namespacesc             C   s*   |d | j krd|d fS d|d fS dS )z°Key sort which ensures items in self._namespace are last by returning
        a tuple key starting with 1 for self._namespace entries and 0 for
        everythin else.
        r   r   é   N)r)   )r*   Úvalr&   r&   r'   Ú_sort_matches÷   s    zTransformer._sort_matchesc             C   s„  |sb| j rbtj| j tjtjtjdd}|}| | ¡ ¡\}}|jrXtd| j |j|f ƒ‚| d¡}g }g }x–|  	¡ D ]Š}	|r„|	j
}
n|d  ¡ r˜|	j}
n|	j}
|
rôxZ|
D ]F}|sÂ| d¡sÂ|d }| |¡r¨| |	|t|ƒd … t|ƒf¡ P q¨W qt| |	¡ qtW |r(|j| jd ttdd	„ |ƒƒS | jr<| j|fgS |rfx"|D ]}	||	krH|	|fgS qHW td
|rtdnd|f ƒ‚d S )NT)ÚstdinÚstdoutrp   Úshellz&filter: "%s" exited: %d with error: %sÚasciir   Ú_)Úkeyc             S   s   | d | d fS )Nr   r   r&   )Úxr&   r&   r'   r+   #  r,   zCTransformer._split_c_string_for_namespace_matches.<locals>.<lambda>zUnknown namespace for %s '%s'Z
identifierrK   )r6   Ú
subprocessÚPopenÚPIPEÚcommunicateÚencodeÚ
returncodeÚ
ValueErrorÚdecoderz   rc   ÚisupperZ_ucase_symbol_prefixesZsymbol_prefixesr]   Ú
startswithrB   ÚlenÚsortr}   rN   Úmapr/   r)   )r*   r>   Úis_identifierÚprocÚ_nameZ	proc_nameÚerrÚmatchesZunprefixed_namespacesre   ÚprefixesÚprefixr&   r&   r'   Ú%_split_c_string_for_namespace_matches  sN    



 

z1Transformer._split_c_string_for_namespace_matchesc             C   s   | j |ddS )zìGiven a StudlyCaps string identifier like FooBar, return a
list of (namespace, stripped_identifier) sorted by namespace length,
or raise ValueError.  As a special case, if the current namespace matches,
it is always biggest (i.e. last).T)r’   )r™   )r*   rE   r&   r&   r'   Úsplit_ctype_namespaces0  s    z"Transformer.split_ctype_namespacesc             C   s   | j |ddS )zŽGiven a C symbol like foo_bar_do_baz, return a list of
(namespace, stripped_symbol) sorted by namespace match probablity, or
raise ValueError.F)r’   )r™   )r*   rK   r&   r&   r'   Úsplit_csymbol_namespaces7  s    z$Transformer.split_csymbol_namespacesc             C   s   | j |dd}|d S )zwGiven a C symbol like foo_bar_do_baz, return the most probable
(namespace, stripped_symbol) match, or raise ValueError.F)r’   éÿÿÿÿ)r™   )r*   rK   r–   r&   r&   r'   Úsplit_csymbol=  s    zTransformer.split_csymbolc       
   
   C   s   | j rZtj| j tjtjtjdd}| | ¡ ¡\}}|jrPtd| j |j|f ƒ‚| d¡}| 	d¡}|rt|dd … }y|  
|¡}W n. tk
r° } ztt|ƒƒ‚W d d }~X Y nX x*|D ]"\}}	|| jkr¸|rÖd|	 S |	S q¸W |d \}}	td||jf ƒ‚d S )	NT)r~   r   rp   r€   z&filter: "%s" exited: %d with error: %sr   r‚   r   rœ   z2Skipping foreign identifier '%s' from namespace %s)r5   r…   r†   r‡   rˆ   r‰   rŠ   r‹   rŒ   rŽ   rš   r"   Ústrr)   r>   )
r*   rE   r“   Z
proc_identr•   Úhiddenr–   rL   re   r>   r&   r&   r'   rJ   C  s6    


zTransformer.strip_identifierc          
   C   sŒ   |j }| d¡}|r |dd … }y|  |¡\}}W n. tk
r` } ztt|ƒƒ‚W d d }~X Y nX || jkr|td|jf ƒ‚|rˆd| S |S )Nr‚   r   z)Skipping foreign symbol from namespace %s)rE   rŽ   r   r‹   r"   rž   r)   r>   )r*   rK   rE   rŸ   re   r>   rL   r&   r&   r'   Ú_strip_symbola  s    

zTransformer._strip_symbolc             C   s²   |d kr|j }|tkr |  |¡S |tkr2|  |¡S |tkrH|  tj|¡S |t	krZ|  
|¡S |tkrn|  ||¡S |tkr„|  tj|¡S |tkr–|  |¡S |tkr ntd|f ƒ d S )Nz#transformer: unhandled symbol: '%s')Útyper   Ú_create_functionr   Ú_create_typedefr   Ú_create_tag_ns_compoundr   ÚRecordr   Ú_create_enumr   Ú_create_memberr   ÚUnionr   Ú_create_constr   Úprint)r*   rK   ÚstypeÚparent_symbolr&   r&   r'   rF   q  s&    



zTransformer._traverse_onec             C   sb   dd„ }t t|jjƒƒdk r d S d }x8|jjD ],}|d krB|j}q.|||jƒ}|dkr.d S q.W |S )Nc             S   sR   g }xBt |  d¡| d¡ƒD ](\}}||kr:d |¡d S | |¡ qW t| |ƒS )Nr‚   )Úziprb   rl   rB   Úmin)ÚaÚbZcommonpartsZawordZbwordr&   r&   r'   Úcommon_prefix‹  s     z6Transformer._enum_common_prefix.<locals>.common_prefixr{   r-   )r   rN   Ú	base_typeÚ
child_listrE   )r*   rK   r±   r˜   Úchildr&   r&   r'   Ú_enum_common_prefixŠ  s    	zTransformer._enum_common_prefixc       
   	   C   sº   |   |¡}|rt|ƒ}nd}g }xX|jjD ]L}|jr6q*|dkrN|j|d … }n
|  |¡}| t 	| 
¡ |j|jd ¡¡ q*W |  |j¡}|jjr–tj}ntj}|||j|d}	|	 |¡ |	S )Nr   )Úmembers)rµ   r   r²   r³   ÚprivaterE   r    rB   r   ZMemberÚlowerÚ	const_intrJ   Zis_bitfieldZBitfieldÚEnumÚadd_symbol_reference)
r*   rK   r˜   Z	prefixlenr¶   r´   r>   Z	enum_nameÚklassrC   r&   r&   r'   r¦      s,    



zTransformer._create_enumc             C   s\   |j  d¡rd S t|  ||j¡ƒ}|  |jj¡}|  |¡}t |||d|j ¡}| 	|¡ |S )Nr‚   F)
rE   rŽ   rN   Ú_create_parametersr²   Ú_create_returnr    r   ZFunctionr»   )r*   rK   Ú
parametersZreturn_r>   Úfuncr&   r&   r'   r¢   ¿  s    

zTransformer._create_functionc             C   sn   |j tkrd}nZ|j tkr"|j}nH|j tkr4|j}n6|j tkrJ|  |j¡S |j tkrf|  |j¡d }nd}|S )NÚvoidÚ*Úgpointer)	r¡   r   r   r>   r   r   Ú_create_source_typer²   r   )r*   Úsource_typeÚvaluer&   r&   r'   rÄ   Ê  s    




zTransformer._create_source_typec             C   sÊ   |j t@ }|j t@ }|jtkr"dS |jttttt	gkr^|j
}|sDd}|rPd| }|rÆd| }nh|jtkrt|  |j¡S |jtkr¨|  |j¡d }|rš|d7 }|rÆ|d7 }n|r²d}nd}|rÂd| }|S |S )	NrÁ   rÃ   zconst z	volatile rÂ   z constz	 volatileZgconstpointer)Útype_qualifierr    r!   r¡   r   r   r   r   r   r   r>   r   Ú_create_complete_source_typer²   r   )r*   rÅ   ÚconstZvolatilerÆ   r&   r&   r'   rÈ   Ú  s>    






z(Transformer._create_complete_source_typec             c   s,   x&t |jƒD ]\}}|  |||¡V  qW d S )N)Ú	enumerater³   Ú_create_parameter)r*   rK   r²   Úir´   r&   r&   r'   r½     s    zTransformer._create_parametersc       
      C   sŠ   |j }| d¡}|r |dd … }|  |¡}|d \}}|rBd| }t d||j f ¡}|  |j|¡ |  |¡ tjd|j	|j	f d}	|	S )Nr‚   r   rœ   z%s__%s__unionz%s.%s)rg   )
rE   rŽ   rš   r   r¨   Ú_parse_fieldsr²   rD   ÚTyper>   )
r*   rK   r¬   Zparent_identrŸ   r–   r8   Úparent_nameZ
fake_unionZ	fake_typer&   r&   r'   Ú_synthesize_union_type  s    


z"Transformer._synthesize_union_typec             C   s¢  |j }|jtkr0|j j jtkr0| j|dd}nn|jtkrV|jd krV|  tj	|¡}nH|jt
kr||jd kr||  tj|¡}n"|jtkr`|  |¡}|j jt
krÈ|j jd krÈ|  ||¡}tjd ||d}nr|  |¡}|  |¡}	|	d dkrö|	d d… }
n|	}
|d dkr|d d… }n|}| j||d}tjd ||
|d}t|j jƒ}d|_|rl|d j|_n|  |j ¡}tj|j|dd|jd	}|jržd|_d|_d|_|S )
NT)Úmember)Úcomplete_ctyperœ   rÂ   )ÚctyperÒ   Fr   )ÚreadableÚwritableÚbits)r²   r¡   r   r   Ú_create_callbackr   r>   Ú_create_member_compoundr   r¥   r   r¨   r   rÈ   rÐ   ÚArrayrÄ   Ú_canonicalize_ctypeÚcreate_type_from_ctype_stringrN   r³   Zzeroterminatedr¹   ÚsizeÚ_create_type_from_baseÚFieldrE   r·   rÔ   rÕ   )r*   rK   r¬   rÅ   rC   rÒ   Zsynthesized_typeZftyperÓ   Zcanonical_ctypeZderefed_nameZderefed_complete_ctypeZ
from_ctyper³   r&   r&   r'   r§     sP    





zTransformer._create_memberc             C   s  |j j}|tkr*|j j jtkr*|  |¡}nî|tkr>|  |¡}nÚ|tkrh|j j jtkrh| jtj|dd}n°|tkr€|  tj|¡}n˜|t	kr˜|  tj
|¡}n€|tkrª|  |¡S |ttttfkr|  |j¡}|  |j ¡}|tjkrâd S | d¡rðd S tj|||jdS td|jt|ƒf ƒ‚|S )NT)Ú	disguisedZ_autoptr)rÓ   zsymbol '%s' of type %s)r²   r¡   r   r   Ú_create_typedef_callbackr   Ú_create_typedef_compoundr   r¥   r   r¨   r   r¦   r   r   r   rJ   rE   rÝ   Ú
type_namesr]   ÚAliasÚNotImplementedErrorr   )r*   rK   rÓ   rC   r>   Útargetr&   r&   r'   r£   U  s6    



zTransformer._create_typedefc             C   sF   t j |¡}|r|jS | d¡s$|S |d d… }|  |¡}|d }|S )NrÂ   rœ   )r   râ   r=   Útarget_fundamentalr]   rÚ   )r*   rÓ   Z	firstpassÚbaseZcanonical_baseÚ	canonicalr&   r&   r'   rÚ   t  s    

zTransformer._canonicalize_ctypec             C   s>   |   |¡}|  |¡}|jtko(|jjt@ }| j|||||dS )N)Úis_constÚis_parameterÚ	is_returnrÒ   )rÄ   rÈ   r¡   r   r²   rÇ   r    rÛ   )r*   rÅ   rê   rë   rÓ   rÒ   rÉ   r&   r&   r'   rÝ     s    


z"Transformer._create_type_from_basec             C   s¬   |dkr<|dkr"d|dd …  }n|}t j|t j|||dS |dkrˆd|krbd| dd¡d  }nd|dd …  }t j|t j|||dS |dkr¨t jt jt j|||dS d S )	N)ÚGListÚGSListz	GLib.Listz
GLib.SList)rì   rí   zGLib.r   )rÓ   ré   rÒ   )	ZGArrayZ	GPtrArrayZ
GByteArrayz
GLib.ArrayzGLib.PtrArrayzGLib.ByteArrayzGObject.ArrayzGObject.PtrArrayzGObject.ByteArrayra   )Z
GHashTablezGLib.HashTablezGObject.HashTable)r   ÚListZTYPE_ANYrb   rÙ   ÚMap)r*   rç   rÓ   ré   rÒ   r>   r&   r&   r'   Ú_create_bare_container_type–  s     

z'Transformer._create_bare_container_typec             C   s    |   |¡}| dd¡}|r"|dks*|dkrNtj ¡ }d |_tjd ||||dS tj |¡}	|	d k	rvtj	|	j
|||dS | j||||d}
|
r|
S tj	|||dS )NrÂ   r-   zutf8*ZGStrv)rÓ   ré   rÒ   )ræ   rÓ   ré   rÒ   )rÚ   Úreplacer   ÚTYPE_STRINGZclonerÓ   rÙ   râ   r=   rÎ   ræ   rð   )r*   rÓ   ré   rê   rë   rÒ   rè   rç   Z	bare_utf8ZfundamentalÚ	containerr&   r&   r'   rÛ   ­  s"    





z)Transformer.create_type_from_ctype_stringc             C   st   |j tkrt dt ¡ ¡S | j|jdd}|jd kr^|jrR|jj tkrRt	 
|d¡ d|f }n|j}t ||¡S d S )Nz...T)rê   z&missing parameter name; undocumentablezarg%d)r¡   r   r   Z	ParameterZVarargsrÝ   r²   rE   r   r   rG   )r*   r¬   ÚindexrK   ZptyperE   r&   r&   r'   rË   Å  s    

zTransformer._create_parameterc             C   s   | j |dd}t |¡S )NT)rë   )rÝ   r   ZReturn)r*   rÅ   Útypevalr&   r&   r'   r¾   Ô  s    zTransformer._create_returnc             C   sš  |j  d¡rd S |jd ks&|j d¡s*d S |  |¡}|jd k	rNtj}|j}n,|jd k	r0|j	d k	rr|  
|j	¡}ntj}|}|  |¡ |jr¸|jr¸|  |j¡}|  |¡}t|tjƒr¸|}|tjkrÒt|jd ƒ}n\|tjkrìt|jd ƒ}nB|tjkrt|jd ƒ}n&|tjkr$t|jd ƒ}n
t|jƒ}nJ|jd k	rTtj}|jrNdnd}n&|jd k	rttj}d|jf }ntƒ ‚t ||||j ¡}| |¡ |S )	Nr‚   z.hl            l        i   ÚtrueZfalsez%f)rE   rŽ   Zsource_filenamer]   r    Zconst_stringr   rò   r¹   r²   rÝ   ZTYPE_INTÚ_resolve_type_from_ctyperg   rÓ   rf   Úresolve_aliasesr?   rÎ   ZTYPE_UINT64rž   ZTYPE_UINT32ZTYPE_UINT16Z
TYPE_UINT8Zconst_booleanZTYPE_BOOLEANZconst_doubleZTYPE_DOUBLEÚAssertionErrorr@   r»   )r*   rK   r>   rõ   rÆ   Z	unaliasedrå   rÉ   r&   r&   r'   r©   Ø  sN    









zTransformer._create_constc             C   sª   |   |j¡}|jjr|jj}nd }|| jkrr| j| }|jrb|||j|d}|j|_| |¡ |S ||_|j|_n*|||j||d}|rd|_n|  	||¡ | |¡ |S )N)rH   )rß   rH   T)
rJ   rE   r²   r>   r7   Úfieldsr»   rÓ   rß   rÍ   )r*   Úcompound_classrK   rß   r>   rH   ÚcompoundZnew_compoundr&   r&   r'   rá     s&    





z$Transformer._create_typedef_compoundc             C   sL   |j | jkr| j|j  }n|d |j |j d}d|_|  ||¡ | |¡ |S )N)rH   F)rE   r7   rß   rÍ   r»   )r*   rû   rK   rü   r&   r&   r'   r¤   @  s    
z#Transformer._create_tag_ns_compoundc             C   s(   ||j |j ƒ}|  ||¡ | |¡ |S )N)rE   rÍ   r»   )r*   rû   rK   rü   r&   r&   r'   rØ   P  s    
z#Transformer._create_member_compoundc             C   s   |   |¡}|sd S |S )N)r×   )r*   rK   Úcallbackr&   r&   r'   rà   V  s    
z$Transformer._create_typedef_callbackc             C   s^   xX|j jD ]L}| j||d}|s"q
t|tjƒr4|}ntj|jd dd|d}|j |¡ q
W d S )N)r¬   TF)Zanonymous_node)	r²   r³   rF   r?   r   rÞ   rE   rú   rB   )r*   rK   rü   r´   Z
child_nodeZfieldr&   r&   r'   rÍ   \  s    zTransformer._parse_fieldsc             C   sà   |j jtkr|j }|j j }n|j jtkr:|j j }|j j j }t|  ||¡ƒ}|  |¡}x2t|ƒD ]&\}}|jjdkr^|j	dkr^|j	|_
q^W |r”|j}	n(|j d¡dkr°|  |¡}	n|  |j¡}	tj|	||d|jd}
|
 |¡ |
S )NrÃ   Z	user_datar‚   r   F)rÓ   )r²   r¡   r   r   rN   r½   r¾   rÊ   ræ   ÚargnameZclosure_namerE   Úfindr    rJ   r   ZCallbackr»   )r*   rK   rÑ   Z	paramtypeZ
retvaltyper¿   ZretvalrÌ   Zparamr>   rý   r&   r&   r'   r×   h  s(    




zTransformer._create_callbackc             C   sN   d|kr*|   |¡}|r|}q4| j |¡}n
|  |¡}|  |¡ |jrJd|_|S )zóParse a C type string (as might be given from an
        annotation) and resolve it.  For compatibility, we can consume
both GI type string (utf8, Foo.Bar) style, as well as C (char *, FooBar) style.

Note that type resolution may not succeed.ra   N)rð   r)   Ztype_from_namerÛ   Úresolve_typeÚresolvedrÓ   )r*   Ztypestrró   rõ   r&   r&   r'   Úcreate_type_from_user_stringƒ  s    


z(Transformer.create_type_from_user_stringc             C   s<   x6| j  ¡ D ](}| |¡}|rd|j|jf |_dS qW dS )Nz%s.%sTF)r2   ry   Úget_by_ctyper>   rg   )r*   rõ   Úpointer_strippedr8   rå   r&   r&   r'   Ú'_resolve_type_from_ctype_all_namespaces˜  s    
z3Transformer._resolve_type_from_ctype_all_namespacesc             C   s‚   |j  dd¡}y|  |¡}W n tk
r8   |  ||¡S X xB|D ]:\}}| |¡}|s`| |¡}|r@d|j|jf |_dS q@W dS )NrÂ   r-   z%s.%sTF)	rÓ   rñ   rš   r‹   r  r=   r  r>   rg   )r*   rõ   r  r–   r8   r>   rå   r&   r&   r'   r÷   ¥  s    

z$Transformer._resolve_type_from_ctypec             C   sD   x>|   ¡ D ]2}|j |jd ¡}|d k	r
d|j|jf |_dS q
W dS )Nz%s.%sTF)rz   râ   r=   Ú
gtype_namer>   rg   )r*   rõ   re   rC   r&   r&   r'   Ú_resolve_type_from_gtype_nameµ  s    z)Transformer._resolve_type_from_gtype_namec             C   sx   t |tjtjfƒr|  |j¡S t |tjƒrJ|  |j¡}|  |j¡}|oH|S |j	rTdS |j
rd|  |¡S |jrt|  |¡S d S )NT)r?   r   rÙ   rî   r   Zelement_typerï   Zkey_typeZ
value_typer  rÓ   r÷   r  r  )r*   rõ   Zkey_resolvedZvalue_resolvedr&   r&   r'   Ú_resolve_type_internal¾  s    
z"Transformer._resolve_type_internalc             C   s\   |   |¡sdS |js|jrdS y|  |j¡}W n tk
rF   d }Y nX |d krVd |_|jS )NFT)r  ræ   Ztarget_foreignrf   rg   ÚKeyErrorr  )r*   rõ   Útype_r&   r&   r'   r   Ì  s    

zTransformer.resolve_typec             C   sH   xBt |tjƒrB|jjdk	r*|  |jj¡}q|jjdk	r>|j}qP qW |S )z™Removes all aliases from typenode, returns first non-alias
        in the typenode alias chain.  Returns typenode argument if it
        is not an alias.N)r?   r   rã   rå   rg   rf   ræ   )r*   Ztypenoder&   r&   r'   rø   ß  s    zTransformer.resolve_aliases)Fr-   r-   )N)F)F)NN)N)FF)NFN)FFFN)F)F);r#   r$   r%   Úpropertyr8   r9   r:   r;   r<   rD   rM   rP   rW   r`   rf   rh   rk   rS   Úclassmethodrw   rT   rz   r}   r™   rš   r›   r   rJ   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(   1   sv    





/
)
8
	 
  
0
8
	r(   )+Z
__future__r   r   r   r   rZ   ro   r…   r-   r   r   r	   Z
cachestorer
   Z	girparserr   Zsourcescannerr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   Ú	Exceptionr"   Úobjectr(   r&   r&   r&   r'   Ú<module>   s   `
