uBFjfoddlZddlmZddlmZddlmZddlmZddl m Z ddl m Z ddl mZdd lmZdd lmZdd lmZdd lmZdd lmZddlmZddlmZddlmZddlmZddlmZm Z ddl!m"Z"ddl#m$Z$ddl%m&Z&ddl'm(Z(m)Z)ddl*m+Z+m,Z,ddl-m.Z.ddl/m0Z0Gdde(Z1dZ2dZ3dZ4dZ5d Z6d!Z7e0j8d"Z9Gd#d$Z:d%Z;ej<d&Z=d'Z>d(Z?d)Z@ d-d+ZAd,ZBdS).N)dedent)Any) Parameter)PythonTokenTypes)tree)Leaf) split_lines)debug)settings)classes)helpers)keywords) complete_dict)complete_file_name)imports)ValueSet)infer_call_of_leafparse_dotted_names)get_global_filters) TreeInstance)DocstringModule)ParamNameWrapper SubModuleName)convert_values convert_namescut_value_at_position)plugin_managerceZdZdZdS)ParamNameWithEqualsc|jdzS)N=) string_name)selfs AC:\PYTHON\_runtimes\venv\Lib\site-packages\jedi/api/completion.pyget_public_namez#ParamNameWithEquals.get_public_names#%%N)__name__ __module__ __qualname__r&r'r%r r s#&&&&&r'r c#K|D]s}t|jD]\\}}|j}||kr|tjkr#|tjtjfvr|j|vrt|jV]tdSN) enumerateparamskindrPOSITIONAL_OR_KEYWORD KEYWORD_ONLYnamer _name) signaturespositional_count used_kwargscall_sigipr0s r%_get_signature_param_namesr;#s33ho.. 3 3DAq6D### 0O(O(O 79OPPPk11)!'22222  333r'c|rdSd}|D]]}t|jD]B\}}|j}|tjurdS||kr|tjtjfvrd}nC|sn^|S)NTF)r.r/r0rVAR_POSITIONALr1POSITIONAL_ONLY)r5r6r7 must_be_kwarg signaturer9r:r0s r%_must_be_kwargrA/stM   i.//  DAq6Dy///uuu$$$)2Q2;2K2M*M*M %   E  r'c #Kt}tjr|}|D]}|j} | |vr| |krtjr| } t j| ||r}tj|||t|||} | j | j f} | |vrD| | |j } | "| } | | jdkr| VdS)Nfuzzy)is_fuzzy cached_namedel_stmt)setr case_insensitive_completionlowerr#r matchr Completionlenr3completeadd tree_nameget_definitiontype)inference_statecompletion_namesstack like_namerDimported_namesrFcomp_dctr3stringnewkrP definitions r% filter_namesr]Es)uuH+&OO%%  ! ^ # #)(;(;   / $\\^^F =% 8 8 8 $I' C3<(A   Q N (!*!9!9!;!;J!-*/Z2O2O  /r'c8d|Dfd|DS)Nch|] }|j Sr+r3).0ds r% z%_remove_duplicates..es / / /QV / / /r'c&g|] }|jv |Sr+r`)racnamess r% z&_remove_duplicates..fs% : : :!afE&9&9A&9&9&9r'r+) completionsother_completionsrfs @r%_remove_duplicatesrjds1 / /. / / /E : : : :{ : : ::r'cd|j|d}||S)zK Returns the scope in which the user resides. This includes flows. Tinclude_prefixes) tree_nodeget_leaf_for_positioncreate_context)module_contextpositionleafs r%get_user_contextrtis4  # 9 9(UY 9 Z ZD  ( ( . ..r'c||d}t|tjtjfs-|j}t|tjtjf-|S)NTrl)ro isinstancerScopeFlowparent) module_noderrnodes r%get_flow_scope_noder|qs`  , ,X , M MD DI677{ DI677 Kr'cgSr-r+)context function_namedecorator_nodess r%complete_param_namesrys  Ir'cdeZdZ ddZdZdZdZdZdZdZ d Z d Z dd Z ddZ dZdZdS)rLFc||_||_|j|_||_t j|j|||_||_||_ ||_ dSr-) _inference_state_module_contextrn _module_node _code_linesr get_on_completion_name _like_name_original_position_signatures_callback_fuzzy)r$rSrq code_linesrrsignatures_callbackrDs r%__init__zCompletion.__init__s^ /-*4%"89JJX`aa#+$7! r'cjjd}t|j\}}}t jj|p|j|dn||zj}|J|sHttj j|||j j jjj }||sd|vr ||}|S|\}}g}|j5|jjdvr'|t%|jtt'j |jj j||} t+|| t-| fdzS) NTrlrC )import_as_namesdotted_as_names)rFc|jj |jd|jd|jfS)N___)r3 startswithrrJ)xr$s r%z%Completion.complete..sUQV5F5Ft5W5W1W121B1B41H1H121B1B31G1G121Ar')key)rror_extract_string_while_in_stringrrrrlistrrrr_complete_in_string_complete_pythonryrRextendextract_imported_namesr]rUrjsorted) r$rsrY start_leafquoteprefixed_completionsrFrTrWrhs ` r%rNzCompletion.completes 66  #!7  %DD$Ja$b$b! E,     $  #NDD+      &: #'(:%t';ZPV!: $"9 ))$$  ' TDFNN'+'?'? F'S'S$' '(,(=(=d(C(C% % ; "t{'7;a'a'a  ! !"8"E"E F F F<(=?O(, DO(, ^Q\^^^__ 3[ A A['A'A'A'ABBB B r'cb |jj}dx|_}|jd|jdt |jz f|_d} tj||j ||jx|_}nM#tj $r;}|j j }|dkr |gfcYd}~S|| fcYd}~Sd}~wwxYwt|dvr|j|jd}|}|jd}|j|jcxkr |jksn|jd}||} | dd d d d } | n| j} | d kr,| jd} t1| t2r | j d z} | jd|kr7| dkrddgz n)| d krgdz n| d krdg} d} t7fdt8jt8jfDrd|D}t?|}|r/|ddvr%|t| dfSd|vr;tC|d|v\}}d|vod|v }| |"|||z } n|ddvr|ddkr|j|j}|jdkr|}|jdkr|}|#|\}}| |z } n|$r| |%|z } n|ddvr|ddvrx|j&|j}|rg|dj'}t|(}|)}| tU|||z } tW|||} | s0| | z } | | dz } | sb|j |jddz d|jd}| |,| p|dd vo |d!dd"k #z } || fS)$a Analyzes the current context of a completion and decides what to return. Technically this works by generating a parser stack and analysing the current stack for possible grammar nodes. Possible enhancements: - global/nonlocal search global - yield from / raise from <- could be only exceptions/generators - In args: */**: no completion - In params (also lambda): no completion before = Nr.ifTrlif_stmtfor_stmt while_stmttry_stmt error_node_stmtelifelse)exceptfinallyrFc3 K|]}|vV dSr-r+)ratallowed_transitionss r% z.Completion._complete_python..sALLAq''LLLLLLr'cg|] }|j Sr+) nonterminal)ra stack_nodes r%rgz/Completion._complete_python..sKKKzJ2KKKr')asdefclass) is_function import_stmt import_fromimport only_modules)trailer dotted_namenewline endmarker)(,)rarglist decoratorz .;z...) only_values)-rgrammarrUrrMr _positionr get_stack_at_positionr OnErrorLeaf error_leafvalue_complete_global_scoper)_allowed_transition_names_and_token_typesrroget_previous_leaf start_posend_possearch_ancestorrRchildrenrvrappendanyrNAMEINDENT _gather_nodes_complete_inheritedr_get_importer_names_complete_trailer_is_parameter_completion_complete_paramsr _call_detailsiter_used_keyword_argumentscount_positional_argumentsr;rA_complete_keywords)r$rsrrUrFer previous_leafindentstmttype_firstrT kwargs_only nonterminalsnodeslevelrfrdotnr5 call_detailsr7r6 current_liners @r%rzCompletion._complete_pythons'/!! U  #A &  #A &T_)=)= =   >!(!>)4"" DJ" > > >L&E||#B&&&&&& ; ; = == = = = = = = > @@BB C C  & & &$::4>\`:aaD 2244M^A&FNdnDDDD DDDD*($?//!:|Z$D| IE ,, $ a 0%eT22:$)K'$9E~a(F22 I--/FF3CC//"j00/3P3P3PP//"j00/66v>>>)?,') LLLL2B2G2B2I2KLLL L L; TLKUKKKL!%((E4 Tr&<<<#D)A)Ad)A)S)S$T$TTT,..1%,9VWW u$1\$A$WhRWFWX  D$<$<!-%=%%  b!%???E"IQTDTDT'==dnMM8y((//11C8{**0022C!%!7!78M8M8O8O!P!P Q A%  ..00 T D$9$9$$?$??  9 **(,0SSS!:!:DN!KJ! `'1!}'B &*<+S+S+U+U&V&V +7+R+R+T+T((,F&,'--( '5ZAQS^&_&_ "T$(C(C(E(EE$$(@(@U(@(S(SS$ +DN1,=,ABCUDNSTDUCUVL  7 7#%1!1"@\"5E5P6@%1"##%6%%?A!8!!   ,,,s*(A77CB<C!B<6C<Cc|jd}|jdkrt|jdkrdS|jdvrdS|jdvo|jddkS)NrlambdefrT parameters) typedargslist varargslistr)rUrrMr)r$toss r%rz#Completion._is_parameter_completionWsgjn ?i ' 'C NNa,?,?4 ?l * *4"BB[syQS}X[G[[r'c|jd}|jdkr |jd}|jdkrt|j|j}|dd}|t|jdkr2|jd}|jdkr|j}n&|jdkr|g}ng}n|}|j d }t||j |SgS) Nrrfuncdefrr decoratorsrr) rUrrtrrrrRrget_decoratorsrrr)r$rsrr~r{rrrs r%rzCompletion._complete_paramsdsZ^  !\ 1 1BJ  !Y . .&t';T^LLG'' i@@D9 ,, a(Av--%&Z ;..&'S %' !%!4!4!6!6J * 0 3 +G]5H*UUU r'c#K|D]M}t|tr6|r"|r|dvrtj|j|VNdS)N)TrueFalseNone)rvstrisalphar KeywordNamer)r$rrr[s r%rzCompletion._complete_keywords{sw$ I IA!S!! Iaiikk I"Ia+D&D&D".t/DaHHHHH I Ir'ct|j|j}tjd|t |j|j}t||j|}g}|D]}||z }|S)Nzglobal completion scope: %s) rtrrr dbgr|rrvalues)r$r~flow_scope_nodefiltersrTfilters r%rz!Completion._complete_global_scopes"4#7HH /999-d.?PP$  N     0 0F   /  r'cb|j|}t||}tjd|dd}t |dkrC|\}|r+t |jdkr|jd}|dvr|}|||fS)Nztrailer completion values: %sMAGENTA)colorrr)numpy tensorflow matplotlibpandas) rrprr r rM is_module string_names_complete_trailer_for_values)r$rinferred_contextr rFv module_names r%rzCompletion._complete_trailers/>>}MM#$4mDD 16KKKK v;;!  BA{{}} 2q~&&!++"#."3K"&UUU&1 D==fEEEEr'cVt|j|j}t||Sr-)rtrrcomplete_trailer)r$r  user_contexts r%rz'Completion._complete_trailer_for_valuess&'(.s(((Q(((r'r)rImporterrrrT)r$rfrrr9s r%rzCompletion._get_importer_namessN((%(((  T2E4;OQV W W!!$"7l!SSSr'c#K|j|jd}|d}|dS|j|}|jd|jdkrdS|d}t||D],}| D]}|j dk|kr|V-dS)zP Autocomplete inherited methods when overriding in child class. TrlclassdefNr) is_instancefunction) rrorrr create_valuer get_filtersnextr api_type)r$rrscls class_valuer rr3s r%rzCompletion._complete_inheriteds 66t~X\6]]"":.. ; F*77<< = t~a0 0 0 F))d);; W   F   MZ/K??JJJ   r'c`fd}t|}t|dt|}|d!d|D}||St jdd}|r)||dgSgS) aU To make it possible for people to have completions in doctests or generally in "Python" code in docstrings, we use the following heuristic: - Having an indented block of code - Having some doctest code that starts with `>>>` - Having backticks that doesn't have whitespace inside it c3Kd}D]m}|s*|ds|drtjdd|VndVttjd|}ndS)NFz>>> z ^( *>>> ?| +)z *>>>)rresubboolrK)linesinclude_next_linelrs r%iter_relevant_linesz;Completion._complete_in_string..iter_relevant_liness %  ? ?$ U(;(;q||C?P?P&!12q999999JJJ$('1)=)=$>$>!!  ? ?r'T)keependsrNcg|]}|dn| S)Nrr+rares r%rgz2Completion._complete_in_string..s "Y"Y"Y1944!"Y"Y"Yr'z `([^`\s]+)r)rr r_complete_code_linesr1searchgroup)r$rrYr7relevant_code_linesrKrs @r%rzCompletion._complete_in_strings ? ? ? ? ? $777 "#6#6z#B#BCC r " ."Y"YEX"Y"Y"Y ,,-@AA A -B88  ?,,ekk!nn-=>> > r'c2|jjd|}t |j|j||}t |j|||jd|j  S)Nr0)in_module_contextrSrzrcgSr-r+)argskwargss r%rz1Completion._complete_code_lines..sr')rrrrrD) rrparsejoinrrrL as_contextrrrN)r$rrz module_values r%r;zCompletion._complete_code_liness+399"''*:M:MNN &"2 1#!      !  # # % %! ( : :+     (** r'N)F)rT)T)r(r)r*rrNrrrrrrrrrrr;r+r'r%rLrLs,1*. . . `O-O-O-b \ \ \.III    FFF$666 TTTT 0Br'rLcNg}|D]}|jjdkrg}||jz } |S)N small_stmt)dfa from_ruler)rUrrs r%rrsA E&& > #| 3 3EE Z% %EE Lr'z^\w*(\'{3}|"{3}|\'|")cfd}|jkrdS|jdkr ||Sg}||jdkrd|jvs d|jvrt|jdkr ||Sd}|jsS|}|;|jdks0t d |jDsd}d fd |D|p||d n|jt|zfS|j d krn-| d ||}|dS) Nc|i}|jdkrd|jz |d<tj|jfi|}|sdS|d}|jdkr(d|j|zkrdSt||d||fS)NrrendposNNN)linecolumn _string_startrKrr=endr)rsrCrKstartrrs r%return_part_of_leafz<_extract_string_while_in_string..return_part_of_leafs 9 # #'{T[8F8 #DJ99&99 $## A 9 # # dkEIIKK6O(O(O##$T844UYY[[\\BD%OOr'rOrYr"'rr3c3K|]}|dvV dS)rubfNr+r:s r%rz2_extract_string_while_in_string..s&"R"R11;"R"R"R"R"R"Rr'r0c38K|]}t|VdSr-r)rar6rrs r%rz2_extract_string_while_in_string..#s.KKq-a::KKKKKKr'r) rrRrrMprefixrallrJrErrPinsert)rsrrrUleaves prefix_leafs ` r%rrs P P P P P$.   yH""4((( F   9 $ $#*;*;sdj?P?P4:""**4000K; '"4466 &+*:f*D*D""R"R 8I8O8O8Q8Q"R"R"RRR+E"&KKKKKFKKKKK#t"* 0A'h778  9 # #  a%%''1  2  r'cg}|D]s}||jD]}||z }|s(t |t r|t ||z }tt|}|D];}||vr5||jD]}||z }<|S)N) origin_scope)r(rnr is_stubrvr_complete_getattrr)rr rTrr python_valuesres r%rr3sGG''\5K'LL 0 0F   /  }} G:e\#B#B G  1, F F F "6**M 44 F??--\5K-LL 4 4 FMMOO3  r'cT|dp|d}tjd|D}|D][}|j}| |jdkr|D]-}|jdkr|jd}|jdkr(|jd }|jd} t|jd ks|jd ks |jd krq| jd} | jd kst| jdkr| } | jd } | jd } | | | j }td|Ds| | }t||ccS]gS)aV A heuristic to make completion for proxy objects work. This is not intended to work in all cases. It works exactly in this case: def __getattr__(self, name): ... return getattr(any_object, name) It is important that the return contains getattr directly, otherwise it won't work anymore. It's really just a stupid heuristic. It will not work if you write e.g. `return (getatr(o, name))`, because of the additional parentheses. It will also not work if you move the getattr to some other place that is not the return statement itself. It is intentional that it doesn't work in all cases. Generally it's really hard to do even this case (as you can see below). Most people will write it like this anyway and the other ones, well they are just out of luck I guess :) ~dave. __getattr____getattribute__c3>K|]}|VdSr-)infer)rar3s r%rz$_complete_getattr..Zs>##  ######r'Nr return_stmtr atom_exprrr3getattrrc3,K|]}|jdkVdS)paramN)r*r!s r%rz$_complete_getattr..ys)@@qzW,@@@@@@r')get_function_slot_namesr from_setsrnrRiter_return_stmtsrrMrrFgotorr infer_noder)rinstancerf functionsfuncrnrjrkatomrrr~ object_node name_node name_listobjectss r%rcrcDs( - -m < <E001CDD "#####I";";N   ) ; ; $6688 ; ;K=00#,Q/I~,,%a(D(+G9%&&!++tyF/B/BzY..&q)G|y((C0@,A,AA,E,Eoo''G!*1-K (+I Y 0CDDI@@i@@@@@  ((55G#L':: : : : : :; ;< Ir'Fc #K|ddD]l} g} |D]E} | | jkr8| j | jdvr|r | t|| z } Ft jd| |dd| }m|d} |D]} | j} |rtj | | |s|s| | krt| trd| D}n| g}|rt|}|D]Q}|r'tj||dt| |}ntj||}|r ||jkr|VRdS)Nr)module namespacezdot lookup on search %s from %s rCcg|] }|j Sr+r`)rars r%rgz$search_in_module..s333A333r')rUlike_name_lengthrE)r#rPr*rrir r rJr rKrvrrr rLrMNamerR)rSrqrf wanted_names wanted_typerNrDignore_importsconverts new_namesr last_namerYn2def_s r%search_in_modulers#2#      AAM!!;*qz=T/T/T*0U-"GGII   3Ycrc KKKR &&((I $$&&   fiuEEE  $*i$7$7!]++ 33333 -%e,,  ="-'"),Y!& DD#<<&>JJJ+r'cdg}|jdvrt|jD]\}}|jdkrT|dkr3|j|dz jdkr|j|dz jdkrI||jd|jdvr"|t ||S)N)rrdotted_as_nameimport_as_namer3rkeywordr)rr)rRr.rrrrr)r{rWindexchilds r%rrsN y^^^%dm44 E ELE5zV##AII$- ":"?9"L"L M%!)4:dBB%%ek2222CCC%%&rs5 //////******111111""""""......IIIIIIII555555------::::::@@@@@@@@KKKKKKKK333333''''''&&&&&*&&& 3 3 3,>;;; /// ssssssssl  344 ---`"===B9>38''''T     r'