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sy| |}||_| | W q tk
r  } zt|| W d d }~X Y qX qW 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 .girT)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 )zGiven 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 |sx| jD ]}| j| qW | }|| 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 )zKey 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}
|
rxZ|
D ]F}|s|ds|d }||r||	|t|d  t|f P qW 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 )zGiven 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 )zGiven 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|rd|	 S |	S qW |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 |rd| 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   t |tst||d kr |j}|tkr2| |S |tkrD| |S |tkrZ| 	t
j|S |tkrl| |S |tkr| ||S |tkr| 	t
j|S |tkr| |S |tkrntd|f  d S )Nz#transformer: unhandled symbol: '%s')r?   r   AssertionError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rt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   sz   |d k	st |jtkrd}nZ|jtkr.|j}nH|jtkr@|j}n6|jtkrV| |jS |jt	krr| |jd }nd}|S )Nvoid*gpointer)
r   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   |d k	st |jt@ }|jt@ }|jtkr.dS |jtttt	t
gkrj|j}|sPd}|r\d| }|rd| }nh|jtkr| |jS |jtkr| |jd }|r|d7 }|r|d7 }n|rd}nd}|rd| }|S |S )	Nr   r   zconst z	volatile r   z constz	 volatileZgconstpointer)r   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 \}}|r>|sBt|rNd| }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   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rd|_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rd S |drd 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rd|krbd|ddd  }nd|dd   }t j|t j|||dS |dkrt 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rt|jd }n\|tjkrt|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_DOUBLEr   r@   r   )r*   rK   r>   r   r   Z	unaliasedr   r   r&   r&   r'   r     sN    









zTransformer._create_constc             C   s   |  |j}|jst|jjr(|jj}nd }|| jkr|| j| }|jrl|||j|d}|j|_|| |S ||_|j|_n*|||j||d}|rd|_	n| 
|| || |S )N)rH   )r   rH   T)rJ   rE   r   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 )zParse 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 k	st|j dd}y| |}W n tk
rF   | ||S X xB|D ]:\}}||}|sn||}|rNd|j|jf |_	dS qNW dS )Nr   r-   z%s.%sTF)
r   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   sR   |j d k	stx>|  D ]2}|j|j d }|d k	rd|j|jf |_dS qW dS )Nz%s.%sTF)
gtype_namer   rz   r   r=   r>   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   sj   |  |sdS |js|jrdS |jd k	s,ty| |j}W n tk
rT   d }Y nX |d krdd |_|jS )NFT)r  r   Ztarget_foreignrg   r   rf   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 )zRemoves 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   `
