
    BNe3_                       d dl mZ d dl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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 d dl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& er
d dl'Z(d dlm)Z) g dZ* G d de
          Z+ G d de          Z, G d de          Z- G d de          Z. G d de          Z/ G d de0          Z1	 d dl2Z2 e3e2          Z4n# e5$ r g Z4Y nw xY wddZ6dS )     )annotationsN)Enum)TYPE_CHECKINGAnyCallableDictIterableListOptionalTuple)CompleteEvent	Completer
CompletionPathCompleter)SystemCompleter)compile)GrammarCompleter)Document)fragment_list_to_textto_formatted_text)get_jedi_script_from_document)_CompiledGrammar)PythonCompleterCompletePrivateAttributesHidePrivateCompleterc                      e Zd ZdZdZdZdZdS )r   zH
    Should we display private attributes in the completion pop-up?
    NEVERIF_NO_PUBLICALWAYSN)__name__
__module____qualname____doc__r   r   r        |/home/feoh/.cache/pypoetry/virtualenvs/veilid-python-play-bIboZq2W-py3.11/lib/python3.11/site-packages/ptpython/completer.pyr   r       s)          E!LFFFr%   r   c                  t     e Zd ZdZd fd	Zedd            Zedd            ZddZddZ	ddZ
ddZ xZS )r   z$
    Completer for Python code.
    get_globalsCallable[[], dict[str, Any]]
get_localsenable_dictionary_completionCallable[[], bool]returnNonec                   t                                                       || _        || _        || _        t                      | _        t          ||          | _        t          ||          | _
        d | _        d | _        d S N)super__init__r(   r*   r+   r   _system_completerJediCompleter_jedi_completerDictionaryCompleter_dictionary_completer_path_completer_cache_path_completer_grammar_cache)selfr(   r*   r+   	__class__s       r&   r2   zPythonCompleter.__init__/   sz     	&$,H)!0!2!2,[*EE%8j%Q%Q">B"FJ***r%   r   c                    | j         9t          | j        t          d          t          d          d          | _         | j         S )NT)
expanduservar1var2)r8   r   _path_completer_grammarr   r:   s    r&   _path_completerzPythonCompleter._path_completerB   sT    %-)9,)T:::)T::: * *D& ))r%   r   c                P    | j         |                                 | _         | j         S )zb
        Return the grammar for matching paths inside strings inside Python
        code.
        )r9   _create_path_completer_grammarrB   s    r&   rA   z'PythonCompleter._path_completer_grammarN   s*     -5151T1T1V1VD.11r%   c                N    d
d}d
d}d
d}d}t          |||d||d	          S )Ntextstrr-   c                .    t          j        dd|           S )Nz\\(.)z\1)resubrG   s    r&   	unwrapperzAPythonCompleter._create_path_completer_grammar.<locals>.unwrapper[   s    6(E4000r%   c                V    |                      dd                               dd          S )N\\\'z\'replacerL   s    r&   single_quoted_wrapperzMPythonCompleter._create_path_completer_grammar.<locals>.single_quoted_wrapper^   &    <<f--55c5AAAr%   c                V    |                      dd                               dd          S )NrO   rP   "z\"rR   rL   s    r&   double_quoted_wrapperzMPythonCompleter._create_path_completer_grammar.<locals>.double_quoted_wrappera   rU   r%   a  
                # Text before the current string.
                (
                    [^'"#]                                  |  # Not quoted characters.
                    '''  ([^'\\]|'(?!')|''(?!')|\\.])*  ''' |  # Inside single quoted triple strings
                    "" " ([^"\\]|"(?!")|""(?!^)|\\.])* "" " |  # Inside double quoted triple strings

                    \#[^\n]*(\n|$)           |  # Comment.
                    "(?!"") ([^"\\]|\\.)*"   |  # Inside double quoted strings.
                    '(?!'') ([^'\\]|\\.)*'      # Inside single quoted strings.

                        # Warning: The negative lookahead in the above two
                        #          statements is important. If we drop that,
                        #          then the regex will try to interpret every
                        #          triple quoted string also as a single quoted
                        #          string, making this exponentially expensive to
                        #          execute!
                )*
                # The current string that we're completing.
                (
                    ' (?P<var1>([^\n'\\]|\\.)*) |  # Inside a single quoted string.
                    " (?P<var2>([^\n"\\]|\\.)*)    # Inside a double quoted string.
                )
        r>   )escape_funcsunescape_funcs)rG   rH   r-   rH   )compile_grammar)r:   rM   rT   rX   grammars        r&   rE   z.PythonCompleter._create_path_completer_grammarZ   s    	1 	1 	1 	1	B 	B 	B 	B	B 	B 	B 	B2 "7AVWW$-yAA
 
 
 	
r%   documentr   boolc                h    |j         }t          |j        o|                                p|dv           S )Nz/.~)char_before_cursorr^   rG   isalnum)r:   r]   r`   s      r&   _complete_path_while_typingz+PythonCompleter._complete_path_while_typing   sB    %8M N#++--L1Cu1L
 
 	
r%   c                r    |j         }|dd         }t          |o|                                p|dv           S )zp
        When `complete_while_typing` is set, only return completions when this
        returns `True`.
        Nz_.([,)text_before_cursorr^   ra   )r:   r]   rG   r`   s       r&   _complete_python_while_typingz-PythonCompleter._complete_python_while_typing   sL    
 *!"##YT(0022S6HG6S
 
 	
r%   complete_eventr   Iterable[Completion]c              #    K   |j                                                             d          rG| j                            t          |j         dd         |j        dz
            |          E d{V  dS |j        s|                     |          rG| 	                                r3d}| j
                            ||          D ]}|j         dvrd}|V  |rdS |j        s|                     |          r!| j                            ||          E d{V  |j        s|                     |          rD| j                            |j                  s#| j                            ||          E d{V  dS dS dS )z)
        Get Python completions.
        !   N)rG   cursor_positionFz[.T)rG   lstrip
startswithr3   get_completionsr   rl   completion_requestedrf   r+   r7   rb   rC   rA   matchre   r5   )r:   r]   rg   has_dict_completionscs        r&   ro   zPythonCompleter.get_completions   s,      =!!,,S11 	-==!qrr*H<TWX<X   	         F . 	$2T2T3
 3
 	 0022 ',$3CCn   A vT)) 04,GGGG' F . 	V$2R2R3
 3
 	V +;;HnUUUUUUUUU . 	$2T2T3
 3
 	 /55h6QRR /??n           		 	r%   )r(   r)   r*   r)   r+   r,   r-   r.   )r-   r   )r-   r   )r]   r   r-   r^   r]   r   rg   r   r-   rh   )r    r!   r"   r#   r2   propertyrC   rA   rE   rb   rf   ro   __classcell__r;   s   @r&   r   r   *   s         K K K K K K& 	* 	* 	* X	* 	2 	2 	2 X	2'
 '
 '
 '
R
 
 
 
	
 	
 	
 	
0 0 0 0 0 0 0 0r%   r   c                  ,     e Zd ZdZd fdZddZ xZS )r4   z3
    Autocompleter that uses the Jedi library.
    r(   r)   r*   r-   r.   c                d    t                                                       || _        || _        d S r0   )r1   r2   r(   r*   )r:   r(   r*   r;   s      r&   r2   zJediCompleter.__init__   s.    
 	&$r%   r]   r   rg   r   rh   c           
   #    K   t          ||                                 |                                           }|r4	 |                    |j        |j        dz             }t          |d           }|D ]{}|j        dk    rd}nd}|j        dk    rd	}t          |j	        t          |j                  t          |j	                  z
  |j	        |z   |j        t          |          
          V  |d S # t          $ r Y d S t          $ r Y d S t          $ r Y d S t          $ r Y d S t           $ r Y d S t"          $ r Y d S t$          $ r Y d S t&          $ r Y d S t(          $ r Y d S t*          $ r Y d S w xY wd S )Nrk   )columnlinec                |    | j         dk    | j                            d          | j                                        fS )Nparam_)typenamern   name_with_symbolslower)jcs    r&   <lambda>z/JediCompleter.get_completions.<locals>.<lambda>  s8    7***3//,2244$ r%   keyfunction() r~   ...)displaydisplay_metastyle)r   r*   r(   completecursor_position_colcursor_position_rowsortedr   r   r   len_get_style_for_jedi_completion	TypeErrorUnicodeDecodeErrorAttributeError
ValueErrorKeyErrorOSErrorAssertionErrorSystemErrorNotImplementedError	Exception)r:   r]   rg   scriptjedi_completionsr   suffixs          r&   ro   zJediCompleter.get_completions   s]      /doo'')9)9););
 
  G	F#)??#7!59 $3 $ $ T $*$ 
$ 
$ 
$  +  Bw*,,!%!#w'))!&$,BK((3r/C+D+DD " 4v =%'W<R@@       e     %    !              !        &      OG	 G	sG   $C2 2
E,?	E,	E,	E,#	E,/	E,;	E,	E,	E,	E,+E,r(   r)   r*   r)   r-   r.   rt   )r    r!   r"   r#   r2   ro   rv   rw   s   @r&   r4   r4      sc         % % % % % %N N N N N N N Nr%   r4   c                  d     e Zd ZdZd f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 xZS )%r6   a  
    Experimental completer for Python dictionary keys.

    Warning: This does an `eval` and `repr` on some Python expressions before
             the cursor, which is potentially dangerous. It doesn't match on
             function calls, so it only triggers attribute access.
    r(   r)   r*   r-   r.   c                   t                                                       || _        || _        d}d| d| d}t	          j        d| dt          j                  | _        t	          j        d| dt          j                  | _        t	          j        d| d	t          j                  | _	        t	          j        d| d
t          j                  | _
        d S )Nz[a-zA-Z_][a-zA-Z0-9_]*a@  
            # Any expression safe enough to eval while typing.
            # No operators, except dot, and only other dict lookups.
            # Technically, this can be unsafe of course, if bad code runs
            # in `__getattr__` or ``__getitem__``.
            (
                # Variable name
                zr

                \s*

                (?:
                    # Attribute access.
                    \s* \. \s* ap   \s*

                    |

                    # Item lookup.
                    # (We match the square brackets. The key can be anything.
                    # We don't care about matching quotes here in the regex.
                    # Nested square brackets are not supported.)
                    \s* \[ [^\[\]]+ \] \s*
                )*
            )
        z4
                for \s+ ([a-zA-Z0-9_]+) \s+ in \s+ z \s* :
            z
                z
                $
            z

                # Dict loopup to complete (square bracket open + start of
                # string).
                \[
                \s* ([^\[\]]*)$
            z

                # Attribute loopup to complete (dot + varname).
                \.
                \s* ([a-zA-Z0-9_]*)$
            )r1   r2   r(   r*   rJ   r   VERBOSEfor_loop_patternexpression_patternitem_lookup_patternattribute_lookup_pattern)r:   r(   r*   varname
expressionr;   s        r&   r2   zDictionaryCompleter.__init__1  s1   
 	&$ ,   !(  
: !#
4>   J	!
 !
 #%*   J#
 #
 $&:   J
$
 
$
  )+
   J	)
 	)
%%%r%   r   rH   temp_localsdict[str, Any]objectc                    	 t          |                                |                                 |          S # t          $ r Y dS w xY w)zw
        Do lookup of `object_var` in the context.
        `temp_locals` is a dictionary, used for the locals.
        N)evalstripr(   BaseException)r:   r   r   s      r&   _lookupzDictionaryCompleter._lookup  sS    
	
((**D,<,<,>,>LLL 	 	 	44	s   47 
AAr]   r   rg   r   rh   c              #    K   |                                                                  }| j                            |j                  D ]X}|                                \  }}|                     ||          }t          |t          t          f          r|r|d         ||<   Y| 
                    |||          E d {V  |                     |||          E d {V  |                     |||          E d {V  d S )Nr   )r*   copyr   finditerre   groupsr   
isinstancelisttuple_get_expression_completions_get_item_lookup_completions_get_attribute_completions)r:   r]   rg   r   rq   r   r   expression_vals           r&   ro   z#DictionaryCompleter.get_completions  sa      oo'',,..*33H4OPP 	9 	9E"',,..GZ!\\*kBBN .4-88 9^ 9'5a'8G$ 33nk
 
 	
 	
 	
 	
 	
 	
 	
 44nk
 
 	
 	
 	
 	
 	
 	
 	
 22nk
 
 	
 	
 	
 	
 	
 	
 	
 	
 	
r%   objc                f    	 t          t          |                    S # t          $ r t          w xY wr0   )rH   reprr   ReprFailedError)r:   r   s     r&   _do_reprzDictionaryCompleter._do_repr  s:    	"tCyy>>! 	" 	" 	"!!	"s    0localsc                    | j                             |j                  }|0|                                d         }|                     ||          S dS )z
        Evaluate
        Nr   )r   searchre   r   r   )r:   r]   r   rq   
object_vars        r&   eval_expressionz#DictionaryCompleter.eval_expression  sN     '..x/JKK*J<<
F333tr%   c              #     K   |                      ||          }|`t          |t          t          t          t
          j        t
          j        f          rt          dd          V  dS t          dd          V  dS dS )z?
        Complete the [ or . operator after an object.
        N[r   .)	r   r   r   r   dictcollections_abcMappingSequencer   )r:   r]   rg   r   results        r&   r   z/DictionaryCompleter._get_expression_completions  s       %%h<<udO$;_=UV  	) !a(((((((
 !a((((((( r%   c           
   #     K   d fd} j                             |j                  }|'|                                \  }}                     ||          }t          |t          t          j        f          r|}	||dz   |dz   fD ]/}
	 t          j
        |
          }	 n# t          t          f$ r Y ,w xY w|                                D ]\  }
}t          |
                              t          |	                    rZ	                      |
          }t#          |d	z   t%          |           d
| d	 ||                    V  ~# t&          $ r Y w xY wdS t          |t(          t*          t          j        f          r|r|                                rt1          t3          t%          |          d                    D ]}
t          |
                              |          rk	                      |
          }t#          |d	z   t%          |           d
| d	 |||
                             V  t# t4          $ r Y t&          $ r Y w xY wdS dS dS dS )z+
        Complete dictionary keys.
        valuer   r-   Callable[[], str]c                     d fd}|S )z4Abbreviate meta text, make sure it fits on one line.r-   rH   c                 x                                   } d| v r|                     dd          d         dz   } | S )N
rk   r   r   )r   split)rG   r:   r   s    r&   get_value_reprz[DictionaryCompleter._get_item_lookup_completions.<locals>.meta_repr.<locals>.get_value_repr  sA    }}U++ 4<<::dA..q1E9Dr%   )r-   rH   r$   )r   r   r:   s   ` r&   	meta_reprzCDictionaryCompleter._get_item_lookup_completions.<locals>.meta_repr  s/           "!r%   NrW   rQ   ]r   )r   r   i  )r   r   r-   r   )r   r   re   r   r   r   r   r   r   astliteral_evalSyntaxErrorr   itemsrH   rn   r   r   r   r   r   r   r   isdigitrangeminr   )r:   r]   rg   r   r   rq   r   r   r   key_objkvk_reprs   `            r&   r   z0DictionaryCompleter._get_item_lookup_completions  s     	" 	" 	" 	" 	" 	"$ (//0KLL#llnnOJ \\*k::F &4)@"ABB *%sSy#)4  A"%"21"5"5  (4 ! ! ! !
 #LLNN ! !DAq1vv((W66 
!	!%)]]1%5%5F", &!$S	(5F-6Yq\\	# # #      / ! ! ! D!
!! ! FT5/2J$KLL % %ckkmm %"3s6{{D#9#9:: % %q66,,S11 %%)-q)9)9&0$*SL%(XXI,9MMM1:6!91E1E	'" '" '" !" !" !" !" $, % % % !%#2 % % % $%%G @% %% %% %s>   
B  B43B4 AE		
EE(AH77
I	IIc              #    K   | j                             |j                  }||                                \  }}|                     ||          |                     t                              }dfd}|D ]I}	|	                    |          r0 ||	          }
t          |	t          |           |	|
z             V  HdS dS )z+
        Complete attribute names.
        Nr   rH   r-   c                    	 t          | d           }t          j        |          st          j        |          rdS t	          |t
          j                  rdS t	          |t
          j                  rdS n#  Y nxY wdS )Nr   z{}z[]r   )getattrinspect
isfunctionismethodr   r   r   r   )r   r   r   s     r&   
get_suffixzBDictionaryCompleter._get_attribute_completions.<locals>.get_suffix6  s    	!&$55C)#.. $'2B32G2G $#t!#'>?? $#t!#'?@@ $#t$Drs   9A7 A7 A7 7A;)r   )r   rH   r-   rH   )
r   r   re   r   r   _sort_attribute_namesdirrn   r   r   )r:   r]   rg   r   rq   r   	attr_namenamesr   r   r   r   s              @r&   r   z.DictionaryCompleter._get_attribute_completions$  s       -44X5PQQ$)LLNN!J	 \\*k::F..s6{{;;E       S S??9-- S'Z--F$TC	NN?D6MRRRRRR1 *S Sr%   r   	list[str]c                ,    dd}t          ||          S )z~
        Sort attribute names alphabetically, but move the double underscore and
        underscore names to the end.
        r   rH   r-   tuple[int, str]c                n    |                      d          rd| fS |                      d          rd| fS d| fS )N__   r   rk   r   )rn   )r   s    r&   sort_keyz;DictionaryCompleter._sort_attribute_names.<locals>.sort_keyN  sH    t$$ !4y s## !4y t9r%   r   )r   rH   r-   r   )r   )r:   r   r   s      r&   r   z)DictionaryCompleter._sort_attribute_namesH  s+    	 	 	 	 e****r%   r   )r   rH   r   r   r-   r   rt   )r   r   r-   rH   )r]   r   r   r   r-   r   )r]   r   rg   r   r   r   r-   rh   )r   r   r-   r   )r    r!   r"   r#   r2   r   ro   r   r   r   r   r   r   rv   rw   s   @r&   r6   r6   (  s         S
 S
 S
 S
 S
 S
j   
 
 
 
8" " " "	 	 	 	) ) ) ).N% N% N% N%`"S "S "S "SH+ + + + + + + +r%   r6   c                  "    e Zd ZdZddZddZdS )r   z
    Wrapper around completer that hides private fields, depending on whether or
    not public fields are shown.

    (The reason this is implemented as a `Completer` wrapper is because this
    way it works also with `FuzzyCompleter`.)
    	completerr   complete_private_attributes'Callable[[], CompletePrivateAttributes]r-   r.   c                "    || _         || _        d S r0   )r   r   )r:   r   r   s      r&   r2   zHidePrivateCompleter.__init__a  s    
 #+F(((r%   r]   r   rg   r   rh   c                (   t          | j                            ||                    }|                                 }d}d
d|t          j        k    rd}n+|t          j        k    rt          fd|D                       }|rfd	|D             }|S )NF
completionr   r-   r^   c                n    t          t          | j                            }|                    d          S )Nr   )r   r   r   rn   )r   rG   s     r&   
is_privatez8HidePrivateCompleter.get_completions.<locals>.is_privatep  s-    ()::;M)N)NOOD??3'''r%   Tc              3  0   K   | ]} |           V  d S r0   r$   .0r   r   s     r&   	<genexpr>z7HidePrivateCompleter.get_completions.<locals>.<genexpr>x  s0      XXj::j#9#99XXXXXXr%   c                *    g | ]} |          |S r$   r$   r  s     r&   
<listcomp>z8HidePrivateCompleter.get_completions.<locals>.<listcomp>{  s8       )

:@V@V  r%   )r   r   r-   r^   )r   r   ro   r   r   r   r   any)r:   r]   rg   completionsr   hide_privater   s         @r&   ro   z$HidePrivateCompleter.get_completionsi  s     4>99(NSSTT&*&F&F&H&H#	( 	( 	( 	( '*C*IIILL(,E,RRRXXXXKXXXXXL 	   -8  K r%   N)r   r   r   r   r-   r.   rt   )r    r!   r"   r#   r2   ro   r$   r%   r&   r   r   X  sJ         G G G G     r%   r   c                      e Zd ZdZdS )r   z;Raised when the repr() call in `DictionaryCompleter` fails.N)r    r!   r"   r#   r$   r%   r&   r   r     s        AAAAr%   r   jedi_completionjedi.api.classes.Completionr-   rH   c                p    | j         }| j        dk    rdS |t          v rdS t          j        |          rdS dS )z7
    Return completion style to use for this name.
    r~   zclass:completion.paramzclass:completion.builtinzclass:completion.keywordr   )r   r   _builtin_nameskeyword	iskeyword)r  r   s     r&   r   r     sO     ,Dw&&''~)) *))2r%   )r  r  r-   rH   )7
__future__r   r   collections.abcabcr   r   r  rJ   enumr   typingr   r   r   r   r	   r
   r   r   prompt_toolkit.completionr   r   r   r   (prompt_toolkit.contrib.completers.systemr   1prompt_toolkit.contrib.regular_languages.compilerr   r[   3prompt_toolkit.contrib.regular_languages.completionr   prompt_toolkit.documentr   prompt_toolkit.formatted_textr   r   ptpython.utilsr   jedi.api.classesjedir   __all__r   r   r4   r6   r   r   r   builtinsr   r  ImportErrorr   r$   r%   r&   <module>r"     s   " " " " " " 



 ) ) ) ) ) )   				       V V V V V V V V V V V V V V V V V V V V            E D D D D D X X X X X X P P P P P P , , , , , , R R R R R R R R 8 8 8 8 8 8 SRRRRRR
R
R
R       [ [ [ [ [i [ [ [|] ] ] ] ]I ] ] ]@m+ m+ m+ m+ m+) m+ m+ m+`	' ' ' ' '9 ' ' 'TB B B B Bi B B BOOOS]]NN   NNN     s   C C('C(