o
    tBhc$                     @  s   U d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZ ddlmZ ddlmZm Z m!Z! e"d	Z#d
e$d< e"ddddgedddddR Z%d
e$d< G dd dZ&dS )zySemantic analysis of call-based Enum definitions.

This is conceptually part of mypy.semanal (semantic analyzer pass 2).
    )annotations)cast)Final)	ARG_NAMEDARG_POSMDEFAssignmentStmtCallExprContextDictExprEnumCallExpr
ExpressionListExpr
MemberExprNameExprRefExprStrExprSymbolTableNode	TupleExprTypeInfoVar)Options)SemanticAnalyzerInterface)ENUM_REMOVED_PROPSLiteralTypeget_proper_type)z	enum.Enumzenum.IntEnumz	enum.Flagzenum.IntFlagzenum.StrEnumr   
ENUM_BASESnamevalue_name__value_
__module____annotations____doc__	__slots____dict__ENUM_SPECIAL_PROPSc                   @  sR   e Zd Zd/ddZd0ddZd1ddZd2ddZd3d#d$Zd4d(d)Zd5d,d-Z	d.S )6EnumCallAnalyzeroptionsr   apir   returnNonec                 C  s   || _ || _d S N)r(   r)   )selfr(   r)    r.   h/var/www/html/riverr-enterprise-integrations-main/venv/lib/python3.10/site-packages/mypy/semanal_enum.py__init__:   s   
zEnumCallAnalyzer.__init__sr   is_func_scopeboolc                 C  s   t |jdkst|jd ttfsdS |jd }|j}| |j||}|du r)dS t|tr6| d| dS | j	
||| dS )zCheck if s defines an Enum; if yes, store the definition in symbol table.

        Return True if this looks like an Enum definition (but maybe with errors),
        otherwise return False.
           r   FNz'Enum type as attribute is not supportedT)lenlvalues
isinstancer   r   r   check_enum_callrvaluefailr)   
add_symbol)r-   r1   r2   lvaluer   	enum_callr.   r.   r/   process_enum_call>   s   "

z"EnumCallAnalyzer.process_enum_callnoder   var_namestrTypeInfo | Nonec                 C  s   t |tsdS |}|j}t |tsdS |j}|tvrdS | ||dd \}}}	|	s6| |g ||j	}
n.t
t|jd j}||ksE|rN|dt|j	 7 }| ||||j	}
||ks]|rd| j||
 t|
|||_|j| |j	|
_	|
S )zCheck if a call defines an Enum.

        Example:

          A = enum.Enum('A', 'foo bar')

        is equivalent to:

          class A(enum.Enum):
              foo = 1
              bar = 2
        N.r   @)r7   r	   calleer   fullnamer   parse_enum_call_argssplitbuild_enum_call_typeinfoliner   r   argsr   rA   r)   add_symbol_skip_localr   analyzedset_line)r-   r?   r@   r2   callrF   rG   itemsvaluesokinfor   r.   r.   r/   r8   R   s,   

z EnumCallAnalyzer.check_enum_callr   rQ   	list[str]rG   rK   intr   c           	      C  s|   | j |}|d usJ | j |||}| |_d|_|D ]}t|}||_d|_|j	 d| |_
tt||j|< q|S )NTrC   )r)   named_type_or_nonebasic_new_typeinfocalculate_metaclass_typemetaclass_typeis_enumr   rT   is_propertyrG   	_fullnamer   r   names)	r-   r   rQ   rG   rK   baserT   itemvarr.   r.   r/   rJ   |   s   
z)EnumCallAnalyzer.build_enum_call_typeinforP   r	   
class_name/tuple[list[str], list[Expression | None], bool]c                 C  s  |j }tdd |jD s| d| d|S t|dk r'| d| d|S t|dkr7| d| d|S g d	}|jD ]}||vrN| d
| d| q>d\}}t|j|D ]\}}|dkrc|}|dkri|}qY|du rr|d }|du rz|d }t|ts| | d|S g }	g }
t|tr|j	}|
dd D ]}|	| qnt|ttfr|j}tdd |D rdd |D }	ntdd |D r|D ]"}t|ttfsJ |j\}}t|tsJ |	|j	 |
| qn| d| |S t|tr#|jD ]!\}}t|ts| | d|  S |	|j	 |
| q nyt|d trt|d jtrt|d jj}|durct|trct|j	trc|j	}|
dd D ]}|	| qYn9|d jjrt|d jjtr|d jj}|
dd D ]}|	| qn| d| |S | d| |S t|	dkr| | d|S |
sdgt|	 }
t|	t|
ksJ |	|
dfS )zhParse arguments of an Enum call.

        Return a tuple of fields, values, was there an error.
        c                 S  s   g | ]}|t tfv qS r.   )r   r   ).0arg_kindr.   r.   r/   
<listcomp>       z9EnumCallAnalyzer.parse_enum_call_args.<locals>.<listcomp>zUnexpected arguments to z()   zToo few arguments for    zToo many arguments for )Nr   r^   modulequalnametypestartzUnexpected keyword argument "")NNr   r^   Nr   r4   z1() expects a string literal as the first argument, c                 s  s    | ]}t |tV  qd S r,   )r7   r   rd   seq_itemr.   r.   r/   	<genexpr>   s    z8EnumCallAnalyzer.parse_enum_call_args.<locals>.<genexpr>c                 S  s   g | ]}t t|jqS r.   )r   r   r   rq   r.   r.   r/   rf      rg   c                 s  s<    | ]}t |ttfot|jd kot |jd tV  qdS )rh   r   N)r7   r   r   r5   rQ   r   rq   r.   r.   r/   rs      s    
z>%s() with tuple or list expects strings or (name, value) pairsz-() with dict literal requires string literalszI%s() expects a string, tuple, list or dict literal as the second argumentz() needs at least one itemT)rL   all	arg_kindsfail_enum_call_argr5   	arg_nameszipr7   r   r   replacerI   appendr   r   rQ   r   r   r?   r   r   rl   r   rA   is_finalfinal_value)r-   rP   rb   rL   
valid_namearg_namer   r^   argrQ   rR   fieldsfield	seq_itemsrr   r   keyproper_typer.   r.   r/   rH      s   





"

"
z%EnumCallAnalyzer.parse_enum_call_argsmessagecontextr
   c                 C  s   |  || g g dfS )NF)r:   )r-   r   r   r.   r.   r/   rv      s   
z#EnumCallAnalyzer.fail_enum_call_argmsgctxc                 C  s   | j || d S r,   )r)   r:   )r-   r   r   r.   r.   r/   r:      s   zEnumCallAnalyzer.failN)r(   r   r)   r   r*   r+   )r1   r   r2   r3   r*   r3   )r?   r   r@   rA   r2   r3   r*   rB   )
r   rA   rQ   rU   rG   rA   rK   rV   r*   r   )rP   r	   rb   rA   r*   rc   )r   rA   r   r
   r*   rc   )r   rA   r   r
   r*   r+   )
__name__r!   __qualname__r0   r>   r8   rJ   rH   rv   r:   r.   r.   r.   r/   r'   9   s    



*

er'   N)'r#   
__future__r   typingr   typing_extensionsr   
mypy.nodesr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   mypy.optionsr   mypy.semanal_sharedr   
mypy.typesr   r   r   	frozensetr   r"   r&   r'   r.   r.   r.   r/   <module>   s>    P	
