B
    bZ                 @   s  d dl mZ d dlmZ d dlmZmZ d dlmZ d dl	m
Z
mZ d dlmZ d dlmZmZ d dlm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 ZG dd dZG dd deZG dd deZG dd dZ G dd de eZ!G dd de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,e*Z+G d-d. d.Z,G d/d0 d0Z-G d1d2 d2e-e"Z.G d3d4 d4e eZ/G d5d6 d6e-e/Z0d7S )8    )abstractmethod)	Parameter)OptionalTuple)search_ancestor)find_statement_documentationclean_scope_docstring)unite)ValueSet	NO_VALUES)inference_state_method_cache)
docstrings)memoize_method)deep_ast_copyinfer_call_of_leaf)plugin_managerc             C   s.   d}x$| D ]}|r|d7 }||  7 }q
W |S )N z 
------------------------------
)	py__doc__)namesdocname r   3lib/python3.7/site-packages/jedi/inference/names.py_merge_name_docs   s    
r   c               @   s   e Zd ZU dZeeeef  ed< eed< dZ	dZ
dZedd Ze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edd Zdd ZdS )AbstractNameDefinitionN	start_posstring_nameTc             C   s   t d S )N)NotImplementedError)selfr   r   r   infer&   s    zAbstractNameDefinition.inferc             C   s   | hS )Nr   )r   r   r   r   goto*   s    zAbstractNameDefinition.gotoFc             C   s6   |   }|d ks|s|S |  j}|d kr.d S || S )N)_get_qualified_namesget_root_contextstring_names)r   include_module_namesZqualified_namesmodule_namesr   r   r   get_qualified_names0   s    
z*AbstractNameDefinition.get_qualified_namesc             C   s   d S )Nr   )r   r   r   r   r!   :   s    z+AbstractNameDefinition._get_qualified_namesc             C   s
   | j  S )N)parent_contextr"   )r   r   r   r   r"   >   s    z'AbstractNameDefinition.get_root_contextc             C   s   | j S )N)r   )r   r   r   r   get_public_nameA   s    z&AbstractNameDefinition.get_public_namec             C   s2   | j d krd| jj| jf S d| jj| j| j f S )Nz<%s: string_name=%s>z!<%s: string_name=%s start_pos=%s>)r   	__class____name__r   )r   r   r   r   __repr__D   s    
zAbstractNameDefinition.__repr__c             C   s   dS )NFr   )r   r   r   r   	is_importJ   s    z AbstractNameDefinition.is_importc             C   s   dS )Nr   r   )r   r   r   r   r   M   s    z AbstractNameDefinition.py__doc__c             C   s   | j jS )N)r'   api_type)r   r   r   r   r-   P   s    zAbstractNameDefinition.api_typec             C   s   dS )z
        Returns either None or the value that is public and qualified. Won't
        return a function, because a name in a function is never public.
        Nr   )r   r   r   r   get_defining_qualified_valueT   s    z3AbstractNameDefinition.get_defining_qualified_value)F)r*   
__module____qualname__r   r   r   int__annotations__strr'   	tree_nameis_value_namer   r   r    r&   r!   r"   r(   r+   r,   r   propertyr-   r.   r   r   r   r   r      s    


r   c               @   s$   e Zd ZdZdZdd Zdd ZdS )AbstractArbitraryNamez
    When you e.g. want to complete dicts keys, you probably want to complete
    string literals, which is not really a name, but for Jedi we use this
    concept of Name for completions as well.
    Fc             C   s   || _ || _|j| _d S )N)inference_stater   Zbuiltins_moduler'   )r   r8   stringr   r   r   __init__d   s    zAbstractArbitraryName.__init__c             C   s   t S )N)r   )r   r   r   r   r   i   s    zAbstractArbitraryName.inferN)r*   r/   r0   __doc__r5   r:   r   r   r   r   r   r7   \   s   r7   c                   s^   e Zd Zdd Zd fdd	Zdd Zdd	 Zd
d Zdd Ze	dd Z
e	dd Z  ZS )AbstractTreeNamec             C   s   || _ || _d S )N)r'   r4   )r   r'   r4   r   r   r   r:   n   s    zAbstractTreeName.__init__Fc                sd   t | jdd}|d k	rX|jdkr0|    sX|rT|jsTtdd || jD S d S t 	|S )Nimport_nameimport_from   c             s   s   | ]}|j V  qd S )N)value).0nr   r   r   	<genexpr>|   s    z7AbstractTreeName.get_qualified_names.<locals>.<genexpr>)
r   r4   levelr"   	get_value
is_packagetupleZget_path_for_namesuperr&   )r   r$   Zimport_node)r)   r   r   r&   r   s    
z$AbstractTreeName.get_qualified_namesc             C   s$   | j  }|d krd S || jjf S )N)r'   r&   r4   r@   )r   Zparent_namesr   r   r   r!      s    
z%AbstractTreeName._get_qualified_namesc             C   s&   |   rtdn| jr"| j S d S )Nz&Shouldn't really happen, please report)r,   r   r'   rE   )r   r   r   r   r.      s
    

z-AbstractTreeName.get_defining_qualified_valuec                s  | j  | jjdd}|d k	rp|j}|dkrFjjdk}|rn| gS q|dkrhddlm} | }|S | gS n,ddlm} | }|d k	rd	d
 |D S j}|j}	|	dkr|jd dkr|jd kr|j}
|
jdkr|
j}
|
jdkr<|
jdkr 	|
jd }nt|
jj
|
}|
jjd | }|d dkrH|d  	|d }ddlm} x"|dd  D ]}
| ||
}qpW g }xN|D ]F}x>| D ]2}x*| D ]}|jjkr|| qW qW qW |S n\|	dkr<|j
}|dkr<t|}g |j|d d <  	|}t fdd|D S |	dkrr|jd dkrrt dd}|j dS tddp}|jdkr} j|jdS d S )NT)import_name_always	expr_stmt)Zpowertrailer)r>   r=   r   )goto_import)%follow_error_node_imports_if_possiblec             S   s   g | ]
}|j qS r   )r   )rA   r@   r   r   r   
<listcomp>   s    z)AbstractTreeName.goto.<locals>.<listcomp>argumentr?   =ZarglistclassdefZ	decoratorawait)infer_trailerZdotted_namec             3   s   | ]}|j  d V  qdS ))name_contextN)r    )rA   r@   )contextr   r   r   rC      s   z(AbstractTreeName.goto.<locals>.<genexpr>rK   .)Zcut_own_trailer)rT   Zlambdef)Zposition)r'   r4   get_definitiontypeparentjedi.inference.importsrL   rM   children
infer_nodeindexpopjedi.inference.syntax_treerS   Zget_signaturesZget_param_namesr   r@   appendr   r	   r   r    r   r   )r   
definitionZtype_Zis_simple_namerL   r%   rM   valuesZparZ	node_typerK   Z	value_setiZto_inferrS   Zparam_namesr@   Z	signature
param_namer]   Z
new_dottedZstmtr   )rU   r   r   r       sx    

*






zAbstractTreeName.gotoc             C   s   t | jdd}|d k	S )Nr>   r=   )r   r4   )r   impr   r   r   r,      s    zAbstractTreeName.is_importc             C   s   | j jS )N)r4   r@   )r   r   r   r   r      s    zAbstractTreeName.string_namec             C   s   | j jS )N)r4   r   )r   r   r   r   r      s    zAbstractTreeName.start_pos)F)r*   r/   r0   r:   r&   r!   r.   r    r,   r6   r   r   __classcell__r   r   )r)   r   r<   m   s   Hr<   c                   sH   e Zd Zdd Zdd Zdd Z fddZd	d
 Zedd Z	  Z
S )ValueNameMixinc             C   s   t | jgS )N)r
   _value)r   r   r   r   r      s    zValueNameMixin.inferc             C   sF   | j  }|sB| j  rBddlm} || gdd}| |krBt|S |S )Nr   )convert_namesF)prefer_stub_to_compiled)rh   r   is_stub!jedi.inference.gradual.conversionri   r   )r   r   ri   r   r   r   r   r      s    
zValueNameMixin.py__doc__c             C   s
   | j  S )N)rh   r&   )r   r   r   r   r!      s    z#ValueNameMixin._get_qualified_namesc                s   | j d kr| j S t  S )N)r'   rh   
as_contextrH   r"   )r   )r)   r   r   r"      s    

zValueNameMixin.get_root_contextc             C   s$   | j }| s| r | j  S d S )N)r'   Z	is_moduleZis_classrE   )r   rU   r   r   r   r.      s    
z+ValueNameMixin.get_defining_qualified_valuec             C   s   | j jS )N)rh   r-   )r   r   r   r   r-      s    zValueNameMixin.api_type)r*   r/   r0   r   r   r!   r"   r.   r6   r-   rf   r   r   )r)   r   rg      s   	rg   c                   s$   e Zd Z fddZdd Z  ZS )	ValueNamec                s   t  |j| || _d S )N)rH   r:   r'   rh   )r   r@   r4   )r)   r   r   r:     s    zValueName.__init__c             C   s   t | jjgS )N)r
   rh   r   )r   r   r   r   r    	  s    zValueName.goto)r*   r/   r0   r:   r    rf   r   r   )r)   r   rn     s   rn   c               @   sX   e Zd ZeddddddZdd Zedd	 Zd
d Zedd Z	e
dddd ZdS )TreeNameDefinitionmodulefunctionparamclass)r=   r>   Zfuncdefrr   rQ   c             C   s    ddl m} || jj| j| jS )Nr   )tree_name_to_values)r_   rt   r'   r8   r4   )r   rt   r   r   r   r     s
    zTreeNameDefinition.inferc             C   s*   | j jdd}|d krdS | j|jdS )NT)rI   	statement)r4   rW   
_API_TYPESgetrX   )r   ra   r   r   r   r-     s    zTreeNameDefinition.api_typec       	      C   s   g }d}| j j}| j }x|dk	r|jdkrxjt|jD ]T\}}||kr6t|d }|rxtt|j| d }t|| }|d||f P q6W t	dd}n|jdkrd}n|jd	krP |}|j}qW |S )
a  
        Returns an array of tuple(int, node) of the indexes that are used in
        tuple assignments.

        For example if the name is ``y`` in the following code::

            x, (y, z) = 2, ''

        would result in ``[(1, xyz_node), (0, yz_node)]``.

        When searching for b in the case ``a, *b, c = [...]`` it will return::

            [(slice(1, -1), abc_node)]
        FN)ZtestlistZtestlist_compZtestlist_star_exprZexprlist   r   zCouldn't find the assignment.Z	star_exprT)rJ   Zsync_comp_for)
r4   rY   rX   	enumerater[   r1   lensliceinsertLookupError)	r   ZindexesZis_star_exprnodeZcomparerc   Zchildr]   Zfrom_endr   r   r   assignment_indexes&  s.    




z%TreeNameDefinition.assignment_indexesc             C   s   | j jS )N)r'   r8   )r   r   r   r   r8   O  s    z"TreeNameDefinition.inference_stater   )defaultc             C   s   | j }|dkrT| j  rFddlm} || gdd}| |krFt|S t| j	 S |dkrt| 
 }| |krtt|S |dkr| j rt| j	 S dS )	N)rq   rs   r6   r   )ri   F)rj   rp   ru   r   )r-   r'   r"   rk   rl   ri   r   r   r4   rW   r    Zis_definitionr   )r   r-   ri   r   r   r   r   r   T  s    zTreeNameDefinition.py__doc__N)r*   r/   r0   dictrv   r   r6   r-   r   r8   r   r   r   r   r   r   ro     s   	)ro   c               @   s2   e Zd ZdddZdddZdd Zdd	d
ZdS )_ParamMixinTc             C   s(   t jt jg}|r|t j |  |kS )N)r   POSITIONAL_ONLYPOSITIONAL_OR_KEYWORDr`   VAR_POSITIONALget_kind)r   Zinclude_staroptionsr   r   r   maybe_positional_argumentl  s    z%_ParamMixin.maybe_positional_argumentc             C   s(   t jt jg}|r|t j |  |kS )N)r   KEYWORD_ONLYr   r`   VAR_KEYWORDr   )r   Zinclude_starsr   r   r   r   maybe_keyword_argumentr  s    z"_ParamMixin.maybe_keyword_argumentc             C   s(   |   }|tjkrdS |tjkr$dS dS )N*z**r   )r   r   r   r   )r   kindr   r   r   _kind_stringx  s    

z_ParamMixin._kind_stringFc             C   s   d S )Nr   )r   r$   r   r   r   r&     s    z_ParamMixin.get_qualified_namesN)T)T)F)r*   r/   r0   r   r   r   r&   r   r   r   r   r   k  s   

r   c               @   s<   e Zd ZdZdd Zdd Zdd Zedd	 Zd
d Z	dS )ParamNameInterfacerr   c             C   s   t d S )N)r   )r   r   r   r   r     s    zParamNameInterface.get_kindc             C   s   t d S )N)r   )r   r   r   r   	to_string  s    zParamNameInterface.to_stringc             C   s   dS )as  
        For dealing with type inference and working around the graph, we
        sometimes want to have the param name of the execution. This feels a
        bit strange and we might have to refactor at some point.

        For now however it exists to avoid infering params when we don't really
        need them (e.g. when we can just instead use annotations.
        Nr   )r   r   r   r   get_executed_param_name  s    	z*ParamNameInterface.get_executed_param_namec             C   s(   |   }|tjkrdS |tjkr$dS dS )Nr?   rx   r   )r   r   r   r   )r   r   r   r   r   
star_count  s    

zParamNameInterface.star_countc             C   s   t S )N)r   )r   r   r   r   infer_default  s    z ParamNameInterface.infer_defaultN)
r*   r/   r0   r-   r   r   r   r6   r   r   r   r   r   r   r     s   	r   c               @   s,   e Zd ZdZdZdd Zdd Zdd ZdS )BaseTreeParamNameNc             C   sX   |   |   }| j}| j}|d k	r8|d|jdd 7 }|d k	rT|d|jdd 7 }|S )Nz: F)Zinclude_prefixrP   )r   r(   annotation_nodedefault_nodeget_code)r   output
annotationr   r   r   r   r     s    zBaseTreeParamName.to_stringc             C   s    | j }|dr|dd  }|S )N__rx   )r   
startswith)r   r   r   r   r   r(     s    
z!BaseTreeParamName.get_public_namec             K   s   | gS )Nr   )r   kwargsr   r   r   r      s    zBaseTreeParamName.goto)r*   r/   r0   r   r   r   r(   r    r   r   r   r   r     s
   
r   c                   s^   e Zd Z fddZdd Zedd Zdd	d
Zdd Zedd Z	dd Z
dd Z  ZS )_ActualTreeParamNamec                s   t  | | || _d S )N)rH   r:   Zget_default_param_contextfunction_value)r   r   r4   )r)   r   r   r:     s    z_ActualTreeParamName.__init__c             C   s   t | jdS )Nrr   )r   r4   )r   r   r   r   _get_param_node  s    z$_ActualTreeParamName._get_param_nodec             C   s
   |   jS )N)r   r   )r   r   r   r   r     s    z$_ActualTreeParamName.annotation_nodeTFc             C   s0   ddl m} || j|  |d}|r,| }|S )Nr   )infer_param)ignore_stars)Z!jedi.inference.gradual.annotationr   r   r   execute_annotation)r   r   r   r   rb   r   r   r   infer_annotation  s    
z%_ActualTreeParamName.infer_annotationc             C   s   | j }|d krtS | j|S )N)r   r   r'   r\   )r   r~   r   r   r   r     s    z"_ActualTreeParamName.infer_defaultc             C   s
   |   jS )N)r   r   )r   r   r   r   r     s    z!_ActualTreeParamName.default_nodec             C   s   |   }|jdkrtjS |jdkr(tjS |jjdr<tjS |j	}d}xR|j
D ]H}|rf|dkrtjS qN|dkrttjS |jdkrN|jrtjS ||krNd}qNW tjS )	Nr?   rx   r   F/r   rr   T)r   r   r   r   r   r   r@   r   r   rY   r[   r   rX   r   )r   Z
tree_paramrY   Zparam_appearedpr   r   r   r     s*    


z_ActualTreeParamName.get_kindc             C   s&   |   }|r|S t| j|  }|S )N)r   r   r   r   r   )r   rb   Z
doc_paramsr   r   r   r     s
    z_ActualTreeParamName.infer)TF)r*   r/   r0   r:   r   r6   r   r   r   r   r   r   rf   r   r   )r)   r   r     s   
	r   c                   s@   e Zd Zejdd fddZejdd fddZ  ZS )AnonymousParamNameZgoto_anonymous_param)r   c                s
   t   S )N)rH   r    )r   )r)   r   r   r      s    zAnonymousParamName.gotoZinfer_anonymous_paramc                s   t   }|r|S ddlm} |  }|| j|j}|r<|S |jdkrbddlm	} || jj
g }nD|jdkrddlm} || jj
i }n|jd krtS | jj|jS t|hS )Nr   )dynamic_param_lookupr?   )	FakeTuplerx   )FakeDict)rH   r   Zjedi.inference.dynamic_paramsr   r   r   position_indexr   Zjedi.inference.value.iterabler   r8   r   r   r   r'   r\   r
   )r   rb   r   rr   r   r@   r   )r)   r   r   r   	  s$    



zAnonymousParamName.infer)r*   r/   r0   r   Zdecorater    r   rf   r   r   )r)   r   r     s   r   c                   s0   e Zd Z fddZ fddZdd Z  ZS )	ParamNamec                s   t  || || _d S )N)rH   r:   	arguments)r   r   r4   r   )r)   r   r   r:   "  s    zParamName.__init__c                s   t   }|r|S |   S )N)rH   r   r   )r   rb   )r)   r   r   r   &  s    
zParamName.inferc             C   s(   ddl m} || j| j}||  j S )Nr   )get_executed_param_names)Zjedi.inference.paramr   r   r   r   r   )r   r   Zparams_namesr   r   r   r   -  s    z!ParamName.get_executed_param_name)r*   r/   r0   r:   r   r   rf   r   r   )r)   r   r   !  s   r   c               @   s$   e Zd Zdd Zdd Zdd ZdS )ParamNameWrapperc             C   s
   || _ d S )N)_wrapped_param_name)r   rd   r   r   r   r:   4  s    zParamNameWrapper.__init__c             C   s   t | j|S )N)getattrr   )r   r   r   r   r   __getattr__7  s    zParamNameWrapper.__getattr__c             C   s   d| j j| jf S )Nz<%s: %s>)r)   r*   r   )r   r   r   r   r+   :  s    zParamNameWrapper.__repr__N)r*   r/   r0   r:   r   r+   r   r   r   r   r   3  s   r   c               @   sZ   e Zd ZdZdZdd ZdddZedd	 Ze	d
d Z
dd Zedd Zdd ZdS )
ImportName)r?   r   r   c             C   s   || _ || _d S )N)_from_module_contextr   )r   r'   r   r   r   r   r:   B  s    zImportName.__init__Fc             C   sH   |rD| j r<| j dkstd| jj}|d kr0|S || jf S | jfS dS )Nr?   z(Everything else is not supported for nowr   )_levelAssertionErrorr   r#   r   )r   r$   r%   r   r   r   r&   F  s    zImportName.get_qualified_namesc             C   s&   | j }|  }|s|S tt| S )N)r   r   nextiterrm   )r   mZimport_valuesr   r   r   r'   Q  s
    zImportName.parent_contextc             C   s.   ddl m} | j}||j| jg|| jd S )Nr   )Importer)rD   )rZ   r   r   r8   r   r   Zfollow)r   r   r   r   r   r   r   [  s    zImportName.inferc             C   s   dd |   D S )Nc             S   s   g | ]
}|j qS r   )r   )rA   r   r   r   r   rN   b  s    z#ImportName.goto.<locals>.<listcomp>)r   )r   r   r   r   r    a  s    zImportName.gotoc             C   s   dS )Nrp   r   )r   r   r   r   r-   d  s    zImportName.api_typec             C   s   t |  S )N)r   r    )r   r   r   r   r   h  s    zImportName.py__doc__N)F)r*   r/   r0   r   r   r:   r&   r6   r'   r   r   r    r-   r   r   r   r   r   r   >  s   

r   c               @   s   e Zd ZdZdS )SubModuleNamer?   N)r*   r/   r0   r   r   r   r   r   r   l  s   r   c               @   s$   e Zd Zdd Zdd Zdd ZdS )NameWrapperc             C   s
   || _ d S )N)_wrapped_name)r   Zwrapped_namer   r   r   r:   q  s    zNameWrapper.__init__c             C   s   t | j|S )N)r   r   )r   r   r   r   r   r   t  s    zNameWrapper.__getattr__c             C   s   d| j j| jf S )Nz%s(%s))r)   r*   r   )r   r   r   r   r+   w  s    zNameWrapper.__repr__N)r*   r/   r0   r:   r   r+   r   r   r   r   r   p  s   r   c                   s   e Zd Z fddZ  ZS )StubNameMixinc                sh   ddl m} | g}| jdkr>d| j jkr>dd |  D }||dd}| |kr\t  S t	|S d S )	Nr   )ri   ru   rP   c             S   s   g | ]
}|j qS r   )r   )rA   vr   r   r   rN     s    z+StubNameMixin.py__doc__.<locals>.<listcomp>F)rj   )
rl   ri   r-   r4   rW   r[   r   rH   r   r   )r   ri   r   )r)   r   r   r   |  s    
zStubNameMixin.py__doc__)r*   r/   r0   r   rf   r   r   )r)   r   r   {  s   r   c                   s   e Zd Z fddZ  ZS )StubNamec                sJ   t   }| jdkrF|   dkrFddlm  t fdd|D S |S )Nversion_infosysr   )VersionInfoc             3   s   | ]} |V  qd S )Nr   )rA   c)r   r   r   rC     s    z!StubName.infer.<locals>.<genexpr>)rH   r   r   r"   Z
py__name__Z!jedi.inference.gradual.stub_valuer   r
   )r   Zinferred)r)   )r   r   r     s
    
zStubName.infer)r*   r/   r0   r   rf   r   r   )r)   r   r     s   r   c               @   s$   e Zd ZdZdd Zedd ZdS )
ModuleName)r?   r   c             C   s   || _ || _d S )N)rh   _name)r   r@   r   r   r   r   r:     s    zModuleName.__init__c             C   s   | j S )N)r   )r   r   r   r   r     s    zModuleName.string_nameN)r*   r/   r0   r   r:   r6   r   r   r   r   r   r     s   r   c               @   s   e Zd ZdS )StubModuleNameN)r*   r/   r0   r   r   r   r   r     s   r   N)1abcr   inspectr   typingr   r   Z
parso.treer   Zjedi.parser_utilsr   r   Zjedi.inference.utilsr	   Zjedi.inference.base_valuer
   r   Zjedi.inference.cacher   Zjedi.inferencer   Z
jedi.cacher   Zjedi.inference.helpersr   r   Zjedi.pluginsr   r   r   r7   r<   rg   rn   ro   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s@   @w 	^!E.	