Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
marvel
GitHub Repository: marvel/qnf
Path: blob/master/elisp/emacs-for-python/rope-dist/rope/contrib/findit.py
1496 views
1
import rope.base.codeanalyze
2
import rope.base.evaluate
3
import rope.base.pyobjects
4
from rope.base import taskhandle, exceptions, worder
5
from rope.contrib import fixsyntax
6
from rope.refactor import occurrences
7
8
9
def find_occurrences(project, resource, offset, unsure=False, resources=None,
10
in_hierarchy=False, task_handle=taskhandle.NullTaskHandle()):
11
"""Return a list of `Location`\s
12
13
If `unsure` is `True`, possible matches are returned, too. You
14
can use `Location.unsure` to see which are unsure occurrences.
15
`resources` can be a list of `rope.base.resource.File`\s that
16
should be searched for occurrences; if `None` all python files
17
in the project are searched.
18
19
"""
20
name = worder.get_name_at(resource, offset)
21
this_pymodule = project.pycore.resource_to_pyobject(resource)
22
primary, pyname = rope.base.evaluate.eval_location2(
23
this_pymodule, offset)
24
def is_match(occurrence):
25
return unsure
26
finder = occurrences.create_finder(
27
project.pycore, name, pyname, unsure=is_match,
28
in_hierarchy=in_hierarchy, instance=primary)
29
if resources is None:
30
resources = project.pycore.get_python_files()
31
job_set = task_handle.create_jobset('Finding Occurrences',
32
count=len(resources))
33
return _find_locations(finder, resources, job_set)
34
35
36
def find_implementations(project, resource, offset, resources=None,
37
task_handle=taskhandle.NullTaskHandle()):
38
"""Find the places a given method is overridden.
39
40
Finds the places a method is implemented. Returns a list of
41
`Location`\s.
42
"""
43
name = worder.get_name_at(resource, offset)
44
this_pymodule = project.pycore.resource_to_pyobject(resource)
45
pyname = rope.base.evaluate.eval_location(this_pymodule, offset)
46
if pyname is not None:
47
pyobject = pyname.get_object()
48
if not isinstance(pyobject, rope.base.pyobjects.PyFunction) or \
49
pyobject.get_kind() != 'method':
50
raise exceptions.BadIdentifierError('Not a method!')
51
else:
52
raise exceptions.BadIdentifierError('Cannot resolve the identifier!')
53
def is_defined(occurrence):
54
if not occurrence.is_defined():
55
return False
56
def not_self(occurrence):
57
if occurrence.get_pyname().get_object() == pyname.get_object():
58
return False
59
filters = [is_defined, not_self,
60
occurrences.InHierarchyFilter(pyname, True)]
61
finder = occurrences.Finder(project.pycore, name, filters=filters)
62
if resources is None:
63
resources = project.pycore.get_python_files()
64
job_set = task_handle.create_jobset('Finding Implementations',
65
count=len(resources))
66
return _find_locations(finder, resources, job_set)
67
68
69
def find_definition(project, code, offset, resource=None, maxfixes=1):
70
"""Return the definition location of the python name at `offset`
71
72
A `Location` object is returned if the definition location can be
73
determined, otherwise ``None`` is returned.
74
"""
75
fixer = fixsyntax.FixSyntax(project.pycore, code, resource, maxfixes)
76
main_module = fixer.get_pymodule()
77
pyname = fixer.pyname_at(offset)
78
if pyname is not None:
79
module, lineno = pyname.get_definition_location()
80
name = rope.base.worder.Worder(code).get_word_at(offset)
81
if lineno is not None:
82
start = module.lines.get_line_start(lineno)
83
def check_offset(occurrence):
84
if occurrence.offset < start:
85
return False
86
pyname_filter = occurrences.PyNameFilter(pyname)
87
finder = occurrences.Finder(project.pycore, name,
88
[check_offset, pyname_filter])
89
for occurrence in finder.find_occurrences(pymodule=module):
90
return Location(occurrence)
91
92
93
class Location(object):
94
95
def __init__(self, occurrence):
96
self.resource = occurrence.resource
97
self.region = occurrence.get_word_range()
98
self.offset = self.region[0]
99
self.unsure = occurrence.is_unsure()
100
self.lineno = occurrence.lineno
101
102
103
def _find_locations(finder, resources, job_set):
104
result = []
105
for resource in resources:
106
job_set.started_job(resource.path)
107
for occurrence in finder.find_occurrences(resource):
108
result.append(Location(occurrence))
109
job_set.finished_job()
110
return result
111
112