| Index: tools/telemetry/third_party/rope/rope/contrib/findit.py
|
| diff --git a/tools/telemetry/third_party/rope/rope/contrib/findit.py b/tools/telemetry/third_party/rope/rope/contrib/findit.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..93eb01a8467649de1f094e7eab61ef49ff4940fb
|
| --- /dev/null
|
| +++ b/tools/telemetry/third_party/rope/rope/contrib/findit.py
|
| @@ -0,0 +1,114 @@
|
| +import rope.base.codeanalyze
|
| +import rope.base.evaluate
|
| +import rope.base.pyobjects
|
| +from rope.base import taskhandle, exceptions, worder
|
| +from rope.contrib import fixsyntax
|
| +from rope.refactor import occurrences
|
| +
|
| +
|
| +def find_occurrences(project, resource, offset, unsure=False, resources=None,
|
| + in_hierarchy=False,
|
| + task_handle=taskhandle.NullTaskHandle()):
|
| + """Return a list of `Location`\s
|
| +
|
| + If `unsure` is `True`, possible matches are returned, too. You
|
| + can use `Location.unsure` to see which are unsure occurrences.
|
| + `resources` can be a list of `rope.base.resource.File`\s that
|
| + should be searched for occurrences; if `None` all python files
|
| + in the project are searched.
|
| +
|
| + """
|
| + name = worder.get_name_at(resource, offset)
|
| + this_pymodule = project.get_pymodule(resource)
|
| + primary, pyname = rope.base.evaluate.eval_location2(
|
| + this_pymodule, offset)
|
| +
|
| + def is_match(occurrence):
|
| + return unsure
|
| + finder = occurrences.create_finder(
|
| + project, name, pyname, unsure=is_match,
|
| + in_hierarchy=in_hierarchy, instance=primary)
|
| + if resources is None:
|
| + resources = project.get_python_files()
|
| + job_set = task_handle.create_jobset('Finding Occurrences',
|
| + count=len(resources))
|
| + return _find_locations(finder, resources, job_set)
|
| +
|
| +
|
| +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.get_pymodule(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, name, filters=filters)
|
| + if resources is None:
|
| + resources = project.get_python_files()
|
| + job_set = task_handle.create_jobset('Finding Implementations',
|
| + count=len(resources))
|
| + return _find_locations(finder, resources, job_set)
|
| +
|
| +
|
| +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)
|
| +
|
| +
|
| +class Location(object):
|
| +
|
| + def __init__(self, occurrence):
|
| + self.resource = occurrence.resource
|
| + self.region = occurrence.get_word_range()
|
| + self.offset = self.region[0]
|
| + self.unsure = occurrence.is_unsure()
|
| + self.lineno = occurrence.lineno
|
| +
|
| +
|
| +def _find_locations(finder, resources, job_set):
|
| + result = []
|
| + for resource in resources:
|
| + job_set.started_job(resource.path)
|
| + for occurrence in finder.find_occurrences(resource):
|
| + result.append(Location(occurrence))
|
| + job_set.finished_job()
|
| + return result
|
|
|