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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 G dd deZG dd deZedddZedddZedddZedddZedddZedddZedddZedddZedddZedddZedddZedddZedddZedddZ ed d dZ!ed!d!dZ"ed"d"dZ#ed#d#dZ$ed$d$dZ%ed%d%dZ&ed&d&dZ'ed'd'dZ(ed(d(dZ)ed)d)dZ*ed*d*dZ+ed+d+dZ,ed,d,dZ-ed-d-dZ.ed.d.dZ/ed/d0dZ0ed1d0dZ1ed2d2dZ2eeeeeeeeeeee e!e"e#e$e%e&e)e*e+e,e-e.e/gZ3e'e(gZ4e45e3 eegZ6e65e4 e65e0e1e2g ee'e(gZ7e8e6Z9x$eee)e*e-e2gD ]Z:e9;e: qW i Z<xe6D ]Z=e=e<e=j>< qW i Z?xe4D ]Z=e=e?e=j>< qW ee<d3< ee<d4< ee<d5< ee<d6< ee<d7< e e<d8< e!e<d9< e!e<d:< e e<d;< e!e<d<< e"e<d=< e"e<d>< e#e<d?< e#e<d@< e$e<dA< e$e<dB< e+e<dC< e,e<dD< e0e<dE< ee<dF< ee<d< e)e<dG< ee<dH< ee<dI< ee<dJ< ee<dK< ee<dL< ee<dM< ee<dN< ee<dO< ee<dP< ee<dQ< e0e<dR< e0e<d0< ee<dS< ee<dT< e%e<d$< e&e<d%< e'e<d&< e(e<d'< ee<dU< ee<dV< ee<dW< e"e<dX< e$e<dY< ee<dZ< e<d$ e<d[< e<d% e<d\< e#e<d]< e<d$ e<d^< e!e<d_< e"e<d`< e"e<da< e!e<db< ee<dc< ee<dd< deZ@dfZAdgZBdhZCdiZDdjZEdZFdkZGdlZHdmZIdnZJdoZKdpZLG dqdr dreZMG dsdt dteZNG dudv dveZOG dwdx dxeOZPG dydz dzZQG d{d| d|ePZRG d}d~ d~eRZSG dd deSZTG dd deRZUG dd deZVG dd deZWG dd deZXG dd deZYG dd dePZZG dd deOZ[G dd de[Z\G dd de[Z]G dd dePeQZ^G dd dePeQZ_G dd deOZ`G dd dePeQZaG dd deOZbG dd deaZcG dd deaZdG dd dePeQZeG dd deRZfG dd dePeQZgG dd dePeQZhG dd dePZiG dd dePZjG dd deRZkdS )    )absolute_import)division)print_function)unicode_literalsN)chain   )message)OrderedDict)Position)to_underscoresc            	   @   s   e Zd ZdZd&ddZedd Zedd	 Ze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S )'Typea{  
    A Type can be either:
    * A reference to a node (target_giname)
    * A reference to a "fundamental" type like 'utf8'
    * A "foreign" type - this can be any string."
    If none are specified, then it's in an "unresolved" state.  An
    unresolved type can have two data sources; a "ctype" which comes
    from a C type string, or a gtype_name (from g_type_name()).
    NFc
       
      C   s   || _ || _|| _|r&t| tstn|rD|d ks6t|d kstnh|rnd|ksTt|d ks`t|d kstn>|r|d k	s~t|d kst|d kstn|d k	s|d k	st|| _|| _|| _|| _	|	| _
d S )N.)ctype
gtype_nameorigin_symbol
isinstanceTypeUnknownAssertionErrortarget_fundamentaltarget_ginametarget_foreignis_constcomplete_ctype)
selfr   r   r   r   r   _target_unknownr   r   r    r   //usr/lib/gobject-introspection/giscanner/ast.py__init__1   s,    
zType.__init__c             C   s   | j p| jp| jS )N)r   r   r   )r   r   r   r   resolvedS   s    zType.resolvedc             C   s0   | j r| j S | jr| jS | jr$| jS ds,td S )NF)r   r   r   r   )r   r   r   r   unresolved_stringY   s    zType.unresolved_stringc             C   s   t |}|dk	r"| |j|jdS |dkr8ttt|dS |dkrZtd|dd  t|dS |dkrt }d|_td|d|d	d
S | |dS )zParse a GType name (as from g_type_name()), and return a
Type instance.  Note that this function performs namespace lookup,
in contrast to the other create_type() functions.N)r   r   Z
GHashTable)r   )ZGArrayZ	GPtrArrayZ
GByteArrayzGLib.r   ZGStrvF)r   r   r   )	
type_namesgetr   r   MapTYPE_ANYArrayTYPE_STRINGclone)clsr   fundamentalZ	bare_utf8r   r   r   create_from_gtype_named   s    


zType.create_from_gtype_namec             C   s   | j d k	st| j dd S )Nr   r   )r   r   split)r   r   r   r   
get_giname{   s    zType.get_ginamec             C   sN   | j r|| j |j S | jr(|| j|jS | jr<|| j|jS || j|jS d S )N)r   r   r   r   )r   otheropr   r   r   _compare   s    zType._comparec             C   s   |  |tjS )N)r.   operatorlt)r   r,   r   r   r   __lt__   s    zType.__lt__c             C   s   |  |tjS )N)r.   r/   gt)r   r,   r   r   r   __gt__   s    zType.__gt__c             C   s   |  |tjS )N)r.   r/   ge)r   r,   r   r   r   __ge__   s    zType.__ge__c             C   s   |  |tjS )N)r.   r/   le)r   r,   r   r   r   __le__   s    zType.__le__c             C   s   |  |tjS )N)r.   r/   eq)r   r,   r   r   r   __eq__   s    zType.__eq__c             C   s   |  |tjS )N)r.   r/   ne)r   r,   r   r   r   __ne__   s    zType.__ne__c             C   s   t | j| j| j| jfS )N)hashr   r   r   r   )r   r   r   r   __hash__   s    
zType.__hash__c             C   s6   t |ttfr.x|D ]}| |rdS qW dS | |kS )zReturn True if the specified types are compatible at
        an introspection level, disregarding their C types.
        A sequence may be given for typeval, in which case
        this function returns True if the type is compatible with
        any.TF)r   listtupleis_equiv)r   typevalvalr   r   r   r@      s    

zType.is_equivc             C   s   t | j| j| j| j| jdS )N)r   r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   r&      s
    z
Type.clonec             C   s(   | j r| j S | jr| jS | jr$| jS d S )N)r   r   r   )r   r   r   r   __str__   s    zType.__str__c             C   sT   | j rd| j f }n,| jr(d| jf }n| jr<d| jf }nd}d| jj|| jf S )Nztarget_fundamental=%s, ztarget_giname=%s, ztarget_foreign=%s,  z%s(%sctype=%s))r   r   r   	__class____name__r   )r   datar   r   r   __repr__   s    zType.__repr__)	NNNNNFFNN)rF   
__module____qualname____doc__r   propertyr   r   classmethodr)   r+   r.   r1   r3   r5   r7   r9   r;   r=   r@   r&   rC   rH   r   r   r   r   r   &   s4   	        

r   c               @   s   e Zd Zdd ZdS )r   c             C   s   t j| dd d S )NT)r   )r   r   )r   r   r   r   r      s    zTypeUnknown.__init__N)rF   rI   rJ   r   r   r   r   r   r      s   r   ZnoneZvoid)r   r   ZgpointerZgbooleanZgint8Zguint8Zgint16Zguint16Zgint32Zguint32Zgint64Zguint64ZgcharZgshortZgushortZgintZguintZglongZgulongZgsizeZgssizeZgintptrZguintptrz	long longzunsigned long longZgfloatZgdoublezlong doubleZgunicharZGTypeutf8zgchar*filenameZva_listcharzsigned charzunsigned charZshortzsigned shortzunsigned shortintz
signed intzunsigned short intsignedzunsigned intZunsignedZlongzsigned longzunsigned longzunsigned long intfloatZdoublezchar*zvoid*zsigned long longZint8_tZuint8_tZint16_tZuint16_tZint32_tZuint32_tZint64_tZuint64_tboolZgucharZ
gchararrayZgoffsetZ	gunichar2ZgconstpointeranyZbooleanZuintZulongzFILE*Zsize_tZssize_tZtime_tZoff_tZpid_tZuid_tZgid_tZdev_tZ	socklen_tidinoutZinoutZcallasyncZnotifiedZ	containerZfullfirstZlastZcleanupzmust-collectc               @   sz   e Zd ZdddZdddZdd Zd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S ) 	NamespaceNc             C   s   || _ || _|d k	r|| _n|g| _|d k	r4|| _n| j}dd |D | _dd | jD | _t | _i | _i | _i | _	i | _
t | _g | _g | _g | _d S )Nc             S   s   g | ]}t | qS r   )r   lower).0pr   r   r   
<listcomp>  s    z&Namespace.__init__.<locals>.<listcomp>c             S   s   g | ]}|  qS r   )upper)r]   r^   r   r   r   r_     s    )nameversionidentifier_prefixessymbol_prefixesZ_ucase_symbol_prefixesr	   namesaliasesr    ctypessymbolssetZincludesZshared_librariesZ
c_includesZexported_packages)r   ra   rb   rc   rd   Zpsr   r   r   r   {  s&    zNamespace.__init__c             C   s<   |t krt||dS d|kr"|}nd| j|f }t||dS )aO  Backwards compatibility method for older .gir files, which
only use the 'name' attribute.  If name refers to a fundamental type,
create a Type object referncing it.  If name is already a
fully-qualified GIName like 'Foo.Bar', returns a Type targeting it .
Otherwise a Type targeting name qualififed with the namespace name is
returned.)r   r   r   z%s.%s)r   r   )r    r   ra   )r   ra   r   targetr   r   r   type_from_name  s    zNamespace.type_from_namec             C   s  t |tst|j| krdS |jdks*t| |_t |trH|| j|j< n8t |trj|jdk	rj|| j	|j< nt |t
r|| j|j< t |ttttfrx8t|j|j|jD ]"}t |t
sq| |_|| j|j< qW t |tttfrx|jD ]
}| |_qW t |ttfr"xt|j|jD ]}| |_qW t |ttfrx2|jD ](}t |t
sNq:| |_|| j|j< q:W x"|jD ]}| |_|| j|j< qnW t|dr|| j|j< dS )zwDoesn't directly append the function to our own namespace,
but adds it to things like ctypes, symbols, and type_names.
Nr   )r   Noder   	namespaceAliasrf   ra   
Registeredr   r    Functionrh   symbolCompoundClass	InterfaceBoxedr   methodsstatic_methodsconstructorsfieldssignals
propertiesEnumBitfieldmembershasattrrg   r   )r   nodefnfmmemberr   r   r   track  sD    




zNamespace.trackFc             C   sL   | j |j}|d k	r2|s(td|f | | | | || j |j< d S )NzNamespace conflict: %r)re   r!   ra   
ValueErrorremover   )r   r   replaceZpreviousr   r   r   append  s    

zNamespace.appendc             C   sv   t |tr| j|j= nt |tr4|jd k	r4| j|j= t|drH| j|j	= t |t
r\| j|j= d |_| j|jd  d S )Nr   )r   rn   rf   ra   ro   r   r    r   rg   r   rp   rh   rq   rm   re   pop)r   r   r   r   r   r     s    





zNamespace.removec             C   s.   t |tr|j}| | || j|< | |_dS )zLike remove(), but doesn't unset the node's namespace
back-reference, and it's still possible to look up
functions via get_by_symbol().N)r   rp   rq   r   rh   rm   )r   r   rq   r   r   r   rS     s
    


zNamespace.floatc             C   s
   t | jS )N)iterre   )r   r   r   r   __iter__  s    zNamespace.__iter__c             C   s
   | j  S )N)re   items)r   r   r   r   r     s    zNamespace.itemsc             C   s
   | j  S )N)re   values)r   r   r   r   r     s    zNamespace.valuesc             C   s   | j |S )N)re   r!   )r   ra   r   r   r   r!     s    zNamespace.getc             C   s   | j |S )N)rg   r!   )r   r   r   r   r   get_by_ctype  s    zNamespace.get_by_ctypec             C   s   | j |S )N)rh   r!   )r   rq   r   r   r   get_by_symbol  s    zNamespace.get_by_symbolc             C   s"   x|   D ]}||g  q
W d S )N)r   walk)r   callbackr   r   r   r   r     s    zNamespace.walk)NN)N)F)rF   rI   rJ   r   rk   r   r   r   rS   r   r   r   r!   r   r   r   r   r   r   r   r[   z  s   

'


r[   c               @   sh   e Zd Zdd Ze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S )Includec             C   s   || _ || _d S )N)ra   rb   )r   ra   rb   r   r   r   r     s    zInclude.__init__c             C   s   | | dd S )N-r   )r*   )r'   stringr   r   r   from_string  s    zInclude.from_stringc             C   s   || j | jf|j |jfS )N)ra   rb   )r   r,   r-   r   r   r   r.     s    zInclude._comparec             C   s   |  |tjS )N)r.   r/   r0   )r   r,   r   r   r   r1     s    zInclude.__lt__c             C   s   |  |tjS )N)r.   r/   r2   )r   r,   r   r   r   r3     s    zInclude.__gt__c             C   s   |  |tjS )N)r.   r/   r4   )r   r,   r   r   r   r5     s    zInclude.__ge__c             C   s   |  |tjS )N)r.   r/   r6   )r   r,   r   r   r   r7     s    zInclude.__le__c             C   s   |  |tjS )N)r.   r/   r8   )r   r,   r   r   r   r9     s    zInclude.__eq__c             C   s   |  |tjS )N)r.   r/   r:   )r   r,   r   r   r   r;     s    zInclude.__ne__c             C   s   t t| S )N)r<   str)r   r   r   r   r=      s    zInclude.__hash__c             C   s   d| j | jf S )Nz%s-%s)ra   rb   )r   r   r   r   rC   #  s    zInclude.__str__N)rF   rI   rJ   r   rM   r   r.   r1   r3   r5   r7   r9   r;   r=   rC   r   r   r   r   r     s   r   c               @   s   e Zd ZdZdd ZdS )	Annotatedz6An object which has a few generic metadata
properties.c             C   sB   d | _ d | _d| _d| _t | _d | _d | _d | _d | _	d | _
d S )NFT)rb   Zversion_docskipZintrospectabler	   Z
attributesZ	stabilityZstability_docZ
deprecatedZdeprecated_docdoc)r   r   r   r   r   *  s    zAnnotated.__init__N)rF   rI   rJ   rK   r   r   r   r   r   r   '  s   r   c               @   s   e Zd ZdZedd Zedd Zd*ddZdd	 Zd
d Z	eee	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S )+rl   zA node is a type of object which is uniquely identified by its
(namespace, name) pair.  When combined with a ., this is called a
GIName.  It's possible for nodes to contain or point to other nodes.c             C   s   | j r| j j| j S | jS )N)rm   ra   )r   r   r   r   <lambda><  s   zNode.<lambda>c             C   s   d| j j| jf S )Nz%s.%s)rm   ra   )r   r   r   r   r   >      Nc             C   s.   t |  d | _|| _d| _t | _d | _d S )NF)r   r   rm   ra   Zforeignri   file_positions_parent)r   ra   r   r   r   r   @  s    
zNode.__init__c             C   s   | j d k	r| j S | jS d S )N)r   rm   )r   r   r   r   _get_parentH  s    
zNode._get_parentc             C   s
   || _ d S )N)r   )r   valuer   r   r   _set_parentN  s    zNode._set_parentc             C   s&   | j dk	sttd| j j| jf dS )z+Create a Type object referencing this node.Nz%s.%s)r   )rm   r   r   ra   )r   r   r   r   create_typeR  s    zNode.create_typec             C   s   || j | jf|j |jfS )N)rm   ra   )r   r,   r-   r   r   r   r.   W  s    zNode._comparec             C   s   |  |tjS )N)r.   r/   r0   )r   r,   r   r   r   r1   Z  s    zNode.__lt__c             C   s   |  |tjS )N)r.   r/   r2   )r   r,   r   r   r   r3   ]  s    zNode.__gt__c             C   s   |  |tjS )N)r.   r/   r4   )r   r,   r   r   r   r5   `  s    zNode.__ge__c             C   s   |  |tjS )N)r.   r/   r6   )r   r,   r   r   r   r7   c  s    zNode.__le__c             C   s   |  |tjS )N)r.   r/   r8   )r   r,   r   r   r   r9   f  s    zNode.__eq__c             C   s   |  |tjS )N)r.   r/   r:   )r   r,   r   r   r   r;   i  s    zNode.__ne__c             C   s   t | j| jfS )N)r<   rm   ra   )r   r   r   r   r=   l  s    zNode.__hash__c             C   s   d| j j| jf S )Nz%s('%s'))rE   rF   ra   )r   r   r   r   rH   o  s    zNode.__repr__c             C   s   | j |j  d S )N)r   update)r   r   r   r   r   inherit_file_positionsr  s    zNode.inherit_file_positionsc             C   s   | j | d S )N)r   add)r   Zpositionr   r   r   add_file_positionu  s    zNode.add_file_positionc             C   s   |j r| t|j |j d S )N)Zsource_filenamer   r
   line)r   rq   r   r   r   add_symbol_referencex  s    zNode.add_symbol_referencec             C   sJ   || |}|dks t d|f |s(dS ||  | || |  d S )N)TFz)Walk function must return boolean, not %rF)r   r   _walkr   )r   r   r   Zresr   r   r   r   |  s    

z	Node.walkc             C   s   d S )Nr   )r   r   r   r   r   r   r     s    z
Node._walk)N)rF   rI   rJ   rK   rL   Zc_nameZgi_namer   r   r   parentr   r.   r1   r3   r5   r7   r9   r;   r=   rH   r   r   r   r   r   r   r   r   r   rl   7  s,   

	rl   c               @   s   e Zd ZdZdd ZdS )ro   z3A node that (possibly) has gtype_name and get_type.c             C   s4   |d kr|d ks$|d k	r |d k	s$t || _|| _d S )N)r   r   get_type)r   r   r   r   r   r   r     s    zRegistered.__init__N)rF   rI   rJ   rK   r   r   r   r   r   ro     s   ro   c               @   s~   e Zd Zdd Zdd Zdd ZeeeZdd Zd	d
 Z	eee	Z
dd Zdd ZeeeZedd Zdd Zdd ZdS )Callablec             C   s2   t | | || _|| _|  | _d | _d | _d S )N)rl   r   retval
parametersthrowsinstance_parameterr   )r   ra   r   r   r   r   r   r   r     s    
zCallable.__init__c             C   s   | j S )N)_retval)r   r   r   r   _get_retval  s    zCallable._get_retvalc             C   s   || _ | j d k	r| | j _d S )N)r   r   )r   r   r   r   r   _set_retval  s    
zCallable._set_retvalc             C   s   | j S )N)_instance_parameter)r   r   r   r   _get_instance_parameter  s    z Callable._get_instance_parameterc             C   s   || _ |d k	r| |_d S )N)r   r   )r   r   r   r   r   _set_instance_parameter  s    z Callable._set_instance_parameterc             C   s   | j S )N)_parameters)r   r   r   r   _get_parameters  s    zCallable._get_parametersc             C   s    || _ x| j D ]
}| |_qW d S )N)r   r   )r   r   paramr   r   r   _set_parameters  s    zCallable._set_parametersc             C   s"   | j d k	r| j g| j S | jS d S )N)r   r   )r   r   r   r   all_parameters  s    
zCallable.all_parametersc             C   s8   x$t | jD ]\}}|j|kr|S qW td|f d S )NzUnknown argument %s)	enumerater   argnamer   )r   ra   i	parameterr   r   r   get_parameter_index  s    
zCallable.get_parameter_indexc             C   s0   x| j D ]}|j|kr|S qW td|f d S )NzUnknown argument %s)r   r   r   )r   ra   r   r   r   r   get_parameter  s    
zCallable.get_parameterN)rF   rI   rJ   r   r   r   rL   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r     s   

r   c               @   s$   e Zd Zdd Zdd Zdd ZdS )rp   c             C   s@   t | |||| || _d| _d| _d | _d | _d | _d| _d S )NF)	r   r   rq   Z	is_methodZis_constructorZshadowed_byZshadowsZmoved_toZinternal_skipped)r   ra   r   r   r   rq   r   r   r   r     s    zFunction.__init__c             C   s4   t  | }| jd d  |_x|jD ]
}||_q"W |S )N)copyr   r   )r   r&   r   r   r   r   r&     s
    

zFunction.clonec             C   s^   | j ds| j dsdS | jr&dS | jj}|tsZ|jdkrZt	d| j |f  dS dS )NZ	_get_typeZ
_get_gtypeFzGtk.Typez'function '%s' returns '%r', not a GTypeT)
ra   endswithr   r   typer@   
TYPE_GTYPEr   r   warn)r   Zrettyper   r   r   is_type_meta_function  s    zFunction.is_type_meta_functionN)rF   rI   rJ   r   r&   r   r   r   r   r   rp     s   
	rp   c               @   s   e Zd Zdd ZdS )ErrorQuarkFunctionc             C   s   t | ||||| || _d S )N)rp   r   error_domain)r   ra   r   r   r   rq   r   r   r   r   r     s    zErrorQuarkFunction.__init__N)rF   rI   rJ   r   r   r   r   r   r     s   r   c               @   s    e Zd Zdd Zedd ZdS )	VFunctionc             C   s   t | |||| d | _d S )N)r   r   Zinvoker)r   ra   r   r   r   r   r   r   r     s    zVFunction.__init__c             C   s    | ||j |jdd  |j}|S )Nr   )r   r   r   )r'   ra   cbobjr   r   r   from_callback  s    zVFunction.from_callbackN)rF   rI   rJ   r   rM   r   r   r   r   r   r     s   r   c               @   s   e Zd Zdd ZdS )Varargsc             C   s   t j| ddd d S )Nz	<varargs>)r   )r   r   )r   r   r   r   r   
  s    zVarargs.__init__N)rF   rI   rJ   r   r   r   r   r   r     s   r   c               @   s,   e Zd ZdZdZdZdZdd Zdd Zd	S )
r$   z<c>z
GLib.ArrayzGLib.ByteArrayzGLib.PtrArrayc             K   s~   t j| fddi| |d ks(|| jkr2| j| _n"|| j| j| jfksNt||| _t|t sbt|| _	d| _
d | _d | _d S )Nr   z<array>T)r   r   C
array_type
GLIB_ARRAYGLIB_BYTEARRAYGLIB_PTRARRAYr   r   element_typezeroterminatedlength_param_namesize)r   r   r   kwargsr   r   r   r     s    
zArray.__init__c             C   s*   t | j| j}| j|_| j|_| j|_|S )N)r$   r   r   r   r   r   )r   Zarrr   r   r   r&   $  s
    zArray.cloneN)	rF   rI   rJ   r   r   r   r   r   r&   r   r   r   r   r$     s   r$   c               @   s   e Zd Zdd Zdd ZdS )Listc             K   s4   t j| fddi| || _t|t s*t|| _d S )Nr   z<list>)r   r   ra   r   r   r   )r   ra   r   r   r   r   r   r   .  s
    zList.__init__c             C   s   t | j| jS )N)r   ra   r   )r   r   r   r   r&   5  s    z
List.cloneN)rF   rI   rJ   r   r&   r   r   r   r   r   ,  s   r   c               @   s   e Zd Zdd Zdd ZdS )r"   c             K   sB   t j| fddi| t|t s$t|| _t|t s8t|| _d S )Nr   z<map>)r   r   r   r   key_type
value_type)r   r   r   r   r   r   r   r   ;  s
    zMap.__init__c             C   s   t | j| jS )N)r"   r   r   )r   r   r   r   r&   B  s    z	Map.cloneN)rF   rI   rJ   r   r&   r   r   r   r   r"   9  s   r"   c               @   s   e Zd ZdddZdS )rn   Nc             C   s   t | | || _|| _d S )N)rl   r   rj   r   )r   ra   rj   r   r   r   r   r   H  s    zAlias.__init__)N)rF   rI   rJ   r   r   r   r   r   rn   F  s   rn   c               @   s   e Zd ZdZdd ZdS )TypeContainerz2A fundamental base class for Return and Parameter.c             C   sJ   t |  || _|| _|| _|| _|d k	r2|| _n|jr@t| _nd | _d S )N)	r   r   r   nullablenot_nullable	directiontransferr   PARAM_TRANSFER_NONE)r   typenoder   r   r   r   r   r   r   r   Q  s    
zTypeContainer.__init__N)rF   rI   rJ   rK   r   r   r   r   r   r   N  s   r   c               @   s&   e Zd ZdZdddZedd ZdS )		ParameterzAn argument to a function.NFc             C   s^   t | |||
|| || _|| _d | _|rB| jtkr<d| _nd| _|| _|	| _	d | _
d | _d S )NT)r   r   r   optionalr   r   PARAM_DIRECTION_OUTr   scopecaller_allocatesZclosure_nameZdestroy_name)r   r   r   r   r   r   r   Z
allow_noner   r   r   r   r   r   r   b  s    
zParameter.__init__c             C   s   | j S )N)r   )r   r   r   r   ra   w  s    zParameter.name)NNFFFNFF)rF   rI   rJ   rK   r   rL   ra   r   r   r   r   r   _  s      
r   c               @   s   e Zd ZdZdddZdS )ReturnzA return value from a function.FNc             C   s    t j| ||||td d | _d S )N)r   )r   r   r   r   )r   Zrtyper   r   r   r   r   r   r     s    zReturn.__init__)FFN)rF   rI   rJ   rK   r   r   r   r   r   r   |  s    r   c               @   s   e Zd ZdddZdd ZdS )r|   Nc             C   sP   t | | t| || || _|| _|| _x|D ]
}| |_q2W d | _g | _d S )N)	rl   r   ro   c_symbol_prefixr   r~   r   r   rw   )r   ra   r   r   r   r   r~   r   r   r   r   r     s    

zEnum.__init__c             C   s    x| j D ]}||| qW d S )N)rw   r   )r   r   r   methr   r   r   r     s    z
Enum._walk)NNNN)rF   rI   rJ   r   r   r   r   r   r   r|     s
      
r|   c               @   s   e Zd ZdddZdd ZdS )r}   Nc             C   sJ   t | | t| || || _|| _|| _x|D ]
}| |_q2W g | _d S )N)rl   r   ro   r   r   r~   r   rw   )r   ra   r   r   r   r   r~   r   r   r   r   r     s    

zBitfield.__init__c             C   s    x| j D ]}||| qW d S )N)rw   r   )r   r   r   r   r   r   r   r     s    zBitfield._walk)NNNN)rF   rI   rJ   r   r   r   r   r   r   r}     s
      

r}   c               @   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S )Memberc             C   s,   t |  || _|| _|| _|| _d | _d S )N)r   r   ra   r   rq   nickr   )r   ra   r   rq   r   r   r   r   r     s    
zMember.__init__c             C   s   || j |j S )N)ra   )r   r,   r-   r   r   r   r.     s    zMember._comparec             C   s   |  |tjS )N)r.   r/   r0   )r   r,   r   r   r   r1     s    zMember.__lt__c             C   s   |  |tjS )N)r.   r/   r2   )r   r,   r   r   r   r3     s    zMember.__gt__c             C   s   |  |tjS )N)r.   r/   r4   )r   r,   r   r   r   r5     s    zMember.__ge__c             C   s   |  |tjS )N)r.   r/   r6   )r   r,   r   r   r   r7     s    zMember.__le__c             C   s   |  |tjS )N)r.   r/   r8   )r   r,   r   r   r   r9     s    zMember.__eq__c             C   s   |  |tjS )N)r.   r/   r:   )r   r,   r   r   r   r;     s    zMember.__ne__c             C   s
   t | jS )N)r<   ra   )r   r   r   r   r=     s    zMember.__hash__c             C   s   d| j j| jf S )Nz%s('%s'))rE   rF   ra   )r   r   r   r   rH     s    zMember.__repr__N)rF   rI   rJ   r   r.   r1   r3   r5   r7   r9   r;   r=   rH   r   r   r   r   r     s   r   c               @   s6   e Zd ZdddZdd Zdd Zd	d
 Zdd ZdS )rr   NFc             C   sZ   t | | t| || || _g | _g | _g | _g | _|| _|| _	|| _
|| _|| _d S )N)rl   r   ro   r   rv   rw   ry   rx   	disguisedr   r   r   tag_name)r   ra   r   r   r   r   r   r   r   r   r   r     s    zCompound.__init__c             C   s   || _ || _| | jj|< d S )N)r   r   rm   r    )r   r   r   r   r   r   	add_gtype  s    zCompound.add_gtypec             C   s   x| j D ]}||| qW x| jD ]}||| q$W x| jD ]}||| q@W x&| jD ]}|jd k	r\|j|| q\W d S )N)rx   r   rv   rw   ry   anonymous_node)r   r   r   ctorfuncfieldr   r   r   r     s    
zCompound._walkc             C   s0   x| j D ]}|j|kr|S qW td|f d S )NzUnknown field %s)ry   ra   r   )r   ra   r   r   r   r   	get_field  s    
zCompound.get_fieldc             C   s8   x$t | jD ]\}}|j|kr|S qW td|f d S )NzUnknown field %s)r   ry   ra   r   )r   ra   r   r   r   r   r   get_field_index  s    
zCompound.get_field_index)NNNNFN)rF   rI   rJ   r   r   r   r   r   r   r   r   r   rr     s        
rr   c               @   s^   e Zd Zd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S )FieldNc             C   sP   t |  |s|st|| _|| _|| _|| _|| _|| _d| _	d | _
d | _d S )NF)r   r   r   ra   r   readablewritablebitsr   Zprivaterm   r   )r   ra   r   r   r   r   r   r   r   r   r     s    
zField.__init__c             C   s   || j |j S )N)ra   )r   r,   r-   r   r   r   r.     s    zField._comparec             C   s   |  |tjS )N)r.   r/   r0   )r   r,   r   r   r   r1     s    zField.__lt__c             C   s   |  |tjS )N)r.   r/   r2   )r   r,   r   r   r   r3      s    zField.__gt__c             C   s   |  |tjS )N)r.   r/   r4   )r   r,   r   r   r   r5   #  s    zField.__ge__c             C   s   |  |tjS )N)r.   r/   r6   )r   r,   r   r   r   r7   &  s    zField.__le__c             C   s   |  |tjS )N)r.   r/   r8   )r   r,   r   r   r   r9   )  s    zField.__eq__c             C   s   |  |tjS )N)r.   r/   r:   )r   r,   r   r   r   r;   ,  s    zField.__ne__c             C   s
   t | jS )N)r<   ra   )r   r   r   r   r=   /  s    zField.__hash__c             C   s   d| j j| jf S )Nz%s('%s'))rE   rF   ra   )r   r   r   r   rH   2  s    zField.__repr__)NN)rF   rI   rJ   r   r.   r1   r3   r5   r7   r9   r;   r=   rH   r   r   r   r   r   
  s    
r   c               @   s   e Zd ZdddZdS )RecordNFc          
   C   s$   t j| |||||||d d | _d S )N)r   r   r   r   r   r   )rr   r   Zis_gtype_struct_for)r   ra   r   r   r   r   r   r   r   r   r   r   8  s    zRecord.__init__)NNNNFN)rF   rI   rJ   r   r   r   r   r   r   6  s        r   c               @   s   e Zd ZdddZdS )UnionNFc          
   C   s   t j| |||||||d d S )N)r   r   r   r   r   r   )rr   r   )r   ra   r   r   r   r   r   r   r   r   r   r   M  s    zUnion.__init__)NNNNFN)rF   rI   rJ   r   r   r   r   r   r   K  s        r   c               @   s"   e Zd ZdZdddZdd ZdS )ru   z6A boxed type with no known associated structure/union.Nc             C   sb   |d k	st |d k	st t| | t| || |d k	rF|d k	sFt || _g | _g | _g | _d S )N)r   rl   r   ro   r   rx   rv   rw   )r   ra   r   r   r   r   r   r   r   _  s    zBoxed.__init__c             C   sX   x| j D ]}||| qW x| jD ]}||| q$W x| jD ]}||| q@W d S )N)rx   r   rv   rw   )r   r   r   r   r   r   r   r   r   n  s    zBoxed._walk)NNN)rF   rI   rJ   rK   r   r   r   r   r   r   ru   ]  s
     
ru   c               @   s   e Zd ZdddZdS )SignalNFc	       	      C   s4   t | |||d || _|| _|| _|| _|| _d S )NF)r   r   when
no_recursedetailedactionno_hooks)	r   ra   r   r   r   r   r   r   r  r   r   r   r   y  s    zSignal.__init__)NFFFF)rF   rI   rJ   r   r   r   r   r   r   w  s     r   c               @   s   e Zd ZdddZdd ZdS )rs   NFc             C   s   t | | t| || || _|| _|| _d| _d | _d | _d | _	d | _
g | _d | _|| _g | _g | _g | _g | _g | _g | _g | _g | _d S )NF)rl   r   ro   r   r   parent_typer(   Z
unref_funcZref_funcZset_value_funcZget_value_funcparent_chainglib_type_structis_abstractrv   virtual_methodsrw   Z
interfacesrx   r{   ry   rz   )r   ra   r  r   r   r   r   r  r   r   r   r     s*    zClass.__init__c             C   s   x| j D ]}||| qW x| jD ]}||| q$W x| jD ]}||| q@W x| jD ]}||| q\W x"| jD ]}|jrx|j|| qxW x| jD ]}||| qW x| jD ]}||| qW d S )N)	rv   r   r  rw   rx   ry   r   rz   r{   )r   r   r   r   r   r   sigZpropr   r   r   r     s    zClass._walk)NNNNF)rF   rI   rJ   r   r   r   r   r   r   rs     s       
rs   c               @   s   e Zd ZdddZdd ZdS )rt   Nc             C   sl   t | | t| || || _|| _|| _g | _g | _g | _g | _	g | _
d | _g | _g | _g | _g | _d S )N)rl   r   ro   r   r   r  r  rv   rz   rw   r  r  r{   ry   Zprerequisitesrx   )r   ra   r  r   r   r   r   r   r   r   r     s    zInterface.__init__c             C   s   x| j D ]}||| qW x| jD ]}||| q$W x| jD ]}||| q@W x"| jD ]}|jr\|j|| q\W x| jD ]}||| qW d S )N)rv   r   rw   r  ry   r   rz   )r   r   r   r   r   r  r   r   r   r     s    zInterface._walk)NNNN)rF   rI   rJ   r   r   r   r   r   r   rt     s
      
rt   c               @   s   e Zd Zdd ZdS )Constantc             C   s"   t | | || _|| _|| _d S )N)rl   r   r   r   r   )r   ra   r   r   r   r   r   r   r     s    zConstant.__init__N)rF   rI   rJ   r   r   r   r   r   r    s   r  c               @   s   e Zd ZdddZdS )PropertyNc             C   sJ   t | | || _|| _|| _|| _|| _|d kr:t| _n|| _d | _	d S )N)
rl   r   r   r   r   	constructconstruct_onlyr   r   r   )r   ra   Ztypeobjr   r   r
  r  r   r   r   r   r     s    zProperty.__init__)N)rF   rI   rJ   r   r   r   r   r   r	    s   r	  c               @   s   e Zd ZdddZdS )CallbackNc             C   s   t | |||| || _d S )N)r   r   r   )r   ra   r   r   r   r   r   r   r   r     s    zCallback.__init__)N)rF   rI   rJ   r   r   r   r   r   r    s   r  )lZ
__future__r   r   r   r   r   r/   	itertoolsr   rD   r   collectionsr	   r
   Zutilsr   objectr   r   Z	TYPE_NONEr#   ZTYPE_BOOLEANZ	TYPE_INT8Z
TYPE_UINT8Z
TYPE_INT16ZTYPE_UINT16Z
TYPE_INT32ZTYPE_UINT32Z
TYPE_INT64ZTYPE_UINT64Z	TYPE_CHARZ
TYPE_SHORTZTYPE_USHORTZTYPE_INTZ	TYPE_UINTZ	TYPE_LONGZ
TYPE_ULONGZ	TYPE_SIZEZ
TYPE_SSIZEZTYPE_INTPTRZTYPE_UINTPTRZTYPE_LONG_LONGZTYPE_LONG_ULONGZ
TYPE_FLOATZTYPE_DOUBLEZTYPE_LONG_DOUBLEZTYPE_UNICHARr   r%   ZTYPE_FILENAMEZTYPE_VALISTZBASIC_TYPESZBASIC_GIR_TYPESextendZ	GIR_TYPESZPOINTER_TYPESr>   ZINTROSPECTABLE_BASICvr   r    rA   r   Zbasic_type_namesZPARAM_DIRECTION_INr   ZPARAM_DIRECTION_INOUTZPARAM_SCOPE_CALLZPARAM_SCOPE_ASYNCZPARAM_SCOPE_NOTIFIEDr   ZPARAM_TRANSFER_CONTAINERZPARAM_TRANSFER_FULLZSIGNAL_FIRSTZSIGNAL_LASTZSIGNAL_CLEANUPZSIGNAL_MUST_COLLECTr[   r   r   rl   ro   r   rp   r   r   r   r$   r   r"   rn   r   r   r   r|   r}   r   rr   r   r   r   ru   r   rs   rt   r  r	  r  r   r   r   r   <module>   sX   "







 &R	;'
&2,3'	