U
    <c*                     @  sN  d Z ddlmZ ddlZddlZddlmZmZmZm	Z	m
Z
mZmZmZmZ ddlmZmZ G dd dejZeZG dd	 d	ejZejd
dG dd dZejG dd dZejG dd dZedddZejG dd dZejG dd dZejd
dG dd dZG dd dZejG dd dZejG dd dZ dS ) zLThis file defines an additional layer of abstraction on top of the SARIF OM.    )annotationsN)	Any	FrozenSetListOptionalSequenceSetTupleTypeTypeVar)	formattersarifc                   @  s    e Zd ZdZdZdZdZdZdS )LevelzThe level of a diagnostic.

    This class is used to represent the level of a diagnostic. The levels are defined
    by the SARIF specification, and are not modifiable. For alternative categories,
    please use infra.Tag instead.
    noneZnotewarningerrorN)__name__
__module____qualname____doc__NONEZNOTEWARNINGERROR r   r   Q/tmp/pip-unpacked-wheel-gikjz4vx/torch/onnx/_internal/diagnostics/infra/_infra.pyr      s
   r   c                   @  s   e Zd ZdZdS )TagzKThe tag of a diagnostic. This class can be inherited to define custom tags.Nr   r   r   r   r   r   r   r   r      s   r   T)frozenc                   @  sj   e Zd ZU ded< ded< ded< dZded< dZded< dZded	< ed d
ddZdd
ddZ	dS )Rulestridnamemessage_default_templateNOptional[str]short_descriptionfull_descriptionhelp_urireturnc                 K  sp   d|kr|d d nd}d|kr,|d d nd}d|kr@|d nd}| |d |d |d	 d
 d |||d}|S )z3Returns a rule from the SARIF reporting descriptor.r$   textNr%   markdownr&   r    r!   Zmessage_stringsdefault)r    r!   r"   r$   r%   r&   r   )clskwargsr$   r%   r&   ruler   r   r   
from_sarif,   s$    zRule.from_sarifzsarif.ReportingDescriptorc                 C  sT   | j dk	rtj| j dnd}| jdk	r6tjd| jdnd}tj| j| j||| jdS )z2Returns a SARIF reporting descriptor of this Rule.Nr)    )r)   r*   )r    r!   r$   r%   r&   )r$   r   ZMultiformatMessageStringr%   ZReportingDescriptorr    r!   r&   )selfr$   r%   r   r   r   r   E   s    z
Rule.sarif)
r   r   r   __annotations__r$   r%   r&   classmethodr/   r   r   r   r   r   r   #   s   
r   c                   @  sP   e Zd ZU ded< ded< dZded< dZded< dZded< d	d
ddZdS )Locationr   urimessageNOptional[int]linestart_column
end_columnzsarif.Locationr'   c              	   C  sB   t jt jt j| jdt j| j| j| j| jddt j	| j
ddS )z2Returns the SARIF representation of this location.)r6   )Z
start_liner:   Zend_liner;   )Zartifact_locationZregionr0   )Zphysical_locationr7   )r   r5   ZPhysicalLocationZArtifactLocationr6   ZRegionr9   r:   r;   Messager7   r2   r   r   r   r   b   s    	zLocation.sarif)r   r   r   r3   r9   r:   r;   r   r   r   r   r   r5   Z   s   
r5   c                   @  sJ   e Zd ZU ejedZded< ddddZdd	d	d
d
d
ddddZ	dS )Stackdefault_factoryList[Location]frame_locationszsarif.Stackr'   c                 C  s   t jdd | jD dS )z/Returns the SARIF representation of this stack.c                 S  s   g | ]}t j|  d qS ))location)r   Z
StackFrame).0locr   r   r   
<listcomp>y   s    zStack.sarif.<locals>.<listcomp>)frames)r   r>   rB   r=   r   r   r   r   v   s
    zStack.sarifNr   r8   None)r6   r7   r9   r:   r;   r(   c              	   C  s   | j t|||||d dS )zAdds a frame to the stack.)r6   r7   r9   r:   r;   N)rB   appendr5   )r2   r6   r7   r9   r:   r;   r   r   r   	add_frame~   s    	zStack.add_frame)NNN)
r   r   r   dataclassesfieldlistrB   r3   r   rJ   r   r   r   r   r>   r   s   
   r>   _Diagnostic
Diagnostic)boundc                   @  s   e Zd ZU ded< ded< ded< ejedZded	< ejedZd
ed< dZ	ded< ejedZ
ded< ddddZddddddZddddddZddddd d!ZdS )"rO   r   r.   r   levelOptional[Tuple[Any, ...]]message_argsr?   rA   	locationszList[Stack]stacksNr#   additional_messagez	List[Tag]tagszsarif.Resultr'   c                 C  s   | j dkrt | _ | jjj| j  }| jdk	r<| d| j }tjtj|d| j	j
| jjd}dd | jD |_dd | jD |_tjdd | jD d	|_|S )
z;Returns the SARIF Result representation of this diagnostic.N
r0   )r7   rQ   Zrule_idc                 S  s   g | ]}|  qS r   r   )rD   rC   r   r   r   rF      s     z$Diagnostic.sarif.<locals>.<listcomp>c                 S  s   g | ]}|  qS r   rY   )rD   stackr   r   r   rF      s     c                 S  s   g | ]
}|j qS r   )value)rD   tagr   r   r   rF      s     )rW   )rS   tupler.   r"   formatrV   r   ZResultr<   rQ   r[   r    rT   rU   ZPropertyBagrW   Z
properties)r2   r7   Zsarif_resultr   r   r   r      s     


zDiagnostic.sarifrN   r5   )r2   rC   r(   c                 C  s   | j | | S )z"Adds a location to the diagnostic.)rT   rI   )r2   rC   r   r   r   with_location   s    zDiagnostic.with_locationr>   )r2   rZ   r(   c                 C  s   | j | | S )zAdds a stack to the diagnostic.)rU   rI   )r2   rZ   r   r   r   
with_stack   s    zDiagnostic.with_stackr   )r2   r7   r(   c                 C  s(   | j dkr|| _ n| j  d| | _ | S )z-Adds an additional message to the diagnostic.NrX   )rV   )r2   r7   r   r   r   with_additional_message   s    
z"Diagnostic.with_additional_message)r   r   r   r3   rK   rL   rM   rT   rU   rV   rW   r   r_   r`   ra   r   r   r   r   rO      s   
c                   @  sV   e Zd ZU ejddZded< ddddZd	d
dddZe	ddd dddZ
dS )RuleCollectionFinitzFrozenSet[Tuple[str, str]]_rule_id_name_setrH   r'   c                 C  s   t dd t| D | _d S )Nc                 S  s(   h | ] }t |jtr|jj|jjfqS r   )
isinstancer+   r   r    r!   )rD   rL   r   r   r   	<setcomp>   s   z/RuleCollection.__post_init__.<locals>.<setcomp>)	frozensetrK   fieldsre   r=   r   r   r   __post_init__   s
    zRuleCollection.__post_init__r   bool)r.   r(   c                 C  s   |j |jf| jkS )z(Checks if the rule is in the collection.)r    r!   re   )r2   r.   r   r   r   __contains__   s    zRuleCollection.__contains__r   zSequence[Rule])new_collection_class_namerulesr(   c                 C  s   t j|dd |D | fd S )zLCreates a custom class inherited from RuleCollection with the list of rules.c                 S  s*   g | ]"}t |jt|tj|d fqS )r+   )r   Zkebab_case_to_snake_caser!   typerK   rL   rD   r.   r   r   r   rF      s
   

z>RuleCollection.custom_collection_from_list.<locals>.<listcomp>)bases)rK   Zmake_dataclass)r,   rm   rn   r   r   r   custom_collection_from_list   s    z*RuleCollection.custom_collection_from_listN)r   r   r   rK   rL   re   r3   rj   rl   r4   rs   r   r   r   r   rb      s
   
	rb   c                   @  s   e Zd ZU ded< ded< ded< ejedZded< ejd	ed
Z	ded< ddddZ
ddddZdddddddZdS )DiagnosticToolr   r!   versionrb   rn   ro   zType[Diagnostic]diagnostic_typeFrd   r@   z	Set[Rule]_triggered_rulesrH   r'   c                 C  s    t | jtstd| j d S )NzAExpected diagnostic_type to be a subclass of Diagnostic, but got )
issubclassrv   rO   	TypeErrorr=   r   r   r   rj      s    
zDiagnosticTool.__post_init__z
sarif.Toolc                 C  s(   t jt j| j| jdd | jD ddS )z&Returns the SARIF Tool representation.c                 S  s   g | ]}|  qS r   rY   rq   r   r   r   rF      s     z(DiagnosticTool.sarif.<locals>.<listcomp>)r!   ru   rn   )Zdriver)r   ZToolZToolComponentr!   ru   rx   r=   r   r   r   r      s    zDiagnosticTool.sarifr   r   rR   rO   r.   rQ   rS   r(   c                 K  sZ   || j kr<td|j d|j d| j d| j d| j j 
| j| | j|||f|S )  Creates a diagnostic for the given arguments.

        Args:
            rule: The rule that triggered the diagnostic.
            level: The level of the diagnostic.
            message_args: The arguments to format the rule's message template.
            **kwargs: Additional arguments to pass to the Diagnostic constructor.

        Returns:
            The created diagnostic.

        Raises:
            ValueError: If the rule is not supported by the tool.
        zRule ':z!' is not supported by this tool ' z'. Supported rules are: )	rn   
ValueErrorr    r!   ru   re   rx   addrv   )r2   r.   rQ   rS   r-   r   r   r   create_diagnostic  s    
,z DiagnosticTool.create_diagnosticN)r   r   r   r3   rK   rL   rO   rv   setrx   rj   r   r   r   r   r   r   rt      s   

rt   c                   @  s   e Zd ZddddZdS )
InvocationrH   r'   c                 C  s
   t  d S N)NotImplementedErrorr=   r   r   r   __init__#  s    zInvocation.__init__N)r   r   r   r   r   r   r   r   r   !  s   r   c                   @  s   e Zd ZdZdS )DiagnosticOptionsz)
    Options for diagnostic context.
    Nr   r   r   r   r   r   '  s   r   c                   @  s   e Zd ZU ded< dZded< ejdedZded	< ejdd
Z	ded< dd Z
dd ZddddZddddddddZdS )DiagnosticContextrt   toolNzOptional[DiagnosticOptions]optionsFrw   zList[Diagnostic]_diagnosticsrc   r   _invocationc                 C  s   | S r   r   r=   r   r   r   	__enter__5  s    zDiagnosticContext.__enter__c                 C  s   dS )NTr   )r2   exc_typeexc_valexc_tbr   r   r   __exit__8  s    zDiagnosticContext.__exit__z	sarif.Runr'   c                 C  s    t j| j  dd | jD dS )zReturns the SARIF Run object.c                 S  s   g | ]}|  qS r   rY   )rD   
diagnosticr   r   r   rF   ?  s     z+DiagnosticContext.sarif.<locals>.<listcomp>)r   results)r   ZRunr   r   r=   r   r   r   r   ;  s    zDiagnosticContext.sarifr   r   rR   rO   r{   c                 K  s$   | j j|||f|}| j| |S )r|   )r   r   r   rI   )r2   r.   rQ   rS   r-   r   r   r   r   diagnoseB  s    zDiagnosticContext.diagnose)N)r   r   r   r3   r   rK   rL   rM   r   r   r   r   r   r   r   r   r   r   r   .  s   
 r   )!r   
__future__r   rK   enumtypingr   r   r   r   r   r   r	   r
   r   Z&torch.onnx._internal.diagnostics.infrar   r   Enumr   levelsr   Z	dataclassr   r5   r>   rN   rO   rb   rt   r   r   r   r   r   r   r   <module>   s4   ,
6 /#
6