Skip to content

Instantly share code, notes, and snippets.

@mcepl
Created September 12, 2017 05:09
Show Gist options
  • Save mcepl/34cf6dfc99598573ea36b1c901c325b9 to your computer and use it in GitHub Desktop.
Save mcepl/34cf6dfc99598573ea36b1c901c325b9 to your computer and use it in GitHub Desktop.
diff --git a/rope/base/worder.py b/rope/base/worder.py
index c85c6b3..35bc3ca 100644
--- a/rope/base/worder.py
+++ b/rope/base/worder.py
@@ -74,6 +74,9 @@ class Worder(object):
def is_from_statement(self, offset):
return self.code_finder.is_from_statement(offset)
- def is_from_star_statement(self, offset):
- return self.code_finder.is_from_star_statement(offset)
+
def get_from_aliased(self, offset):
return self.code_finder.get_from_aliased(offset)
@@ -329,6 +332,18 @@ class _RealFinder(object):
from_names = self._find_first_non_space_char(from_names)
return self._find_import_end(from_names) >= offset
- def is_from_star_statement(self, offset):
- try:
- last_from = self.code.rindex('from ', 0, offset)
- from_import = self.code.index(' import ', last_from)
- from_names = from_import + 8
- except ValueError:
- return False
- from_names = self._find_first_non_space_char(from_names)
- if self._find_import_end(from_names) < offset:
- return False
- ```
return self.code[from_names] == '*'
```
+
def is_from_statement_module(self, offset):
if offset >= len(self.code) - 1:
return False
diff --git a/rope/refactor/move.py b/rope/refactor/move.py
index 1c9a03b..f5a00e1 100644
--- a/rope/refactor/move.py
+++ b/rope/refactor/move.py
@@ -423,9 +423,14 @@ class MoveModule(object):
return destname + '.' + self.old_name
return self.old_name
- def _new_import(self, dest):
- def _new_normal_import(self, dest):
return importutils.NormalImport([(self._new_modname(dest), None)])
- def _new_from_import(self, dest_name):
- module_name = '.'.join(dest_name[:-1])
- name = dest_name[-1]
- return importutils.FromImport(module_name, 0, [(name, None)])
+
def _change_moving_module(self, changes, dest):
if not self.source.is_folder():
pymodule = self.project.get_pymodule(self.source)
@@ -444,11 +449,23 @@ class MoveModule(object):
if pymodule is None:
pymodule = self.project.get_pymodule(resource)
new_name = self._new_modname(dest)
- new_import = self._new_import(dest)
- source = self.tools.rename_in_module(
- new_name, imports=True, pymodule=pymodule, resource=resource)
- should_import = self.tools.occurs_in_module(
- pymodule=pymodule, resource=resource, imports=False)
- dest_name = new_name.split('.')
- (in_from_stmt, is_star) = self.tools.occurs_in_from_statement(
- pymodule=pymodule, resource=resource, imports=True)
+
- if in_from_stmt and len(dest_name) > 1:
- if is_star:
- dest_name.append('*')
- new_import = self._new_from_import(dest_name)
- source = resource.read() if resource else pymodule.source_code
- should_import = True
- else:
- new_import = self._new_normal_import(dest)
- source = self.tools.rename_in_module(
- new_name, imports=True, pymodule=pymodule, resource=resource)
- should_import = self.tools.occurs_in_module(
- ```
pymodule=pymodule, resource=resource, imports=False)
```
+
pymodule = self.tools.new_pymodule(pymodule, source)
source = self.tools.remove_old_imports(pymodule)
if should_import:
@@ -517,11 +534,29 @@ class _MoveTools(object):
return source
def occurs_in_module(self, pymodule=None, resource=None, imports=True):
- for occurrence in self._find_occurrences(pymodule, resource, imports):
- return True
- return False
+
- def occurs_in_from_statement(self, pymodule=None, resource=None,
- imports=True):
- for occurrence in self._find_occurrences(pymodule, resource, imports):
- if occurrence.is_in_from_statement():
- return (True, occurrence.is_from_star_statement())
- return (False, False)
+
- def occurs_in_normal_import_statement(self, pymodule=None, resource=None,
- imports=True):
- for occurrence in self._find_occurrences(pymodule, resource, imports):
- if occurrence.is_in_normal_import_statement():
- return True
- return False
+
- def _find_occurrences(self, pymodule=None, resource=None, imports=True):
finder = self._create_finder(imports)
for occurrence in finder.find_occurrences(pymodule=pymodule,
resource=resource):
- return True
- return False
- ```
yield occurrence
```
def _create_finder(self, imports):
return occurrences.create_finder(self.project, self.old_name,
diff --git a/rope/refactor/occurrences.py b/rope/refactor/occurrences.py
index 14a2d7d..380255c 100644
--- a/rope/refactor/occurrences.py
+++ b/rope/refactor/occurrences.py
@@ -142,8 +142,20 @@ class Occurrence(object):
@utils.saveit
def is_in_import_statement(self):
- return (self.tools.word_finder.is_from_statement(self.offset) or
- self.tools.word_finder.is_import_statement(self.offset))
- return self.is_in_from_statement() or \
- self.is_in_normal_import_statement()
+
- @utils.saveit
- def is_in_from_statement(self):
- return self.tools.word_finder.is_from_statement(self.offset)
+
- @utils.saveit
- def is_in_normal_import_statement(self):
- return self.tools.word_finder.is_import_statement(self.offset)
+
- @utils.saveit
- def is_from_star_statement(self):
- ```
return self.tools.word_finder.is_from_star_statement(self.offset)
```
def is_called(self):
return self.tools.word_finder.is_a_function_being_called(self.offset)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment