o
    qoin                     @   s8  d Z ddlZddlZddlmZmZ ddlZG dd dejdZ	ej
ddG d	d
 d
e	Zej
ddG dd de	Zej
ddG dd de	Zej
ddG dd de	Zdeeeee e	f  dee dee fddZej
ddG dd de	Zej
ddG dd de	Zej
ddG dd de	ZdS )zVery minimal AST library.

We are transitioning to LibCST, so please don't use this library. It is only for
supporting older code.
    N)ListUnionc                   @   s(   e Zd ZdZejdee fddZdS )CodegenNodezSuper-lightweight codegen node.returnc                 C   s   dS )zReturns lines of code for this element.

    If the final lines should be indented, any outer nodes should modify the
    output of this method.

    Returns:
      Lines of code.
    N selfr   r   P/home/ubuntu/.local/lib/python3.10/site-packages/fiddle/_src/codegen/mini_ast.pylines    s   
zCodegenNode.linesN)	__name__
__module____qualname____doc__abcabstractmethodr   strr
   r   r   r   r	   r      s    r   )	metaclassT)frozenc                   @   s"   e Zd ZdZdee fddZdS )Noopz2No-op node, when emitting something is convenient.r   c                 C   s   g S Nr   r   r   r   r	   r
   1   s   z
Noop.linesN)r   r   r   r   r   r   r
   r   r   r   r	   r   -   s    r   c                   @   s4   e Zd ZU dZeed< eed< dee fddZdS )
Assignmentz5Assigns an expression to a left-hand-side expression.lhsexprr   c                 C   s   | j  d| j gS )Nz = )r   r   r   r   r   r	   r
   ;      zAssignment.linesNr   r   r   r   r   __annotations__r   r
   r   r   r   r	   r   5   
   
 r   c                   @   s,   e Zd ZU dZeed< dee fddZdS )
ReturnStmtzReturns an expression.r   r   c                 C   s   d| j  gS )Nzreturn )r   r   r   r   r	   r
   D   s   zReturnStmt.linesNr   r   r   r   r	   r   ?   s   
 r   c                   @   s4   e Zd ZU dZeed< eed< dee fddZdS )TrailingCommentz=Attaches a trailing comment to the last line of another node.childcommentr   c                 C   sB   d| j  }| j }|rg |d d |d  d| S |gS )Nz#   )r    r   r
   )r   r    r
   r   r   r	   r
   N   s   
,zTrailingComment.linesN)	r   r   r   r   r   r   r   r   r
   r   r   r   r	   r   H   r   r   sub_nodes_or_lines	separatorr   c                 C   s   t d| } g }t| D ]?\}}|dkr|| t|tr#|| qt|tr7tdd |D r7|| qt|trD||	  qt
d| |S )a  Helper to generate lines for a block of code.

  Args:
    sub_nodes_or_lines: Items to join, which are either string constants or
      codegen nodes.
    separator: Lines to insert between items to join.

  Returns:
    List of lines, taken from `sub_nodes_or_lines`.
  Nr   c                 s   s    | ]}t |tV  qd S r   )
isinstancer   ).0xr   r   r	   	<genexpr>i   s    zblock.<locals>.<genexpr>z'Unsupported item in argument to block: )filter	enumerateextendr%   r   appendlistallr   r
   	TypeError)r#   r$   resultiitemr   r   r	   blockT   s   



r3   c                   @   s0   e Zd ZU dZee ed< dee fddZdS )ImmediateAttrsBlockzGBlock of code setting up immediate objects (as opposed to nested ones).nodesr   c                 C   s   t | jg S r   )r3   r5   r   r   r   r	   r
   w   s   zImmediateAttrsBlock.linesN	r   r   r   r   r   r   r   r   r
   r   r   r   r	   r4   r   s   
 r4   c                   @   s<   e Zd ZU dZee ed< ee ed< dee fddZdS )SharedThenResultAssignmentz4Block of code setting shared instances, then a tree.shared_instancestree_blocksr   c                 C   s   t | j| j dgS )N )r3   r8   r9   r   r   r   r	   r
      r   z SharedThenResultAssignment.linesNr6   r   r   r   r	   r7   {   s
   
 r7   c                   @   s>   e Zd ZU dZeej ed< ee ed< dee	 fddZ
dS )ConfigBuilderzqTop-level node for imports, followed by builder code.

  By default, this generates a `build_config()` method.
  importsbuilder_bodyr   c                 C   sL   t j| jdj }dd t| jdgD }tt|gg dg| gddgS )N)bodyc                 S   s   g | ]}d | qS )r"   r   )r&   liner   r   r	   
<listcomp>   s    z'ConfigBuilder.lines.<locals>.<listcomp>r:   zdef build_config():)cstModuler<   code
splitlinesr3   r=   )r   import_linesfn_bodyr   r   r	   r
      s
   zConfigBuilder.linesN)r   r   r   r   r   rA   SimpleStatementLiner   r   r   r
   r   r   r   r	   r;      s
   
 r;   )r   r   dataclassestypingr   r   libcstrA   ABCMetar   	dataclassr   r   r   r   r   r3   r4   r7   r;   r   r   r   r	   <module>   s2   


	




	