
                             d Z ddlmZ ddlmZ ddlmZ ddlZdZdZdZd	Z	 G d
 dej                        Zd Z G d de      Zd Zd Zy)zgcloud shell completion.    )absolute_import)division)unicode_literalsN\)"');&|()<>c                   (    e Zd ZdZdZdZdZdZdZdZ	y)	ShellTokenType                     N)
__name__
__module____qualname__ARGFLAG
TERMINATORIOREDIRECTIONFILETRAILING_BACKSLASH     3lib/googlecloudsdk/command_lib/interactive/lexer.pyr   r      s&    	#	
$*"+	
$r#   r   c                     | S )zProcesses a quoted shell argument from the lexer.

  Args:
    s: the raw quoted string (ex: "\"foo\" \\ 'bar'")

  Returns:
    An argument as would be passed from a shell to a process it forks
    (ex: "foo" \ 'bar').

  r"   )ss    r$   UnquoteShellr'   )   s	     
(r#   c                   D    e Zd ZdZej
                  ddfdZd Zd Zd Z	y)
ShellTokenzShell token info.

  Attributes:
    value: The token string with quotes and escapes preserved.
    lex: Instance of ShellTokenType
    start: the index of the first char of the raw value
    end: the index directly after the last char of the raw value
  Nc                 <    || _         || _        || _        || _        y N)valuelexstartend)selfr,   r-   r.   r/   s        r$   __init__zShellToken.__init__B   s    DJDHDJDHr#   c                     | j                   t        j                  u s| j                   t        j                  u rt	        | j
                        S | j
                  S r+   )r-   r   r   r   r'   r,   r0   s    r$   UnquotedValuezShellToken.UnquotedValueH   s>    xx>%%%^5H5H)H$**%%ZZr#   c                 b    t        || j                        r| j                  |j                  k(  S y)zEquality based on properties.F)
isinstance	__class____dict__)r0   others     r$   __eq__zShellToken.__eq__N   s&    %(]]enn,,r#   c                 z    dj                  | j                  | j                  | j                  | j                        S )zImprove debugging during tests.zShellToken({}, {}, {}, {}))formatr,   r-   r.   r/   r3   s    r$   __repr__zShellToken.__repr__T   s0    '..tzz488/3zz488E Er#   )
r   r   r   __doc__r   r   r1   r4   r:   r=   r"   r#   r$   r)   r)   8   s+     !/ 2 2$D Er#   r)   c                    | }	 | t        |      k\  r%| |kD  rt        dt        j                  | dz
  |       S y||    }|j	                         sn| dz  } O| }t        |      dz
  | k(  r,||    dk(  r$| dz  } t        |||  t        j
                  ||       S |t        v s/|j                         r| dz   t        |      k  r|| dz      t        v r| }||    j                         r| dz  } | t        |      k  r||    t        v r| dz  } | t        |      k  r*||    t        v r| dz  } | t        |      k  r||    t        v r| t        |      dz
  k  r4||    dk(  r,|| dz      j                         r| dz  } t        j                  }nt        j                  }t        |||  |||       S |} |t        v r%| dz  } t        |||  t        j                  ||       S d}| t        |      k  ri||    }||k(  rd}nH|F|t        v r|}n;|t        k(  r| dz   t        |      k  r| dz  } nn.|j	                         rn|t        v rn| dz  } | t        |      k  ri||   dk(  rt        j                  nt        j                  }t        |||  |||       S )	zReturns the next shell token at s[i:].

  Args:
    i: The index of the next character in s.
    s: The string to parse for shell tokens.

  Returns:
   A ShellToken, None if there are no more token in s.
   r   Nr   r
   r   )r.   r/   -)lenr)   r   r   isspacer!   SHELL_REDIRECTION_CHARSisdigitr   r   SHELL_TERMINATOR_CHARSr   SHELL_QUOTE_CHARSSHELL_ESCAPE_CHARr   )ir&   indexcr-   quotes         r$   GetShellTokenrM   Z   s    %CF{	
U"n00!a%;;	!A99;FA 	 % 	VaZ1_1FAaaj."C"CUANN ""aiika!ec!fnAh))Et||~1fa3q6zad551faAJ1Q4#::	Q AJ1Q4#::	
SVaZAaDCKAa!eH,<,<,>	Q((%
Cu!<<A 
  FAaaj.";";5aPP %	CF
	!AEze		
	!!Q3Q<
q&! 99;&&FA# 	
CF
$  !x3N4F4F#	AeAJ5a	88r#   c                 *   g }d}	 t        ||       }|s	 |S |j                  }|j                  |       |j                  t        j
                  k(  rCt        ||       }|s	 |S |j                  }t        j                  |_        |j                  |       )zReturns the list of ShellTokens in s.

  Args:
    s: The string to parse for shell tokens.

  Returns:
    The list of ShellTokens in s.
  r   )rM   r/   appendr-   r   r   r    )r&   tokensrI   tokens       r$   GetShellTokensrR      s     &!!QE 
- 			A
MM%yyN...Aq!e 
- ))a %%eimmE 	r#   )r>   
__future__r   r   r   enumrH   rG   rF   rD   Enumr   r'   objectr)   rM   rR   r"   r#   r$   <module>rW      s`      &  '    - $ TYY E EDH9Vr#   