Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
marvel
GitHub Repository: marvel/qnf
Path: blob/master/elisp/emacs-for-python/rope-dist/rope/base/pynames.py
1423 views
1
import rope.base.pyobjects
2
from rope.base import exceptions, utils
3
4
5
class PyName(object):
6
"""References to `PyObject`\s inside python programs"""
7
8
def get_object(self):
9
"""Return the `PyObject` object referenced by this `PyName`"""
10
11
def get_definition_location(self):
12
"""Return a (module, lineno) tuple"""
13
14
15
class DefinedName(PyName):
16
17
def __init__(self, pyobject):
18
self.pyobject = pyobject
19
20
def get_object(self):
21
return self.pyobject
22
23
def get_definition_location(self):
24
return (self.pyobject.get_module(), self.pyobject.get_ast().lineno)
25
26
27
class AssignedName(PyName):
28
"""Only a placeholder"""
29
30
31
class UnboundName(PyName):
32
33
def __init__(self, pyobject=None):
34
self.pyobject = pyobject
35
if self.pyobject is None:
36
self.pyobject = rope.base.pyobjects.get_unknown()
37
38
def get_object(self):
39
return self.pyobject
40
41
def get_definition_location(self):
42
return (None, None)
43
44
45
class AssignmentValue(object):
46
"""An assigned expression"""
47
48
def __init__(self, ast_node, levels=None, evaluation='',
49
assign_type=False):
50
"""The `level` is `None` for simple assignments and is
51
a list of numbers for tuple assignments for example in::
52
53
a, (b, c) = x
54
55
The levels for for `a` is ``[0]``, for `b` is ``[1, 0]`` and for
56
`c` is ``[1, 1]``.
57
58
"""
59
self.ast_node = ast_node
60
if levels == None:
61
self.levels = []
62
else:
63
self.levels = levels
64
self.evaluation = evaluation
65
self.assign_type = assign_type
66
67
def get_lineno(self):
68
return self.ast_node.lineno
69
70
71
class EvaluatedName(PyName):
72
"""A name whose object will be evaluated later"""
73
74
def __init__(self, callback, module=None, lineno=None):
75
self.module = module
76
self.lineno = lineno
77
self.callback = callback
78
self.pyobject = _Inferred(callback, _get_concluded_data(module))
79
80
def get_object(self):
81
return self.pyobject.get()
82
83
def get_definition_location(self):
84
return (self.module, self.lineno)
85
86
def invalidate(self):
87
"""Forget the `PyObject` this `PyName` holds"""
88
self.pyobject.set(None)
89
90
91
class ParameterName(PyName):
92
"""Only a placeholder"""
93
94
95
class ImportedModule(PyName):
96
97
def __init__(self, importing_module, module_name=None,
98
level=0, resource=None):
99
self.importing_module = importing_module
100
self.module_name = module_name
101
self.level = level
102
self.resource = resource
103
self.pymodule = _get_concluded_data(self.importing_module)
104
105
def _current_folder(self):
106
resource = self.importing_module.get_module().get_resource()
107
if resource is None:
108
return None
109
return resource.parent
110
111
def _get_pymodule(self):
112
if self.pymodule.get() is None:
113
pycore = self.importing_module.pycore
114
if self.resource is not None:
115
self.pymodule.set(pycore.resource_to_pyobject(self.resource))
116
elif self.module_name is not None:
117
try:
118
if self.level == 0:
119
pymodule = pycore.get_module(self.module_name,
120
self._current_folder())
121
else:
122
pymodule = pycore.get_relative_module(
123
self.module_name, self._current_folder(), self.level)
124
self.pymodule.set(pymodule)
125
except exceptions.ModuleNotFoundError:
126
pass
127
return self.pymodule.get()
128
129
def get_object(self):
130
if self._get_pymodule() is None:
131
return rope.base.pyobjects.get_unknown()
132
return self._get_pymodule()
133
134
def get_definition_location(self):
135
pymodule = self._get_pymodule()
136
if not isinstance(pymodule, rope.base.pyobjects.PyDefinedObject):
137
return (None, None)
138
return (pymodule.get_module(), 1)
139
140
141
class ImportedName(PyName):
142
143
def __init__(self, imported_module, imported_name):
144
self.imported_module = imported_module
145
self.imported_name = imported_name
146
147
def _get_imported_pyname(self):
148
try:
149
result = self.imported_module.get_object()[self.imported_name]
150
if result != self:
151
return result
152
except exceptions.AttributeNotFoundError:
153
pass
154
return UnboundName()
155
156
@utils.prevent_recursion(rope.base.pyobjects.get_unknown)
157
def get_object(self):
158
return self._get_imported_pyname().get_object()
159
160
@utils.prevent_recursion(lambda: (None, None))
161
def get_definition_location(self):
162
return self._get_imported_pyname().get_definition_location()
163
164
165
def _get_concluded_data(module):
166
if module is None:
167
return rope.base.pyobjects._ConcludedData()
168
return module._get_concluded_data()
169
170
171
def _circular_inference():
172
raise rope.base.pyobjects.IsBeingInferredError(
173
'Circular Object Inference')
174
175
class _Inferred(object):
176
177
def __init__(self, get_inferred, concluded=None):
178
self.get_inferred = get_inferred
179
self.concluded = concluded
180
if self.concluded is None:
181
self.temp = None
182
183
@utils.prevent_recursion(_circular_inference)
184
def get(self, *args, **kwds):
185
if self.concluded is None or self.concluded.get() is None:
186
self.set(self.get_inferred(*args, **kwds))
187
if self._get() is None:
188
self.set(rope.base.pyobjects.get_unknown())
189
return self._get()
190
191
def set(self, pyobject):
192
if self.concluded is not None:
193
self.concluded.set(pyobject)
194
self.temp = pyobject
195
196
def _get(self):
197
if self.concluded is not None:
198
return self.concluded.get()
199
return self.temp
200
201