Path: blob/master/elisp/emacs-for-python/rope-dist/rope/contrib/findit.py
1496 views
import rope.base.codeanalyze1import rope.base.evaluate2import rope.base.pyobjects3from rope.base import taskhandle, exceptions, worder4from rope.contrib import fixsyntax5from rope.refactor import occurrences678def find_occurrences(project, resource, offset, unsure=False, resources=None,9in_hierarchy=False, task_handle=taskhandle.NullTaskHandle()):10"""Return a list of `Location`\s1112If `unsure` is `True`, possible matches are returned, too. You13can use `Location.unsure` to see which are unsure occurrences.14`resources` can be a list of `rope.base.resource.File`\s that15should be searched for occurrences; if `None` all python files16in the project are searched.1718"""19name = worder.get_name_at(resource, offset)20this_pymodule = project.pycore.resource_to_pyobject(resource)21primary, pyname = rope.base.evaluate.eval_location2(22this_pymodule, offset)23def is_match(occurrence):24return unsure25finder = occurrences.create_finder(26project.pycore, name, pyname, unsure=is_match,27in_hierarchy=in_hierarchy, instance=primary)28if resources is None:29resources = project.pycore.get_python_files()30job_set = task_handle.create_jobset('Finding Occurrences',31count=len(resources))32return _find_locations(finder, resources, job_set)333435def find_implementations(project, resource, offset, resources=None,36task_handle=taskhandle.NullTaskHandle()):37"""Find the places a given method is overridden.3839Finds the places a method is implemented. Returns a list of40`Location`\s.41"""42name = worder.get_name_at(resource, offset)43this_pymodule = project.pycore.resource_to_pyobject(resource)44pyname = rope.base.evaluate.eval_location(this_pymodule, offset)45if pyname is not None:46pyobject = pyname.get_object()47if not isinstance(pyobject, rope.base.pyobjects.PyFunction) or \48pyobject.get_kind() != 'method':49raise exceptions.BadIdentifierError('Not a method!')50else:51raise exceptions.BadIdentifierError('Cannot resolve the identifier!')52def is_defined(occurrence):53if not occurrence.is_defined():54return False55def not_self(occurrence):56if occurrence.get_pyname().get_object() == pyname.get_object():57return False58filters = [is_defined, not_self,59occurrences.InHierarchyFilter(pyname, True)]60finder = occurrences.Finder(project.pycore, name, filters=filters)61if resources is None:62resources = project.pycore.get_python_files()63job_set = task_handle.create_jobset('Finding Implementations',64count=len(resources))65return _find_locations(finder, resources, job_set)666768def find_definition(project, code, offset, resource=None, maxfixes=1):69"""Return the definition location of the python name at `offset`7071A `Location` object is returned if the definition location can be72determined, otherwise ``None`` is returned.73"""74fixer = fixsyntax.FixSyntax(project.pycore, code, resource, maxfixes)75main_module = fixer.get_pymodule()76pyname = fixer.pyname_at(offset)77if pyname is not None:78module, lineno = pyname.get_definition_location()79name = rope.base.worder.Worder(code).get_word_at(offset)80if lineno is not None:81start = module.lines.get_line_start(lineno)82def check_offset(occurrence):83if occurrence.offset < start:84return False85pyname_filter = occurrences.PyNameFilter(pyname)86finder = occurrences.Finder(project.pycore, name,87[check_offset, pyname_filter])88for occurrence in finder.find_occurrences(pymodule=module):89return Location(occurrence)909192class Location(object):9394def __init__(self, occurrence):95self.resource = occurrence.resource96self.region = occurrence.get_word_range()97self.offset = self.region[0]98self.unsure = occurrence.is_unsure()99self.lineno = occurrence.lineno100101102def _find_locations(finder, resources, job_set):103result = []104for resource in resources:105job_set.started_job(resource.path)106for occurrence in finder.find_occurrences(resource):107result.append(Location(occurrence))108job_set.finished_job()109return result110111112