Ejemplo n.º 1
0
 def _change_module(self, resource, remove, only_current):
     filters = [occurrences.NoImportsFilter(),
                occurrences.PyNameFilter(self.pyname)]
     if only_current and resource == self.original:
         def check_aim(occurrence):
             start, end = occurrence.get_primary_range()
             if self.offset < start or end < self.offset:
                 return False
         filters.insert(0, check_aim)
     finder = occurrences.Finder(self.project, self.name, filters=filters)
     changed = rename.rename_in_module(
         finder, self.imported, resource=resource, replace_primary=True)
     if changed and remove:
         changed = _remove_from(self.project, self.pyname,
                                changed, resource)
     return changed
Ejemplo n.º 2
0
def find_implementations(project,
                         resource,
                         offset,
                         resources=None,
                         task_handle=taskhandle.NullTaskHandle()):
    """Find the places a given method is overridden.

    Finds the places a method is implemented.  Returns a list of
    `Location`\s.
    """
    name = worder.get_name_at(resource, offset)
    this_pymodule = project.pycore.resource_to_pyobject(resource)
    pyname = rope.base.evaluate.eval_location(this_pymodule, offset)
    if pyname is not None:
        pyobject = pyname.get_object()
        if not isinstance(pyobject, rope.base.pyobjects.PyFunction) or \
           pyobject.get_kind() != 'method':
            raise exceptions.BadIdentifierError('Not a method!')
    else:
        raise exceptions.BadIdentifierError('Cannot resolve the identifier!')

    def is_defined(occurrence):
        if not occurrence.is_defined():
            return False

    def not_self(occurrence):
        if occurrence.get_pyname().get_object() == pyname.get_object():
            return False

    filters = [
        is_defined, not_self,
        occurrences.InHierarchyFilter(pyname, True)
    ]
    finder = occurrences.Finder(project.pycore, name, filters=filters)
    if resources is None:
        resources = project.pycore.get_python_files()
    job_set = task_handle.create_jobset('Finding Implementations',
                                        count=len(resources))
    return _find_locations(finder, resources, job_set)
Ejemplo n.º 3
0
def find_definition(project, code, offset, resource=None, maxfixes=1):
    """Return the definition location of the python name at `offset`

    A `Location` object is returned if the definition location can be
    determined, otherwise ``None`` is returned.
    """
    fixer = fixsyntax.FixSyntax(project, code, resource, maxfixes)
    pyname = fixer.pyname_at(offset)
    if pyname is not None:
        module, lineno = pyname.get_definition_location()
        name = rope.base.worder.Worder(code).get_word_at(offset)
        if lineno is not None:
            start = module.lines.get_line_start(lineno)

            def check_offset(occurrence):
                if occurrence.offset < start:
                    return False

            pyname_filter = occurrences.PyNameFilter(pyname)
            finder = occurrences.Finder(project, name,
                                        [check_offset, pyname_filter])
            for occurrence in finder.find_occurrences(pymodule=module):
                return Location(occurrence)