| Index: tools/telemetry/third_party/rope/rope/base/pynames.py
|
| diff --git a/tools/telemetry/third_party/rope/rope/base/pynames.py b/tools/telemetry/third_party/rope/rope/base/pynames.py
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..5d489814a35c8a592156711244ada9ee10484b45
|
| --- /dev/null
|
| +++ b/tools/telemetry/third_party/rope/rope/base/pynames.py
|
| @@ -0,0 +1,201 @@
|
| +import rope.base.pyobjects
|
| +from rope.base import exceptions, utils
|
| +
|
| +
|
| +class PyName(object):
|
| + """References to `PyObject`\s inside python programs"""
|
| +
|
| + def get_object(self):
|
| + """Return the `PyObject` object referenced by this `PyName`"""
|
| +
|
| + def get_definition_location(self):
|
| + """Return a (module, lineno) tuple"""
|
| +
|
| +
|
| +class DefinedName(PyName):
|
| +
|
| + def __init__(self, pyobject):
|
| + self.pyobject = pyobject
|
| +
|
| + def get_object(self):
|
| + return self.pyobject
|
| +
|
| + def get_definition_location(self):
|
| + return (self.pyobject.get_module(), self.pyobject.get_ast().lineno)
|
| +
|
| +
|
| +class AssignedName(PyName):
|
| + """Only a placeholder"""
|
| +
|
| +
|
| +class UnboundName(PyName):
|
| +
|
| + def __init__(self, pyobject=None):
|
| + self.pyobject = pyobject
|
| + if self.pyobject is None:
|
| + self.pyobject = rope.base.pyobjects.get_unknown()
|
| +
|
| + def get_object(self):
|
| + return self.pyobject
|
| +
|
| + def get_definition_location(self):
|
| + return (None, None)
|
| +
|
| +
|
| +class AssignmentValue(object):
|
| + """An assigned expression"""
|
| +
|
| + def __init__(self, ast_node, levels=None, evaluation='',
|
| + assign_type=False):
|
| + """The `level` is `None` for simple assignments and is
|
| + a list of numbers for tuple assignments for example in::
|
| +
|
| + a, (b, c) = x
|
| +
|
| + The levels for for `a` is ``[0]``, for `b` is ``[1, 0]`` and for
|
| + `c` is ``[1, 1]``.
|
| +
|
| + """
|
| + self.ast_node = ast_node
|
| + if levels is None:
|
| + self.levels = []
|
| + else:
|
| + self.levels = levels
|
| + self.evaluation = evaluation
|
| + self.assign_type = assign_type
|
| +
|
| + def get_lineno(self):
|
| + return self.ast_node.lineno
|
| +
|
| +
|
| +class EvaluatedName(PyName):
|
| + """A name whose object will be evaluated later"""
|
| +
|
| + def __init__(self, callback, module=None, lineno=None):
|
| + self.module = module
|
| + self.lineno = lineno
|
| + self.callback = callback
|
| + self.pyobject = _Inferred(callback, _get_concluded_data(module))
|
| +
|
| + def get_object(self):
|
| + return self.pyobject.get()
|
| +
|
| + def get_definition_location(self):
|
| + return (self.module, self.lineno)
|
| +
|
| + def invalidate(self):
|
| + """Forget the `PyObject` this `PyName` holds"""
|
| + self.pyobject.set(None)
|
| +
|
| +
|
| +class ParameterName(PyName):
|
| + """Only a placeholder"""
|
| +
|
| +
|
| +class ImportedModule(PyName):
|
| +
|
| + def __init__(self, importing_module, module_name=None,
|
| + level=0, resource=None):
|
| + self.importing_module = importing_module
|
| + self.module_name = module_name
|
| + self.level = level
|
| + self.resource = resource
|
| + self.pymodule = _get_concluded_data(self.importing_module)
|
| +
|
| + def _current_folder(self):
|
| + resource = self.importing_module.get_module().get_resource()
|
| + if resource is None:
|
| + return None
|
| + return resource.parent
|
| +
|
| + def _get_pymodule(self):
|
| + if self.pymodule.get() is None:
|
| + pycore = self.importing_module.pycore
|
| + if self.resource is not None:
|
| + self.pymodule.set(pycore.project.get_pymodule(self.resource))
|
| + elif self.module_name is not None:
|
| + try:
|
| + if self.level == 0:
|
| + pymodule = pycore.project.get_module(
|
| + self.module_name, self._current_folder())
|
| + else:
|
| + pymodule = pycore.project.get_relative_module(
|
| + self.module_name, self._current_folder(),
|
| + self.level)
|
| + self.pymodule.set(pymodule)
|
| + except exceptions.ModuleNotFoundError:
|
| + pass
|
| + return self.pymodule.get()
|
| +
|
| + def get_object(self):
|
| + if self._get_pymodule() is None:
|
| + return rope.base.pyobjects.get_unknown()
|
| + return self._get_pymodule()
|
| +
|
| + def get_definition_location(self):
|
| + pymodule = self._get_pymodule()
|
| + if not isinstance(pymodule, rope.base.pyobjects.PyDefinedObject):
|
| + return (None, None)
|
| + return (pymodule.get_module(), 1)
|
| +
|
| +
|
| +class ImportedName(PyName):
|
| +
|
| + def __init__(self, imported_module, imported_name):
|
| + self.imported_module = imported_module
|
| + self.imported_name = imported_name
|
| +
|
| + def _get_imported_pyname(self):
|
| + try:
|
| + result = self.imported_module.get_object()[self.imported_name]
|
| + if result != self:
|
| + return result
|
| + except exceptions.AttributeNotFoundError:
|
| + pass
|
| + return UnboundName()
|
| +
|
| + @utils.prevent_recursion(rope.base.pyobjects.get_unknown)
|
| + def get_object(self):
|
| + return self._get_imported_pyname().get_object()
|
| +
|
| + @utils.prevent_recursion(lambda: (None, None))
|
| + def get_definition_location(self):
|
| + return self._get_imported_pyname().get_definition_location()
|
| +
|
| +
|
| +def _get_concluded_data(module):
|
| + if module is None:
|
| + return rope.base.pyobjects._ConcludedData()
|
| + return module._get_concluded_data()
|
| +
|
| +
|
| +def _circular_inference():
|
| + raise rope.base.pyobjects.IsBeingInferredError(
|
| + 'Circular Object Inference')
|
| +
|
| +
|
| +class _Inferred(object):
|
| +
|
| + def __init__(self, get_inferred, concluded=None):
|
| + self.get_inferred = get_inferred
|
| + self.concluded = concluded
|
| + if self.concluded is None:
|
| + self.temp = None
|
| +
|
| + @utils.prevent_recursion(_circular_inference)
|
| + def get(self, *args, **kwds):
|
| + if self.concluded is None or self.concluded.get() is None:
|
| + self.set(self.get_inferred(*args, **kwds))
|
| + if self._get() is None:
|
| + self.set(rope.base.pyobjects.get_unknown())
|
| + return self._get()
|
| +
|
| + def set(self, pyobject):
|
| + if self.concluded is not None:
|
| + self.concluded.set(pyobject)
|
| + self.temp = pyobject
|
| +
|
| + def _get(self):
|
| + if self.concluded is not None:
|
| + return self.concluded.get()
|
| + return self.temp
|
|
|