Example #1
0
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.')
Example #2
0
 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)
Example #3
0
 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
Example #4
0
 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()
Example #5
0
 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.')
Example #6
0
 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()
Example #7
0
 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()
Example #8
0
    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()
Example #9
0
 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()
Example #10
0
    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
Example #11
0
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))