Index: tools/telemetry/third_party/rope/rope/refactor/importutils/importinfo.py |
diff --git a/tools/telemetry/third_party/rope/rope/refactor/importutils/importinfo.py b/tools/telemetry/third_party/rope/rope/refactor/importutils/importinfo.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..114080aac486abddf7e14025bc97733e7177ab70 |
--- /dev/null |
+++ b/tools/telemetry/third_party/rope/rope/refactor/importutils/importinfo.py |
@@ -0,0 +1,201 @@ |
+class ImportStatement(object): |
+ """Represent an import in a module |
+ |
+ `readonly` attribute controls whether this import can be changed |
+ by import actions or not. |
+ |
+ """ |
+ |
+ def __init__(self, import_info, start_line, end_line, |
+ main_statement=None, blank_lines=0): |
+ self.start_line = start_line |
+ self.end_line = end_line |
+ self.readonly = False |
+ self.main_statement = main_statement |
+ self._import_info = None |
+ self.import_info = import_info |
+ self._is_changed = False |
+ self.new_start = None |
+ self.blank_lines = blank_lines |
+ |
+ def _get_import_info(self): |
+ return self._import_info |
+ |
+ def _set_import_info(self, new_import): |
+ if not self.readonly and \ |
+ new_import is not None and not new_import == self._import_info: |
+ self._is_changed = True |
+ self._import_info = new_import |
+ |
+ import_info = property(_get_import_info, _set_import_info) |
+ |
+ def get_import_statement(self): |
+ if self._is_changed or self.main_statement is None: |
+ return self.import_info.get_import_statement() |
+ else: |
+ return self.main_statement |
+ |
+ def empty_import(self): |
+ self.import_info = ImportInfo.get_empty_import() |
+ |
+ def move(self, lineno, blank_lines=0): |
+ self.new_start = lineno |
+ self.blank_lines = blank_lines |
+ |
+ def get_old_location(self): |
+ return self.start_line, self.end_line |
+ |
+ def get_new_start(self): |
+ return self.new_start |
+ |
+ def is_changed(self): |
+ return self._is_changed or (self.new_start is not None or |
+ self.new_start != self.start_line) |
+ |
+ def accept(self, visitor): |
+ return visitor.dispatch(self) |
+ |
+ |
+class ImportInfo(object): |
+ |
+ def get_imported_primaries(self, context): |
+ pass |
+ |
+ def get_imported_names(self, context): |
+ return [primary.split('.')[0] |
+ for primary in self.get_imported_primaries(context)] |
+ |
+ def get_import_statement(self): |
+ pass |
+ |
+ def is_empty(self): |
+ pass |
+ |
+ def __hash__(self): |
+ return hash(self.get_import_statement()) |
+ |
+ def _are_name_and_alias_lists_equal(self, list1, list2): |
+ if len(list1) != len(list2): |
+ return False |
+ for pair1, pair2 in zip(list1, list2): |
+ if pair1 != pair2: |
+ return False |
+ return True |
+ |
+ def __eq__(self, obj): |
+ return isinstance(obj, self.__class__) and \ |
+ self.get_import_statement() == obj.get_import_statement() |
+ |
+ def __ne__(self, obj): |
+ return not self.__eq__(obj) |
+ |
+ @staticmethod |
+ def get_empty_import(): |
+ return EmptyImport() |
+ |
+ |
+class NormalImport(ImportInfo): |
+ |
+ def __init__(self, names_and_aliases): |
+ self.names_and_aliases = names_and_aliases |
+ |
+ def get_imported_primaries(self, context): |
+ result = [] |
+ for name, alias in self.names_and_aliases: |
+ if alias: |
+ result.append(alias) |
+ else: |
+ result.append(name) |
+ return result |
+ |
+ def get_import_statement(self): |
+ result = 'import ' |
+ for name, alias in self.names_and_aliases: |
+ result += name |
+ if alias: |
+ result += ' as ' + alias |
+ result += ', ' |
+ return result[:-2] |
+ |
+ def is_empty(self): |
+ return len(self.names_and_aliases) == 0 |
+ |
+ |
+class FromImport(ImportInfo): |
+ |
+ def __init__(self, module_name, level, names_and_aliases): |
+ self.module_name = module_name |
+ self.level = level |
+ self.names_and_aliases = names_and_aliases |
+ |
+ def get_imported_primaries(self, context): |
+ if self.names_and_aliases[0][0] == '*': |
+ module = self.get_imported_module(context) |
+ return [name for name in module |
+ if not name.startswith('_')] |
+ result = [] |
+ for name, alias in self.names_and_aliases: |
+ if alias: |
+ result.append(alias) |
+ else: |
+ result.append(name) |
+ return result |
+ |
+ def get_imported_resource(self, context): |
+ """Get the imported resource |
+ |
+ Returns `None` if module was not found. |
+ """ |
+ if self.level == 0: |
+ return context.project.find_module( |
+ self.module_name, folder=context.folder) |
+ else: |
+ return context.project.find_relative_module( |
+ self.module_name, context.folder, self.level) |
+ |
+ def get_imported_module(self, context): |
+ """Get the imported `PyModule` |
+ |
+ Raises `rope.base.exceptions.ModuleNotFoundError` if module |
+ could not be found. |
+ """ |
+ if self.level == 0: |
+ return context.project.get_module( |
+ self.module_name, context.folder) |
+ else: |
+ return context.project.get_relative_module( |
+ self.module_name, context.folder, self.level) |
+ |
+ def get_import_statement(self): |
+ result = 'from ' + '.' * self.level + self.module_name + ' import ' |
+ for name, alias in self.names_and_aliases: |
+ result += name |
+ if alias: |
+ result += ' as ' + alias |
+ result += ', ' |
+ return result[:-2] |
+ |
+ def is_empty(self): |
+ return len(self.names_and_aliases) == 0 |
+ |
+ def is_star_import(self): |
+ return len(self.names_and_aliases) > 0 and \ |
+ self.names_and_aliases[0][0] == '*' |
+ |
+ |
+class EmptyImport(ImportInfo): |
+ |
+ names_and_aliases = [] |
+ |
+ def is_empty(self): |
+ return True |
+ |
+ def get_imported_primaries(self, context): |
+ return [] |
+ |
+ |
+class ImportContext(object): |
+ |
+ def __init__(self, project, folder): |
+ self.project = project |
+ self.folder = folder |