def get_canonical_path(project, resource, offset): """Get the canonical path to an object. Given the offset of the object, this returns a list of (name, name_type) tuples representing the canonical path to the object. For example, the 'x' in the following code: class Foo(object): def bar(self): class Qux(object): def mux(self, x): pass we will return: [('Foo', 'CLASS'), ('bar', 'FUNCTION'), ('Qux', 'CLASS'), ('mux', 'FUNCTION'), ('x', 'PARAMETER')] `resource` is a `rope.base.resources.Resource` object. `offset` is the offset of the pyname you want the path to. """ # Retrieve the PyName. pymod = project.get_pymodule(resource) pyname = rope.base.evaluate.eval_location(pymod, offset) # Now get the location of the definition and its containing scope. defmod, lineno = pyname.get_definition_location() if not defmod: return None scope = defmod.get_scope().get_inner_scope_for_line(lineno) # Start with the name of the object we're interested in. names = [] if isinstance(pyname, pynamesdef.ParameterName): names = [(worder.get_name_at(pymod.get_resource(), offset), 'PARAMETER') ] elif isinstance(pyname, pynamesdef.AssignedName): names = [(worder.get_name_at(pymod.get_resource(), offset), 'VARIABLE')] # Collect scope names. while scope.parent: if isinstance(scope, pyscopes.FunctionScope): scope_type = 'FUNCTION' elif isinstance(scope, pyscopes.ClassScope): scope_type = 'CLASS' else: scope_type = None names.append((scope.pyobject.get_name(), scope_type)) scope = scope.parent names.append((defmod.get_resource().real_path, 'MODULE')) names.reverse() return names
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_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.pycore.resource_to_pyobject(resource) primary, pyname = rope.base.evaluate.eval_location2(this_pymodule, offset) def is_match(occurrence): return unsure finder = occurrences.create_finder(project.pycore, name, pyname, unsure=is_match, in_hierarchy=in_hierarchy, instance=primary) if resources is None: resources = project.pycore.get_python_files() job_set = task_handle.create_jobset('Finding Occurrences', count=len(resources)) return _find_locations(finder, resources, job_set)
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 __init__(self, project, resource, offset): self.pycore = project.pycore self.resource = resource self.offset = offset self.old_name = worder.get_name_at(resource, offset) self.pymodule = self.pycore.resource_to_pyobject(self.resource) self.old_pyname = evaluate.eval_location(self.pymodule, offset)
def __init__(self, project, resource, offset=None): """If `offset` is None, the `resource` itself will be renamed""" self.project = project self.pycore = project.pycore self.resource = resource if offset is not None: self.old_name = worder.get_name_at(self.resource, offset) this_pymodule = self.pycore.resource_to_pyobject(self.resource) self.old_instance, self.old_pyname = \ evaluate.eval_location2(this_pymodule, offset) if self.old_pyname is None: raise exceptions.RefactoringError( 'Rename refactoring should be performed' ' on resolvable python identifiers.') else: if not resource.is_folder() and resource.name == '__init__.py': resource = resource.parent dummy_pymodule = self.pycore.get_string_module('') self.old_instance = None self.old_pyname = pynames.ImportedModule(dummy_pymodule, resource=resource) if resource.is_folder(): self.old_name = resource.name else: self.old_name = resource.name[:-3]
def __init__(self, project, resource, offset): self.project = project self.resource = resource self.offset = offset self.old_name = worder.get_name_at(resource, offset) self.pymodule = project.get_pymodule(self.resource) self.old_pyname = evaluate.eval_location(self.pymodule, offset)
def __init__(self, project, resource, offset): self.project = project this_pymodule = self.project.get_pymodule(resource) pyname = evaluate.eval_location(this_pymodule, offset) self.method_name = worder.get_name_at(resource, offset) self.pyfunction = pyname.get_object() if self.pyfunction.get_kind() != "method": raise exceptions.RefactoringError("Only normal methods" " can be moved.")
def get_imports(self, path, offset): for r in self.root_project.get_python_files(): print(r.path) res = self.get_resource(path) name = get_name_at(res, offset) imports = tuple(self.get_names(name)) location = self.auto_import.find_insertion_line(res.read()) return {'imports': imports, 'location': location}
def __init__(self, project, resource, offset): self.pycore = project.pycore self.name = worder.get_name_at(resource, offset) this_pymodule = self.pycore.resource_to_pyobject(resource) self.pyname = evaluate.eval_location(this_pymodule, offset) if not self._is_an_attribute(self.pyname): raise exceptions.RefactoringError( 'Encapsulate field should be performed on class attributes.') self.resource = self.pyname.get_definition_location()[0].get_resource()
def __init__(self, project, resource, offset): self.project = project this_pymodule = self.project.get_pymodule(resource) pyname = evaluate.eval_location(this_pymodule, offset) self.method_name = worder.get_name_at(resource, offset) self.pyfunction = pyname.get_object() if self.pyfunction.get_kind() != 'method': raise exceptions.RefactoringError('Only normal methods' ' can be moved.')
def __init__(self, project, resource, offset): self.project = project self.pycore = project.pycore this_pymodule = self.pycore.resource_to_pyobject(resource) pyname = evaluate.eval_location(this_pymodule, offset) self.method_name = worder.get_name_at(resource, offset) self.pyfunction = pyname.get_object() if self.pyfunction.get_kind() != 'method': raise exceptions.RefactoringError('Only normal methods' ' can be moved.')
def _is_on_symbol(self, offset): "Is this offset on a symbol?" data = self.resource.read() if len(data) > offset and not data[offset].isalnum(): return False word = worder.get_name_at(self.resource, offset) if word: return True else: return False
def _is_on_symbol(self, offset): "Is this offset on a symbol?" if not ROPE_AVAILABLE: return False data = self.resource.read() if len(data) > offset and not data[offset].isalnum(): return False word = worder.get_name_at(self.resource, offset) if word: return True else: return False
def _is_on_symbol(self, offset): "Is this offset on a symbol?" if not ROPE_AVAILABLE: return False data = self.resource.read() if offset >= len(data): return False if data[offset] != '_' and not data[offset].isalnum(): return False word = worder.get_name_at(self.resource, offset) if word: return True else: return False
def __init__(self, project, resource, offset): self.project = project this_pymodule = self.project.get_pymodule(resource) self.old_pyname = evaluate.eval_location(this_pymodule, offset) if self.old_pyname is None: raise exceptions.RefactoringError("Move refactoring should be performed on a " "class/function/variable.") if self._is_variable(self.old_pyname): self.old_name = worder.get_name_at(resource, offset) pymodule = this_pymodule else: self.old_name = self.old_pyname.get_object().get_name() pymodule = self.old_pyname.get_object().get_module() self._check_exceptional_conditions() self.source = pymodule.get_resource() self.tools = _MoveTools(self.project, self.source, self.old_pyname, self.old_name) self.import_tools = self.tools.import_tools
def get_changes(self): name = worder.get_name_at(self.resource, self.offset) this_pymodule = self.project.get_pymodule(self.resource) pyname = evaluate.eval_location(this_pymodule, self.offset) if not self._is_a_method_local(pyname): raise exceptions.RefactoringError( 'Convert local variable to field should be performed on \n' 'a local variable of a method.') pymodule, lineno = pyname.get_definition_location() function_scope = pymodule.get_scope().get_inner_scope_for_line(lineno) # Not checking redefinition #self._check_redefinition(name, function_scope) new_name = self._get_field_name(function_scope.pyobject, name) changes = Rename(self.project, self.resource, self.offset).\ get_changes(new_name, resources=[self.resource]) return changes
def __init__(self, project, resource, offset): self.project = project this_pymodule = self.project.get_pymodule(resource) self.old_pyname = evaluate.eval_location(this_pymodule, offset) if self.old_pyname is None: raise exceptions.RefactoringError( 'Move refactoring should be performed on a ' 'class/function/variable.') if self._is_variable(self.old_pyname): self.old_name = worder.get_name_at(resource, offset) pymodule = this_pymodule else: self.old_name = self.old_pyname.get_object().get_name() pymodule = self.old_pyname.get_object().get_module() self._check_exceptional_conditions() self.source = pymodule.get_resource() self.tools = _MoveTools(self.project, self.source, self.old_pyname, self.old_name) self.import_tools = self.tools.import_tools
def _set_name_and_pyname(self): self.name = worder.get_name_at(self.resource, self.offset) this_pymodule = self.project.get_pymodule(self.resource) self.primary, self.pyname = evaluate.eval_location2( this_pymodule, self.offset) if self.pyname is None: return pyobject = self.pyname.get_object() if isinstance(pyobject, pyobjects.PyClass) and "__init__" in pyobject: self.pyname = pyobject["__init__"] self.name = "__init__" pyobject = self.pyname.get_object() self.others = None if (self.name == "__init__" and isinstance(pyobject, pyobjects.PyFunction) and isinstance(pyobject.parent, pyobjects.PyClass)): pyclass = pyobject.parent self.others = (pyclass.get_name(), pyclass.parent[pyclass.get_name()])
def _set_name_and_pyname(self): self.name = worder.get_name_at(self.resource, self.offset) this_pymodule = self.pycore.resource_to_pyobject(self.resource) self.primary, self.pyname = evaluate.eval_location2( this_pymodule, self.offset) if self.pyname is None: return pyobject = self.pyname.get_object() if isinstance(pyobject, pyobjects.PyClass) and \ '__init__' in pyobject: self.pyname = pyobject['__init__'] self.name = '__init__' pyobject = self.pyname.get_object() self.others = None if self.name == '__init__' and \ isinstance(pyobject, pyobjects.PyFunction) and \ isinstance(pyobject.parent, pyobjects.PyClass): pyclass = pyobject.parent self.others = (pyclass.get_name(), pyclass.parent[pyclass.get_name()])
def _set_name_and_pyname(self): self.name = worder.get_name_at(self.resource, self.offset) this_pymodule = self.project.get_pymodule(self.resource) self.primary, self.pyname = evaluate.eval_location2( this_pymodule, self.offset) if self.pyname is None: return pyobject = self.pyname.get_object() if isinstance(pyobject, pyobjects.PyClass) and \ '__init__' in pyobject: self.pyname = pyobject['__init__'] self.name = '__init__' pyobject = self.pyname.get_object() self.others = None if self.name == '__init__' and \ isinstance(pyobject, pyobjects.PyFunction) and \ isinstance(pyobject.parent, pyobjects.PyClass): pyclass = pyobject.parent self.others = (pyclass.get_name(), pyclass.parent[pyclass.get_name()])
def getOccurencesForEditor(fileName, editor, throwException): " Provides a list of the current token occurences " temporaryName = "" result = [] nameToSearch = "" try: temporaryName = _switchFileAndBuffer(fileName, editor) GlobalData().validateRopeProject() ropeProject = GlobalData().getRopeProject(fileName) position = editor.currentPosition() resource = path_to_resource(ropeProject, fileName) nameToSearch = worder.get_name_at(resource, position) result = find_occurrences(ropeProject, resource, position, True) except: if throwException: raise _restoreOriginalFile(fileName, temporaryName, editor) return nameToSearch, _buildOccurrencesImplementationsResult(result)
def find_usages(self): """ Find all usages of the word under cursor. """ api.editor.save_all_editors() if api.editor.get_current_editor() is None: return file_path = api.editor.get_current_path() api.editor.save_current_editor() offset = self._get_real_position( api.editor.get_current_editor().textCursor().position()) self._occurrence_to_search = worder.get_name_at( libutils.path_to_resource(self._main_project, file_path), offset) main_project = api.project.get_current_project() other_projects = self._get_other_projects(path_only=True) file_path = file_path api.tasks.start( _('Refactoring: find usages'), find_usages, self._on_find_usages_finished, args=(main_project, other_projects, file_path, offset), cancellable=True, use_thread=True)
def getOccurencesForEditor( fileName, editor, throwException ): " Provides a list of the current token occurences " temporaryName = "" result = [] nameToSearch = "" try: temporaryName = _switchFileAndBuffer( fileName, editor ) GlobalData().validateRopeProject() ropeProject = GlobalData().getRopeProject( fileName ) position = editor.currentPosition() resource = path_to_resource( ropeProject, fileName ) nameToSearch = worder.get_name_at( resource, position ) result = find_occurrences( ropeProject, resource, position, True ) except: if throwException: raise _restoreOriginalFile( fileName, temporaryName, editor ) return nameToSearch, _buildOccurrencesImplementationsResult( result )
def find_usages(self): """ Find all usages of the word under cursor. """ api.editor.save_all_editors() if api.editor.get_current_editor() is None: return file_path = api.editor.get_current_path() api.editor.save_current_editor() offset = self._get_real_position( api.editor.get_current_editor().textCursor().position()) self._occurrence_to_search = worder.get_name_at( libutils.path_to_resource(self._main_project, file_path), offset) main_project = api.project.get_current_project() other_projects = self._get_other_projects(path_only=True) file_path = file_path api.tasks.start(_('Refactoring: find usages'), find_usages, self._on_find_usages_finished, args=(main_project, other_projects, file_path, offset), cancellable=True, use_thread=True)
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.pycore.resource_to_pyobject(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.pycore, name, filters=filters) if resources is None: resources = project.pycore.get_python_files() job_set = task_handle.create_jobset('Finding Implementations', count=len(resources)) return _find_locations(finder, resources, job_set)
def get_name(self): if self.is_constructor(): return "__init__" if self.is_instance(): return "__call__" return worder.get_name_at(self.resource, self.offset)
def get_name(self): return worder.get_name_at(self.resource, self.offset)
def _get_name_and_pyname(self): return (worder.get_name_at(self.resource, self.offset), evaluate.eval_location(self.pymodule, self.offset))
def get_name(self): if self.is_constructor(): return '__init__' if self.is_instance(): return '__call__' return worder.get_name_at(self.resource, self.offset)