
    cw                     d    d Z ddlmZmZmZ d Z G d dej                  Z G d d          ZdS )	a  Finding bad name and attribute accesses

`find_errors` function can be used to find possible bad name and
attribute accesses.  As an example::

  errors = find_errors(project, project.get_resource('mod.py'))
  for error in errors:
      print('%s: %s' % (error.lineno, error.error))

prints possible errors for ``mod.py`` file.

TODO:

* use task handles
* reporting names at most once
* attributes of extension modules that don't appear in
  extension_modules project config can be ignored
* not calling `PyScope.get_inner_scope_for_line()` if it is a
  bottleneck; needs profiling
* not reporting occurrences where rope cannot infer the object
* rope saves multiple objects for some of the names in its objectdb
  use all of them not to give false positives
* ... ;-)

    )astevaluate	pyobjectsc                     |                      |          }t          |          }|                    |                                           |j        S )zUFind possible bad name and attribute accesses

    It returns a list of `Error`.
    )get_pymodule_BadAccessFindervisitget_asterrors)projectresourcepymodulefinders       7lib/python3.11/site-packages/rope/contrib/finderrors.pyfind_errorsr      sJ    
 ##H--Hh''F
LL!!##$$$=    c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )r   c                 T    || _         |                                | _        g | _        d S N)r   	get_scopescoper   )selfr   s     r   __init__z_BadAccessFinder.__init__)   s'     ''))
r   c                 n   t          |j        t          j        t          j        f          rd S | j                            |j                  }|                    |j	                  }|| 
                    |d           d S |                     |||j                  r| 
                    |d           d S d S )NzUnresolved variablezDefined later)
isinstancectxr   StoreParamr   get_inner_scope_for_linelinenolookupid
_add_error_is_defined_afterr   noder   pynames       r   _Namez_BadAccessFinder._Name.   s    dhCI 677 	F
33DK@@dg&& 	3OOD"788888##E64;?? 	3OOD/22222	3 	3r   c                    t          |j        t          j                  s| j                            |j                  }t          j        ||j	                  }|Z|
                                t          j                    k    r1|j        |
                                vr|                     |d           |                     |j	                   d S )NzUnresolved attribute)r   r   r   r   r   r   r    r   	eval_nodevalue
get_objectr   get_unknownattrr#   r	   r%   s       r   
_Attributez_BadAccessFinder._Attribute8   s    $(CI.. 	BJ77DDE'tz::F Bf&7&7&9&9Y=R=T=T&T B9F$5$5$7$77 BOOD*@AAA

4:r   c                     t          |t          j                  r|j        }n|j        }|dk    r7t          |j        |dz   |z             }| j                            |           d S d S )NNone )	r   r   	Attributer.   r"   Errorr    r   append)r   r&   msgnameerrors        r   r#   z_BadAccessFinder._add_errorA   sr    dCM** 	9DD7D6> 	&$+sSy4'788EKu%%%%%	& 	&r   c                     |                                 }|D|d         >|d         | j        k    r/||d         cxk    r|                                k    rn d S dS d S d S d S d S )N   r   T)get_definition_locationr   get_end)r   r   r'   r    locations        r   r$   z"_BadAccessFinder._is_defined_afterJ   s    1133 	HQK 	t},hqk   -2]]__      t	 	 	 	   r   N)__name__
__module____qualname__r   r(   r/   r#   r$    r   r   r   r   (   s_          
3 3 3  & & &    r   r   c                       e Zd Zd Zd ZdS )r4   c                 "    || _         || _        d S r   r    r8   )r   r    r8   s      r   r   zError.__init__U   s    


r   c                 $    | j          d| j         S )Nz: rD   )r   s    r   __str__zError.__str__Y   s    +-----r   N)r>   r?   r@   r   rF   rA   r   r   r4   r4   T   s2          . . . . .r   r4   N)	__doc__	rope.baser   r   r   r   RopeNodeVisitorr   r4   rA   r   r   <module>rJ      s    2 / . . . . . . . . .  ) ) ) ) )s* ) ) )X. . . . . . . . . .r   