B
    –ìZÖ  ã               @   sÒ   d Z ddlZddlZddlZddlmZmZmZ ddl	m
Z
 e ejjj¡Zedd„ ƒZedd„ ƒZd	d
„ Zedd„ ƒZdd„ Zdd„ Zdd„ Zedd„ ƒZdd„ Zeddd„ƒZedd„ ƒZdd„ Zdd„ ZdS ) zgA module for inferring objects

For more information see the documentation in `rope.base.oi`
package.

é    N)ÚevaluateÚutilsÚ	arguments)Úget_type_hinting_factoryc             C   s´   | j j}| | |¡}|dk	r |S t| |ƒ}|dk	rj|rf|  ¡  ¡ dk	rf| | jdd¡}| | ||¡ |S | 	| |¡}|dk	r‚|S t
| j jƒ ¡ }|| ƒ}|dk	r°tjj |¡S dS )z<Infer the `PyObject` this `PyFunction` returns after callingNF)Úspecial_args)ÚpycoreÚobject_infoZget_exact_returnedÚ_infer_returnedZ
get_moduleZget_resourceÚget_argumentsÚget_param_namesZfunction_calledZget_returnedr   ÚprojectZmake_return_providerÚropeÚbaseÚ	pyobjectsÚPyObject)Ú
pyfunctionÚargsr   ÚresultÚparamsZhint_returnÚtype_© r   ú/lib/python3.7/site-packages/rope/base/oi/soi.pyÚinfer_returned_object   s$    
r   c             C   s0   | j j}| | ¡}|dkr"t| ƒ}t| |ƒ |S )z9Infer the `PyObject`\s of parameters of this `PyFunction`N)r   r   Zget_parameter_objectsÚ_parameter_objectsÚ_handle_first_parameter)r   r   r   r   r   r   Úinfer_parameter_objects)   s    

r   c             C   sp   |   ¡ }|d ks|dkr|s>| jdds,d S | tjj ¡ ¡ |dkrZtjj | j¡|d< |dkrl| j|d< d S )N)ÚmethodÚclassmethodF)r   r   r   r   )	Úget_kindr   Úappendr   r   r   Úget_unknownr   Úparent)ÚpyobjectZ
parametersZkindr   r   r   r   4   s    r   c             C   sž   | j s
d S x^t| j ƒD ]P}t|| jƒ}t|tjjjƒrF| 	¡ dkrFP q|tjj
 ¡ krZP q|d k	r|S qW t| jjjƒ ¡ }|| ƒ}|d k	rštjj
 |¡S |S )NZNotImplementedType)ZassignmentsÚreversedÚ_infer_assignmentÚmoduleÚ
isinstancer   r   ÚbuiltinsZBuiltinUnknownZget_namer   r    r   r   r   Zmake_assignment_providerr   )ÚpynameÚ
assignmentr   Zhint_assignmentZhinting_resultr   r   r   Úinfer_assigned_objectB   s    r*   c             C   s>   | j j}| | |¡}|s:t| ƒ}t|ƒ|kr:| || ¡ |S )N)r   r   Úget_passed_objectsr   Úlenr   )r   Zparameter_indexr   r   Zstatically_inferredr   r   r   r+   V   s    r+   c          	   C   sÎ   |r(|   ¡  ¡  |  | | jdd¡¡ |   ¡ }| ¡ s<d S d}xˆt| ¡ | d … ƒD ]n}yNt ||¡}|d krtwX| 	¡ } | t
jj ¡ krŽwX| ¡ sš| S t
jj | ¡S W qX t
jjjk
rÄ   Y qXX qXW d S )NF)r   é   )Ú	get_scopeZinvalidate_dataZ_set_parameter_pyobjectsr
   r   Z_get_returned_astsr#   r   Ú	eval_nodeÚ
get_objectr   r   r   r    Z_is_generatorr'   Zget_generatorÚIsBeingInferredError)r"   r   ZscopeZmaxtriesZreturned_nodeZresulting_pynamer   r   r   r	   a   s*    r	   c             C   sl   g }| j dd}t| jjƒ ¡ }xF|D ]>}|| |ƒ}|d k	rR| tjj 	|¡¡ q&| tjj 
¡ ¡ q&W |S )NF)r   )r   r   r   r   Zmake_param_providerr   r   r   r   r   r    )r"   r   r   Z
hint_paramÚnamer   r   r   r   r   }   s    

r   c             C   s@   t | |ƒ}|d krd S |\}}t| ||ƒ}|d kr6d S t| |ƒS )N)Ú_follow_pynameÚ_follow_evaluationsÚ_follow_levels)r)   Úpymoduler   r(   r"   r   r   r   r$   Œ   s    
r$   c             C   s„   x~| j D ]t}t| ¡ tjjjƒrN| ¡  ¡ }|rH|tt	|ƒd |ƒ }qrd }n$t| ¡ tjjj
ƒrn| ¡ j}nd }|d krP qW |S )Né   )Zlevelsr&   Úget_typer   r   r'   ZTupleZget_holding_objectsÚminr,   ZListZholding)r)   r"   ÚindexZholdingsr   r   r   r5   ˜   s    r5   c             C   s    | j }|d krt|ƒ}| ¡  |¡}t ||¡}|d k	rœ| ¡ }t| ¡ t	j
jjƒr”| ¡ dkr”t	j
j t	j
j |j¡¡}|| ¡  t |g¡¡fS ||fS d S )NZClass)Zast_nodeÚ_get_lineno_for_noder.   Zget_inner_scope_for_liner   r/   r0   r&   r8   r   r   r'   ZPropertyr   ZpynamesZUnboundNamer   r   r"   Zget_property_objectr   ÚObjectArguments)r)   r6   ÚlinenoÚassign_nodeZholding_scoper(   r   Úargr   r   r   r3   ©   s    
r3   c             C   s¼   |}| j  d¡}xŠ|D ]‚}| d¡}|r4|d d… }|rV|}t||ƒ}|d k	rV| ¡ }|d k	rŽ|rŽt|tjjj	ƒrŠt
 |g¡}| |¡}nd }|d krP qW |d k	r¸| jr¸tjj |¡S |S )NÚ.z()éþÿÿÿ)Z
evaluationÚsplitÚendswithÚ_get_attributer0   r&   r   r   r   ZAbstractFunctionr   r<   Zget_returned_objectZassign_typer   )r)   r(   r"   Z
new_pynameÚtokensÚtokenZcallr   r   r   r   r4   »   s*    


r4   c             C   s   t | dƒr| jd k	r| jS dS )Nr=   r7   )Úhasattrr=   )r>   r   r   r   r;   Õ   s    

r;   c             C   s   | d k	r|| kr| | S d S )Nr   )r"   r2   r   r   r   rD   Ü   s    rD   )N)Ú__doc__Zrope.base.builtinsr   Zrope.base.pynamesZrope.base.pyobjectsZ	rope.baser   r   r   Z!rope.base.oi.type_hinting.factoryr   Zignore_exceptionr   r   r1   Z_ignore_inferredr   r   r   r*   r+   r	   r   r$   r5   r3   r4   r;   rD   r   r   r   r   Ú<module>   s*   