From 3978162137d3a1e6d8ed645c32082e162857559d Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 13 Dec 2022 22:36:16 +0100 Subject: [PATCH 1/8] fix most of #544 and some minor refactoring. --- rope/base/change.py | 12 +++++++++--- rope/base/history.py | 8 ++++++-- rope/base/libutils.py | 4 +++- rope/base/oi/doa.py | 5 ++--- rope/base/project.py | 19 ++++++++----------- rope/base/pycore.py | 8 ++++---- rope/base/pynamesdef.py | 5 ++--- rope/base/pyobjectsdef.py | 2 +- rope/contrib/autoimport/pickle.py | 27 +++++++++++++-------------- rope/contrib/autoimport/sqlite.py | 16 ++++++++++------ rope/contrib/findit.py | 12 ++++++++---- rope/contrib/fixmodnames.py | 2 ++ rope/refactor/change_signature.py | 11 +++++++---- rope/refactor/encapsulate_field.py | 4 +++- rope/refactor/inline.py | 14 ++++++++++---- rope/refactor/introduce_factory.py | 2 ++ rope/refactor/move.py | 12 +++++++++--- rope/refactor/occurrences.py | 14 +++++++------- rope/refactor/rename.py | 4 +++- rope/refactor/restructure.py | 10 ++++++---- rope/refactor/similarfinder.py | 19 +++++++++---------- rope/refactor/usefunction.py | 10 ++++------ 22 files changed, 128 insertions(+), 92 deletions(-) diff --git a/rope/base/change.py b/rope/base/change.py index 16eadb9fb..cf0668730 100644 --- a/rope/base/change.py +++ b/rope/base/change.py @@ -60,7 +60,9 @@ def __init__(self, description, timestamp=None): self.description = description self.time = timestamp - def do(self, job_set=taskhandle.NullJobSet()): + def do(self, job_set=None): + if job_set is None: + job_set = taskhandle.NullJobSet() try: done = [] for change in self.changes: @@ -72,7 +74,9 @@ def do(self, job_set=taskhandle.NullJobSet()): change.undo() raise - def undo(self, job_set=taskhandle.NullJobSet()): + def undo(self, job_set=None): + if job_set is None: + job_set = taskhandle.NullJobSet() try: done = [] for change in reversed(self.changes): @@ -123,7 +127,9 @@ def _handle_job_set(function): methods of `Change`. """ - def call(self, job_set=taskhandle.NullJobSet()): + def call(self, job_set=None): + if job_set is None: + job_set = taskhandle.NullJobSet() job_set.started_job(str(self)) function(self) job_set.finished_job() diff --git a/rope/base/history.py b/rope/base/history.py index cbfc692db..24bda59da 100644 --- a/rope/base/history.py +++ b/rope/base/history.py @@ -25,13 +25,15 @@ def _load_history(self): for data in result[1]: self._redo_list.append(to_change(data)) - def do(self, changes, task_handle=taskhandle.NullTaskHandle()): + def do(self, changes, task_handle=None): """Perform the change and add it to the `self.undo_list` Note that uninteresting changes (changes to ignored files) will not be appended to `self.undo_list`. """ + if task_handle is None: + task_handle = taskhandle.NullTaskHandle() try: self.current_change = changes changes.do(change.create_job_set(task_handle, changes)) @@ -52,7 +54,7 @@ def _is_change_interesting(self, changes): return True return False - def undo(self, change=None, drop=False, task_handle=taskhandle.NullTaskHandle()): + def undo(self, change=None, drop=False, task_handle=None): """Redo done changes from the history When `change` is `None`, the last done change will be undone. @@ -65,6 +67,8 @@ def undo(self, change=None, drop=False, task_handle=taskhandle.NullTaskHandle()) the redo list. """ + if task_handle is None: + task_handle = taskhandle.NullTaskHandle() if not self._undo_list: raise exceptions.HistoryError("Undo list is empty") if change is None: diff --git a/rope/base/libutils.py b/rope/base/libutils.py index c2c1d3f77..fd6d02ffb 100644 --- a/rope/base/libutils.py +++ b/rope/base/libutils.py @@ -67,11 +67,13 @@ def analyze_module(project, resource): project.pycore.analyze_module(resource) -def analyze_modules(project, task_handle=taskhandle.NullTaskHandle()): +def analyze_modules(project, task_handle=None): """Perform static object analysis on all python files in the project Note that this might be really time consuming. """ + if task_handle is None: + task_handle = taskhandle.NullTaskHandle() resources = project.get_python_files() job_set = task_handle.create_jobset("Analyzing Modules", len(resources)) for resource in resources: diff --git a/rope/base/oi/doa.py b/rope/base/oi/doa.py index 2ec6a7fc8..f0034b4bf 100644 --- a/rope/base/oi/doa.py +++ b/rope/base/oi/doa.py @@ -1,4 +1,5 @@ import base64 +import contextlib import hashlib import hmac @@ -122,7 +123,7 @@ def kill_process(self): """Stop the process""" if self.process.poll() is not None: return - try: + with contextlib.suppress(OSError): if hasattr(self.process, "terminate"): self.process.terminate() elif os.name != "nt": @@ -132,8 +133,6 @@ def kill_process(self): handle = int(self.process._handle) ctypes.windll.kernel32.TerminateProcess(handle, -1) - except OSError: - pass def add_finishing_observer(self, observer): """Notify this observer when execution finishes""" diff --git a/rope/base/project.py b/rope/base/project.py index 527ffcf33..dadb3144f 100644 --- a/rope/base/project.py +++ b/rope/base/project.py @@ -1,3 +1,4 @@ +import contextlib import os import shutil import sys @@ -69,11 +70,9 @@ def get_module(self, name, folder=None): def get_python_path_folders(self): result = [] for src in self.prefs.get("python_path", []) + sys.path: - try: + with contextlib.suppress(exceptions.ResourceNotFoundError): src_folder = get_no_project().get_resource(src) result.append(src_folder) - except exceptions.ResourceNotFoundError: - pass return result # INFO: It was decided not to cache source folders, since: @@ -111,12 +110,14 @@ def remove_observer(self, observer): if observer in self.observers: self.observers.remove(observer) - def do(self, changes, task_handle=taskhandle.NullTaskHandle()): + def do(self, changes, task_handle=None): """Apply the changes in a `ChangeSet` Most of the time you call this function for committing the changes for a refactoring. """ + if task_handle is None: + task_handle = taskhandle.NullTaskHandle() self.history.do(changes, task_handle=task_handle) def get_pymodule(self, resource, force_errors=False): @@ -256,9 +257,8 @@ def _get_resource_path(self, name): return os.path.join(self._address, *name.split("/")) def _init_ropefolder(self): - if self.ropefolder is not None: - if not self.ropefolder.exists(): - self._create_recursively(self.ropefolder) + if self.ropefolder is not None and not self.ropefolder.exists(): + self._create_recursively(self.ropefolder) def _create_recursively(self, folder): if folder.parent != self.root and not folder.parent.exists(): @@ -436,12 +436,9 @@ def _import_old_files(self, name): def _get_opener(self, compress): if compress: - try: + with contextlib.suppress(ImportError): import gzip - return gzip.open - except ImportError: - pass return open def _get_file(self, name, compress): diff --git a/rope/base/pycore.py b/rope/base/pycore.py index abab0120e..d249a3bf9 100644 --- a/rope/base/pycore.py +++ b/rope/base/pycore.py @@ -1,4 +1,5 @@ import bisect +import contextlib import difflib import warnings @@ -214,7 +215,8 @@ def analyze_module( self, pymodule, should_analyze, search_subscopes, followed_calls ) - def get_classes(self, task_handle=taskhandle.NullTaskHandle()): + def get_classes(self, task_handle=None): + warnings.warn( "`PyCore.get_classes()` is deprecated", DeprecationWarning, stacklevel=2 ) @@ -295,7 +297,7 @@ def get_pymodule(self, name): def perform_soa_on_changed_scopes(project, resource, old_contents): pycore = project.pycore if resource.exists() and pycore.is_python_file(resource): - try: + with contextlib.suppress(exceptions.ModuleSyntaxError): new_contents = resource.read() # detecting changes in new_contents relative to old_contents detector = _TextChangeDetector(new_contents, old_contents) @@ -311,8 +313,6 @@ def should_analyze(pydefined): return detector.consume_changes(start, end) pycore.analyze_module(resource, should_analyze, search_subscopes) - except exceptions.ModuleSyntaxError: - pass class _TextChangeDetector: diff --git a/rope/base/pynamesdef.py b/rope/base/pynamesdef.py index ffbfb8e3c..3b51ee636 100644 --- a/rope/base/pynamesdef.py +++ b/rope/base/pynamesdef.py @@ -1,3 +1,4 @@ +import contextlib import rope.base.oi.soi from rope.base import pynames from rope.base.pynames import * @@ -24,10 +25,8 @@ def get_object(self): def get_definition_location(self): """Returns a (module, lineno) tuple""" if self.lineno is None and self.assignments: - try: + with contextlib.suppress(AttributeError): self.lineno = self.assignments[0].get_lineno() - except AttributeError: - pass return (self.module, self.lineno) def invalidate(self): diff --git a/rope/base/pyobjectsdef.py b/rope/base/pyobjectsdef.py index b87d2462a..04d57c957 100644 --- a/rope/base/pyobjectsdef.py +++ b/rope/base/pyobjectsdef.py @@ -108,7 +108,7 @@ def decorators(self): try: return self.ast_node.decorator_list except AttributeError: - return getattr(self.ast_node, "decorators", None) + return self.ast_node.decorators class PyComprehension(pyobjects.PyComprehension): diff --git a/rope/contrib/autoimport/pickle.py b/rope/contrib/autoimport/pickle.py index ef733947a..d4ff955d6 100644 --- a/rope/contrib/autoimport/pickle.py +++ b/rope/contrib/autoimport/pickle.py @@ -10,6 +10,8 @@ sqlite-based storage backend (rope.contrib.autoimport.sqlite.AutoImport). """ + +import contextlib import re from rope.base import ( @@ -63,9 +65,8 @@ def import_assist(self, starting): # XXX: breaking if gave up! use generators result = [] for module in self.names: - for global_name in self.names[module]: - if global_name.startswith(starting): - result.append((global_name, module)) + result.extend((global_name, module) for global_name in self.names[module] if global_name.startswith(starting)) + return result def get_modules(self, name): @@ -84,7 +85,7 @@ def get_name_locations(self, name): result = [] for module in self.names: if name in self.names[module]: - try: + with contextlib.suppress(exceptions.ModuleNotFoundError): pymodule = self.project.get_module(module) if name in pymodule: pyname = pymodule[name] @@ -93,12 +94,10 @@ def get_name_locations(self, name): resource = module.get_module().get_resource() if resource is not None and lineno is not None: result.append((resource, lineno)) - except exceptions.ModuleNotFoundError: - pass return result def generate_cache( - self, resources=None, underlined=None, task_handle=taskhandle.NullTaskHandle() + self, resources=None, underlined=None, task_handle=None ): """Generate global name cache for project files @@ -107,6 +106,8 @@ def generate_cache( project are cached. """ + if task_handle is None: + task_handle = taskhandle.NullTaskHandle() if resources is None: resources = self.project.get_python_files() job_set = task_handle.create_jobset( @@ -118,9 +119,11 @@ def generate_cache( job_set.finished_job() def generate_modules_cache( - self, modules, underlined=None, task_handle=taskhandle.NullTaskHandle() + self, modules, underlined=None, task_handle=None ): """Generate global name cache for modules listed in `modules`""" + if task_handle is None: + task_handle = taskhandle.NullTaskHandle() job_set = task_handle.create_jobset( "Generating autoimport cache for modules", len(modules) ) @@ -164,23 +167,19 @@ def find_insertion_line(self, code): def update_resource(self, resource, underlined=None): """Update the cache for global names in `resource`""" - try: + with contextlib.suppress(exceptions.ModuleSyntaxError): pymodule = self.project.get_pymodule(resource) modname = self._module_name(resource) self._add_names(pymodule, modname, underlined) - except exceptions.ModuleSyntaxError: - pass def update_module(self, modname, underlined=None): """Update the cache for global names in `modname` module `modname` is the name of a module. """ - try: + with contextlib.suppress(exceptions.ModuleNotFoundError): pymodule = self.project.get_module(modname) self._add_names(pymodule, modname, underlined) - except exceptions.ModuleNotFoundError: - pass def _module_name(self, resource): return libutils.modname(resource) diff --git a/rope/contrib/autoimport/sqlite.py b/rope/contrib/autoimport/sqlite.py index 381aa99e0..990c6ce33 100644 --- a/rope/contrib/autoimport/sqlite.py +++ b/rope/contrib/autoimport/sqlite.py @@ -1,4 +1,6 @@ """AutoImport module for rope.""" + +import contextlib import re import sqlite3 import sys @@ -158,7 +160,7 @@ def search_full( self, name: str, exact_match: bool = False, - ignored_names: Set[str] = set(), + ignored_names: Set[str] = None, ) -> Generator[SearchResult, None, None]: """ Search both modules and names for an import string. @@ -177,6 +179,8 @@ def search_full( __________ Unsorted Generator of SearchResults. Each is guaranteed to be unique. """ + if ignored_names is None: + ignored_names = set() results = set(self._search_name(name, exact_match)) results = results.union(self._search_module(name, exact_match)) for result in results: @@ -293,7 +297,7 @@ def generate_cache( def generate_modules_cache( self, modules: List[str] = None, - task_handle: taskhandle.BaseTaskHandle = taskhandle.NullTaskHandle(), + task_handle: taskhandle.BaseTaskHandle = None, single_thread: bool = False, underlined: Optional[bool] = None, ): @@ -305,6 +309,8 @@ def generate_modules_cache( Do not use this for generating your own project's internal names, use generate_resource_cache for that instead. """ + if task_handle is None: + task_handle = taskhandle.NullTaskHandle() underlined = self.underlined if underlined is None else underlined packages: List[Package] = ( @@ -315,7 +321,7 @@ def generate_modules_cache( existing = self._get_packages_from_cache() packages = list(filter_packages(packages, underlined, existing)) - if len(packages) == 0: + if not packages: return self._add_packages(packages) job_set = task_handle.create_jobset("Generating autoimport cache", 0) @@ -359,7 +365,7 @@ def get_name_locations(self, name): models.Name.search_by_name_like.select("module"), (name,) ).fetchall() for module in modules: - try: + with contextlib.suppress(exceptions.ModuleNotFoundError): module_name = module[0] if module_name.startswith(f"{self.project_package.name}."): module_name = ".".join(module_name.split(".")) @@ -371,8 +377,6 @@ def get_name_locations(self, name): resource = module.get_module().get_resource() if resource is not None and lineno is not None: result.append((resource, lineno)) - except exceptions.ModuleNotFoundError: - pass return result def clear_cache(self): diff --git a/rope/contrib/findit.py b/rope/contrib/findit.py index 89782953a..d8ab40acc 100644 --- a/rope/contrib/findit.py +++ b/rope/contrib/findit.py @@ -16,7 +16,7 @@ def find_occurrences( unsure=False, resources=None, in_hierarchy=False, - task_handle=taskhandle.NullTaskHandle(), + task_handle=None, ): """Return a list of `Location` @@ -27,6 +27,8 @@ def find_occurrences( in the project are searched. """ + if task_handle is None: + task_handle = taskhandle.NullTaskHandle() name = worder.get_name_at(resource, offset) this_pymodule = project.get_pymodule(resource) primary, pyname = evaluate.eval_location2(this_pymodule, offset) @@ -49,13 +51,15 @@ def is_match(occurrence): def find_implementations( - project, resource, offset, resources=None, task_handle=taskhandle.NullTaskHandle() + project, resource, offset, resources=None, task_handle=None ): """Find the places a given method is overridden. Finds the places a method is implemented. Returns a list of `Location`. """ + if task_handle is None: + task_handle = taskhandle.NullTaskHandle() name = worder.get_name_at(resource, offset) this_pymodule = project.get_pymodule(resource) pyname = evaluate.eval_location(this_pymodule, offset) @@ -122,7 +126,7 @@ def _find_locations(finder, resources, job_set): result = [] for resource in resources: job_set.started_job(resource.path) - for occurrence in finder.find_occurrences(resource): - result.append(Location(occurrence)) + result.extend(Location(occurrence) for occurrence in finder.find_occurrences(resource)) + job_set.finished_job() return result diff --git a/rope/contrib/fixmodnames.py b/rope/contrib/fixmodnames.py index 3f4e4a9cc..c5dca66ec 100644 --- a/rope/contrib/fixmodnames.py +++ b/rope/contrib/fixmodnames.py @@ -31,6 +31,8 @@ def get_changes(self, fixer=str.lower, task_handle=taskhandle.NullTaskHandle()): the name of a module, it should return the fixed name. """ + if task_handle is None: + task_handle = taskhandle.NullTaskHandle() stack = changestack.ChangeStack(self.project, "Fixing module names") jobset = task_handle.create_jobset( "Fixing module names", self._count_fixes(fixer) + 1 diff --git a/rope/refactor/change_signature.py b/rope/refactor/change_signature.py index 42d6082f1..ea55beb00 100644 --- a/rope/refactor/change_signature.py +++ b/rope/refactor/change_signature.py @@ -53,8 +53,10 @@ def _change_calls( call_changer, in_hierarchy=None, resources=None, - handle=taskhandle.NullTaskHandle(), + handle=None, ): + if handle is None: + handle = taskhandle.NullTaskHandle() if resources is None: resources = self.project.get_python_files() changes = ChangeSet("Changing signature of <%s>" % self.name) @@ -151,7 +153,7 @@ def get_changes( changers, in_hierarchy=False, resources=None, - task_handle=taskhandle.NullTaskHandle(), + task_handle=None, ): """Get changes caused by this refactoring @@ -163,6 +165,8 @@ def get_changes( in the project are searched. """ + if task_handle is None: + task_handle = taskhandle.NullTaskHandle() function_changer = _FunctionChangers( self.pyname.get_object(), self._definfo(), changers ) @@ -179,9 +183,8 @@ def __init__(self, pyfunction, definition_info, changers=None): self.changed_definition_infos = self._get_changed_definition_infos() def _get_changed_definition_infos(self): - result = [] definition_info = self.definition_info - result.append(definition_info) + result = [definition_info] for changer in self.changers: definition_info = copy.deepcopy(definition_info) changer.change_definition_info(definition_info) diff --git a/rope/refactor/encapsulate_field.py b/rope/refactor/encapsulate_field.py index ba18b2b54..b2768baf3 100644 --- a/rope/refactor/encapsulate_field.py +++ b/rope/refactor/encapsulate_field.py @@ -28,7 +28,7 @@ def get_changes( getter=None, setter=None, resources=None, - task_handle=taskhandle.NullTaskHandle(), + task_handle=None, ): """Get the changes this refactoring makes @@ -42,6 +42,8 @@ def get_changes( files in the project are searched. """ + if task_handle is None: + task_handle = taskhandle.NullTaskHandle() if resources is None: resources = self.project.get_python_files() changes = ChangeSet("Encapsulate field <%s>" % self.name) diff --git a/rope/refactor/inline.py b/rope/refactor/inline.py index cfc14e5af..33811c96e 100644 --- a/rope/refactor/inline.py +++ b/rope/refactor/inline.py @@ -132,7 +132,7 @@ def get_changes( remove=True, only_current=False, resources=None, - task_handle=taskhandle.NullTaskHandle(), + task_handle=None, ): """Get the changes this refactoring makes @@ -140,6 +140,8 @@ def get_changes( `only_current` is `True`, the the current occurrence will be inlined, only. """ + if task_handle is None: + task_handle = taskhandle.NullTaskHandle() changes = ChangeSet("Inline method <%s>" % self.name) if resources is None: resources = self.project.get_python_files() @@ -256,8 +258,10 @@ def get_changes( only_current=False, resources=None, docs=False, - task_handle=taskhandle.NullTaskHandle(), + task_handle=None, ): + if task_handle is None: + task_handle = taskhandle.NullTaskHandle() if resources is None: if rename._is_local(self.pyname): resources = [self.resource] @@ -414,8 +418,10 @@ def _get_definition_params(self): def get_function_name(self): return self.pyfunction.get_name() - def get_definition(self, primary, pyname, call, host_vars=[], returns=False): + def get_definition(self, primary, pyname, call, host_vars=None, returns=False): # caching already calculated definitions + if host_vars is None: + host_vars = [] return self._calculate_definition(primary, pyname, call, host_vars, returns) def _calculate_header(self, primary, pyname, call): @@ -451,7 +457,7 @@ def _calculate_definition(self, primary, pyname, call, host_vars, returns): # If there is a name conflict, all variable names # inside the inlined function are renamed - if len(set(all_names).intersection(set(host_vars))) > 0: + if set(all_names).intersection(set(host_vars)): prefix = next(_DefinitionGenerator.unique_prefix) guest = libutils.get_string_module(self.project, source, self.resource) diff --git a/rope/refactor/introduce_factory.py b/rope/refactor/introduce_factory.py index 600075e68..902ceb85e 100644 --- a/rope/refactor/introduce_factory.py +++ b/rope/refactor/introduce_factory.py @@ -44,6 +44,8 @@ def get_changes( files in the project are searched. """ + if task_handle is None: + task_handle = taskhandle.NullTaskHandle() if resources is None: resources = self.project.get_python_files() changes = ChangeSet("Introduce factory method <%s>" % factory_name) diff --git a/rope/refactor/move.py b/rope/refactor/move.py index 7feacb1c8..cb97f8003 100644 --- a/rope/refactor/move.py +++ b/rope/refactor/move.py @@ -76,7 +76,7 @@ def get_changes( dest_attr, new_name=None, resources=None, - task_handle=taskhandle.NullTaskHandle(), + task_handle=None, ): """Return the changes needed for this refactoring @@ -90,6 +90,8 @@ def get_changes( will be applied to all python files. """ + if task_handle is None: + task_handle = taskhandle.NullTaskHandle() changes = ChangeSet("Moving method <%s>" % self.method_name) if resources is None: resources = self.project.get_python_files() @@ -299,8 +301,10 @@ def _is_variable(self, pyname): return isinstance(pyname, pynames.AssignedName) def get_changes( - self, dest, resources=None, task_handle=taskhandle.NullTaskHandle() + self, dest, resources=None, task_handle=None ): + if task_handle is None: + task_handle = taskhandle.NullTaskHandle() if resources is None: resources = self.project.get_python_files() if dest is None or not dest.exists(): @@ -487,8 +491,10 @@ def __init__(self, project, resource): self.import_tools = self.tools.import_tools def get_changes( - self, dest, resources=None, task_handle=taskhandle.NullTaskHandle() + self, dest, resources=None, task_handle=None ): + if task_handle is None: + task_handle = taskhandle.NullTaskHandle() if resources is None: resources = self.project.get_python_files() if dest is None or not dest.is_folder(): diff --git a/rope/refactor/occurrences.py b/rope/refactor/occurrences.py index 53705e93f..b75b32cd1 100644 --- a/rope/refactor/occurrences.py +++ b/rope/refactor/occurrences.py @@ -35,6 +35,8 @@ arguments """ + +import contextlib import re from rope.base import ast @@ -62,7 +64,9 @@ class Finder: """ - def __init__(self, project, name, filters=[lambda o: True], docs=False): + def __init__(self, project, name, filters=None, docs=False): + if filters is None: + filters = [lambda o: True] self.project = project self.name = name self.docs = docs @@ -143,17 +147,13 @@ def get_primary_range(self): @utils.saveit def get_pyname(self): - try: + with contextlib.suppress(exceptions.BadIdentifierError): return self.tools.name_finder.get_pyname_at(self.offset) - except exceptions.BadIdentifierError: - pass @utils.saveit def get_primary_and_pyname(self): - try: + with contextlib.suppress(exceptions.BadIdentifierError): return self.tools.name_finder.get_primary_and_pyname_at(self.offset) - except exceptions.BadIdentifierError: - pass @utils.saveit def is_in_import_statement(self): diff --git a/rope/refactor/rename.py b/rope/refactor/rename.py index aa4066724..92faadd62 100644 --- a/rope/refactor/rename.py +++ b/rope/refactor/rename.py @@ -59,7 +59,7 @@ def get_changes( unsure=None, docs=False, resources=None, - task_handle=taskhandle.NullTaskHandle(), + task_handle=None, ): """Get the changes needed for this refactoring @@ -82,6 +82,8 @@ def get_changes( `resources` instead. """ + if task_handle is None: + task_handle = taskhandle.NullTaskHandle() if unsure in (True, False): warnings.warn( "unsure parameter should be a function that returns " "True or False", diff --git a/rope/refactor/restructure.py b/rope/refactor/restructure.py index 68694cdbf..a39e18805 100644 --- a/rope/refactor/restructure.py +++ b/rope/refactor/restructure.py @@ -95,7 +95,7 @@ def get_changes( checks=None, imports=None, resources=None, - task_handle=taskhandle.NullTaskHandle(), + task_handle=None, ): """Get the changes needed by this restructuring @@ -119,6 +119,8 @@ def get_changes( in restructuring pattern. """ + if task_handle is None: + task_handle = taskhandle.NullTaskHandle() if checks is not None: warnings.warn( "The use of checks parameter is deprecated; " @@ -287,10 +289,10 @@ def _get_node_text(self, node, force=False): start, end = patchedast.node_region(node) main_text = self.source[start:end] collector = codeanalyze.ChangeCollector(main_text) - for node in self._get_nearest_roots(node): - sub_start, sub_end = patchedast.node_region(node) + for node_ in self._get_nearest_roots(node): + sub_start, sub_end = patchedast.node_region(node_) collector.add_change( - sub_start - start, sub_end - start, self._get_node_text(node) + sub_start - start, sub_end - start, self._get_node_text(node_) ) result = collector.get_changed() if result is None: diff --git a/rope/refactor/similarfinder.py b/rope/refactor/similarfinder.py index c9254a578..bc9fa3df6 100644 --- a/rope/refactor/similarfinder.py +++ b/rope/refactor/similarfinder.py @@ -45,7 +45,9 @@ def __init__(self, pymodule, wildcards=None): else: self.wildcards = wildcards - def get_matches(self, code, args={}, start=0, end=None): + def get_matches(self, code, args=None, start=0, end=None): + if args is None: + args = {} self.args = args if end is None: end = len(self.source) @@ -136,9 +138,7 @@ def _create_pattern(self, expression): def _replace_wildcards(self, expression): ropevar = _RopeVariable() template = CodeTemplate(expression) - mapping = {} - for name in template.get_names(): - mapping[name] = ropevar.get_var(name) + mapping = {name: ropevar.get_var(name) for name in template.get_names()} return template.substitute(mapping) @@ -369,10 +369,9 @@ def _pydefined_to_str(pydefined): if isinstance( pydefined, (rope.base.builtins.BuiltinClass, rope.base.builtins.BuiltinFunction) ): - return "__builtins__." + pydefined.get_name() - else: - while pydefined.parent is not None: - address.insert(0, pydefined.get_name()) - pydefined = pydefined.parent - module_name = libutils.modname(pydefined.resource) + return f"__builtins__.{pydefined.get_name()}" + while pydefined.parent is not None: + address.insert(0, pydefined.get_name()) + pydefined = pydefined.parent + module_name = libutils.modname(pydefined.resource) return ".".join(module_name.split(".") + address) diff --git a/rope/refactor/usefunction.py b/rope/refactor/usefunction.py index 255e33fe8..534b1a5c8 100644 --- a/rope/refactor/usefunction.py +++ b/rope/refactor/usefunction.py @@ -47,7 +47,9 @@ def _check_returns(self): "usefunction: return should be the last statement." ) - def get_changes(self, resources=None, task_handle=taskhandle.NullTaskHandle()): + def get_changes(self, resources=None, task_handle=None): + if task_handle is None: + task_handle = taskhandle.NullTaskHandle() if resources is None: resources = self.project.get_python_files() changes = change.ChangeSet("Using function <%s>" % self.pyfunction.get_name()) @@ -141,12 +143,8 @@ def _is_expression(self): def find_temps(project, code): code = "def f():\n" + sourceutils.indent_lines(code, 4) pymodule = libutils.get_string_module(project, code) - result = [] function_scope = pymodule.get_scope().get_scopes()[0] - for name, pyname in function_scope.get_names().items(): - if isinstance(pyname, pynames.AssignedName): - result.append(name) - return result + return [name for name, pyname in function_scope.get_names().items() if isinstance(pyname, pynames.AssignedName)] def _returns_last(node): From 1b3cec66afad793ca72c78dd3005845e344b6c20 Mon Sep 17 00:00:00 2001 From: alex Date: Tue, 13 Dec 2022 23:01:31 +0100 Subject: [PATCH 2/8] revert small fix (prevents attributeError) --- rope/base/pyobjectsdef.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rope/base/pyobjectsdef.py b/rope/base/pyobjectsdef.py index 04d57c957..b87d2462a 100644 --- a/rope/base/pyobjectsdef.py +++ b/rope/base/pyobjectsdef.py @@ -108,7 +108,7 @@ def decorators(self): try: return self.ast_node.decorator_list except AttributeError: - return self.ast_node.decorators + return getattr(self.ast_node, "decorators", None) class PyComprehension(pyobjects.PyComprehension): From bf70ac99b1d9e209a64bfdb57181239ae84e82be Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Wed, 28 Dec 2022 17:20:26 +1100 Subject: [PATCH 3/8] Change NullTaskHandle() to DEFAULT_TASK_HANDLE --- rope/base/history.py | 10 +++------- rope/base/libutils.py | 4 +--- rope/base/project.py | 4 +--- rope/base/taskhandle.py | 3 +++ rope/contrib/autoimport/pickle.py | 8 ++------ rope/contrib/autoimport/sqlite.py | 6 ++---- rope/contrib/autoimport/utils.py | 5 +---- rope/contrib/findit.py | 8 ++------ rope/contrib/fixmodnames.py | 4 +--- rope/refactor/change_signature.py | 8 ++------ rope/refactor/encapsulate_field.py | 4 +--- rope/refactor/inline.py | 8 ++------ rope/refactor/introduce_factory.py | 4 +--- rope/refactor/move.py | 12 +++--------- rope/refactor/rename.py | 4 +--- rope/refactor/restructure.py | 4 +--- rope/refactor/usefunction.py | 4 +--- 17 files changed, 28 insertions(+), 72 deletions(-) diff --git a/rope/base/history.py b/rope/base/history.py index 24bda59da..b85b54468 100644 --- a/rope/base/history.py +++ b/rope/base/history.py @@ -25,15 +25,13 @@ def _load_history(self): for data in result[1]: self._redo_list.append(to_change(data)) - def do(self, changes, task_handle=None): + def do(self, changes, task_handle=taskhandle.DEFAULT_TASK_HANDLE): """Perform the change and add it to the `self.undo_list` Note that uninteresting changes (changes to ignored files) will not be appended to `self.undo_list`. """ - if task_handle is None: - task_handle = taskhandle.NullTaskHandle() try: self.current_change = changes changes.do(change.create_job_set(task_handle, changes)) @@ -54,7 +52,7 @@ def _is_change_interesting(self, changes): return True return False - def undo(self, change=None, drop=False, task_handle=None): + def undo(self, change=None, drop=False, task_handle=taskhandle.DEFAULT_TASK_HANDLE): """Redo done changes from the history When `change` is `None`, the last done change will be undone. @@ -67,8 +65,6 @@ def undo(self, change=None, drop=False, task_handle=None): the redo list. """ - if task_handle is None: - task_handle = taskhandle.NullTaskHandle() if not self._undo_list: raise exceptions.HistoryError("Undo list is empty") if change is None: @@ -81,7 +77,7 @@ def undo(self, change=None, drop=False, task_handle=None): del self.redo_list[-len(dependencies) :] return result - def redo(self, change=None, task_handle=taskhandle.NullTaskHandle()): + def redo(self, change=None, task_handle=taskhandle.DEFAULT_TASK_HANDLE): """Redo undone changes from the history When `change` is `None`, the last undone change will be diff --git a/rope/base/libutils.py b/rope/base/libutils.py index fd6d02ffb..f5b0ff461 100644 --- a/rope/base/libutils.py +++ b/rope/base/libutils.py @@ -67,13 +67,11 @@ def analyze_module(project, resource): project.pycore.analyze_module(resource) -def analyze_modules(project, task_handle=None): +def analyze_modules(project, task_handle=taskhandle.DEFAULT_TASK_HANDLE): """Perform static object analysis on all python files in the project Note that this might be really time consuming. """ - if task_handle is None: - task_handle = taskhandle.NullTaskHandle() resources = project.get_python_files() job_set = task_handle.create_jobset("Analyzing Modules", len(resources)) for resource in resources: diff --git a/rope/base/project.py b/rope/base/project.py index dadb3144f..86fbedb45 100644 --- a/rope/base/project.py +++ b/rope/base/project.py @@ -110,14 +110,12 @@ def remove_observer(self, observer): if observer in self.observers: self.observers.remove(observer) - def do(self, changes, task_handle=None): + def do(self, changes, task_handle=taskhandle.DEFAULT_TASK_HANDLE): """Apply the changes in a `ChangeSet` Most of the time you call this function for committing the changes for a refactoring. """ - if task_handle is None: - task_handle = taskhandle.NullTaskHandle() self.history.do(changes, task_handle=task_handle) def get_pymodule(self, resource, force_errors=False): diff --git a/rope/base/taskhandle.py b/rope/base/taskhandle.py index afcb97ed0..2759f934d 100644 --- a/rope/base/taskhandle.py +++ b/rope/base/taskhandle.py @@ -213,3 +213,6 @@ def get_name(self): def increment(self): pass + + +DEFAULT_TASK_HANDLE = NullTaskHandle() diff --git a/rope/contrib/autoimport/pickle.py b/rope/contrib/autoimport/pickle.py index d4ff955d6..5147029f7 100644 --- a/rope/contrib/autoimport/pickle.py +++ b/rope/contrib/autoimport/pickle.py @@ -97,7 +97,7 @@ def get_name_locations(self, name): return result def generate_cache( - self, resources=None, underlined=None, task_handle=None + self, resources=None, underlined=None, task_handle=taskhandle.DEFAULT_TASK_HANDLE ): """Generate global name cache for project files @@ -106,8 +106,6 @@ def generate_cache( project are cached. """ - if task_handle is None: - task_handle = taskhandle.NullTaskHandle() if resources is None: resources = self.project.get_python_files() job_set = task_handle.create_jobset( @@ -119,11 +117,9 @@ def generate_cache( job_set.finished_job() def generate_modules_cache( - self, modules, underlined=None, task_handle=None + self, modules, underlined=None, task_handle=taskhandle.DEFAULT_TASK_HANDLE ): """Generate global name cache for modules listed in `modules`""" - if task_handle is None: - task_handle = taskhandle.NullTaskHandle() job_set = task_handle.create_jobset( "Generating autoimport cache for modules", len(modules) ) diff --git a/rope/contrib/autoimport/sqlite.py b/rope/contrib/autoimport/sqlite.py index 990c6ce33..bb8310033 100644 --- a/rope/contrib/autoimport/sqlite.py +++ b/rope/contrib/autoimport/sqlite.py @@ -267,7 +267,7 @@ def generate_cache( self, resources: List[Resource] = None, underlined: bool = False, - task_handle: taskhandle.BaseTaskHandle = taskhandle.NullTaskHandle(), + task_handle: taskhandle.BaseTaskHandle = taskhandle.DEFAULT_TASK_HANDLE, ): """Generate global name cache for project files. @@ -297,7 +297,7 @@ def generate_cache( def generate_modules_cache( self, modules: List[str] = None, - task_handle: taskhandle.BaseTaskHandle = None, + task_handle: taskhandle.BaseTaskHandle = taskhandle.DEFAULT_TASK_HANDLE, single_thread: bool = False, underlined: Optional[bool] = None, ): @@ -309,8 +309,6 @@ def generate_modules_cache( Do not use this for generating your own project's internal names, use generate_resource_cache for that instead. """ - if task_handle is None: - task_handle = taskhandle.NullTaskHandle() underlined = self.underlined if underlined is None else underlined packages: List[Package] = ( diff --git a/rope/contrib/autoimport/utils.py b/rope/contrib/autoimport/utils.py index 7ee5f4136..55cc16b71 100644 --- a/rope/contrib/autoimport/utils.py +++ b/rope/contrib/autoimport/utils.py @@ -102,10 +102,7 @@ def sort_and_deduplicate_tuple( def should_parse(path: pathlib.Path, underlined: bool) -> bool: if underlined: return True - for part in path.parts: - if part.startswith("_"): - return False - return True + return all(not part.startswith("_") for part in path.parts) def get_files( diff --git a/rope/contrib/findit.py b/rope/contrib/findit.py index d8ab40acc..75d054749 100644 --- a/rope/contrib/findit.py +++ b/rope/contrib/findit.py @@ -16,7 +16,7 @@ def find_occurrences( unsure=False, resources=None, in_hierarchy=False, - task_handle=None, + task_handle=taskhandle.DEFAULT_TASK_HANDLE, ): """Return a list of `Location` @@ -27,8 +27,6 @@ def find_occurrences( in the project are searched. """ - if task_handle is None: - task_handle = taskhandle.NullTaskHandle() name = worder.get_name_at(resource, offset) this_pymodule = project.get_pymodule(resource) primary, pyname = evaluate.eval_location2(this_pymodule, offset) @@ -51,15 +49,13 @@ def is_match(occurrence): def find_implementations( - project, resource, offset, resources=None, task_handle=None + project, resource, offset, resources=None, task_handle=taskhandle.DEFAULT_TASK_HANDLE ): """Find the places a given method is overridden. Finds the places a method is implemented. Returns a list of `Location`. """ - if task_handle is None: - task_handle = taskhandle.NullTaskHandle() name = worder.get_name_at(resource, offset) this_pymodule = project.get_pymodule(resource) pyname = evaluate.eval_location(this_pymodule, offset) diff --git a/rope/contrib/fixmodnames.py b/rope/contrib/fixmodnames.py index c5dca66ec..493da5637 100644 --- a/rope/contrib/fixmodnames.py +++ b/rope/contrib/fixmodnames.py @@ -24,15 +24,13 @@ class FixModuleNames: def __init__(self, project): self.project = project - def get_changes(self, fixer=str.lower, task_handle=taskhandle.NullTaskHandle()): + def get_changes(self, fixer=str.lower, task_handle=taskhandle.DEFAULT_TASK_HANDLE): """Fix module names `fixer` is a function that takes and returns a `str`. Given the name of a module, it should return the fixed name. """ - if task_handle is None: - task_handle = taskhandle.NullTaskHandle() stack = changestack.ChangeStack(self.project, "Fixing module names") jobset = task_handle.create_jobset( "Fixing module names", self._count_fixes(fixer) + 1 diff --git a/rope/refactor/change_signature.py b/rope/refactor/change_signature.py index ea55beb00..ddeecf4a2 100644 --- a/rope/refactor/change_signature.py +++ b/rope/refactor/change_signature.py @@ -53,10 +53,8 @@ def _change_calls( call_changer, in_hierarchy=None, resources=None, - handle=None, + handle=taskhandle.DEFAULT_TASK_HANDLE, ): - if handle is None: - handle = taskhandle.NullTaskHandle() if resources is None: resources = self.project.get_python_files() changes = ChangeSet("Changing signature of <%s>" % self.name) @@ -153,7 +151,7 @@ def get_changes( changers, in_hierarchy=False, resources=None, - task_handle=None, + task_handle=taskhandle.DEFAULT_TASK_HANDLE, ): """Get changes caused by this refactoring @@ -165,8 +163,6 @@ def get_changes( in the project are searched. """ - if task_handle is None: - task_handle = taskhandle.NullTaskHandle() function_changer = _FunctionChangers( self.pyname.get_object(), self._definfo(), changers ) diff --git a/rope/refactor/encapsulate_field.py b/rope/refactor/encapsulate_field.py index b2768baf3..ad969b7f8 100644 --- a/rope/refactor/encapsulate_field.py +++ b/rope/refactor/encapsulate_field.py @@ -28,7 +28,7 @@ def get_changes( getter=None, setter=None, resources=None, - task_handle=None, + task_handle=taskhandle.DEFAULT_TASK_HANDLE, ): """Get the changes this refactoring makes @@ -42,8 +42,6 @@ def get_changes( files in the project are searched. """ - if task_handle is None: - task_handle = taskhandle.NullTaskHandle() if resources is None: resources = self.project.get_python_files() changes = ChangeSet("Encapsulate field <%s>" % self.name) diff --git a/rope/refactor/inline.py b/rope/refactor/inline.py index 33811c96e..792e30ccd 100644 --- a/rope/refactor/inline.py +++ b/rope/refactor/inline.py @@ -132,7 +132,7 @@ def get_changes( remove=True, only_current=False, resources=None, - task_handle=None, + task_handle=taskhandle.DEFAULT_TASK_HANDLE, ): """Get the changes this refactoring makes @@ -140,8 +140,6 @@ def get_changes( `only_current` is `True`, the the current occurrence will be inlined, only. """ - if task_handle is None: - task_handle = taskhandle.NullTaskHandle() changes = ChangeSet("Inline method <%s>" % self.name) if resources is None: resources = self.project.get_python_files() @@ -258,10 +256,8 @@ def get_changes( only_current=False, resources=None, docs=False, - task_handle=None, + task_handle=taskhandle.DEFAULT_TASK_HANDLE, ): - if task_handle is None: - task_handle = taskhandle.NullTaskHandle() if resources is None: if rename._is_local(self.pyname): resources = [self.resource] diff --git a/rope/refactor/introduce_factory.py b/rope/refactor/introduce_factory.py index 902ceb85e..0dc00d21b 100644 --- a/rope/refactor/introduce_factory.py +++ b/rope/refactor/introduce_factory.py @@ -31,7 +31,7 @@ def get_changes( factory_name, global_factory=False, resources=None, - task_handle=taskhandle.NullTaskHandle(), + task_handle=taskhandle.DEFAULT_TASK_HANDLE, ): """Get the changes this refactoring makes @@ -44,8 +44,6 @@ def get_changes( files in the project are searched. """ - if task_handle is None: - task_handle = taskhandle.NullTaskHandle() if resources is None: resources = self.project.get_python_files() changes = ChangeSet("Introduce factory method <%s>" % factory_name) diff --git a/rope/refactor/move.py b/rope/refactor/move.py index cb97f8003..78f3dba8b 100644 --- a/rope/refactor/move.py +++ b/rope/refactor/move.py @@ -76,7 +76,7 @@ def get_changes( dest_attr, new_name=None, resources=None, - task_handle=None, + task_handle=taskhandle.DEFAULT_TASK_HANDLE, # FIXME: this is unused ): """Return the changes needed for this refactoring @@ -90,8 +90,6 @@ def get_changes( will be applied to all python files. """ - if task_handle is None: - task_handle = taskhandle.NullTaskHandle() changes = ChangeSet("Moving method <%s>" % self.method_name) if resources is None: resources = self.project.get_python_files() @@ -301,10 +299,8 @@ def _is_variable(self, pyname): return isinstance(pyname, pynames.AssignedName) def get_changes( - self, dest, resources=None, task_handle=None + self, dest, resources=None, task_handle=taskhandle.DEFAULT_TASK_HANDLE ): - if task_handle is None: - task_handle = taskhandle.NullTaskHandle() if resources is None: resources = self.project.get_python_files() if dest is None or not dest.exists(): @@ -491,10 +487,8 @@ def __init__(self, project, resource): self.import_tools = self.tools.import_tools def get_changes( - self, dest, resources=None, task_handle=None + self, dest, resources=None, task_handle=taskhandle.DEFAULT_TASK_HANDLE ): - if task_handle is None: - task_handle = taskhandle.NullTaskHandle() if resources is None: resources = self.project.get_python_files() if dest is None or not dest.is_folder(): diff --git a/rope/refactor/rename.py b/rope/refactor/rename.py index 92faadd62..65f90aeab 100644 --- a/rope/refactor/rename.py +++ b/rope/refactor/rename.py @@ -59,7 +59,7 @@ def get_changes( unsure=None, docs=False, resources=None, - task_handle=None, + task_handle=taskhandle.DEFAULT_TASK_HANDLE, ): """Get the changes needed for this refactoring @@ -82,8 +82,6 @@ def get_changes( `resources` instead. """ - if task_handle is None: - task_handle = taskhandle.NullTaskHandle() if unsure in (True, False): warnings.warn( "unsure parameter should be a function that returns " "True or False", diff --git a/rope/refactor/restructure.py b/rope/refactor/restructure.py index a39e18805..e061d1b0a 100644 --- a/rope/refactor/restructure.py +++ b/rope/refactor/restructure.py @@ -95,7 +95,7 @@ def get_changes( checks=None, imports=None, resources=None, - task_handle=None, + task_handle=taskhandle.DEFAULT_TASK_HANDLE, ): """Get the changes needed by this restructuring @@ -119,8 +119,6 @@ def get_changes( in restructuring pattern. """ - if task_handle is None: - task_handle = taskhandle.NullTaskHandle() if checks is not None: warnings.warn( "The use of checks parameter is deprecated; " diff --git a/rope/refactor/usefunction.py b/rope/refactor/usefunction.py index 534b1a5c8..b8e88d692 100644 --- a/rope/refactor/usefunction.py +++ b/rope/refactor/usefunction.py @@ -47,9 +47,7 @@ def _check_returns(self): "usefunction: return should be the last statement." ) - def get_changes(self, resources=None, task_handle=None): - if task_handle is None: - task_handle = taskhandle.NullTaskHandle() + def get_changes(self, resources=None, task_handle=taskhandle.DEFAULT_TASK_HANDLE): if resources is None: resources = self.project.get_python_files() changes = change.ChangeSet("Using function <%s>" % self.pyfunction.get_name()) From 39fa41c0c41346ba6cd73081eae230308a725d02 Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Wed, 28 Dec 2022 17:30:32 +1100 Subject: [PATCH 4/8] Change NullJobSet() to DEFAULT_JOB_SET --- rope/base/change.py | 12 +++--------- rope/base/taskhandle.py | 1 + 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/rope/base/change.py b/rope/base/change.py index cf0668730..a6871f867 100644 --- a/rope/base/change.py +++ b/rope/base/change.py @@ -60,9 +60,7 @@ def __init__(self, description, timestamp=None): self.description = description self.time = timestamp - def do(self, job_set=None): - if job_set is None: - job_set = taskhandle.NullJobSet() + def do(self, job_set=taskhandle.DEFAULT_JOB_SET): try: done = [] for change in self.changes: @@ -74,9 +72,7 @@ def do(self, job_set=None): change.undo() raise - def undo(self, job_set=None): - if job_set is None: - job_set = taskhandle.NullJobSet() + def undo(self, job_set=taskhandle.DEFAULT_JOB_SET): try: done = [] for change in reversed(self.changes): @@ -127,9 +123,7 @@ def _handle_job_set(function): methods of `Change`. """ - def call(self, job_set=None): - if job_set is None: - job_set = taskhandle.NullJobSet() + def call(self, job_set=taskhandle.DEFAULT_JOB_SET): job_set.started_job(str(self)) function(self) job_set.finished_job() diff --git a/rope/base/taskhandle.py b/rope/base/taskhandle.py index 2759f934d..8de76bc0f 100644 --- a/rope/base/taskhandle.py +++ b/rope/base/taskhandle.py @@ -216,3 +216,4 @@ def increment(self): DEFAULT_TASK_HANDLE = NullTaskHandle() +DEFAULT_JOB_SET = NullJobSet() From 4ad683fe6e15c7e6eae371085dcfd02efb48806e Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Wed, 28 Dec 2022 17:35:20 +1100 Subject: [PATCH 5/8] Add missing default value for PyCore.get_classes(task_handle) --- rope/base/pycore.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rope/base/pycore.py b/rope/base/pycore.py index 82778c1b6..0341312ae 100644 --- a/rope/base/pycore.py +++ b/rope/base/pycore.py @@ -208,7 +208,7 @@ def analyze_module( self, pymodule, should_analyze, search_subscopes, followed_calls ) - def get_classes(self, task_handle=None): + def get_classes(self, task_handle=taskhandle.DEFAULT_TASK_HANDLE): warnings.warn( "`PyCore.get_classes()` is deprecated", DeprecationWarning, stacklevel=2 From 2d21607a51639892db5e99bce8c4c26c45876daf Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Wed, 28 Dec 2022 17:40:54 +1100 Subject: [PATCH 6/8] Fix no implicit optionals warning from mypy --- rope/contrib/autoimport/sqlite.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rope/contrib/autoimport/sqlite.py b/rope/contrib/autoimport/sqlite.py index fb411234e..2f9744f15 100644 --- a/rope/contrib/autoimport/sqlite.py +++ b/rope/contrib/autoimport/sqlite.py @@ -155,7 +155,7 @@ def search_full( self, name: str, exact_match: bool = False, - ignored_names: Set[str] = None, + ignored_names: Optional[Set[str]] = None, ) -> Generator[SearchResult, None, None]: """ Search both modules and names for an import string. @@ -260,7 +260,7 @@ def _dump_all(self) -> Tuple[List[Name], List[Package]]: def generate_cache( self, - resources: List[Resource] = None, + resources: Optional[List[Resource]] = None, underlined: bool = False, task_handle: taskhandle.BaseTaskHandle = taskhandle.DEFAULT_TASK_HANDLE, ): @@ -291,7 +291,7 @@ def generate_cache( def generate_modules_cache( self, - modules: List[str] = None, + modules: Optional[List[str]] = None, task_handle: taskhandle.BaseTaskHandle = taskhandle.DEFAULT_TASK_HANDLE, single_thread: bool = False, underlined: Optional[bool] = None, From 2b4c378eabd462613f0d46383747cefd11eaf837 Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Wed, 28 Dec 2022 17:41:32 +1100 Subject: [PATCH 7/8] Use map() instead of trivial list comprehension --- rope/contrib/findit.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/rope/contrib/findit.py b/rope/contrib/findit.py index 8c76e839d..134b48b4a 100644 --- a/rope/contrib/findit.py +++ b/rope/contrib/findit.py @@ -131,9 +131,6 @@ def _find_locations(finder, resources, job_set): result = [] for resource in resources: job_set.started_job(resource.path) - result.extend( - Location(occurrence) for occurrence in finder.find_occurrences(resource) - ) - + result.extend(map(Location, finder.find_occurrences(resource))) job_set.finished_job() return result From 0c1365ef716c90f832ee3d1fa1f88a28e52b588d Mon Sep 17 00:00:00 2001 From: Lie Ryan Date: Wed, 28 Dec 2022 17:45:58 +1100 Subject: [PATCH 8/8] Revert {node_->node} rename --- rope/refactor/restructure.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/rope/refactor/restructure.py b/rope/refactor/restructure.py index 3e8b2ded2..55a4b2d03 100644 --- a/rope/refactor/restructure.py +++ b/rope/refactor/restructure.py @@ -286,10 +286,10 @@ def _get_node_text(self, node, force=False): start, end = patchedast.node_region(node) main_text = self.source[start:end] collector = codeanalyze.ChangeCollector(main_text) - for node_ in self._get_nearest_roots(node): - sub_start, sub_end = patchedast.node_region(node_) + for node in self._get_nearest_roots(node): + sub_start, sub_end = patchedast.node_region(node) collector.add_change( - sub_start - start, sub_end - start, self._get_node_text(node_) + sub_start - start, sub_end - start, self._get_node_text(node) ) result = collector.get_changed() if result is None: