o
    7f$                     @  s   U d Z ddlmZ ddlmZ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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)Finalcast)	ARG_NAMEDARG_POSMDEFAssignmentStmtCallExprContextDictExprEnumCallExpr
ExpressionListExpr
MemberExprNameExprRefExprStrExprSymbolTableNode	TupleExprTypeInfoVaris_StrExpr_list)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/   J/home/ertert/spirit/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.   r2   r3   lvaluer   	enum_callr/   r/   r0   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 \}}}	|	sC|}
|r9|
dt|j	 7 }
| 
|
g ||j	}n!tt|jd j}
|
|ksR|r[|
dt|j	 7 }
| 
|
|||j	}|
|ksj|rq| 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   )r8   r	   calleer   fullnamer   parse_enum_call_argssplitrB   linebuild_enum_call_typeinfor   r   argsr   r*   add_symbol_skip_localr   analyzedset_line)r.   r@   rA   r3   callrG   rH   itemsvaluesokr   infor/   r/   r0   r9   R   s2   

z EnumCallAnalyzer.check_enum_callr   rR   	list[str]rH   rK   intr   c           	      C  s|   | j |}|d usJ | j |||}| |_d|_|D ]}t|}||_d|_|j	 d| |_
tt||j|< q|S )NTrD   )r*   named_type_or_nonebasic_new_typeinfocalculate_metaclass_typemetaclass_typeis_enumr   rU   is_propertyrH   	_fullnamer   r   names)	r.   r   rR   rH   rK   baserU   itemvarr/   r/   r0   rL      s   
z)EnumCallAnalyzer.build_enum_call_typeinforQ   r	   
class_name/tuple[list[str], list[Expression | None], bool]c                 C  sx  |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|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	 |
| qnyt|d trt|d jtrt|d jj}|dur]t|tr]t|j	tr]|j	}|
dd D ]}|	| qSn9|d jjrt|d jjtr|d jj}|
dd D ]}|	| q|n| d| |S | d| |S |	s| | 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    | ]	}|t tfv V  qd S r-   )r   r   ).0arg_kindr/   r/   r0   	<genexpr>   s    z8EnumCallAnalyzer.parse_enum_call_args.<locals>.<genexpr>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   r5   z1() expects a string literal as the first argument, c                 S  s   g | ]}|j qS r/   )r   re   seq_itemr/   r/   r0   
<listcomp>   s    z9EnumCallAnalyzer.parse_enum_call_args.<locals>.<listcomp>c                 s  s<    | ]}t |ttfot|jd kot |jd tV  qdS )rh   r   N)r8   r   r   r6   rR   r   rq   r/   r/   r0   rg      s    
z>%s() with tuple or list expects strings or (name, value) pairsz-() with dict literal requires string literalszfSecond argument of %s() must be string, tuple, list or dict literal for mypy to determine Enum membersz() needs at least one itemT)rM   all	arg_kindsfail_enum_call_argr6   	arg_nameszipr8   r   r   replacerJ   appendr   r   rR   r   r   r   r@   r   r   rl   r   rB   is_finalfinal_value)r.   rQ   rc   rM   
valid_namearg_namer   r_   argrR   rS   fieldsfield	seq_itemsrr   r   keyproper_typer/   r/   r0   rI      s   





"

"
z%EnumCallAnalyzer.parse_enum_call_argsmessagecontextr
   c                 C  s   |  || g g dfS )NF)r;   )r.   r   r   r/   r/   r0   rv      s   
z#EnumCallAnalyzer.fail_enum_call_argmsgctxc                 C  s   | j || d S r-   )r*   r;   )r.   r   r   r/   r/   r0   r;      s   zEnumCallAnalyzer.failN)r)   r   r*   r   r+   r,   )r2   r   r3   r4   r+   r4   )r@   r   rA   rB   r3   r4   r+   rC   )
r   rB   rR   rV   rH   rB   rK   rW   r+   r   )rQ   r	   rc   rB   r+   rd   )r   rB   r   r
   r+   rd   )r   rB   r   r
   r+   r,   )
__name__r"   __qualname__r1   r?   r9   rL   rI   rv   r;   r/   r/   r/   r0   r(   9   s    



-

er(   N)'r$   
__future__r   typingr   r   
mypy.nodesr   r   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/   r0   <module>   s<    T	
