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Zd dlm	Z	 d dl
mZ dd	lmZmZ dd
lmZ d!ddZdd ZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZeeedZG dd  d eZdS )"    )absolute_import)division)print_function)unicode_literalsN)saxutils)TemplateLookup   )ast	xmlwriter)to_underscoresFc             C   s   t | tjr|r| jS dS t| dr6| jr6| jd }nt| dd }|d krt | tjrn| jrnd| j	j| jf S d| j	j| jf S t | tj
tjtjtjfrdt|dd| jf S t | tjr| jrdt|dd| jf S dt|dd| jf S d S )	Nindex_chainparentz%s.%sz%s-%sT)	recursive)
isinstancer	   	Namespacenamehasattrr   getattrFunctionshadows	namespacePropertySignal	VFunctionFieldmake_page_id)noder   r    r   5/usr/lib/gobject-introspection/giscanner/docwriter.pyr   (   s     r   c             C   s  t | tjrd}n t | tjtjtjfr0d}nt | tjrBd}nt | tjrTd}nt | tjr~| j	rld}n| j
rxd}nd}nt | tjtjfrd}n~t | tjr| jd k	rd	}nbt | tjr| jd k	rd
}nFt | tjr| jd k	rd}n*t | tjrd}nt | tjrd}nd}|S )Nr   classZ	interfacerecordmethodconstructorZfunctionenumpropertysignalZvfunccallbackfielddefault)r   r	   r   ClassBoxedCompoundZ	InterfaceRecordr   	is_methodis_constructorEnumBitfieldr   r   r   r   Callabler   )r   Z	node_kindr   r   r    get_node_kindB   s8    r4   c               @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )TemplatedScannerc             C   s   |  || _| | j| _d S )N)unmangle_specsspecs
make_regexregex)selfr7   r   r   r    __init__e   s    zTemplatedScanner.__init__c                s@   t d tdd |D d fdd	fdd|D S )	Nz<<([a-zA-Z_:]+)>>c             s   s    | ]\}}| d |fV  qdS )!N)lstrip).0r   specr   r   r    	<genexpr>k   s    z2TemplatedScanner.unmangle_specs.<locals>.<genexpr>c                s    fdd} || S )Nc                sX   |  d}d|kr$|dd\}}nd }| }|d }|rP rPd ||f S |S d S )Nr   :z(?P<%s_%s>%s))groupsplit)matchZchild_spec_nameZpattern_nameZ
child_specZ	unmangled)r   specdictunmangler   r    replace_funcn   s    

zGTemplatedScanner.unmangle_specs.<locals>.unmangle.<locals>.replace_func)sub)r?   r   rG   )mangledrE   rF   )r   r    rF   m   s    z1TemplatedScanner.unmangle_specs.<locals>.unmanglec                s   g | ]\}}| ||fqS r   r   )r>   r   r?   )rF   r   r    
<listcomp>   s    z3TemplatedScanner.unmangle_specs.<locals>.<listcomp>)N)recompiledict)r:   r7   r   )rI   rE   rF   r    r6   i   s    
zTemplatedScanner.unmangle_specsc             C   s   d dd |D }t|S )N|c             s   s(   | ] \}}| d sd||f V  qdS )r<   z
(?P<%s>%s)N)
startswith)r>   r   r?   r   r   r    r@      s    z.TemplatedScanner.make_regex.<locals>.<genexpr>)joinrK   rL   )r:   r7   r9   r   r   r    r8      s    zTemplatedScanner.make_regexc             C   sZ   |  }|||i}|d }x6| D ]*\}}||r(|t|d  }|||< q(W |S )N_)	groupdictpopitemsrO   len)r:   r   rD   rR   
propertiesrB   valuekeyr   r   r    get_properties   s    
zTemplatedScanner.get_propertiesc             c   s   d}xh| j ||}|d krP | }||krBd||| d fV  | }|j}||d| ||fV  qW |t|k rd||d  d fV  d S )Nr   other)r9   searchstartend	lastgrouprB   rY   rU   )r:   textposrD   r\   r   r   r   r    scan   s    zTemplatedScanner.scanN)__name__
__module____qualname__r;   r6   r8   rY   ra   r   r   r   r    r5   d   s
   
r5   c                   s   e Zd Z fddZ  ZS )DocstringScannerc                s(   ddddddddg}t t| | d S )	N)z!alphaz[a-zA-Z0-9_]+)z!alpha_dashz[a-zA-Z0-9_-]+)r&   z3#<<type_name:alpha>>:(<<property_name:alpha_dash>>))r'   z2#<<type_name:alpha>>::(<<signal_name:alpha_dash>>))	type_namez#(<<type_name:alpha>>))
enum_valuez%(<<member_name:alpha>>))	parameterz@<<param_name:alpha>>)function_callz<<symbol_name:alpha>>\(\))superre   r;   )r:   r7   )	__class__r   r    r;      s    zDocstringScanner.__init__)rb   rc   rd   r;   __classcell__r   r   )rk   r    re      s   re   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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dAd(d)Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 ZdBd4d5Zd6d7 Zd8d9 Zd:d; Zd<d= Z d>d? Z!d@S )CDocFormatterc             C   s   || _ t | _d S )N)_transformerre   _scanner)r:   transformerr   r   r    r;      s    zDocFormatter.__init__c             C   s
   t |S )N)r   escape)r:   r_   r   r   r    rq      s    zDocFormatter.escapec             C   s.   t |ddrdS t|tjr*|jd kr*dS dS )NprivateFT)r   r   r	   ZNoder   )r:   r   r   r   r    should_render_node   s
    zDocFormatter.should_render_nodec             C   sH   |d krdS d}x2| dD ]$}|d7 }|| ||7 }|d7 }qW |S )N z

z  <p>z</p>)rC   format_inline)r:   r   docresultparar   r   r    format   s    zDocFormatter.formatc             C   sN   y| j |}W n tk
r$   d S X x"|D ]\}}||}|r,|S q,W d S )N)rn   Zsplit_ctype_namespaces
ValueErrorget)r:   Zidentmatchesr   r   r   r   r   r    _resolve_type   s    
zDocFormatter._resolve_typec             C   sN   y| j |}W n tk
r$   d S X x"|D ]\}}||}|r,|S q,W d S )N)rn   Zsplit_csymbol_namespacesrz   Zget_by_symbol)r:   symbolr|   r   r   r   r   r   r    _resolve_symbol   s    
zDocFormatter._resolve_symbolc             C   s.   x|D ]}|j |kr|S qW td|f d S )NzCould not find %s)r   KeyError)r:   Zlist_r   itemr   r   r    _find_thing   s    

zDocFormatter._find_thingc             C   s
   |  |S )N)rq   )r:   r   rD   propsr   r   r    _process_other   s    zDocFormatter._process_otherc          	   C   sT   |  |d }|d kr|S y| |j|d }W n ttfk
rH   |S X | |S )Nrf   Zproperty_name)r}   r   rV   AttributeErrorr   format_xref)r:   r   rD   r   	type_nodeZpropr   r   r    _process_property   s    zDocFormatter._process_propertyc          	   C   sT   |  |d }|d kr|S y| |j|d }W n ttfk
rH   |S X | |S )Nrf   Zsignal_name)r}   r   Zsignalsr   r   r   )r:   r   rD   r   r   r'   r   r   r    _process_signal   s    zDocFormatter._process_signalc             C   s$   |  |d }|d kr|S | |S )Nrf   )r}   r   )r:   r   rD   r   type_r   r   r    _process_type_name  s    zDocFormatter._process_type_namec             C   sJ   |d }yd| j | f S  tk
r,   Y nX | |}|rF| |S |S )Nmember_namez<code>%s</code>)fundamentalsr   r   r   )r:   r   rD   r   r   rg   r   r   r    _process_enum_value  s    

z DocFormatter._process_enum_valuec          	   C   s>   y| |d }W n ttfk
r*   |S X d| ||f S )NZ
param_namez<code>%s</code>)get_parameterr   rz   format_parameter_name)r:   r   rD   r   rh   r   r   r    _process_parameter!  s
    zDocFormatter._process_parameterc             C   s$   |  |d }|d kr|S | |S )NZsymbol_name)r   r   )r:   r   rD   r   funcr   r   r    _process_function_call)  s    z#DocFormatter._process_function_callc             C   s<   |\}}}| j | j| j| j| j| j| jd}|| |||S )N)rZ   r&   r'   rf   rg   rh   ri   )r   r   r   r   r   r   r   )r:   r   tokZkindrD   r   dispatchr   r   r    _process_token0  s    

zDocFormatter._process_tokenc             C   s   t d S )N)NotImplementedError)r:   r   r   r   r    get_in_parameters?  s    zDocFormatter.get_in_parametersc                s*   j |} fdd|D }d|S )Nc                s   g | ]}  |qS r   )r   )r>   r   )r   r:   r   r    rJ   D  s    z.DocFormatter.format_inline.<locals>.<listcomp>rt   )ro   ra   rP   )r:   r   rx   tokensZwordsr   )r   r:   r    ru   B  s    zDocFormatter.format_inlinec             C   s   t |jtjrdS |jS d S )Nz...)r   typer	   Varargsargname)r:   r   rh   r   r   r    r   G  s    z"DocFormatter.format_parameter_namec             C   s   t d S )N)r   )r:   r   r   r   r    format_function_nameM  s    z!DocFormatter.format_function_nameFc             C   s   t d S )N)r   )r:   r   linkr   r   r    format_typeP  s    zDocFormatter.format_typec             C   s   t |tjr|jS t |tjr(| |S t |tjrT|jd k	rTd| |j|jf S t |tj	r|jd k	rd| |j|jf S t |tj
r|jd k	rd| |j|jf S t |tjr|jd k	rd| |j|jf S t|S d S )Nz%s:%sz%s::%sz%s->%s)r   r	   r   r   r   r   r   r   format_page_namer   r   r   r   )r:   r   r   r   r    r   S  s    
zDocFormatter.format_page_namec             K   s   |d kst |ds4dgtt|  }td|S t|tjrZ| j	|j
f|d |j S |j| jjkrt| ||S | ||S d S )Nr   )xrefr   r   .)r   listsortedrT   r
   build_xml_tagr   r	   ZMemberr   r   r   r   rn   format_internal_xrefformat_external_xref)r:   r   attrdictattrsr   r   r    r   c  s    zDocFormatter.format_xrefc             C   s*   dt |fgtt|  }td|S )Nr   r   )r   r   r   rT   r
   r   )r:   r   r   r   r   r   r    r   o  s    z!DocFormatter.format_internal_xrefc             C   sN   |j }dd|jt|jt|f fg}|tt| 7 }t	d|| 
|S )NZhrefz../%s-%s/%s.htmlr   )r   r   strversionr   r   r   rT   r
   r   r   )r:   r   r   nsr   r   r   r    r   s  s
    z!DocFormatter.format_external_xrefc             C   s   dS )NTr   )r:   r)   r   r   r    field_is_writablez  s    zDocFormatter.field_is_writablec             C   sl   g }|j r|s|d |jr6|s6| |r6|d t|tjrb|jrR|d |jrb|d d	|S )NZReadZWriteZ	ConstructzConstruct Onlyz / )
readableappendwritabler   r   r	   r   Z	constructconstruct_onlyrP   )r:   Z	property_r   flagsr   r   r    format_property_flags}  s    






z"DocFormatter.format_property_flagsc             C   sf   t |tjr|jddS |jr*t|jS t |tjr:dS t |tjrJdS t |tjrZdS t	dd S )N-rQ   r(   Zanonymous_unionzanonymous fieldzinvalid node)
r   r	   r   r   replacer   ZCallbackUnionr   	Exception)r:   r   r   r   r    r     s    
zDocFormatter.to_underscoresc             C   s   |d   |dd   S )Nr   r   )lower)r:   stringr   r   r    to_lower_camel_case  s    z DocFormatter.to_lower_camel_casec             C   s6   |g}x"|j r(| j|j }|| qW |  |S )N)parent_typern   lookup_typenoder   reverse)r:   r   Zparent_chainr   r   r    get_class_hierarchy  s    z DocFormatter.get_class_hierarchyc             C   sR   t |jdkrJt |jdkr>d|jd d d |jd  S |jd S ndS d S )Nr   r   z, r   z and zGObject.Object)rU   ZprerequisitesrP   )r:   r   r   r   r    format_prerequisites  s
    "z!DocFormatter.format_prerequisitesc             C   s   |j jd |j }g }xF|j  D ]8}t|tjs4q"x$|jD ]}|j|kr<|| P q<W q"W t	|dkrndS d|jf }t	|dkr||d j S |d
dd |d d	 D  d
 |d	 j S d S )Nr   r   Nonez%s is implemented by r   z, c             s   s   | ]}|j V  qd S )N)r   )r>   ir   r   r    r@     s    z<DocFormatter.format_known_implementations.<locals>.<genexpr>r   z and )r   r   valuesr   r	   r+   Z
interfacestarget_ginamer   rU   rP   )r:   r   Z	node_nameimplcZimplementedoutr   r   r    format_known_implementations  s    


z)DocFormatter.format_known_implementationsN)F)F)"rb   rc   rd   r;   rq   rs   ry   r}   r   r   r   r   r   r   r   r   r   r   r   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r    rm      s>   

rm   c               @   s:   e Zd ZdZdZddddZddd	Zd
d Zdd ZdS )DocFormatterCCztext/x-csrcTRUEFALSENULL)r   r   r   Fc             C   sR   t |tjr| |jd S |jd k	r,|jS |jr8|jS | j|}t	|dS d S )N*ctype)
r   r	   Arrayr   element_typer   target_fundamentalrn   r   r   )r:   r   r   r   r   r   r    r     s    
zDocFormatterC.format_typec             C   s   t |tjr|jS |jS d S )N)r   r	   r   r~   r   )r:   r   r   r   r    r     s    z"DocFormatterC.format_function_namec             C   s   |j S )N)all_parameters)r:   r   r   r   r    r     s    zDocFormatterC.get_in_parametersN)F)	rb   rc   rd   language	mime_typer   r   r   r   r   r   r   r    r     s   
r   c                   s   e Zd Z fddZ  ZS )DocFormatterIntrospectableBasec                sT   t |tjr|jd k	rdS t|dds*dS t |tjrD|jd k	rDdS tt| 	|S )NFintrospectableT)
r   r	   r.   Zis_gtype_struct_forr   r   Zshadowed_byrj   r   rs   )r:   r   )rk   r   r    rs     s    z1DocFormatterIntrospectableBase.should_render_node)rb   rc   rd   rs   rl   r   r   )rk   r    r     s   r   c                   sb   e Zd ZdZdZddddZ fddZd	d
 Zdd Zdd Z	dddZ
dd Zdd Z  ZS )DocFormatterPythonPythonztext/pythonTrueFalser   )r   r   r   c                s    t |ddrdS tt| |S )Nr0   F)r   rj   r   rs   )r:   r   )rk   r   r    rs     s    z%DocFormatterPython.should_render_nodec             C   s$   t |ddrdS t|tjr dS dS )Nr/   FT)r   r   r	   r   )r:   r   r   r   r    r/     s
    zDocFormatterPython.is_methodc             C   s4   |  |r||jkrdS t|jtjr*dS |jS d S )Nr:   z...)r/   Zinstance_parameterr   r   r	   r   r   )r:   r   rh   r   r   r    r     s
    z(DocFormatterPython.format_parameter_namec             C   s6   dddddddddddddddddd	d
}| ||S )NZunicoder   boolintfloatz
GLib.Paramobjectz[str]zGLib.Variant)utf8gunichargcharguchargbooleangintguintglonggulonggint64guint64gfloatgdoubleZ
gchararrayZGParamZPyObjectZGStrvGVariant)r{   )r:   r   fundamental_typesr   r   r    format_fundamental_type  s&    z*DocFormatterPython.format_fundamental_typeFc             C   sn   t |tjtjfr&d| |j d S t |tjrNd| |j| |jf S |j	d k	r^|j	S | 
|jS d S )N[]z{%s: %s})r   r	   Listr   r   r   Mapkey_type
value_typer   r   r   )r:   r   r   r   r   r    r   4  s    
zDocFormatterPython.format_typec             C   s*   |j d k	r d| |j |jf S |jS d S )Nz%s.%s)r   r   r   )r:   r   r   r   r    r   ?  s    
z'DocFormatterPython.format_function_namec             C   s   |j S )N)r   )r:   r   r   r   r    r   E  s    z$DocFormatterPython.get_in_parameters)F)rb   rc   rd   r   r   r   rs   r/   r   r   r   r   r   rl   r   r   )rk   r    r     s   		
r   c                   s   e Zd ZdZdZddddZdd Zd	d
 Z f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$d% Z  ZS )'DocFormatterGjsZGjsz
text/x-gjstrueZfalseZnull)r   r   r   c             C   s$   t |ddrdS t|tjr dS dS )Nr/   FT)r   r   r	   r   )r:   r   r   r   r    r/   S  s
    zDocFormatterGjs.is_methodc             C   s   d }d }t tdd |j}x<|D ]4}|d kr@t|jdkr@|}|d kr"|jdkr"|}q"W |d krf|}|d krt|dkr|d }||_||_d S )Nc             S   s   t | ddS )Nr   T)r   )r   r   r   r    <lambda>a      z<DocFormatterGjs.resolve_gboxed_constructor.<locals>.<lambda>r   new)r   filterconstructorsrU   
parametersr   gjs_default_constructorgjs_zero_args_constructor)r:   r   zero_args_constructordefault_constructorZintrospectable_constructorsr   r   r   r    resolve_gboxed_constructor\  s$    



z*DocFormatterGjs.resolve_gboxed_constructorc                sL  t |tjtjfr| | t |tjrf|jrft|jt|j  kr^t|j	  kr^dkrfn ndS t |tj
rvdS t |tjr|jd krdS t |jtjtjfrdS t |tjr|jd krdS t |tjr<d}|jr2| j|j}xF|r0|jjdkr|jdkrd}P |jd kr P | j|j}qW |r<dS tt| |S )Nr   FZGObjectZ	ParamSpecT)r   r	   r-   r,   r  	disguisedrU   methodsZstatic_methodsr   ZErrorQuarkFunctionr   r   r   r+   r   r   r   rn   r   r   rj   r   rs   )r:   r   Zis_gparam_subclassr   )rk   r   r    rs   s  s:    
4
z"DocFormatterGjs.should_render_nodec          !   C   sR   dddddddddd	d
dddddddddddddddddddddd }| ||S )NvoidZBooleanzNumber(gint8)zNumber(guint8)zNumber(gint16)zNumber(guint16)zNumber(gint32)zNumber(guint32)zNumber(gchar)zNumber(guchar)zNumber(gshort)zNumber(gint)zNumber(guint)zNumber(gfloat)zNumber(gdouble)StringzGObject.TypezGLib.VariantzNumber(gsize)zNumber(gssize)zNumber(gintptr)zNumber(guintptr)zNumber(glong)zNumber(gulong)zNumber(gint64)zNumber(guint64)zNumber(long double)zNumber(long long)zNumber(unsigned long long)) nonegpointerr   gint8guint8Zgint16Zguint16Zgint32Zguint32r   r   Zgshortr   r   r   r   r   r   filenameZGTyper   ZgsizeZgssizeZgintptrZguintptrr   r   r   r   zlong doublez	long longzunsigned long long)r{   )r:   r   r   r   r   r    r     sB    z'DocFormatterGjs.format_fundamental_typeFc             C   s  t |tjr|jjdkrdS t |tjtjfrDd| |j| d S t |tjrpd| |j|| |j	|f S |r~|jdkrdS |j
d k	r|j
}|dkrdS |d	krd
S |dkrdS | r| jjj}||d rd||f S | j|}| r| |S |S | |jS d S )N)r  r	  Z	ByteArrayzArray()z{%s: %s}r  r  )zGLib.ByteArrayz
GLib.ByteszGObject.ValueZAnyzGObject.Closurer   r   z<link xref="%s">%s</link>)r   r	   r   r   r   r   r   r   r   r   r   rn   r   r   rO   r   r   r   )r:   r   r   ZginameZnsnameresolvedr   r   r    r     s6    

zDocFormatterGjs.format_typec             C   sR   |j }|jr|j}|jr,d| |j|f S |jd k	rJd| |j|f S |S d S )Nz%s.prototype.%sz%s.%s)r   r   r/   r   r   )r:   r   r   r   r   r    r     s    
z$DocFormatterGjs.format_function_namec             C   s<   t |tjtjfr,d| |j| |f S t| |S d S )Nz%s.%s)r   r	   r   r   r   r   r   r   )r:   r   r   r   r    r     s    z DocFormatterGjs.format_page_namec             C   s   t |jdkp|jjjdkS )Nr   r  )rU   r   retvalr   r   )r:   r   r   r   r    has_any_parameters  s    z"DocFormatterGjs.has_any_parametersc             C   s   t  }x|jD ]}|jtjkr(|| |jd k	rD|||j |jd k	r`|||j t	|j
tjr|j
jd k	r|||j
j qW g }x |jD ]}||kr|| qW |S )N)setr   	directionr	   PARAM_DIRECTION_OUTaddclosure_namer   destroy_namer   r   r   length_param_namer   )r:   r   skipparamparamsr   r   r    r     s    


z!DocFormatterGjs.get_in_parametersc             C   s   t  }x|jD ]}|jtjkr(|| |jd k	rD|||j |jd k	r`|||j t	|j
tjr|j
jd k	r|||j
j qW g }|jj
jdkrd}|jj
jdkrd}t||jj
tj}|jj|_|| x |jD ]}||kr|| qW t|dkrd|d _|S )Nr  Zreturn_valuer   okr   ZReturnsr   )r  r   r  r	   ZPARAM_DIRECTION_INr  r  r   r  r   r   r   r  r  r   Z	Parameterr  rv   r   rU   r   )r:   r   r  r  r  r   Z	ret_paramr   r   r    get_out_parameters  s2    





z"DocFormatterGjs.get_out_parametersc                s"     |}d fdd|D S )Nz, c             3   s&   | ]}d |j  |jdf V  qdS )z%s: %sTN)r   r   r   )r>   p)r:   r   r    r@   #  s   z7DocFormatterGjs.format_in_parameters.<locals>.<genexpr>)r   rP   )r:   r   Z	in_paramsr   )r:   r    format_in_parameters!  s    
z$DocFormatterGjs.format_in_parametersc                s\     |}t|dkrdS t|dkr8 |d jdS dd fdd|D  d	 S d S )
Nr   r  r   Tr   z, c             3   s&   | ]}d |j  |jdf V  qdS )z%s: %sTN)r   r   r   )r>   r  )r:   r   r    r@   .  s   z8DocFormatterGjs.format_out_parameters.<locals>.<genexpr>r   )r  rU   r   r   rP   )r:   r   Z
out_paramsr   )r:   r    format_out_parameters&  s    
z%DocFormatterGjs.format_out_parametersc             C   s   t |tjr|jd krdS |jr$dS t |jtjr6dS |jjdkrFdS | j	|j}|rt |tj
r~|jjd dkr~| |S t |tjtjfrdS dS dS d S )NF)Nr  r  r   r
  Zva_listTr   r   )r   r	   r   r   rr   r   r   r   rn   r   r-   r   _struct_is_simpler1   r2   )r:   r   r  r   r   r    r   1  s$    

z!DocFormatterGjs.field_is_writablec             C   s:   |j st|jdkrdS x|jD ]}| |s dS q W dS )Nr   FT)r  rU   fieldsr   )r:   r   fr   r   r    r  G  s    
z!DocFormatterGjs._struct_is_simplec       	         s   |j jdkr|jdkrdS |j}|j}|d k	}|sHt|tjrH |}|sT|d krt|tjrt	 j
|j}d}x*|D ]"}|d|j j|j|j|jf 7 }qxW |rd| d }|S dS n" |}d fd	d
|D S d S )NZGLibZVariantzsignature: String, value: Anyrt   z+    <link xref='%s.%s-%s'>%s</link>: value
z{
}z, c             3   s$   | ]}d |j  |jf V  qdS )z%s: %sN)r   r   r   )r>   r  )r:   r   r    r@   m  s   z<DocFormatterGjs.format_gboxed_constructor.<locals>.<genexpr>)r   r   r   r   r   r	   r.   r  r-   r   r   r  r   rP   )	r:   r   r   r   Zcan_allocater  r   r   Zconstruct_paramsr   )r:   r    format_gboxed_constructorP  s*    


z)DocFormatterGjs.format_gboxed_constructor)F)rb   rc   rd   r   r   r   r/   r  rs   r   r   r   r   r  r   r  r  r  r   r  r"  rl   r   r   )rk   r    r   I  s(   	"&
	r   )r   ZpythonZgjsc               @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )	DocWriterc             C   s^   || _ yt|  }W n" tk
r8   td|f Y nX || j | _| jj| _|  | _	d S )NzUnsupported language: %s)
rn   	LANGUAGESr   r   
SystemExit
_formatterr   	_language_get_template_lookup_lookup)r:   rp   r   Zformatter_classr   r   r    r;   x  s    
zDocWriter.__init__c             C   sR   dt jkr$t jd }t j|d}nt jt}t j|d}t|gt ddS )NZ UNINSTALLED_INTROSPECTION_SRCDIRZ	giscannerZdoctemplateszutf-8)ZdirectoriesZmodule_directoryZoutput_encoding)	osenvironpathrP   dirname__file__r   tempfileZmkdtemp)r:   Z
top_srcdirZsrcdirZtemplate_dirr   r   r    r(    s    

zDocWriter._get_template_lookupc                sR   yt   W n tk
r"   Y nX  jjg  jj fdd d S )Nc                s     | |S )N)
_walk_node)r   chain)outputr:   r   r    r     r   z!DocWriter.write.<locals>.<lambda>)r*  makedirsOSErrorr0  rn   r   walk)r:   r2  r   )r2  r:   r    write  s    zDocWriter.writec             C   s~   t |tjr|jd k	rdS | j|rz| ||| t |tjtjfrv|	| x|j
D ]}| ||| qXW |  dS dS )NFT)r   r	   r   Zmoved_tor&  rs   _render_noder-   r+   r   r  r0  rS   )r:   r2  r   r1  r   r   r   r    r0    s    
zDocWriter._walk_nodec          	   C   s   | j j}t||_t|}d| j|f }t|}| j|}|j	||||| j
td}	tjtj||d }
t|
d}||	 W d Q R X d S )Nz
%s/%s.tmpl)r   r   page_id	page_kindZ	formatterr	   z.pagewb)rn   r   r   r   r4   r'  r   r)  Zget_templateZrenderr&  r	   r*  r,  rP   abspathopenr6  )r:   r   r1  r2  r   r9  Ztemplate_namer8  templaterw   Zoutput_file_namefpr   r   r    r7    s     

zDocWriter._render_nodeN)rb   rc   rd   r;   r(  r6  r0  r7  r   r   r   r    r#  w  s
   
r#  )F)Z
__future__r   r   r   r   r*  rK   r/  Zxml.saxr   Zmako.lookupr   rt   r	   r
   Zutilsr   r   r4   r   r5   re   rm   r   r   r   r   r$  r#  r   r   r   r    <module>   s6   
"@  N  *