
    Æew                     `    d Z ddlmZmZmZ d Z G d dej                        Z G d d      Zy)	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                     | j                  |      }t        |      }|j                  |j                                |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       9/usr/lib/python3/dist-packages/rope/contrib/finderrors.pyfind_errorsr      s=    
 ##H-Hh'F
LL!!#$==    c                   *    e Zd Zd Zd Zd Zd Zd Zy)r   c                 J    || _         |j                         | _        g | _        y N)r   	get_scopescoper   )selfr   s     r   __init__z_BadAccessFinder.__init__)   s      '')
r   c                 x   t        |j                  t        j                  t        j                  f      ry | j
                  j                  |j                        }|j                  |j                        }|| j                  |d       y | j                  |||j                        r| j                  |d       y y )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    dhhCII 67

33DKK@dgg&>OOD"78##E64;;?OOD/2 @r   c                    t        |j                  t        j                        s| j                  j                  |j                        }t        j                  ||j                        }|S|j                         t        j                         k7  r.|j                  |j                         vr| j                  |d       | j                  |j                         y )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    $((CII.JJ77DE''tzz:F!f&7&7&9Y=R=R=T&T99F$5$5$77OOD*@A

4::r   c                     t        |t        j                        r|j                  }n|j                  }|dk7  r8t        |j                  |dz   |z         }| j                  j                  |       y y )NNone )	r   r   	Attributer.   r"   Errorr    r   append)r   r&   msgnameerrors        r   r#   z_BadAccessFinder._add_errorA   sY    dCMM*99D77D6>$++sSy4'78EKKu% r   c                     |j                         }|9|d   3|d   | j                  k(  r ||d   cxk  r|j                         k  ry y y y y y )N   r   T)get_definition_locationr   get_end)r   r   r'   r    locations        r   r$   z"_BadAccessFinder._is_defined_afterJ   s[    113HQK$;t}},hqk<U]]_< = - %<r   N)__name__
__module____qualname__r   r(   r/   r#   r$    r   r   r   r   (   s    
3&r   r   c                       e Zd Zd Zd Zy)r4   c                      || _         || _        y r   r    r8   )r   r    r8   s      r   r   zError.__init__U   s    
r   c                 8    | j                    d| j                   S )Nz: rD   )r   s    r   __str__zError.__str__Y   s    ++b--r   N)r>   r?   r@   r   rF   rA   r   r   r4   r4   T   s    .r   r4   N)	__doc__	rope.baser   r   r   r   RopeNodeVisitorr   r4   rA   r   r   <module>rJ      s4   2 / .)s** )X. .r   