o
    2g%                     @  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/   I/home/garg/my-data/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  s6  t |tsdS |}|j}t |tsdS |j}|tvrdS | ||dd \}}}	}
|
sD|}|r:|dt|j	 7 }| 
|g ||j	}n7||krZd| d| d| d}| || tt|jd	 j}||ksi|rr|dt|j	 7 }| 
||||j	}||ks|r| 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.@zString argument 1 "z" to z$(...) does not match variable name ""r   )r8   r	   calleer   fullnamer   parse_enum_call_argssplitrB   linebuild_enum_call_typeinfor;   r   r   argsr   r*   add_symbol_skip_localr   analyzedset_line)r.   r@   rA   r3   callrH   rI   new_class_nameitemsvaluesokr   infomsgr/   r/   r0   r9   R   s<   

z EnumCallAnalyzer.check_enum_callr   rT   	list[str]rI   rL   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   rW   is_propertyrI   	_fullnamer   r   names)	r.   r   rT   rI   rL   baserW   itemvarr/   r/   r0   rM      s   
z)EnumCallAnalyzer.build_enum_call_typeinforR   r	   
class_name4tuple[str, 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 |j	}	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 ]}|
| qVn9|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   rb   modulequalnametypestartzUnexpected keyword argument "rG   )NNr   rb   Nr   r5   z1() expects a string literal as the first argument, c                 S  s   g | ]}|j qS r/   )r   rh   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 )rk   r   N)r8   r   r   r6   rT   r   rs   r/   r/   r0   rj      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)rN   all	arg_kindsfail_enum_call_argr6   	arg_nameszipr8   r   r   replacerK   appendr   r   rT   r   r   r   r@   r   r   ro   r   rB   is_finalfinal_value)r.   rR   rf   rN   
valid_namearg_namer   rb   argrS   rT   rU   fieldsfield	seq_itemsrt   r   keyproper_typer/   r/   r0   rJ      s   





"

"z%EnumCallAnalyzer.parse_enum_call_argsmessagecontextr
   c                 C  s   |  || dg g dfS )N F)r;   )r.   r   r   r/   r/   r0   rx      s   z#EnumCallAnalyzer.fail_enum_call_argrX   ctxc                 C  s   | j || d S r-   )r*   r;   )r.   rX   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   rT   rY   rI   rB   rL   rZ   r+   r   )rR   r	   rf   rB   r+   rg   )r   rB   r   r
   r+   rg   )rX   rB   r   r
   r+   r,   )
__name__r"   __qualname__r1   r?   r9   rM   rJ   rx   r;   r/   r/   r/   r0   r(   9   s    



4

g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	
