def create_move(project, resource, offset=None): """A factory for creating Move objects Based on `resource` and `offset`, return one of `MoveModule`, `MoveGlobal` or `MoveMethod` for performing move refactoring. """ if offset is None: return MoveModule(project, resource) this_pymodule = project.pycore.resource_to_pyobject(resource) pyname = evaluate.get_pyname_at(this_pymodule, offset) if pyname is None: raise exceptions.RefactoringError( 'Move only works on classes, functions, modules and methods.') pyobject = pyname.get_object() if isinstance(pyobject, pyobjects.PyModule) or \ isinstance(pyobject, pyobjects.PyPackage): return MoveModule(project, pyobject.get_resource()) if isinstance(pyobject, pyobjects.PyFunction) and \ isinstance(pyobject.parent, pyobjects.PyClass): return MoveMethod(project, resource, offset) if isinstance(pyobject, pyobjects.PyDefinedObject) and \ isinstance(pyobject.parent, pyobjects.PyModule): return MoveGlobal(project, resource, offset) raise exceptions.RefactoringError( 'Move only works on global classes/functions, modules and methods.')
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.get_pyname_at(self.pymodule, offset)
def __init__(self, project, resource, offset): self.project = project self.pycore = project.pycore this_pymodule = self.pycore.resource_to_pyobject(resource) self.pyname = evaluate.get_pyname_at(this_pymodule, offset) range_finder = worder.Worder(resource.read()) self.region = range_finder.get_primary_range(offset) self.name = range_finder.get_word_at(offset) self.offset = offset
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.get_pyname_at(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 self.pycore = project.pycore this_pymodule = self.pycore.resource_to_pyobject(resource) pyname = evaluate.get_pyname_at(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.pycore = project.pycore this_pymodule = self.pycore.resource_to_pyobject(resource) self.old_pyname = evaluate.get_pyname_at(this_pymodule, offset) self.old_name = self.old_pyname.get_object().get_name() pymodule = self.old_pyname.get_object().get_module() self.source = pymodule.get_resource() self.tools = _MoveTools(self.pycore, self.source, self.old_pyname, self.old_name) self.import_tools = self.tools.import_tools self._check_exceptional_conditions()
def __init__(self, project, resource, offset): self.pycore = project.pycore this_pymodule = self.pycore.resource_to_pyobject(resource) pyname = evaluate.get_pyname_at(this_pymodule, offset) if pyname is None or not isinstance(pyname.get_object(), pyobjects.PyFunction): raise exceptions.RefactoringError( 'Replace method with method object refactoring should be ' 'performed on a function.') self.pyfunction = pyname.get_object() self.pymodule = self.pyfunction.get_module() self.resource = self.pymodule.get_resource()
def __init__(self, project, resource, offset): self.pycore = project.pycore self.offset = offset this_pymodule = self.pycore.resource_to_pyobject(resource) self.old_pyname = evaluate.get_pyname_at(this_pymodule, offset) if self.old_pyname is None or not isinstance(self.old_pyname.get_object(), rope.base.pyobjects.PyClass): raise rope.base.exceptions.RefactoringError( 'Introduce factory should be performed on a class.') self.old_name = self.old_pyname.get_object().get_name() self.pymodule = self.old_pyname.get_object().get_module() self.resource = self.pymodule.get_resource()
def __init__(self, project, resource, offset): self.project = project self.offset = offset this_pymodule = project.pycore.resource_to_pyobject(resource) pyname = evaluate.get_pyname_at(this_pymodule, offset) if pyname is None: raise exceptions.RefactoringError('Unresolvable name selected') self.pyfunction = pyname.get_object() if not isinstance(self.pyfunction, pyobjects.PyFunction) or \ not isinstance(self.pyfunction.parent, pyobjects.PyModule): raise exceptions.RefactoringError( 'Use function works for global functions, only.') self.resource = self.pyfunction.get_module().get_resource() self._check_returns()
def get_changes(self): name = worder.get_name_at(self.resource, self.offset) this_pymodule = self.pycore.resource_to_pyobject(self.resource) pyname = evaluate.get_pyname_at(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 create_inline(project, resource, offset): """Create a refactoring object for inlining Based on `resource` and `offset` it returns an instance of `InlineMethod`, `InlineVariable` or `InlineParameter`. """ pycore = project.pycore this_pymodule = pycore.resource_to_pyobject(resource) pyname = evaluate.get_pyname_at(this_pymodule, offset) message = 'Inline refactoring should be performed on ' \ 'a method, local variable or parameter.' if pyname is None: raise rope.base.exceptions.RefactoringError(message) if isinstance(pyname, pynames.AssignedName): return InlineVariable(project, resource, offset) if isinstance(pyname, pynames.ParameterName): return InlineParameter(project, resource, offset) if isinstance(pyname.get_object(), pyobjects.PyFunction): return InlineMethod(project, resource, offset) else: raise rope.base.exceptions.RefactoringError(message)
def _get_name_and_pyname(self): return (worder.get_name_at(self.resource, self.offset), evaluate.get_pyname_at(self.pymodule, self.offset))