Path: blob/master/elisp/emacs-for-python/rope-dist/rope/base/pynames.py
1423 views
import rope.base.pyobjects1from rope.base import exceptions, utils234class PyName(object):5"""References to `PyObject`\s inside python programs"""67def get_object(self):8"""Return the `PyObject` object referenced by this `PyName`"""910def get_definition_location(self):11"""Return a (module, lineno) tuple"""121314class DefinedName(PyName):1516def __init__(self, pyobject):17self.pyobject = pyobject1819def get_object(self):20return self.pyobject2122def get_definition_location(self):23return (self.pyobject.get_module(), self.pyobject.get_ast().lineno)242526class AssignedName(PyName):27"""Only a placeholder"""282930class UnboundName(PyName):3132def __init__(self, pyobject=None):33self.pyobject = pyobject34if self.pyobject is None:35self.pyobject = rope.base.pyobjects.get_unknown()3637def get_object(self):38return self.pyobject3940def get_definition_location(self):41return (None, None)424344class AssignmentValue(object):45"""An assigned expression"""4647def __init__(self, ast_node, levels=None, evaluation='',48assign_type=False):49"""The `level` is `None` for simple assignments and is50a list of numbers for tuple assignments for example in::5152a, (b, c) = x5354The levels for for `a` is ``[0]``, for `b` is ``[1, 0]`` and for55`c` is ``[1, 1]``.5657"""58self.ast_node = ast_node59if levels == None:60self.levels = []61else:62self.levels = levels63self.evaluation = evaluation64self.assign_type = assign_type6566def get_lineno(self):67return self.ast_node.lineno686970class EvaluatedName(PyName):71"""A name whose object will be evaluated later"""7273def __init__(self, callback, module=None, lineno=None):74self.module = module75self.lineno = lineno76self.callback = callback77self.pyobject = _Inferred(callback, _get_concluded_data(module))7879def get_object(self):80return self.pyobject.get()8182def get_definition_location(self):83return (self.module, self.lineno)8485def invalidate(self):86"""Forget the `PyObject` this `PyName` holds"""87self.pyobject.set(None)888990class ParameterName(PyName):91"""Only a placeholder"""929394class ImportedModule(PyName):9596def __init__(self, importing_module, module_name=None,97level=0, resource=None):98self.importing_module = importing_module99self.module_name = module_name100self.level = level101self.resource = resource102self.pymodule = _get_concluded_data(self.importing_module)103104def _current_folder(self):105resource = self.importing_module.get_module().get_resource()106if resource is None:107return None108return resource.parent109110def _get_pymodule(self):111if self.pymodule.get() is None:112pycore = self.importing_module.pycore113if self.resource is not None:114self.pymodule.set(pycore.resource_to_pyobject(self.resource))115elif self.module_name is not None:116try:117if self.level == 0:118pymodule = pycore.get_module(self.module_name,119self._current_folder())120else:121pymodule = pycore.get_relative_module(122self.module_name, self._current_folder(), self.level)123self.pymodule.set(pymodule)124except exceptions.ModuleNotFoundError:125pass126return self.pymodule.get()127128def get_object(self):129if self._get_pymodule() is None:130return rope.base.pyobjects.get_unknown()131return self._get_pymodule()132133def get_definition_location(self):134pymodule = self._get_pymodule()135if not isinstance(pymodule, rope.base.pyobjects.PyDefinedObject):136return (None, None)137return (pymodule.get_module(), 1)138139140class ImportedName(PyName):141142def __init__(self, imported_module, imported_name):143self.imported_module = imported_module144self.imported_name = imported_name145146def _get_imported_pyname(self):147try:148result = self.imported_module.get_object()[self.imported_name]149if result != self:150return result151except exceptions.AttributeNotFoundError:152pass153return UnboundName()154155@utils.prevent_recursion(rope.base.pyobjects.get_unknown)156def get_object(self):157return self._get_imported_pyname().get_object()158159@utils.prevent_recursion(lambda: (None, None))160def get_definition_location(self):161return self._get_imported_pyname().get_definition_location()162163164def _get_concluded_data(module):165if module is None:166return rope.base.pyobjects._ConcludedData()167return module._get_concluded_data()168169170def _circular_inference():171raise rope.base.pyobjects.IsBeingInferredError(172'Circular Object Inference')173174class _Inferred(object):175176def __init__(self, get_inferred, concluded=None):177self.get_inferred = get_inferred178self.concluded = concluded179if self.concluded is None:180self.temp = None181182@utils.prevent_recursion(_circular_inference)183def get(self, *args, **kwds):184if self.concluded is None or self.concluded.get() is None:185self.set(self.get_inferred(*args, **kwds))186if self._get() is None:187self.set(rope.base.pyobjects.get_unknown())188return self._get()189190def set(self, pyobject):191if self.concluded is not None:192self.concluded.set(pyobject)193self.temp = pyobject194195def _get(self):196if self.concluded is not None:197return self.concluded.get()198return self.temp199200201