U
    Ô¾|eO  ã                   @   s2   d Z ddlZG dd„ dejƒZdd„ Zdd„ ZdS )	zR
This module provides helper functions to find the first line of a function
body.
é    Nc                       s8   e Zd ZdZdd„ Z‡ fdd„Zejdœdd„Z‡  Z	S )	ÚFindDefFirstLinezÊ
    Attributes
    ----------
    first_stmt_line : int or None
        This stores the first statement line number if the definition is found.
        Or, ``None`` if the definition is not found.
    c                 C   s   |j | _|j| _d| _dS )zf
        Parameters
        ----------
        code :
            The function's code object.
        N)Úco_nameÚ_co_nameÚco_firstlinenoÚ_co_firstlinenoÚfirst_stmt_line)ÚselfÚcode© r
   úW/var/www/website-v5/atlas_env/lib/python3.8/site-packages/numba/misc/firstlinefinder.pyÚ__init__   s    zFindDefFirstLine.__init__c                    s    t  |¡D ]}tƒ  |¡ q
d S )N)ÚastÚiter_child_nodesÚsuperÚvisit)r   ÚnodeÚchild©Ú	__class__r
   r   Ú_visit_children   s    z FindDefFirstLine._visit_children©r   c                 C   sz   |j | jkrlt|jgƒ}|jr4|jd }| |j¡ | j|krl|jrl|jd }t|ƒr`|jd }|j| _	d S |  
|¡ d S )Nr   é   )Únamer   ÚsetÚlinenoÚdecorator_listÚaddr   ÚbodyÚ_is_docstringr   r   )r   r   Zpossible_start_linesZfirst_decorZ
first_stmtr
   r
   r   Úvisit_FunctionDef!   s    



z"FindDefFirstLine.visit_FunctionDef)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   ÚFunctionDefr   Ú__classcell__r
   r
   r   r   r   	   s   r   c                 C   s0   t | tjƒr,t | jtjƒr,t | jjtƒr,dS dS )NTF)Ú
isinstancer   ÚExprÚvalueÚConstantÚstrr   r
   r
   r   r   ?   s    ÿr   c              	   C   sj   | j }z"t|jƒ�}| ¡ }W 5 Q R X W n ttfk
rB   Y dS X t |¡}t|ƒ}| 	|¡ |j
S dS )a  
    Look up the first line of function body using the file in
    ``pyfunc.__code__.co_filename``.

    Returns
    -------
    lineno : int; or None
        The first line number of the function body; or ``None`` if the first
        line cannot be determined.
    N)Ú__code__ÚopenÚco_filenameÚreadÚFileNotFoundErrorÚOSErrorr   Úparser   r   r   )ÚpyfuncÚcoZfinZfile_contentÚtreeÚfinderr
   r
   r   Úget_func_body_first_linenoG   s    

r6   )r#   r   ÚNodeVisitorr   r   r6   r
   r
   r
   r   Ú<module>   s   6