o
    bê²^ç4  ã                   @   sê   d dl Z ddlmZ ddlmZ ddlmZmZmZm	Z	m
Z
mZmZ ddlmZ eef ddlmZ ddlmZ d	d
„ ZG dd„ deƒZdd„ Zdd„ ZG dd„ deƒZe e¡ G dd„ deeƒZdd„ Zdd„ ZG dd„ deeƒZdS )é    Né   )ÚTYPE_INVALID)Úgenerate_doc_string)ÚInterfaceInfoÚ
ObjectInfoÚ
StructInfoÚ	VFuncInfoÚregister_interface_infoÚhook_up_vfunc_implementationÚ
GInterface)Ú_gi)Ú_propertyhelper)Ú_signalhelperc                 C   s    t  dd| ¡}t  dd|¡ ¡ S )Nz(.)([A-Z][a-z]+)z\1_\2z([a-z0-9])([A-Z]))ÚreÚsubÚlower)ÚnameÚs1© r   ú*/usr/lib/python3/dist-packages/gi/types.pyÚ
snake_case,   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S )ÚMetaClassHelperc                 C   s"   | j  ¡ D ]	}t| |j|ƒ qd S ©N)Ú__info__Úget_methodsÚsetattrÚ__name__)ÚclsÚmethod_infor   r   r   Ú_setup_methods2   s   ÿzMetaClassHelper._setup_methodsc                 C   sL   | j }| ¡ }|d u rd S | ¡ D ]}|j}t| |ƒs#t| |t|ƒƒ qd S r   )r   Úget_class_structr   r   Úhasattrr   Úclassmethod)r   ÚinfoÚclass_structr   r   r   r   r   Ú_setup_class_methods6   s   
€üz$MetaClassHelper._setup_class_methodsc                 C   s:   | j  ¡ D ]}| ¡  dd¡}t| |t|j|jƒƒ qd S )Nú-Ú_)r   Ú
get_fieldsÚget_nameÚreplacer   ÚpropertyÚ	get_valueÚ	set_value)r   Ú
field_infor   r   r   r   Ú_setup_fieldsA   s   þzMetaClassHelper._setup_fieldsc                 C   s0   | j  ¡ D ]}| ¡ }| ¡ }t| ||ƒ qd S r   )r   Úget_constantsr)   r,   r   )r   Úconstant_infor   Úvaluer   r   r   Ú_setup_constantsF   s
   ýz MetaClassHelper._setup_constantsc                 C   sT  | j  ¡ D ]¢\}}| d¡rt|ƒsqd}d }| jD ]D}t||d ƒ}|d ur/t|tƒr/|} n0t|dƒr:t|j	dƒs;qt
|j	 ¡ ƒ}|j	 ¡ D ]}|d|| ¡ f krY|}d} nqG|r^ nq|d u rot| j|tdƒd … ƒ}|d ur§|s t|| jƒ}	|	d ur | ¡ }
td|| j	 ¡ | j	 ¡ |
 ¡ |
 ¡ |	j	 ¡ |	j	 ¡ f ƒ‚t|| j|ƒ qd S )NÚdo_Fr   Ú
get_vfuncszdo_%s_%sTzTMethod %s() on class %s.%s is ambiguous with methods in base classes %s.%s and %s.%s)Ú__dict__ÚitemsÚ
startswithÚcallableÚ__mro__ÚgetattrÚ
isinstancer   r!   r   r   Úget_type_namer5   r)   Úfind_vfunc_info_in_interfaceÚ	__bases__ÚlenÚfind_vfunc_conflict_in_basesÚget_containerÚ	TypeErrorÚget_namespacer
   Ú	__gtype__)r   Ú
vfunc_nameÚpy_vfuncÚskip_ambiguity_checkÚ
vfunc_infoÚbaseÚmethodÚ	base_nameÚvÚambiguous_baseÚ	base_infor   r   r   Ú_setup_vfuncsL   sX   
ýÿ	úþ
ÿ€ÇzMetaClassHelper._setup_vfuncsc                 C   sb   | j  d¡}|d u st|tƒsd S | jdkr| jdkrd S | ¡ D ]}d|j }t| ||ƒ q!d S )Nr   zgi.repository.GObjectÚObjectzdo_%s)r6   Úgetr<   r   Ú
__module__r   r5   r   )r   Ú
class_inforI   r   r   r   r   Ú_setup_native_vfuncs‰   s   
þz$MetaClassHelper._setup_native_vfuncsN)	r   rS   Ú__qualname__r   r%   r/   r3   rP   rU   r   r   r   r   r   1   s    =r   c                 C   s|   | D ]9}|t u st|t ƒrt|dƒsqt|jtƒr-|j ¡ D ]}| ¡ |kr,|    S qt|j	|ƒ}|d ur;|  S qd S )Nr   )
r   Ú
issubclassr!   r<   r   r   r5   r)   r>   r?   )ÚbasesrF   rJ   Úvfuncr   r   r   r>   œ   s"   ÿþÿÿr>   c                 C   s~   |D ]:}t |dƒrt |jdƒsq|j ¡ }|  ¡ }|D ]}| ¡ |kr-|| kr-|    S qt| |jƒ}|d ur<|  S qd S )Nr   r5   )r!   r   r5   r)   rA   r?   )rY   rX   ÚklassÚvfuncsrF   rM   Úaklassr   r   r   rA   ¶   s    

ÿ
€ÿrA   c                   @   s    e Zd ZdZdd„ Zdd„ ZdS )Ú_GObjectMetaBasez8Metaclass for automatically registering GObject classes.c                 C   s4   t  | |||¡ t | ¡ t | ¡ |  | j¡ d S r   )ÚtypeÚ__init__ÚpropertyhelperÚinstall_propertiesÚsignalhelperÚinstall_signalsÚ_type_registerr6   )r   r   rX   Údict_r   r   r   r_   É   s   

z_GObjectMetaBase.__init__c                 C   s2   d|v rd S | j  d¡rd S t | | d¡¡ d S )NrE   zgi.overrides.Ú__gtype_name__)rS   r8   r   Útype_registerrR   )r   Ú	namespacer   r   r   rd   Ï   s
   z_GObjectMetaBase._type_registerN)r   rS   rV   Ú__doc__r_   rd   r   r   r   r   r]   Ç   s    r]   c                       s4   e Zd ZdZ‡ fdd„Zdd„ Zedd„ ƒZ‡  ZS )ÚGObjectMetaz+Meta class used for GI GObject based types.c                    sÆ   t t| ƒ |||¡ d}| jd| j ¡  krd}d}|s$| jtjkr$d}|r,|  ¡  d S |r_t| jtƒr8|  	¡  |  
¡  |  ¡  |  ¡  t| jtƒrP|  ¡  d S t| jtƒrat| j ¡ ƒ d S d S d S )NFúgi.repository.T)Úsuperrj   r_   rS   r   rD   rP   r<   r   r%   r   r3   rU   r/   r   r	   Ú
get_g_type)r   r   rX   re   Úis_gi_definedÚis_python_defined©Ú	__class__r   r   r_   á   s*   ö	zGObjectMeta.__init__c                 C   s   t | ƒS r   )Úmro©r   r   r   r   rr   ù   s   zGObjectMeta.mroc                 C   s@   | t krdS | j dd¡}|dur|S | j d¡rt| jƒS dS )zFMeta class property which shows up on any class using this meta-class.Ú ri   N)rk   zgi.overrides)rj   r6   rR   rS   r8   r   r   )r   Údocr   r   r   ri   ü   s   
zGObjectMeta.__doc__)r   rS   rV   ri   r_   rr   r+   Ú__classcell__r   r   rp   r   rj   ß   s    rj   c                    sÒ   g }| gg}| j r| j D ]
}|t|jƒg7 }q|t| j ƒg7 }|rg|D ]}|d ‰ ‡ fdd„|D ƒ}|r<tˆ j vr<d‰ q# ˆ du rEtdƒ‚| ˆ ¡ |dd… D ]}|rd|d ˆ krd|d= |sd| |¡ qP|s!|S )a\  Compute the class precedence list (mro) according to C3, with GObject
    interface considerations.

    We override Python's MRO calculation to account for the fact that
    GObject classes are not affected by the diamond problem:
    http://en.wikipedia.org/wiki/Diamond_problem

    Based on http://www.python.org/download/releases/2.3/mro/
    r   c                    s    g | ]}ˆ |d d… v r|‘qS )r   Nr   )Ú.0Ús©Ú	candidater   r   Ú
<listcomp>(  s     zmro.<locals>.<listcomp>Nz8Cannot create a consistent method resolution order (MRO))r?   Úlistr:   r   rC   ÚappendÚremove)ÚCrX   Úbases_of_subclassesrJ   Úsubclass_basesÚnot_headr   ry   r   rr     s0   


€írr   c                  O   s   d S r   r   )ÚargsÚkwargsr   r   r   Únothing=  s   r…   c                       s,   e Zd ZdZ‡ fdd„Zedd„ ƒZ‡  ZS )Ú
StructMetaz*Meta class used for GI Struct based types.c                    s–   t t| ƒ |||¡ | j ¡ }|tkr|jd urd S |  ¡  |  ¡  | j 	¡ D ]!}| 
¡ rH|jdkrH| ¡ r=| j ¡ dkrHt|ƒ| _t| _ d S q'd S )NÚnewr   )rl   r†   r_   r   rm   r   Úpytyper/   r   r   Úis_constructorr   Úget_argumentsÚget_sizeÚstaticmethodÚ__new__r…   )r   r   rX   re   Úg_typer   rp   r   r   r_   D  s"   

ÿ
€÷zStructMeta.__init__c                 C   s   | t krdS t| jƒS )Nrt   )r†   r   r   rs   r   r   r   ri   Z  s   
zStructMeta.__doc__)r   rS   rV   ri   r_   r+   rv   r   r   rp   r   r†   A  s
    r†   )r   Ú
_constantsr   Ú	docstringr   r   r   r   r   r   r	   r
   r   rt   r   r`   r   rb   r   Úobjectr   r>   rA   r^   r]   Ú_install_metaclassrj   rr   r…   r†   r   r   r   r   Ú<module>   s$   $k
.0