a
    Lg                     @  s$  d dl mZ d dlmZmZ d dlmZ d dlZd dlZd dl	m
Z
mZmZmZmZmZmZ ddlmZmZmZmZmZmZ ddlmZmZmZ dd	lmZ dd
lmZm Z m!Z! ddl"m#Z# G dd dZ$G dd dZ%G dd de%Z&G dd dZ'G dd dZ(G dd de%Z)G dd de&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%Z0G d&d' d'e0Z1G d(d) d)e0Z2G d*d+ d+Z3G d,d- d-e3Z4G d.d/ d/e3Z5G d0d1 d1e3Z6G d2d3 d3e6Z7G d4d5 d5e&Z8G d6d7 d7e&Z9G d8d9 d9Z:dS ):    )annotations)ABCabstractmethod)OrderedDictN)AnyCallableDictListOptionalUnioncast   )POINTER_SUFFIXc_namecgen_ifconddocgen_ifcond	gen_endifgen_if)	QAPIErrorQAPISemErrorQAPISourceError)check_exprs)QAPIDocQAPIExpressionQAPISchemaParser)QAPISourceInfoc                   @  sd   e Zd ZddddddZddd	d
ZddddZddddZddddZddddZdS )QAPISchemaIfCondNz'Optional[Union[str, Dict[str, object]]]None)ifcondreturnc                 C  s
   || _ d S N)r   )selfr    r"   >/home2/Puru_Virtio_Blk/virtio-demo/qemu/scripts/qapi/schema.py__init__2   s    zQAPISchemaIfCond.__init__strr   c                 C  s
   t | jS r    )r   r   r!   r"   r"   r#   _cgen8   s    zQAPISchemaIfCond._cgenc                 C  s   t |  S r    )r   r(   r'   r"   r"   r#   r   ;   s    zQAPISchemaIfCond.gen_ifc                 C  s   t |  S r    )r   r(   r'   r"   r"   r#   r   >   s    zQAPISchemaIfCond.gen_endifc                 C  s
   t | jS r    )r   r   r'   r"   r"   r#   docgenA   s    zQAPISchemaIfCond.docgenboolc                 C  s
   t | jS r    )r*   r   r'   r"   r"   r#   
is_presentD   s    zQAPISchemaIfCond.is_present)N)	__name__
__module____qualname__r$   r(   r   r   r)   r+   r"   r"   r"   r#   r   1   s    r   c                   @  s   e Zd ZdZddddZdddd	Zd
ddddZddddddZd
dddddZd
ddddZ	dddddZ
dS )QAPISchemaEntityz
    A schema entity.

    This is either a directive, such as include, or a definition.
    The latter uses sub-class `QAPISchemaDefinition`.
    Optional[QAPISourceInfo]infoc                 C  s   d | _ || _d| _d S NF)_moduler2   _checked)r!   r2   r"   r"   r#   r$   O   s    zQAPISchemaEntity.__init__r%   r&   c                 C  s   dt | jt| f S )Nz<%s at 0x%x>)typer,   idr'   r"   r"   r#   __repr__Y   s    zQAPISchemaEntity.__repr__
QAPISchemar   schemar   c                 C  s
   d| _ d S NTr5   r!   r;   r"   r"   r#   check\   s    zQAPISchemaEntity.checkNOptional[QAPIDoc]docr   c                 C  s   d S r    r"   r!   rB   r"   r"   r#   connect_doc`   s    zQAPISchemaEntity.connect_doc)r;   r2   r   c                 C  s6   | j s
J |r|jntj}||| _| j|  d S r    )r5   fnameQAPISchemaModuleBUILTIN_MODULE_NAMEmodule_by_fnamer4   
add_entity)r!   r;   r2   rE   r"   r"   r#   _set_modulec   s    
zQAPISchemaEntity._set_modulec                 C  s   |  || j d S r    )rJ   r2   r>   r"   r"   r#   
set_modulek   s    zQAPISchemaEntity.set_moduleQAPISchemaVisitorvisitorr   c                 C  s   | j s
J d S r    r=   r!   rN   r"   r"   r#   visitn   s    zQAPISchemaEntity.visit)N)r,   r-   r.   __doc__r$   r8   r?   rD   rJ   rK   rP   r"   r"   r"   r#   r/   H   s   
r/   c                      s   e Zd ZU ded< d dddddd fd	d
ZddddZddddZddd fddZd!ddd fddZe	ddddZ
ddddZddddZ  ZS )"QAPISchemaDefinitionr%   metaNr0   r@   Optional[QAPISchemaIfCond]!Optional[List[QAPISchemaFeature]])namer2   rB   r   featuresc                   sJ   t  | |pg D ]}|| q|| _|| _|p8t | _|pBg | _d S r    )superr$   set_defined_inrV   rB   r   _ifcondrW   )r!   rV   r2   rB   r   rW   f	__class__r"   r#   r$   v   s    zQAPISchemaDefinition.__init__r&   c                 C  s   dt | j| jt| f S )Nz<%s:%s at 0x%x>)r6   r,   rV   r7   r'   r"   r"   r#   r8      s    zQAPISchemaDefinition.__repr__c                 C  s
   t | jS r    r   rV   r'   r"   r"   r#   r      s    zQAPISchemaDefinition.c_namer9   r   r:   c                   s8   | j r
J t | i }| jD ]}|| j| q d S r    )r5   rX   r?   rW   check_clashr2   r!   r;   seenr[   r\   r"   r#   r?      s
    

zQAPISchemaDefinition.checkrA   c                   s4   t  | |p| j}|r0| jD ]}|| q d S r    )rX   rD   rB   rW   connect_featurer!   rB   r[   r\   r"   r#   rD      s
    

z QAPISchemaDefinition.connect_docr   c                 C  s   | j s
J | jS r    )r5   rZ   r'   r"   r"   r#   r      s    
zQAPISchemaDefinition.ifcondr*   c                 C  s   | j  S r    r1   r'   r"   r"   r#   is_implicit   s    z QAPISchemaDefinition.is_implicitc                 C  s   d| j | jf S )N%s '%s'rS   rV   r'   r"   r"   r#   describe   s    zQAPISchemaDefinition.describe)NN)N)r,   r-   r.   __annotations__r$   r8   r   r?   rD   propertyr   rd   rg   __classcell__r"   r"   r\   r#   rR   s   s   
  rR   c                   @  s.  e Zd ZdddddZddddZd	dd
ddZdddddZd	dddddZd	dd	ddddZd	dddddddddZ	d	ddd dd!d"d#Z
d	dddd$d%d&dd'd(d)Zd	dddd%d&dd*d+d,Zd	dddd-dd.d/d0Zd	dddd$d1dddddddd2d3d4Zd	dddd$ddd5d6d7Zd8S )9rL   r9   r   r:   c                 C  s   d S r    r"   r>   r"   r"   r#   visit_begin   s    zQAPISchemaVisitor.visit_beginr&   c                 C  s   d S r    r"   r'   r"   r"   r#   	visit_end   s    zQAPISchemaVisitor.visit_endr%   rV   r   c                 C  s   d S r    r"   r!   rV   r"   r"   r#   visit_module   s    zQAPISchemaVisitor.visit_moduler/   r*   )entityr   c                 C  s   dS r<   r"   )r!   rp   r"   r"   r#   visit_needed   s    zQAPISchemaVisitor.visit_neededr0   )rV   r2   r   c                 C  s   d S r    r"   )r!   rV   r2   r"   r"   r#   visit_include   s    zQAPISchemaVisitor.visit_include)rV   r2   	json_typer   c                 C  s   d S r    r"   )r!   rV   r2   rs   r"   r"   r#   visit_builtin_type   s    z$QAPISchemaVisitor.visit_builtin_typer   List[QAPISchemaFeature]List[QAPISchemaEnumMember]Optional[str])rV   r2   r   rW   membersprefixr   c                 C  s   d S r    r"   )r!   rV   r2   r   rW   rx   ry   r"   r"   r#   visit_enum_type   s    	z!QAPISchemaVisitor.visit_enum_typeQAPISchemaType)rV   r2   r   element_typer   c                 C  s   d S r    r"   )r!   rV   r2   r   r|   r"   r"   r#   visit_array_type   s    z"QAPISchemaVisitor.visit_array_typezOptional[QAPISchemaObjectType] List[QAPISchemaObjectTypeMember]Optional[QAPISchemaBranches])rV   r2   r   rW   baserx   branchesr   c                 C  s   d S r    r"   )r!   rV   r2   r   rW   r   rx   r   r"   r"   r#   visit_object_type   s    
z#QAPISchemaVisitor.visit_object_type)rV   r2   r   rW   rx   r   r   c                 C  s   d S r    r"   )r!   rV   r2   r   rW   rx   r   r"   r"   r#   visit_object_type_flat   s    	z(QAPISchemaVisitor.visit_object_type_flatQAPISchemaAlternatives)rV   r2   r   rW   alternativesr   c                 C  s   d S r    r"   )r!   rV   r2   r   rW   r   r"   r"   r#   visit_alternate_type   s    z&QAPISchemaVisitor.visit_alternate_typeOptional[QAPISchemaType])rV   r2   r   rW   arg_typeret_typegensuccess_responseboxed	allow_ooballow_preconfig	coroutiner   c                 C  s   d S r    r"   )r!   rV   r2   r   rW   r   r   r   r   r   r   r   r   r"   r"   r#   visit_command   s    zQAPISchemaVisitor.visit_command)rV   r2   r   rW   r   r   r   c                 C  s   d S r    r"   )r!   rV   r2   r   rW   r   r   r"   r"   r#   visit_event  s    	zQAPISchemaVisitor.visit_eventN)r,   r-   r.   rk   rl   ro   rq   rr   rt   rz   r}   r   r   r   r   r   r"   r"   r"   r#   rL      s   	
&rL   c                   @  sz   e Zd ZdZddddZeddddd	Zedddd
dZedddddZ	dddddZ
dddddZdS )rF   z	./builtinr%   rV   c                 C  s   || _ g | _d S r    )rV   _entity_listrn   r"   r"   r#   r$     s    zQAPISchemaModule.__init__r*   rm   c                 C  s
   |  dS )zq
        System modules are internally defined modules.

        Their names start with the "./" prefix.
        z./)
startswithr   r"   r"   r#   is_system_module  s    z!QAPISchemaModule.is_system_modulec                 C  s   |  | S )z
        User modules are those defined by the user in qapi JSON files.

        They do not start with the "./" prefix.
        )r   clsrV   r"   r"   r#   is_user_module!  s    zQAPISchemaModule.is_user_modulec                 C  s
   || j kS )zz
        The built-in module is a single System module for the built-in types.

        It is always "./builtin".
        )rG   r   r"   r"   r#   is_builtin_module*  s    z"QAPISchemaModule.is_builtin_moduler/   r   entr   c                 C  s   | j | d S r    r   appendr!   r   r"   r"   r#   rI   3  s    zQAPISchemaModule.add_entityrL   rM   c                 C  s0   | | j | jD ]}||r|| qd S r    )ro   rV   r   rq   rP   )r!   rN   rp   r"   r"   r#   rP   6  s    

zQAPISchemaModule.visitN)r,   r-   r.   rG   r$   staticmethodr   classmethodr   r   rI   rP   r"   r"   r"   r#   rF     s   rF   c                      s8   e Zd Zddd fddZddd fd	d
Z  ZS )QAPISchemaIncluderF   r   )
sub_moduler2   c                   s   t  | || _d S r    )rX   r$   _sub_module)r!   r   r2   r\   r"   r#   r$   >  s    zQAPISchemaInclude.__init__rL   r   rM   c                   s"   t  | || jj| j d S r    )rX   rP   rr   r   rV   r2   rO   r\   r"   r#   rP   B  s    zQAPISchemaInclude.visit)r,   r-   r.   r$   rP   rj   r"   r"   r\   r#   r   =  s   r   c                      s   e Zd ZeddddZddddZddddZeddd	d
ZddddZddddZ	ddddZ
ddd fddZddddZ  ZS )r{   r%   r&   c                 C  s   d S r    r"   r'   r"   r"   r#   c_typeJ  s    zQAPISchemaType.c_typec                 C  s   |   S r    r   r'   r"   r"   r#   c_param_typeO  s    zQAPISchemaType.c_param_typec                 C  s   |   S r    r   r'   r"   r"   r#   c_unboxed_typeS  s    zQAPISchemaType.c_unboxed_typec                 C  s   d S r    r"   r'   r"   r"   r#   rs   V  s    zQAPISchemaType.json_typerw   c                 C  s"   dddddddd}| |  S )NZQTYPE_QNULLQTYPE_QSTRING
QTYPE_QNUMQTYPE_QBOOLZQTYPE_QLISTZQTYPE_QDICT)nullstringnumberintbooleanarrayobject)getrs   )r!   Z
json2qtyper"   r"   r#   alternate_qtypeZ  s    	zQAPISchemaType.alternate_qtypec                 C  s   |   rd S | jS r    )rd   rV   r'   r"   r"   r#   doc_typef  s    zQAPISchemaType.doc_typer*   c                 C  s   |   t S r    )r   endswithr   r'   r"   r"   r#   need_has_if_optionalk  s    z#QAPISchemaType.need_has_if_optionalr9   r   r:   c                   s:   t  | | jD ]"}| rt| jd|j dqd S )Nz	feature 'z' is not supported for types)rX   r?   rW   
is_specialr   r2   rV   )r!   r;   featr\   r"   r#   r?   p  s    
zQAPISchemaType.checkc                 C  s   d| j | jf S )Nz%s type '%s'rf   r'   r"   r"   r#   rg   x  s    zQAPISchemaType.describe)r,   r-   r.   r   r   r   r   rs   r   r   r   r?   rg   rj   r"   r"   r\   r#   r{   G  s   r{   c                      s   e Zd ZdZdddd fddZddddZddd	d
ZddddZddddZddddZ	ddd fddZ
  ZS )QAPISchemaBuiltinTypezbuilt-inr%   )rV   rs   r   c                   s,   t  |d d  |dv sJ || _|| _d S )N)r   r   r   r   r   value)rX   r$   _json_type_name_c_type_namer!   rV   rs   r   r\   r"   r#   r$     s    zQAPISchemaBuiltinType.__init__r&   c                 C  s   | j S r    r   r'   r"   r"   r#   r     s    zQAPISchemaBuiltinType.c_namec                 C  s   | j S r    )r   r'   r"   r"   r#   r     s    zQAPISchemaBuiltinType.c_typec                 C  s   | j dkrd| j S | jS )Nr%   zconst )rV   r   r'   r"   r"   r#   r     s    

z"QAPISchemaBuiltinType.c_param_typec                 C  s   | j S r    )r   r'   r"   r"   r#   rs     s    zQAPISchemaBuiltinType.json_typec                 C  s   |   S r    )rs   r'   r"   r"   r#   r     s    zQAPISchemaBuiltinType.doc_typerL   r   rM   c                   s&   t  | || j| j|   d S r    )rX   rP   rt   rV   r2   rs   rO   r\   r"   r#   rP     s    zQAPISchemaBuiltinType.visit)r,   r-   r.   rS   r$   r   r   r   rs   r   rP   rj   r"   r"   r\   r#   r   |  s   r   c                      s   e Zd ZdZdddddddd	 fd
dZddd fddZd$ddd fddZddddZddddZddddZ	ddddZ
d dd! fd"d#Z  ZS )%QAPISchemaEnumTypeenumr%   r0   r@   rT   rU   rv   rw   )rV   r2   rB   r   rW   rx   ry   c           	        s8   t  ||||| |D ]}|| q|| _|| _d S r    )rX   r$   rY   rx   ry   )	r!   rV   r2   rB   r   rW   rx   ry   mr\   r"   r#   r$     s
    
zQAPISchemaEnumType.__init__r9   r   r:   c                   s.   t  | i }| jD ]}|| j| qd S r    )rX   r?   rx   r_   r2   )r!   r;   ra   r   r\   r"   r#   r?     s    
zQAPISchemaEnumType.checkNrA   c                   s0   t  | |p| j}| jD ]}|| qd S r    )rX   rD   rB   rx   r!   rB   r   r\   r"   r#   rD     s    

zQAPISchemaEnumType.connect_docr*   r&   c                 C  s
   | j dkS )NQTyper   r'   r"   r"   r#   rd     s    zQAPISchemaEnumType.is_implicitc                 C  s
   t | jS r    r^   r'   r"   r"   r#   r     s    zQAPISchemaEnumType.c_typez	List[str]c                 C  s   dd | j D S )Nc                 S  s   g | ]
}|j qS r"   r   .0r   r"   r"   r#   
<listcomp>      z3QAPISchemaEnumType.member_names.<locals>.<listcomp>)rx   r'   r"   r"   r#   member_names  s    zQAPISchemaEnumType.member_namesc                 C  s   dS )Nr   r"   r'   r"   r"   r#   rs     s    zQAPISchemaEnumType.json_typerL   rM   c                   s0   t  | || j| j| j| j| j| j d S r    )	rX   rP   rz   rV   r2   r   rW   rx   ry   rO   r\   r"   r#   rP     s
    zQAPISchemaEnumType.visit)N)r,   r-   r.   rS   r$   r?   rD   rd   r   r   rs   rP   rj   r"   r"   r\   r#   r     s   r   c                      s   e Zd ZdZdddd fddZddd	d
Zddd fddZdddddZeddddZ	ddddZ
ddddZddddZddddZddd fd d!Zddd"d#Z  ZS )$QAPISchemaArrayTyper   r%   r0   )rV   r2   r|   c                   s   t  ||d  || _|  d S r    )rX   r$   _element_type_name)r!   rV   r2   r|   r\   r"   r#   r$     s    zQAPISchemaArrayType.__init__r*   r&   c                 C  s   dS r<   r"   r'   r"   r"   r#   r     s    z(QAPISchemaArrayType.need_has_if_optionalr9   r   r:   c                   sB   t  | || j| j| jr&| jjnd | _t| jtr>J d S r    )	rX   r?   resolve_typer   r2   Z	defn_metar|   
isinstancer   r>   r\   r"   r#   r?     s    zQAPISchemaArrayType.checkc                 C  s   |  || jj d S r    )rJ   r|   r2   r>   r"   r"   r#   rK     s    zQAPISchemaArrayType.set_moduler   c                 C  s   | j s
J | jjS r    )r5   r|   r   r'   r"   r"   r#   r     s    
zQAPISchemaArrayType.ifcondc                 C  s   dS r<   r"   r'   r"   r"   r#   rd     s    zQAPISchemaArrayType.is_implicitc                 C  s   t | jt S r    r   rV   r   r'   r"   r"   r#   r     s    zQAPISchemaArrayType.c_typec                 C  s   dS )Nr   r"   r'   r"   r"   r#   rs     s    zQAPISchemaArrayType.json_typerw   c                 C  s   | j  }|sd S d| S )Nz	array of )r|   r   )r!   Zelt_doc_typer"   r"   r#   r     s    
zQAPISchemaArrayType.doc_typerL   rM   c                   s(   t  | || j| j| j| j d S r    )rX   rP   r}   rV   r2   r   r|   rO   r\   r"   r#   rP     s    zQAPISchemaArrayType.visitc                 C  s   d| j | jf S )Nz%s type ['%s'])rS   r   r'   r"   r"   r#   rg     s    zQAPISchemaArrayType.describe)r,   r-   r.   rS   r$   r   r?   rK   ri   r   rd   r   rs   r   rP   rg   rj   r"   r"   r\   r#   r     s   r   c                	      s   e Zd Zddddddddd	 fd
dZddd fddZddddddZd-ddd fddZddddZddddZdddd Z	dd fd!d"Z
ddd#d$Zddd%d&Zddd'd(Zd)dd* fd+d,Z  ZS ).QAPISchemaObjectTyper%   r0   r@   rT   rU   rw   r~   r   )rV   r2   rB   r   rW   r   local_membersr   c	           
        sn   t  ||||| |rdnd| _|D ]}	|	| q&|d urH|| || _d | _|| _|| _|  d| _d S )NunionstructF)	rX   r$   rS   rY   
_base_namer   r   r   _check_complete)
r!   rV   r2   rB   r   rW   r   r   r   r   r\   r"   r#   r$     s    
zQAPISchemaObjectType.__init__r9   r   r:   c                   s  | j r
d S | jr"t| jd| j t | | jr:| j r>J t }| jr|	| j| jd| _
t| j
trr| j
jrt| jd| j
  | j
| | j
| j| | jD ]}|| || j| qttt t| }| jr| j|| | j| j| || _d| _ d S )Nzobject %s contains itself'base'z''base' requires a struct type, %s isn'tT)r   r5   r   r2   rV   rX   r?   r   r   r   r   r   r   r   rg   r_   r   r   r	   QAPISchemaObjectTypeMemberlistvaluesrx   )r!   r;   ra   r   rx   r\   r"   r#   r?      sB    

zQAPISchemaObjectType.checkDict[str, QAPISchemaMember]r2   ra   r   c                 C  s:   | j s
J | jD ]}||| q| jr6| j|| d S r    )r5   rx   r_   r   )r!   r2   ra   r   r"   r"   r#   r_   N  s
    

z QAPISchemaObjectType.check_clashNrA   c                   sL   t  | |p| j}| jr2| j r2| j| | jD ]}|| q8d S r    )rX   rD   rB   r   rd   r   r   r\   r"   r#   rD   Y  s    

z QAPISchemaObjectType.connect_docr*   r&   c                 C  s   | j dS )Nq_)rV   r   r'   r"   r"   r#   rd   a  s    z QAPISchemaObjectType.is_implicitc                 C  s   | j  o| j S r    )rx   r   r'   r"   r"   r#   is_emptyf  s    zQAPISchemaObjectType.is_emptyc                 C  s   t dd | jD S )Nc                 s  s   | ]}|j  V  qd S r    )r   r+   r   r"   r"   r#   	<genexpr>j  r   z?QAPISchemaObjectType.has_conditional_members.<locals>.<genexpr>)anyrx   r'   r"   r"   r#   has_conditional_membersi  s    z,QAPISchemaObjectType.has_conditional_membersc                   s   | j dksJ t  S )Nq_empty)rV   rX   r   r'   r\   r"   r#   r   l  s    zQAPISchemaObjectType.c_namec                 C  s   |   rJ t| jt S r    )rd   r   rV   r   r'   r"   r"   r#   r   p  s    zQAPISchemaObjectType.c_typec                 C  s
   t | jS r    r^   r'   r"   r"   r#   r   t  s    z#QAPISchemaObjectType.c_unboxed_typec                 C  s   dS )Nr   r"   r'   r"   r"   r#   rs   w  s    zQAPISchemaObjectType.json_typerL   rM   c              	     sT   t  | || j| j| j| j| j| j| j	 |
| j| j| j| j| j| j	 d S r    )rX   rP   r   rV   r2   r   rW   r   r   r   r   rx   rO   r\   r"   r#   rP   z  s    zQAPISchemaObjectType.visit)N)r,   r-   r.   r$   r?   r_   rD   rd   r   r   r   r   r   rs   rP   rj   r"   r"   r\   r#   r     s    .r   c                      s   e Zd ZdZddddddd fd	d
Zddd fddZdddd fddZddddZddddZddd fddZ	  Z
S )QAPISchemaAlternateType	alternater%   r   r@   rT   ru   r   )rV   r2   rB   r   rW   r   c                   s@   t  ||||| |jsJ || |j| j || _d S r    )rX   r$   
tag_memberrY   rV   r   )r!   rV   r2   rB   r   rW   r   r\   r"   r#   r$     s
    	

z QAPISchemaAlternateType.__init__r9   r   r:   c           	        s,  t  | | jj| | j|i  i }i }| jjD ]}|| j| |j }|szt	| jd|
| j|j
 f t|g}|dkrt|jtr|jjD ]0}|jdv r|d td|jr|d qn|d |d |D ]8}||v rt	| jd|
| j|| f |j||< qq8d S )N%s cannot use %sr   )ZonZoffr   z[-+0-9.]r   z#%s can't be distinguished from '%s')rX   r?   r   r   variantsr_   r2   r6   r   r   rg   setr   r   rx   rV   addrematch)	r!   r;   ra   Z
types_seenvZqtypeZconflictingr   Zqtr\   r"   r#   r?     sD    






zQAPISchemaAlternateType.checkNrA   c                   s2   t  | |p| j}| jjD ]}|| qd S r    )rX   rD   rB   r   r   )r!   rB   r   r\   r"   r#   rD     s    
z#QAPISchemaAlternateType.connect_docr&   c                 C  s   t | jt S r    r   r'   r"   r"   r#   r     s    zQAPISchemaAlternateType.c_typec                 C  s   dS )Nr   r"   r'   r"   r"   r#   rs     s    z!QAPISchemaAlternateType.json_typerL   rM   c                   s,   t  | || j| j| j| j| j d S r    )rX   rP   r   rV   r2   r   rW   r   rO   r\   r"   r#   rP     s
    zQAPISchemaAlternateType.visit)N)r,   r-   r.   rS   r$   r?   rD   r   rs   rP   rj   r"   r"   r\   r#   r     s   &r   c                   @  s>   e Zd ZdddddZdddd	d
ZddddddZdS )QAPISchemaVariantsr   List[QAPISchemaVariant]r2   r   c                 C  s   || _ |  || _d S r    r   )r!   r2   r   r"   r"   r#   r$     s    zQAPISchemaVariants.__init__r%   r   rm   c                 C  s   | j D ]}|| qd S r    )r   rY   )r!   rV   r   r"   r"   r#   rY     s    
z!QAPISchemaVariants.set_defined_inr9   r   r;   ra   r   c                 C  s   | j D ]}|| qd S r    )r   r?   )r!   r;   ra   r   r"   r"   r#   r?     s    
zQAPISchemaVariants.checkN)r,   r-   r.   r$   rY   r?   r"   r"   r"   r#   r     s   	r   c                      sJ   e Zd Zdddd fddZddd	d
ddZddd	dddZ  ZS )QAPISchemaBranchesr   r   r%   )r2   r   tag_namec                   s   t  || || _d S r    )rX   r$   	_tag_name)r!   r2   r   r   r\   r"   r#   r$     s    zQAPISchemaBranches.__init__r9   r   r   r   c           	      C  s  | t| j}|d u s&t|ts&J d}|r:| j|jkrPt| jd| j|f || _|j	s`J |
|j	}|stJ | sd|j	 }t|jtst| jd| j|f |jrt| jd| j|f |j rt| jd| j|f |j	sJ dd | jD }|jjD ]>}|j|vrt|j| jd	|j}||j	 | j| q| jsZt| jd
| jD ]}|| |r`|j|j vrt| jd|j|j f t|jtst| jd|| j|j f |j| q`d S )Nr   z(discriminator '%s' is not a member of %szbase type '%s'z4discriminator member '%s' of %s must be of enum typez4discriminator member '%s' of %s must not be optionalz7discriminator member '%s' of %s must not be conditionalc                 S  s   h | ]
}|j qS r"   r   r   r   r"   r"   r#   	<setcomp>  r   z+QAPISchemaBranches.check.<locals>.<setcomp>r   zunion has no branchesz branch '%s' is not a value of %sr   )r   r   r   r   r   rV   r   r2   r   
defined_inlookup_typerd   r6   r   optionalr   r+   r   rx   QAPISchemaVariantrY   r   r?   r   rg   r   )	r!   r;   ra   r   r   Z	base_typeZcasesr   r   r"   r"   r#   r?     s    






zQAPISchemaBranches.checkr0   r   c                 C  s2   | j D ]&}t|jtsJ |j|t| qd S r    )r   r   r6   r   r_   dict)r!   r2   ra   r   r"   r"   r#   r_   /  s    
zQAPISchemaBranches.check_clash)r,   r-   r.   r$   r?   r_   rj   r"   r"   r\   r#   r     s   Br   c                      s<   e Zd Zdddd fddZddd	d
 fddZ  ZS )r   r   r   r   )r2   r   r   c                   s   t  || || _d S r    )rX   r$   r   )r!   r2   r   r   r\   r"   r#   r$   >  s    zQAPISchemaAlternatives.__init__r9   r   r   r   c                   s@   t  || t| jjts J | jjr,J | jj r<J d S r    )	rX   r?   r   r   r6   r   r   r   r+   )r!   r;   ra   r\   r"   r#   r?   E  s    zQAPISchemaAlternatives.check)r,   r-   r.   r$   r?   rj   r"   r"   r\   r#   r   =  s   r   c                   @  sj   e Zd ZdZdZddddddd	Zdd
dddZddd
dddZdd
dddZdddddZ	dS )QAPISchemaMemberz6 Represents object members, enum members and features memberNr%   r0   rT   )rV   r2   r   c                 C  s"   || _ || _|pt | _d | _d S r    )rV   r2   r   r   r   )r!   rV   r2   r   r"   r"   r#   r$   R  s    zQAPISchemaMember.__init__r   rm   c                 C  s   | j r
J || _ d S r    )r   rn   r"   r"   r#   rY   ]  s    
zQAPISchemaMember.set_defined_inr   r   c                 C  s@   t | j}||v r4t|d| ||| |f | ||< d S )Nz%s collides with %s)r   rV   r   rg   )r!   r2   ra   Zcnamer"   r"   r#   r_   a  s    
zQAPISchemaMember.check_clashr@   rA   c                 C  s   |r| |  d S r    )Zconnect_memberrC   r"   r"   r#   rD   n  s    zQAPISchemaMember.connect_doc)r2   r   c                 C  s   | j }d}| j}|sJ |dr|dd  }|drZ|dksDJ d}d}|d d }n(|d	rzd
| }|d d }ndsJ |d usJ ||jkrd|| j||f S d|| jf S )Nr6   Zq_obj_   z-argr   Z	parametercommandz-basezbase Fz%s '%s' of %s '%s're   )roler   r   r   Z	defn_namerV   )r!   r2   r   rS   r   r"   r"   r#   rg   r  s&    



zQAPISchemaMember.describe)N)
r,   r-   r.   rQ   r   r$   rY   r_   rD   rg   r"   r"   r"   r#   r   N  s    r   c                      sB   e Zd ZdZdddddd fdd	Zd
dd fddZ  ZS )QAPISchemaEnumMemberr   Nr%   r0   rT   rU   )rV   r2   r   rW   c                   s6   t  ||| |pg D ]}|| q|p.g | _d S r    )rX   r$   rY   rW   )r!   rV   r2   r   rW   r[   r\   r"   r#   r$     s    zQAPISchemaEnumMember.__init__r@   r   rA   c                   s*   t  | |r&| jD ]}|| qd S r    rX   rD   rW   rb   rc   r\   r"   r#   rD     s    
z QAPISchemaEnumMember.connect_doc)NN)r,   r-   r.   r   r$   rD   rj   r"   r"   r\   r#   r     s
     r   c                   @  s   e Zd ZdZddddZdS )QAPISchemaFeatureZfeaturer*   r&   c                 C  s
   | j dv S )N)Z
deprecatedZunstabler   r'   r"   r"   r#   r     s    zQAPISchemaFeature.is_specialN)r,   r-   r.   r   r   r"   r"   r"   r#   r     s   r   c                      s`   e Zd Zdddddddd fdd	Zdd
ddZdddddZddd fddZ  ZS )r   Nr%   r   r*   rT   rU   )rV   r2   typr   r   rW   c                   sF   t  ||| |pg D ]}|| q|| _|  || _|p>g | _d S r    )rX   r$   rY   
_type_namer   rW   )r!   rV   r2   r  r   r   rW   r[   r\   r"   r#   r$     s    	z#QAPISchemaObjectTypeMember.__init__r&   c                 C  s   | j o| j S r    )r   r6   r   r'   r"   r"   r#   need_has  s    z#QAPISchemaObjectTypeMember.need_hasr9   r   r:   c                 C  sB   | j s
J || j| j| j| _i }| jD ]}|| j| q*d S r    )r   r   r  r2   rg   r6   rW   r_   r`   r"   r"   r#   r?     s    

z QAPISchemaObjectTypeMember.checkr@   rA   c                   s*   t  | |r&| jD ]}|| qd S r    r   rc   r\   r"   r#   rD     s    
z&QAPISchemaObjectTypeMember.connect_doc)NN)r,   r-   r.   r$   r  r?   rD   rj   r"   r"   r\   r#   r     s     r   c                      s,   e Zd ZdZddddd fddZ  ZS )r   branchr%   r   r   )rV   r2   r  r   c                   s   t  |||d| d S r3   )rX   r$   )r!   rV   r2   r  r   r\   r"   r#   r$     s    zQAPISchemaVariant.__init__)r,   r-   r.   r   r$   rj   r"   r"   r\   r#   r     s   r   c                      s|   e Zd ZdZdddddddddddddd	 fd
dZddd fddZdddd fddZddd fddZ  ZS )QAPISchemaCommandr   r%   r   r@   r   ru   rw   r*   )rV   r2   rB   r   rW   r   r   r   r   r   r   r   r   c                   sT   t  ||||| || _d | _|| _d | _|| _|	| _|
| _|| _	|| _
|| _d S r    )rX   r$   _arg_type_namer   _ret_type_namer   r   r   r   r   r   r   )r!   rV   r2   rB   r   rW   r   r   r   r   r   r   r   r   r\   r"   r#   r$     s    zQAPISchemaCommand.__init__r9   r   r:   c                   s  | j d usJ t | | jr|| j| j d}t|tsPt| j d|  || _	| j	j
rz| jszt| j d| j	  | j	| | j	 r| jst| j d| jr|| j| j d| _| j| j jjvr| j}t|tr|j}t|tst| j d| j  d S )Nzcommand's 'data'zcommand's 'data' cannot take %sz4command's 'data' can take %s only with 'boxed': truez3conditional command arguments require 'boxed': truezcommand's 'returns'z"command's 'returns' cannot take %s)r2   rX   r?   r  r   r   r   r   rg   r   r   r   r   r  r   rV   ZpragmaZcommand_returns_exceptionsr   r|   )r!   r;   r   r  r\   r"   r#   r?     sT    



zQAPISchemaCommand.checkNrA   c                   s:   t  | |p| j}|r6| jr6| j r6| j| d S r    rX   rD   rB   r   rd   rC   r\   r"   r#   rD     s
    
zQAPISchemaCommand.connect_docrL   rM   c                   sH   t  | || j| j| j| j| j| j| j	| j
| j| j| j| j d S r    )rX   rP   r   rV   r2   r   rW   r   r   r   r   r   r   r   r   rO   r\   r"   r#   rP   &  s    zQAPISchemaCommand.visit)N	r,   r-   r.   rS   r$   r?   rD   rP   rj   r"   r"   r\   r#   r    s
   *#r  c                      sp   e Zd ZdZdddddddd	 fd
dZddd fddZdddd fddZddd fddZ  ZS )QAPISchemaEventeventr%   r   r@   r   ru   rw   r*   )rV   r2   rB   r   rW   r   r   c                   s*   t  ||||| || _d | _|| _d S r    )rX   r$   r  r   r   )r!   rV   r2   rB   r   rW   r   r   r\   r"   r#   r$   2  s    
zQAPISchemaEvent.__init__r9   r   r:   c                   s   t  | | jr|| j| jd}t|tsBt| jd|  || _	| j	j
rl| jslt| jd| j	  | j	| | j	 r| jst| jdd S )Nzevent's 'data'zevent's 'data' cannot take %sz2event's 'data' can take %s only with 'boxed': truez1conditional event arguments require 'boxed': true)rX   r?   r  r   r2   r   r   r   rg   r   r   r   r   )r!   r;   r  r\   r"   r#   r?   A  s4    

zQAPISchemaEvent.checkNrA   c                   s:   t  | |p| j}|r6| jr6| j r6| j| d S r    r  rC   r\   r"   r#   rD   W  s
    
zQAPISchemaEvent.connect_docrL   rM   c                   s0   t  | || j| j| j| j| j| j d S r    )	rX   rP   r   rV   r2   r   rW   r   r   rO   r\   r"   r#   rP   ^  s
    zQAPISchemaEvent.visit)Nr	  r"   r"   r\   r#   r
  /  s
   r
  c                   @  s  e Zd ZddddZddddd	Zd
ddddZdddddZdddddZdddddddZdddddZ	ddddd Z
dddd!d"Zd#dd$d%d&Zddddd'd(d)Zdd*d+d,Zd-dd.d/d0d1Zdd2d-dd3d4d5d6Zd7dd8d9d:d;Zdddd<d=d>Zdd?d@ddAdBdCdDdEZd#dd$dFdGZddHd@d-d?dIdJdKdLZdMd?dAdNdOdPZd#dd$dQdRZddd@d?dSdTdUdVZd#dd$dWdXZd#dd$dYdZZd#dd$d[d\Zd#dd$d]d^Zd_dd`dadbZdd*dcddZdeddfdgdhZdiS )jr9   r%   )rE   c              
   C  s   || _ zt|}W n< tyN } z$td| d|j |W Y d }~n
d }~0 0 t|j}|j| _g | _i | _	t
 | _tj|| _| tj | | d| _|   d| _| | |   d S )Nzcan't read schema file 'z': TF)rE   r   OSErrorr   strerrorr   exprsdocsr   _entity_dictr   _module_dictospathdirname_schema_dir_make_modulerF   rG   _predefining_def_predefineds
_def_exprsr?   )r!   rE   parsererrr  r"   r"   r#   r$   f  s,    


zQAPISchema.__init__r/   r   r   c                 C  s   | j | d S r    r   r   r"   r"   r#   _def_entity~  s    zQAPISchema._def_entityrR   )defnr   c                 C  sx   |j s| jsJ | | | j|j}|rh|j rTt|j d}t|j d|j|f t|j d|  || j|j< d S )Nzprevious definitionz'%s' is already defined
%sz%s is already defined)	r2   r  r  r  r   rV   r   r   rg   )r!   r  Z
other_defnwherer"   r"   r#   _def_definition  s    
zQAPISchema._def_definitionzOptional[QAPISchemaEntity]rm   c                 C  s   | j |S r    )r  r   rn   r"   r"   r#   lookup_entity  s    zQAPISchema.lookup_entityr   c                 C  s   |  |}t|tr|S d S r    )r   r   r{   )r!   rV   r  r"   r"   r#   r     s    

zQAPISchema.lookup_typer0   z1Union[None, str, Callable[[QAPISourceInfo], str]]r{   )rV   r2   whatr   c                 C  s@   |  |}|s<|r|sJ t|r*||}t|d||f |S )Nz%s uses unknown type '%s')r   callabler   )r!   rV   r2   r!  r  r"   r"   r#   r     s    
zQAPISchema.resolve_type)rE   r   c                 C  s   t |r|S tj|| jS r    )rF   r   r  r  relpathr  )r!   rE   r"   r"   r#   _module_name  s    
zQAPISchema._module_namerF   c                 C  s,   |  |}|| jvr"t|| j|< | j| S r    )r$  r  rF   r!   rE   rV   r"   r"   r#   r    s    

zQAPISchema._make_modulec                 C  s   |  |}| j| S r    )r$  r  r%  r"   r"   r#   rH     s    
zQAPISchema.module_by_fnamer   )exprr   c                 C  s2   |d }|j d u sJ | t| ||j d S )Ninclude)rB   r  r   r  r2   )r!   r&  r'  r"   r"   r#   _def_include  s
    zQAPISchema._def_include)rV   rs   r   r   c                 C  s"   |  t||| | |d  d S r    )r  r   _make_array_typer   r"   r"   r#   _def_builtin_type  s    zQAPISchema._def_builtin_typer&   c                 C  s   dddt  fdddddd	d
ddddddddt  fdddt  ffD ]}| j|  q@tdd d d d d g d | _| | j g d}| dd |D d }| tdd d d d |d  d S )Nr%   r   char)r   r   double)r   r   int64_t)Zint8r   Zint8_t)Zint16r   Zint16_t)Zint32r   Zint32_t)Zint64r   r-  )Zuint8r   Zuint8_t)Zuint16r   Zuint16_t)Zuint32r   Zuint32_t)Zuint64r   uint64_t)sizer   r.  )r*   r   r*   r   r   ZQObjectr   ZQNullr   )ZnoneZqnullZqnumZqstringZqdictZqlistZqboolc                 S  s   g | ]}d |iqS r   r"   )r   nr"   r"   r#   r     r   z/QAPISchema._def_predefineds.<locals>.<listcomp>r   )r   r*  r   Zthe_empty_object_typer  _make_enum_membersr   )r!   tZqtypesZqtype_valuesr"   r"   r#   r    s8    zQAPISchema._def_predefinedszOptional[List[Dict[str, Any]]]ru   )rW   r2   r   c                   s   |d u rg S  fdd|D S )Nc              	     s&   g | ]}t |d   t|dqS )rV   if)r   r   r   )r   r[   r1   r"   r#   r     s   
z-QAPISchema._make_features.<locals>.<listcomp>r"   )r!   rW   r2   r"   r1   r#   _make_features  s
    
zQAPISchema._make_featuresz$Optional[Union[str, Dict[str, Any]]]r   )rV   r   rW   r2   r   c                 C  s   t ||t|| ||S r    )r   r   r4  )r!   rV   r   rW   r2   r"   r"   r#   _make_enum_member  s    
zQAPISchema._make_enum_memberzList[Dict[str, Any]]rv   )r   r2   r   c                   s    fdd|D S )Nc              	     s,   g | ]$} |d  |d|d qS )rV   r3  rW   )r5  r   r   r2   r!   r"   r#   r     s   
z1QAPISchema._make_enum_members.<locals>.<listcomp>r"   )r!   r   r2   r"   r6  r#   r1    s    zQAPISchema._make_enum_members)r|   r2   r   c                 C  s(   |d }|  |s$| t||| |S )Nr	   )r   r  r   )r!   r|   r2   rV   r"   r"   r#   r)    s    
zQAPISchema._make_array_typer   r   r~   rw   )rV   r2   r   r   rx   r   c                 C  sR   |sd S d||f }|  |}|r2t|tsNJ n| t||d |d d |d  |S )Nzq_obj_%s-%s)r   r   r   r  )r!   rV   r2   r   r   rx   r  r"   r"   r#   _make_implicit_object_type  s    
z%QAPISchema._make_implicit_object_typec                 C  sh   |d }|d }| d}t| d}|j}| | d|}| t|||j||| ||| d S )Nr   datary   r3  rW   )r   r   r2   r4  r  r   rB   r1  )r!   r&  rV   r8  ry   r   r2   rW   r"   r"   r#   _def_enum_type#  s    
zQAPISchema._def_enum_typezUnion[List[str], str]r   )rV   r  r   rW   r2   r   c              
   C  sb   d}| dr|dd  }d}t|trHt|dks8J | |d |}t|||||| ||S )NF*r   Tr   )r   r   r   lenr)  r   r4  )r!   rV   r  r   rW   r2   r   r"   r"   r#   _make_member.  s    


zQAPISchema._make_memberzDict[str, Any])r8  r2   r   c                   s    fdd|  D S )Nc              
     s6   g | ].\}} ||d  t|d|d qS )r6   r3  rW   )r<  r   r   r   keyr   r6  r"   r#   r   E  s
   
z,QAPISchema._make_members.<locals>.<listcomp>)items)r!   r8  r2   r"   r6  r#   _make_members@  s    zQAPISchema._make_membersc                 C  sj   |d }| d}|d }|j}t| d}| | d|}| t|||j|||| ||d  d S )Nr   r   r8  r3  rW   )r   r2   r   r4  r  r   rB   r@  )r!   r&  rV   r   r8  r2   r   rW   r"   r"   r#   _def_struct_typeJ  s    

zQAPISchema._def_struct_typer   )caser  r   r2   r   c                 C  s8   t |tr*t|dksJ | |d |}t||||S )Nr   r   )r   r   r;  r)  r   )r!   rB  r  r   r2   r"   r"   r#   _make_variantV  s    
zQAPISchema._make_variantc           
        s   |d }|d }|d }|d }t |ts.J |j t|d}|d }t |trx| |d| } fdd| D }g }		t
| |j||||	t || d S )	Nr   r   Zdiscriminatorr8  r3  rW   c              
     s.   g | ]&\}} ||d  t|d qS r6   r3  rC  r   r   r=  r6  r"   r#   r   o  s
   z.QAPISchema._def_union_type.<locals>.<listcomp>)r   r   r2   r   r   r4  r7  r@  r?  r  r   rB   r   )
r!   r&  rV   r   r   r8  r   rW   r   rx   r"   r6  r#   _def_union_typeb  s2    
zQAPISchema._def_union_typec                   s   |d }|d }t |tsJ t|d}|j |d } fdd| D }td dd	}t	| |j
||t || d S )
Nr   r8  r3  rW   c              
     s.   g | ]&\}} ||d  t|d qS rD  rE  r=  r6  r"   r#   r     s
   z2QAPISchema._def_alternate_type.<locals>.<listcomp>r6   r   F)r   r   r   r   r2   r4  r?  r   r  r   rB   r   )r!   r&  rV   r8  r   rW   r   r   r"   r6  r#   _def_alternate_type{  s     
zQAPISchema._def_alternate_typec                 C  s  |d }| d}| d}| dd}| dd}| dd}| d	d}| d
d}	| dd}
t| d}|j}| | d|}t|tr| |||d| ||}t|trt	|dksJ | 
|d |}| t|||j|||||||||	|
 d S )Nr   r8  returnsr   Tzsuccess-responser   Fz	allow-oobzallow-preconfigr   r3  rW   argr   r   )r   r   r2   r4  r   r   r7  r@  r   r;  r)  r  r  rB   )r!   r&  rV   r8  Zretsr   r   r   r   r   r   r   r2   rW   r"   r"   r#   _def_command  s4    




zQAPISchema._def_commandc              
   C  s   |d }| d}| dd}t| d}|j}| | d|}t|trh| |||d| ||}| t	|||j
|||| d S )Nr  r8  r   Fr3  rW   rI  )r   r   r2   r4  r   r   r7  r@  r  r
  rB   )r!   r&  rV   r8  r   r   r2   rW   r"   r"   r#   
_def_event  s    

zQAPISchema._def_eventzList[QAPIExpression])r  r   c                 C  s   |D ]}d|v r|  | qd|v r0| | qd|v rD| | qd|v rX| | qd|v rl| | qd|v r| | qd|v r| | qdsJ qd S )	Nr   r   r   r   r   r  r'  F)r9  rA  rF  rG  rJ  rK  r(  )r!   r  r&  r"   r"   r#   r    s     zQAPISchema._def_exprsc                 C  sL   | j D ]}||  |  q| j D ]}||  q$| jD ]}|  q:d S r    )r   r?   rD   rK   r  )r!   r   rB   r"   r"   r#   r?     s    




zQAPISchema.checkrL   rM   c                 C  s0   | |  | j D ]}|| q|  d S r    )rk   r  r   rP   rl   )r!   rN   modr"   r"   r#   rP     s    
zQAPISchema.visitN) r,   r-   r.   r$   r  r  r   r   r   r$  r  rH   r(  r*  r  r4  r5  r1  r)  r7  r9  r<  r@  rA  rC  rF  rG  rJ  rK  r  r?   rP   r"   r"   r"   r#   r9   e  s:   
	
	r9   );Z
__future__r   abcr   r   collectionsr   r  r   typingr   r   r   r	   r
   r   r   commonr   r   r   r   r   r   errorr   r   r   r&  r   r  r   r   r   sourcer   r   r/   rR   rL   rF   r   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r
  r9   r"   r"   r"   r#   <module>   sB   $
 +4i-
5 36KXA$R6