o
    f                     @   sv   d Z ddlZddlZdd ejD Zg dZdZdZdd	 Zd
d Z	dd Z
dddZG dd dZG dd dZdS )aA  Utilities to compile possibly incomplete Python source code.

This module provides two interfaces, broadly similar to the builtin
function compile(), which take program text, a filename and a 'mode'
and:

- Return code object if the command is complete and valid
- Return None if the command is incomplete
- Raise SyntaxError, ValueError or OverflowError if the command is a
  syntax error (OverflowError and ValueError can be produced by
  malformed literals).

The two interfaces are:

compile_command(source, filename, symbol):

    Compiles a single command in the manner described above.

CommandCompiler():

    Instances of this class have __call__ methods identical in
    signature to compile_command; the difference is that if the
    instance compiles program text containing a __future__ statement,
    the instance 'remembers' and compiles all subsequent program texts
    with the statement in force.

The module also provides another class:

Compile():

    Instances of this class act like the built-in function compile,
    but with 'memory' in the sense described above.
    Nc                 C   s   g | ]}t t|qS  )getattr
__future__).0fnamer   r   /usr/lib/python3.10/codeop.py
<listcomp>&   s    r   )compile_commandCompileCommandCompileri   i @  c                 C   s  | dD ]}| }|r|d dkr nq|dkrd}t [ tdttf z| ||| W nB tys   z| |d || W Y W d    d S  typ } zdt|v rfW Y d }~Y W d    d S W Y d }~nd }~ww Y nw W d    n1 s~w   Y  | |||S )N
r   #evalpassignorezincomplete input)	splitstripwarningscatch_warningssimplefilterSyntaxWarningDeprecationWarningSyntaxErrorstr)compilersourcefilenamesymbollineer   r   r   _maybe_compile1   s8   
	r    c                 C   s4   t | }t |}d|v rd|v rdS ||krdS dS )Nzwas never closedFT)repr)err1err2rep1rep2r   r   r   _is_syntax_errorL   s   r&   c                 C   s   t | ||ttB S N)compilePyCF_DONT_IMPLY_DEDENTPyCF_ALLOW_INCOMPLETE_INPUTr   r   r   r   r   r   _compileU   s   r,   <input>singlec                 C   s   t t| ||S )a  Compile a command and determine whether it is incomplete.

    Arguments:

    source -- the source string; may contain \n characters
    filename -- optional filename from which source was read; default
                "<input>"
    symbol -- optional grammar start symbol; "single" (default), "exec"
              or "eval"

    Return value / exceptions raised:

    - Return a code object if the command is complete and valid
    - Return None if the command is incomplete
    - Raise SyntaxError, ValueError or OverflowError if the command is a
      syntax error (OverflowError and ValueError can be produced by
      malformed literals).
    )r    r,   r+   r   r   r   r	   X   s   r	   c                   @   s    e Zd ZdZdd Zdd ZdS )r
   zInstances of this class behave much like the built-in compile
    function, but if one is used to compile text containing a future
    statement, it "remembers" and compiles all subsequent program texts
    with the statement in force.c                 C   s   t tB | _d S r'   )r)   r*   flagsselfr   r   r   __init__r   s   zCompile.__init__c                 C   s<   t |||| jd}tD ]}|j|j@ r|  j|jO  _q|S )NT)r(   r/   	_featuresco_flagscompiler_flag)r1   r   r   r   codeobfeaturer   r   r   __call__u   s   zCompile.__call__N__name__
__module____qualname____doc__r2   r8   r   r   r   r   r
   m   s    r
   c                   @   s"   e Zd ZdZdd Zd	ddZdS )
r   a(  Instances of this class have __call__ methods identical in
    signature to compile_command; the difference is that if the
    instance compiles program text containing a __future__ statement,
    the instance 'remembers' and compiles all subsequent program texts
    with the statement in force.c                 C   s   t  | _d S r'   )r
   r   r0   r   r   r   r2      s   zCommandCompiler.__init__r-   r.   c                 C   s   t | j|||S )a  Compile a command and determine whether it is incomplete.

        Arguments:

        source -- the source string; may contain \n characters
        filename -- optional filename from which source was read;
                    default "<input>"
        symbol -- optional grammar start symbol; "single" (default) or
                  "eval"

        Return value / exceptions raised:

        - Return a code object if the command is complete and valid
        - Return None if the command is incomplete
        - Raise SyntaxError, ValueError or OverflowError if the command is a
          syntax error (OverflowError and ValueError can be produced by
          malformed literals).
        )r    r   )r1   r   r   r   r   r   r   r8      s   zCommandCompiler.__call__Nr-   r.   r9   r   r   r   r   r   |   s    r   r>   )r=   r   r   all_feature_namesr3   __all__r)   r*   r    r&   r,   r	   r
   r   r   r   r   r   <module>   s    "	
