예제 #1
0
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
예제 #2
0
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
예제 #3
0
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)
예제 #4
0
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)
예제 #5
0
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)
예제 #6
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.eval_location(self.pymodule, offset)
예제 #7
0
 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]
예제 #8
0
 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]
예제 #9
0
 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)
예제 #10
0
 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.")
예제 #11
0
 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}
예제 #12
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.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()
예제 #13
0
 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.')
예제 #14
0
파일: move.py 프로젝트: Kha/rope
 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.')
예제 #15
0
파일: refactor.py 프로젝트: 0sn/elpy
 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
예제 #16
0
파일: refactor.py 프로젝트: drothlis/elpy
 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
예제 #17
0
파일: refactor.py 프로젝트: exedre/elpy
 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
예제 #18
0
 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
예제 #19
0
    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
예제 #20
0
 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
예제 #21
0
 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()])
예제 #23
0
 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()])
예제 #24
0
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)
예제 #25
0
 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)
예제 #26
0
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 )
예제 #27
0
 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)
예제 #28
0
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)
예제 #29
0
파일: generate.py 프로젝트: climbus/rope
 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)
예제 #30
0
파일: generate.py 프로젝트: climbus/rope
 def get_name(self):
     return worder.get_name_at(self.resource, self.offset)
예제 #31
0
 def _get_name_and_pyname(self):
     return (worder.get_name_at(self.resource, self.offset),
             evaluate.eval_location(self.pymodule, self.offset))
예제 #32
0
 def get_name(self):
     return worder.get_name_at(self.resource, self.offset)
예제 #33
0
 def _get_name_and_pyname(self):
     return (worder.get_name_at(self.resource, self.offset),
             evaluate.eval_location(self.pymodule, self.offset))
예제 #34
0
 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)