o
    [h                     @   s   d dl Z d dlZd dlmZ d dlmZ edejZedZ	dd Z
dd	 Zd
d ZdddZdd ZedddZedddZdS )    N)deque)contextmanageraZ  
(
 (?:                     # Start of non-capturing group
  (?:\r\n|\r|\n)      |  # Match any single newline, or
  [^\r\n'"]+          |  # Match any character series without quotes or
                         # newlines, or
  "(?:[^"\\]|\\.)*"   |  # Match double-quoted strings, or
  '(?:[^'\\]|\\.)*'      # Match single quoted strings
 )
)
z(\r\n|\r|\n)c                 C   sR   t | }t|}dg}|D ]}|sqt|r|d q|d  |7  < q|S )zSplit a string on all unquoted newlines.

    Unlike str.splitlines(), this will ignore CR/LF/CR+LF if the requisite
    character is inside of a string. )strSPLIT_REGEXsplit
LINE_MATCHmatchappend)stmttextlinesZoutputlinesline r   u/home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/sqlparse/utils.pysplit_unquoted_newlines$   s   

r   c                 C   s8   | du rdS | d dv r| d | d kr| dd } | S )z4Helper that removes surrounding quotes from strings.Nr   )"'`r      r   )valr   r   r   remove_quotes6   s
   r   c                     s    fdd}|S )zqFunction decorator to help with recursion

    :param cls: Classes to not recurse over
    :return: function
    c                    s    fddS )Nc                    s,   |   D ]}t| s| q|  d S N)Zget_sublists
isinstance)ZtlistZsgroup)clsf	wrapped_fr   r   r   F   s
   
z(recurse.<locals>.wrap.<locals>.wrapped_fr   )r   r   )r   r   r   wrapE   s   zrecurse.<locals>.wrapr   )r   r   r   r   r   recurse?   s   	r    c                    s    du rdS |rt  |rdS |r+t |tr$t fdd|D r#dS n j| r+dS |rHt |trAt fdd|D r?dS dS  j|v rHdS dS )a  Helper function to simplify comparisons Instance, Match and TokenType
    :param token:
    :param i: Class or Tuple/List of Classes
    :param m: Tuple of TokenType & Value. Can be list of Tuple for multiple
    :param t: TokenType or Tuple/List of TokenTypes
    :return:  bool
    NFTc                 3   s    | ]} j | V  qd S r   )r
   ).0patterntokenr   r   	<genexpr>_       zimt.<locals>.<genexpr>c                 3   s    | ]} j |v V  qd S r   )ttype)r!   r'   r#   r   r   r%   e   r&   )r   listanyr
   r'   )r$   imtr   r#   r   imtQ   s&   



r-   c                 C   s   t t| |dd dS )zCAdvance the iterator n-steps ahead. If n is none, consume entirely.r   )maxlenN)r   	itertoolsislice)iteratornr   r   r   consumel   s   r3   c                 c   (    |  j |7  _ d V  |  j |8  _ d S r   )offsetfilter_r2   r   r   r   r5   q      r5   r   c                 c   r4   r   )indentr6   r   r   r   r9   x   r8   r9   )NNN)r   )r   )r/   recollectionsr   
contextlibr   compileVERBOSEr   r	   r   r   r    r-   r3   r5   r9   r   r   r   r   <module>   s"   


	
