o
    QEc                     @   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   Lib\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)Zerr1Zerr2Zrep1Z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_flagsZcompiler_flag)r-   r   r   r   ZcodeobZfeaturer   r   r   __call__u   s   zCompile.__call__N__name__
__module____qualname____doc__r.   r1   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   r,   r   r   r   r.      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   )r-   r   r   r   r   r   r   r1      s   zCommandCompiler.__call__Nr)   r*   r2   r   r   r   r   r   |   s    r   r7   )r6   r   r   Zall_feature_namesr/   __all__r%   r&   r    r"   r(   r	   r
   r   r   r   r   r   <module>   s    "	
