From ce634ddf81df99c3d810fdd68d15aaf366b6c34d Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Sun, 12 Feb 2023 13:07:58 -0600 Subject: [PATCH 01/23] Simplify po.get_base_type & po.get_unknown. Remove PyObject staticmethod --- rope/base/builtins.py | 3 ++ rope/base/pyobjects.py | 89 +++++++++++++++++++++--------------------- 2 files changed, 47 insertions(+), 45 deletions(-) diff --git a/rope/base/builtins.py b/rope/base/builtins.py index 151c64742..4c395a25a 100644 --- a/rope/base/builtins.py +++ b/rope/base/builtins.py @@ -83,6 +83,9 @@ def get_attributes(self): def get_module(self): return builtins + def get_superclasses(self): + return [] + class BuiltinFunction(_BuiltinElement, pyobjects.AbstractFunction): def __init__( diff --git a/rope/base/pyobjects.py b/rope/base/pyobjects.py index 4c9fadf27..c2caf78de 100644 --- a/rope/base/pyobjects.py +++ b/rope/base/pyobjects.py @@ -5,9 +5,7 @@ class PyObject: def __init__(self, type_): - if type_ is None: - type_ = self - self.type = type_ + self.type = type_ or self def get_attributes(self): if self.type is self: @@ -63,22 +61,11 @@ def __iter__(self): """The same as ``iter(self.get_attributes())``""" return iter(self.get_attributes()) - _types = None - _unknown = None - @staticmethod - def _get_base_type(name): - if PyObject._types is None: - PyObject._types = {} - base_type = PyObject(None) - PyObject._types["Type"] = base_type - PyObject._types["Module"] = PyObject(base_type) - PyObject._types["Function"] = PyObject(base_type) - PyObject._types["Unknown"] = PyObject(base_type) - return PyObject._types[name] +_anchor_types = None -def get_base_type(name): +def get_base_type(name: str) -> PyObject: """Return the base type with name `name`. The base types are 'Type', 'Function', 'Module' and 'Unknown'. It @@ -95,68 +82,80 @@ def get_base_type(name): provide more methods. """ - return PyObject._get_base_type(name) + global _anchor_types + if _anchor_types is None: + base_type = PyObject(None) + _anchor_types = { + "Function": PyObject(base_type), + "Module": PyObject(base_type), + "Type": base_type, + "Unknown": PyObject(base_type), + } + return _anchor_types[name] -def get_unknown(): - """Return a pyobject whose type is unknown +def get_unknown() -> PyObject: + """Return a pyobject whose type is unknown. - Note that two unknown objects are equal. So for example you can - write:: + Note that two unknown objects are equal. + + For example you can write:: if pyname.get_object() == get_unknown(): print('cannot determine what this pyname holds') Rope could have used `None` for indicating unknown objects but - we had to check that in many places. So actually this method - returns a null object. - + we had to check that in many places. """ - if PyObject._unknown is None: - PyObject._unknown = PyObject(get_base_type("Unknown")) - return PyObject._unknown + return get_base_type("Unknown") class AbstractClass(PyObject): def __init__(self): super().__init__(get_base_type("Type")) - def get_name(self): - pass + if 0: - def get_doc(self): - pass + def get_name(self): + pass + + def get_doc(self): + pass - def get_superclasses(self): - return [] + def get_superclasses(self): + return [] class AbstractFunction(PyObject): def __init__(self): super().__init__(get_base_type("Function")) - def get_name(self): - pass + if 0: - def get_doc(self): - pass + def get_name(self): + pass - def get_param_names(self, special_args=True): - return [] + def get_doc(self): + pass - def get_returned_object(self, args): - return get_unknown() + def get_param_names(self, special_args=True): + return [] + + def get_returned_object(self, args): + return get_unknown() class AbstractModule(PyObject): def __init__(self, doc=None): super().__init__(get_base_type("Module")) - def get_doc(self): - pass + if 0: - def get_resource(self): - pass + def get_doc(self): + pass + + def get_resource(self): + pass class PyDefinedObject: From d2ee5680a9c8d91ba438fd4ab2fc2b2c567c731f Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Sun, 12 Feb 2023 13:20:28 -0600 Subject: [PATCH 02/23] Remove disabled methods --- rope/base/pyobjects.py | 33 --------------------------------- 1 file changed, 33 deletions(-) diff --git a/rope/base/pyobjects.py b/rope/base/pyobjects.py index c2caf78de..bd5fd2e61 100644 --- a/rope/base/pyobjects.py +++ b/rope/base/pyobjects.py @@ -114,49 +114,16 @@ class AbstractClass(PyObject): def __init__(self): super().__init__(get_base_type("Type")) - if 0: - - def get_name(self): - pass - - def get_doc(self): - pass - - def get_superclasses(self): - return [] - class AbstractFunction(PyObject): def __init__(self): super().__init__(get_base_type("Function")) - if 0: - - def get_name(self): - pass - - def get_doc(self): - pass - - def get_param_names(self, special_args=True): - return [] - - def get_returned_object(self, args): - return get_unknown() - class AbstractModule(PyObject): def __init__(self, doc=None): super().__init__(get_base_type("Module")) - if 0: - - def get_doc(self): - pass - - def get_resource(self): - pass - class PyDefinedObject: """Python defined names that rope can access their sources""" From e18fc3150aa10df9056068b0307e47a7ec138c9b Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Sun, 12 Feb 2023 14:19:35 -0600 Subject: [PATCH 03/23] Add rope.base.utils.predicates.py --- rope/base/oi/soi.py | 5 ++++- rope/base/utils/predicates.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 rope/base/utils/predicates.py diff --git a/rope/base/oi/soi.py b/rope/base/oi/soi.py index 4495795db..f6ed0de85 100644 --- a/rope/base/oi/soi.py +++ b/rope/base/oi/soi.py @@ -8,6 +8,8 @@ from rope.base import arguments, evaluate, pynames, pyobjects, utils from rope.base.oi.type_hinting.factory import get_type_hinting_factory +from rope.base.utils.predicates import is_abstract_function + _ignore_inferred = utils.ignore_exception(pyobjects.IsBeingInferredError) @@ -203,7 +205,8 @@ def _follow_evaluations(assignment, pyname, pyobject): if new_pyname is not None: pyobject = new_pyname.get_object() if pyobject is not None and call: - if isinstance(pyobject, pyobjects.AbstractFunction): + # if isinstance(pyobject, pyobjects.AbstractFunction): + if is_abstract_function(pyobject): args = arguments.ObjectArguments([pyname]) pyobject = pyobject.get_returned_object(args) else: diff --git a/rope/base/utils/predicates.py b/rope/base/utils/predicates.py new file mode 100644 index 000000000..b2c317740 --- /dev/null +++ b/rope/base/utils/predicates.py @@ -0,0 +1,28 @@ +"""An experimental module containing predicates to replace `Abstract` classes. + +""" + +import rope.base.builtins as builtins +import rope.base.pyobjects as pyobjects + + +def is_abstract_class(obj): + return isinstance( + obj, + ( + builtins.BuiltinClass, + pyobjects.PyClass, + builtins.Generator, + builtins.Iterator, + ), + ) + + +def is_abstract_function(obj): + return isinstance( + obj, (builtins.BuiltinFunction, builtins.Lambda, pyobjects.PyFunction) + ) + + +def is_abstract_module(obj): + return isinstance(obj, (builtins.BuiltinModule, pyobjects._PyModule)) From e10f54815919f16aac890440d10c1b867ca02cb5 Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Sun, 12 Feb 2023 14:52:33 -0600 Subject: [PATCH 04/23] Use predicates (almost?) everywhere --- rope/base/builtins.py | 7 +++--- rope/base/evaluate.py | 22 +++++++++++++------ rope/base/oi/soa.py | 7 ++++-- rope/base/oi/soi.py | 2 -- rope/base/oi/transform.py | 4 +++- rope/base/utils/predicates.py | 2 +- rope/contrib/codeassist.py | 41 ++++++++++++++++++++--------------- rope/refactor/rename.py | 4 +++- rope/refactor/wildcards.py | 6 +++-- 9 files changed, 58 insertions(+), 37 deletions(-) diff --git a/rope/base/builtins.py b/rope/base/builtins.py index 4c395a25a..b85635ca1 100644 --- a/rope/base/builtins.py +++ b/rope/base/builtins.py @@ -4,6 +4,7 @@ import rope.base.evaluate from rope.base import arguments, ast, pynames, pyobjects, utils +from rope.base.utils.predicates import is_abstract_class, is_abstract_function class BuiltinModule(pyobjects.AbstractModule): @@ -675,7 +676,7 @@ def __init__(self, fget=None, fset=None, fdel=None, fdoc=None): super().__init__(property, attributes) def get_property_object(self, args): - if isinstance(self._fget, pyobjects.AbstractFunction): + if is_abstract_function(self._fget): return self._fget.get_returned_object(args) @@ -746,7 +747,7 @@ def _infer_sequence_for_pyname(pyname): args = arguments.ObjectArguments([pyname]) if "__iter__" in seq: obj = seq["__iter__"].get_object() - if not isinstance(obj, pyobjects.AbstractFunction): + if not is_abstract_function(obj): return None iter = obj.get_returned_object(args) if iter is not None and "next" in iter: @@ -789,7 +790,7 @@ def _super_function(args): else: # pyclass = passed_self.get_type() pyclass = passed_class - if isinstance(pyclass, pyobjects.AbstractClass): + if is_abstract_class(pyclass): supers = pyclass.get_superclasses() if supers: return pyobjects.PyObject(supers[0]) diff --git a/rope/base/evaluate.py b/rope/base/evaluate.py index d9bef3cdb..3453a535d 100644 --- a/rope/base/evaluate.py +++ b/rope/base/evaluate.py @@ -9,10 +9,11 @@ ast, exceptions, nameanalyze, - pyobjects, + # pyobjects, pyobjectsdef, worder, ) +from rope.base.utils.predicates import is_abstract_class, is_abstract_function BadIdentifierError = exceptions.BadIdentifierError @@ -100,7 +101,8 @@ def get_primary_and_pyname_at( if isinstance(pyobject, pyobjectsdef.PyFunction): parameter_name = pyobject.get_parameters().get(keyword_name, None) return (None, parameter_name) - elif isinstance(pyobject, pyobjects.AbstractFunction): + # elif isinstance(pyobject, pyobjects.AbstractFunction): + if is_abstract_function(pyobject): parameter_name = rope.base.pynames.ParameterName() return (None, parameter_name) # class body @@ -138,10 +140,13 @@ def get_enclosing_function(self, offset): function_pyname = None if function_pyname is not None: pyobject = function_pyname.get_object() - if isinstance(pyobject, pyobjects.AbstractFunction): + # if isinstance(pyobject, pyobjects.AbstractFunction): + if is_abstract_function(pyobject): return pyobject elif ( - isinstance(pyobject, pyobjects.AbstractClass) and "__init__" in pyobject + # isinstance(pyobject, pyobjects.AbstractClass) and "__init__" in pyobject + is_abstract_class(pyobject) + and "__init__" in pyobject ): return pyobject["__init__"].get_object() elif "__call__" in pyobject: @@ -186,7 +191,8 @@ def _get_returned(pyobject): args = arguments.create_arguments(primary, pyobject, node, self.scope) return pyobject.get_returned_object(args) - if isinstance(pyobject, rope.base.pyobjects.AbstractClass): + # if isinstance(pyobject, rope.base.pyobjects.AbstractClass): + if is_abstract_class(pyobject): result = None if "__new__" in pyobject: new_function = pyobject["__new__"].get_object() @@ -197,7 +203,8 @@ def _get_returned(pyobject): return pyfunction = None - if isinstance(pyobject, rope.base.pyobjects.AbstractFunction): + # if isinstance(pyobject, rope.base.pyobjects.AbstractFunction): + if is_abstract_function(pyobject): pyfunction = pyobject elif "__call__" in pyobject: pyfunction = pyobject["__call__"].get_object() @@ -345,7 +352,8 @@ def _call_function(self, node, function_name, other_args=None): return if function_name in pyobject: called = pyobject[function_name].get_object() - if not called or not isinstance(called, pyobjects.AbstractFunction): + # if not called or not isinstance(called, pyobjects.AbstractFunction): + if not called or not is_abstract_function(called): return args = [node] if other_args: diff --git a/rope/base/oi/soa.py b/rope/base/oi/soa.py index df60c6fbb..38f155b2c 100644 --- a/rope/base/oi/soa.py +++ b/rope/base/oi/soa.py @@ -2,6 +2,7 @@ import rope.base.oi.soi import rope.base.pynames from rope.base import arguments, evaluate, nameanalyze, pyobjects +from rope.base.utils.predicates import is_abstract_class, is_abstract_function def analyze_module(pycore, pymodule, should_analyze, search_subscopes, followed_calls): @@ -55,9 +56,11 @@ def _Call(self, node): if pyname is None: return pyfunction = pyname.get_object() - if isinstance(pyfunction, pyobjects.AbstractFunction): + # if isinstance(pyfunction, pyobjects.AbstractFunction): + if is_abstract_function(pyfunction): args = arguments.create_arguments(primary, pyfunction, node, self.scope) - elif isinstance(pyfunction, pyobjects.PyClass): + # elif isinstance(pyfunction, pyobjects.PyClass): + elif is_abstract_class(pyfunction): pyclass = pyfunction if "__init__" in pyfunction: pyfunction = pyfunction["__init__"].get_object() diff --git a/rope/base/oi/soi.py b/rope/base/oi/soi.py index f6ed0de85..797cfdc1f 100644 --- a/rope/base/oi/soi.py +++ b/rope/base/oi/soi.py @@ -7,7 +7,6 @@ import rope.base.builtins # Use full qualification for clarity. from rope.base import arguments, evaluate, pynames, pyobjects, utils from rope.base.oi.type_hinting.factory import get_type_hinting_factory - from rope.base.utils.predicates import is_abstract_function _ignore_inferred = utils.ignore_exception(pyobjects.IsBeingInferredError) @@ -205,7 +204,6 @@ def _follow_evaluations(assignment, pyname, pyobject): if new_pyname is not None: pyobject = new_pyname.get_object() if pyobject is not None and call: - # if isinstance(pyobject, pyobjects.AbstractFunction): if is_abstract_function(pyobject): args = arguments.ObjectArguments([pyname]) pyobject = pyobject.get_returned_object(args) diff --git a/rope/base/oi/transform.py b/rope/base/oi/transform.py index 968e70b25..b24d3cd4a 100644 --- a/rope/base/oi/transform.py +++ b/rope/base/oi/transform.py @@ -4,6 +4,7 @@ import rope.base.builtins # Use full qualification for clarity. from rope.base import exceptions +from rope.base.utils.predicates import is_abstract_class class PyObjectToTextual: @@ -32,7 +33,8 @@ def __call__(self, pyobject): return self.transform(pyobject) def PyObject_to_textual(self, pyobject): - if isinstance(pyobject.get_type(), rope.base.pyobjects.AbstractClass): + # if isinstance(pyobject.get_type(), rope.base.pyobjects.AbstractClass): + if is_abstract_class(pyobject.get_type()): result = self.transform(pyobject.get_type()) if result[0] == "defined": return ("instance", result) diff --git a/rope/base/utils/predicates.py b/rope/base/utils/predicates.py index b2c317740..8b4a5d2fe 100644 --- a/rope/base/utils/predicates.py +++ b/rope/base/utils/predicates.py @@ -11,9 +11,9 @@ def is_abstract_class(obj): obj, ( builtins.BuiltinClass, - pyobjects.PyClass, builtins.Generator, builtins.Iterator, + pyobjects.PyClass, ), ) diff --git a/rope/contrib/codeassist.py b/rope/contrib/codeassist.py index 32547891e..2faefc130 100644 --- a/rope/contrib/codeassist.py +++ b/rope/contrib/codeassist.py @@ -16,6 +16,11 @@ ) from rope.contrib import fixsyntax from rope.refactor import functionutils +from rope.base.utils.predicates import ( + is_abstract_class, + is_abstract_function, + is_abstract_module, +) def code_assist( @@ -255,7 +260,7 @@ def parameters(self): pyname = pyname._get_imported_pyname() if isinstance(pyname, pynames.DefinedName): pyobject = pyname.get_object() - if isinstance(pyobject, pyobjects.AbstractFunction): + if is_abstract_function(pyobject): return pyobject.get_param_names() @property @@ -277,9 +282,9 @@ def type(self): pyname, pynames.DefinedName ): pyobject = pyname.get_object() - if isinstance(pyobject, pyobjects.AbstractFunction): + if is_abstract_function(pyobject): return "function" - if isinstance(pyobject, pyobjects.AbstractClass): + if is_abstract_class(pyobject): return "class" return "instance" @@ -515,16 +520,13 @@ def _keyword_parameters(self, pymodule, scope): return {} if function_pyname is not None: pyobject = function_pyname.get_object() - if isinstance(pyobject, pyobjects.AbstractFunction): + if is_abstract_function(pyobject): pass - elif ( - isinstance(pyobject, pyobjects.AbstractClass) - and "__init__" in pyobject - ): + elif is_abstract_class(pyobject) and "__init__" in pyobject: pyobject = pyobject["__init__"].get_object() elif "__call__" in pyobject: pyobject = pyobject["__call__"].get_object() - if isinstance(pyobject, pyobjects.AbstractFunction): + if is_abstract_function(pyobject): param_names = [] param_names.extend(pyobject.get_param_names(special_args=False)) result = {} @@ -590,25 +592,28 @@ def _underline_count(name): class PyDocExtractor: def get_doc(self, pyobject): - if isinstance(pyobject, pyobjects.AbstractFunction): + # if isinstance(pyobject, pyobjects.AbstractFunction): + if is_abstract_function(pyobject): return self._get_function_docstring(pyobject) - elif isinstance(pyobject, pyobjects.AbstractClass): + # elif isinstance(pyobject, pyobjects.AbstractClass): + if is_abstract_class(pyobject): return self._get_class_docstring(pyobject) - elif isinstance(pyobject, pyobjects.AbstractModule): + # elif isinstance(pyobject, pyobjects.AbstractModule): + if is_abstract_module(pyobject): return self._trim_docstring(pyobject.get_doc()) return None def get_calltip(self, pyobject, ignore_unknown=False, remove_self=False): try: - if isinstance(pyobject, pyobjects.AbstractClass): + if is_abstract_class(pyobject): pyobject = pyobject["__init__"].get_object() - if not isinstance(pyobject, pyobjects.AbstractFunction): + if not is_abstract_function(pyobject): pyobject = pyobject["__call__"].get_object() except exceptions.AttributeNotFoundError: return None if ignore_unknown and not isinstance(pyobject, pyobjects.PyFunction): return - if isinstance(pyobject, pyobjects.AbstractFunction): + if is_abstract_function(pyobject): result = self._get_function_signature(pyobject, add_module=True) if remove_self and self._is_method(pyobject): return result.replace("(self)", "()").replace("(self, ", "(") @@ -629,7 +634,7 @@ def _get_class_header(pyclass): if "__init__" in pyclass: init = pyclass["__init__"].get_object() - if isinstance(init, pyobjects.AbstractFunction): + if is_abstract_function(init): doc += "\n\n" + self._get_single_function_docstring(init) return doc @@ -658,7 +663,7 @@ def _get_super_methods(self, pyclass, name): for super_class in pyclass.get_superclasses(): if name in super_class: function = super_class[name].get_object() - if isinstance(function, pyobjects.AbstractFunction): + if is_abstract_function(function): result.append(function) result.extend(self._get_super_methods(super_class, name)) return result @@ -677,7 +682,7 @@ def _get_function_signature(self, pyfunction, add_module=False): def _location(self, pyobject, add_module=False): location = [] parent = pyobject.parent - while parent and not isinstance(parent, pyobjects.AbstractModule): + while parent and not is_abstract_module(parent): location.append(parent.get_name()) location.append(".") parent = parent.parent diff --git a/rope/refactor/rename.py b/rope/refactor/rename.py index cb6348009..5f992b3e4 100644 --- a/rope/refactor/rename.py +++ b/rope/refactor/rename.py @@ -12,6 +12,7 @@ ) from rope.base.change import ChangeContents, ChangeSet, MoveResource from rope.refactor import occurrences +from rope.base.utils.predicates import is_abstract_module class Rename: @@ -138,7 +139,8 @@ def _is_allowed_to_move(self, resources, resource): return resource in resources def _is_renaming_a_module(self): - return isinstance(self.old_pyname.get_object(), pyobjects.AbstractModule) + # return isinstance(self.old_pyname.get_object(), pyobjects.AbstractModule) + return is_abstract_module(self.old_pyname.get_object()) def is_method(self): pyname = self.old_pyname diff --git a/rope/refactor/wildcards.py b/rope/refactor/wildcards.py index 13edab91c..3ac5c2332 100644 --- a/rope/refactor/wildcards.py +++ b/rope/refactor/wildcards.py @@ -1,5 +1,6 @@ -from rope.base import ast, builtins, evaluate, pyobjects +from rope.base import ast, builtins, evaluate ###, pyobjects from rope.refactor import occurrences, patchedast +from rope.base.utils.predicates import is_abstract_class class Wildcard: @@ -117,7 +118,8 @@ def __call__(self, pymodule, node): def _get_super_classes(self, pyobject): result = [] - if isinstance(pyobject, pyobjects.AbstractClass): + ### if isinstance(pyobject, pyobjects.AbstractClass): + if is_abstract_class(pyobject): for superclass in pyobject.get_superclasses(): result.append(superclass) result.extend(self._get_super_classes(superclass)) From db8826a6e020f5b6413a7d9e69c5992a70bcf215 Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Sun, 12 Feb 2023 16:39:41 -0600 Subject: [PATCH 05/23] Remove last mentions of Abstract classes --- rope/base/evaluate.py | 16 +++------------- rope/base/oi/soa.py | 1 - rope/base/oi/transform.py | 1 - rope/base/pyobjects.py | 9 +++------ rope/contrib/codeassist.py | 3 --- rope/refactor/rename.py | 1 - rope/refactor/wildcards.py | 1 - ropetest/pycoretest.py | 3 ++- 8 files changed, 8 insertions(+), 27 deletions(-) diff --git a/rope/base/evaluate.py b/rope/base/evaluate.py index 3453a535d..7c500385f 100644 --- a/rope/base/evaluate.py +++ b/rope/base/evaluate.py @@ -101,7 +101,6 @@ def get_primary_and_pyname_at( if isinstance(pyobject, pyobjectsdef.PyFunction): parameter_name = pyobject.get_parameters().get(keyword_name, None) return (None, parameter_name) - # elif isinstance(pyobject, pyobjects.AbstractFunction): if is_abstract_function(pyobject): parameter_name = rope.base.pynames.ParameterName() return (None, parameter_name) @@ -140,14 +139,9 @@ def get_enclosing_function(self, offset): function_pyname = None if function_pyname is not None: pyobject = function_pyname.get_object() - # if isinstance(pyobject, pyobjects.AbstractFunction): if is_abstract_function(pyobject): return pyobject - elif ( - # isinstance(pyobject, pyobjects.AbstractClass) and "__init__" in pyobject - is_abstract_class(pyobject) - and "__init__" in pyobject - ): + elif is_abstract_class(pyobject) and "__init__" in pyobject: return pyobject["__init__"].get_object() elif "__call__" in pyobject: return pyobject["__call__"].get_object() @@ -191,7 +185,6 @@ def _get_returned(pyobject): args = arguments.create_arguments(primary, pyobject, node, self.scope) return pyobject.get_returned_object(args) - # if isinstance(pyobject, rope.base.pyobjects.AbstractClass): if is_abstract_class(pyobject): result = None if "__new__" in pyobject: @@ -203,7 +196,6 @@ def _get_returned(pyobject): return pyfunction = None - # if isinstance(pyobject, rope.base.pyobjects.AbstractFunction): if is_abstract_function(pyobject): pyfunction = pyobject elif "__call__" in pyobject: @@ -346,13 +338,11 @@ def _Slice(self, node): def _call_function(self, node, function_name, other_args=None): pyname = eval_node(self.scope, node) - if pyname is not None: - pyobject = pyname.get_object() - else: + if pyname is None: return + pyobject = pyname.get_object() if function_name in pyobject: called = pyobject[function_name].get_object() - # if not called or not isinstance(called, pyobjects.AbstractFunction): if not called or not is_abstract_function(called): return args = [node] diff --git a/rope/base/oi/soa.py b/rope/base/oi/soa.py index 38f155b2c..592927ff0 100644 --- a/rope/base/oi/soa.py +++ b/rope/base/oi/soa.py @@ -56,7 +56,6 @@ def _Call(self, node): if pyname is None: return pyfunction = pyname.get_object() - # if isinstance(pyfunction, pyobjects.AbstractFunction): if is_abstract_function(pyfunction): args = arguments.create_arguments(primary, pyfunction, node, self.scope) # elif isinstance(pyfunction, pyobjects.PyClass): diff --git a/rope/base/oi/transform.py b/rope/base/oi/transform.py index b24d3cd4a..aba627ac8 100644 --- a/rope/base/oi/transform.py +++ b/rope/base/oi/transform.py @@ -33,7 +33,6 @@ def __call__(self, pyobject): return self.transform(pyobject) def PyObject_to_textual(self, pyobject): - # if isinstance(pyobject.get_type(), rope.base.pyobjects.AbstractClass): if is_abstract_class(pyobject.get_type()): result = self.transform(pyobject.get_type()) if result[0] == "defined": diff --git a/rope/base/pyobjects.py b/rope/base/pyobjects.py index bd5fd2e61..47c910907 100644 --- a/rope/base/pyobjects.py +++ b/rope/base/pyobjects.py @@ -73,13 +73,10 @@ def get_base_type(name: str) -> PyObject: is discouraged. Use classes defined in this module instead. For example instead of ``pyobject.get_type() == get_base_type('Function')`` use - ``isinstance(pyobject, AbstractFunction)``. + ``is_abstract_function(pyobject)``. - You can use `AbstractClass` for classes, `AbstractFunction` for - functions, and `AbstractModule` for modules. You can also use - `PyFunction` and `PyClass` for testing if an object is - defined somewhere and rope can access its source. These classes - provide more methods. + You can use `is_abstract_class` for classes, `is_abstract_functions` for + functions, and `is_abstract_module` for modules. """ global _anchor_types diff --git a/rope/contrib/codeassist.py b/rope/contrib/codeassist.py index 2faefc130..ffab3301f 100644 --- a/rope/contrib/codeassist.py +++ b/rope/contrib/codeassist.py @@ -592,13 +592,10 @@ def _underline_count(name): class PyDocExtractor: def get_doc(self, pyobject): - # if isinstance(pyobject, pyobjects.AbstractFunction): if is_abstract_function(pyobject): return self._get_function_docstring(pyobject) - # elif isinstance(pyobject, pyobjects.AbstractClass): if is_abstract_class(pyobject): return self._get_class_docstring(pyobject) - # elif isinstance(pyobject, pyobjects.AbstractModule): if is_abstract_module(pyobject): return self._trim_docstring(pyobject.get_doc()) return None diff --git a/rope/refactor/rename.py b/rope/refactor/rename.py index 5f992b3e4..004548cfa 100644 --- a/rope/refactor/rename.py +++ b/rope/refactor/rename.py @@ -139,7 +139,6 @@ def _is_allowed_to_move(self, resources, resource): return resource in resources def _is_renaming_a_module(self): - # return isinstance(self.old_pyname.get_object(), pyobjects.AbstractModule) return is_abstract_module(self.old_pyname.get_object()) def is_method(self): diff --git a/rope/refactor/wildcards.py b/rope/refactor/wildcards.py index 3ac5c2332..1a153c59b 100644 --- a/rope/refactor/wildcards.py +++ b/rope/refactor/wildcards.py @@ -118,7 +118,6 @@ def __call__(self, pymodule, node): def _get_super_classes(self, pyobject): result = [] - ### if isinstance(pyobject, pyobjects.AbstractClass): if is_abstract_class(pyobject): for superclass in pyobject.get_superclasses(): result.append(superclass) diff --git a/ropetest/pycoretest.py b/ropetest/pycoretest.py index 5ccd80d2a..b41c44097 100644 --- a/ropetest/pycoretest.py +++ b/ropetest/pycoretest.py @@ -120,11 +120,12 @@ def __init__(self): def f(): pass """) + from rope.base.utils.predicates import is_abstract_function mod.write(code) mod_element = self.project.get_module("mod") sample_class = mod_element["C"].get_object() f = sample_class["f"].get_object() - self.assertTrue(isinstance(f, AbstractFunction)) + self.assertTrue(is_abstract_function(f)) def test_classes_inside_other_classes(self): mod = testutils.create_module(self.project, "mod") From 56aecfcb0ec7552c8ca0aafc48bf00c50563fd54 Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Sun, 12 Feb 2023 16:49:31 -0600 Subject: [PATCH 06/23] Remove another reference to an Abstract class --- rope/base/arguments.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/rope/base/arguments.py b/rope/base/arguments.py index 12a626816..5f16fd8fb 100644 --- a/rope/base/arguments.py +++ b/rope/base/arguments.py @@ -1,5 +1,6 @@ import rope.base.evaluate from rope.base import ast +from rope.base.utils.predicates import is_abstract_class class Arguments: @@ -104,8 +105,8 @@ def _is_method_call(primary, pyfunction): and isinstance(pyfunction.parent, rope.base.pyobjects.PyClass) ): return True - if isinstance( - pyobject.get_type(), rope.base.pyobjects.AbstractClass - ) and isinstance(pyfunction, rope.base.builtins.BuiltinFunction): + if is_abstract_class(pyobject.get_type()) and isinstance( + pyfunction, rope.base.builtins.BuiltinFunction + ): return True return False From e57ed1177dd3a944d1d3695986f9ca457b118826 Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Sun, 12 Feb 2023 16:55:14 -0600 Subject: [PATCH 07/23] Remove one last ref to an Abstract class --- rope/base/pyobjectsdef.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/rope/base/pyobjectsdef.py b/rope/base/pyobjectsdef.py index 95bd15691..62f10d678 100644 --- a/rope/base/pyobjectsdef.py +++ b/rope/base/pyobjectsdef.py @@ -14,6 +14,7 @@ pyobjects, utils, ) +from rope.base.utils.predicates import is_abstract_module class PyFunction(pyobjects.PyFunction): @@ -554,9 +555,7 @@ def _ImportFrom(self, node): def _is_ignored_import(self, imported_module): if not self.pycore.project.prefs.get("ignore_bad_imports", False): return False - return not isinstance( - imported_module.get_object(), rope.base.pyobjects.AbstractModule - ) + return not is_abstract_module(imported_module.get_object()) def _Global(self, node): module = self.get_module() From 3a1cae78fbba0c963e8044e9bc79acf7dc18ce64 Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Sun, 12 Feb 2023 18:21:17 -0600 Subject: [PATCH 08/23] First successful version w/o Abstract classes --- rope/base/builtins.py | 26 +++++++++++++----------- rope/base/pyobjects.py | 38 +++++++++++++++-------------------- rope/base/pyobjectsdef.py | 8 ++++---- rope/base/utils/predicates.py | 4 +++- ropetest/pycoretest.py | 2 +- 5 files changed, 38 insertions(+), 40 deletions(-) diff --git a/rope/base/builtins.py b/rope/base/builtins.py index b85635ca1..16efb360b 100644 --- a/rope/base/builtins.py +++ b/rope/base/builtins.py @@ -4,12 +4,13 @@ import rope.base.evaluate from rope.base import arguments, ast, pynames, pyobjects, utils +from rope.base.pyobjects import get_base_type from rope.base.utils.predicates import is_abstract_class, is_abstract_function -class BuiltinModule(pyobjects.AbstractModule): +class BuiltinModule(pyobjects.PyObject): ### (pyobjects.AbstractModule): def __init__(self, name, pycore=None, initial={}): - super().__init__() + pyobjects.PyObject.__init__(self, get_base_type("Module")) ### self.name = name self.pycore = pycore self.initial = initial @@ -69,10 +70,10 @@ def parent(self): return self._parent -class BuiltinClass(_BuiltinElement, pyobjects.AbstractClass): +class BuiltinClass(_BuiltinElement, pyobjects.PyObject): ###, pyobjects.AbstractClass): def __init__(self, builtin, attributes, parent=None): + pyobjects.PyObject.__init__(self, get_base_type("Type")) _BuiltinElement.__init__(self, builtin, parent) - pyobjects.AbstractClass.__init__(self) self.initial = attributes @utils.saveit @@ -88,12 +89,13 @@ def get_superclasses(self): return [] -class BuiltinFunction(_BuiltinElement, pyobjects.AbstractFunction): +class BuiltinFunction(_BuiltinElement, pyobjects.PyObject): ###, pyobjects.AbstractFunction): def __init__( self, returned=None, function=None, builtin=None, argnames=[], parent=None ): + pyobjects.PyObject.__init__(self, get_base_type("Function")) _BuiltinElement.__init__(self, builtin, parent) - pyobjects.AbstractFunction.__init__(self) + ### pyobjects.AbstractFunction.__init__(self) self.argnames = argnames self.returned = returned self.function = function @@ -584,9 +586,9 @@ def get_definition_location(self): return (None, None) -class Iterator(pyobjects.AbstractClass): +class Iterator(pyobjects.PyObject): ###(pyobjects.AbstractClass): def __init__(self, holding=None): - super().__init__() + pyobjects.PyObject.__init__(self, get_base_type("Type")) self.holding = holding self.attributes = { "next": BuiltinName(BuiltinFunction(self.holding)), @@ -603,9 +605,9 @@ def get_returned_object(self, args): get_iterator = _create_builtin_getter(Iterator) -class Generator(pyobjects.AbstractClass): +class Generator(pyobjects.PyObject): ###(pyobjects.AbstractClass): def __init__(self, holding=None): - super().__init__() + pyobjects.PyObject.__init__(self, get_base_type("Type")) self.holding = holding self.attributes = { "next": BuiltinName(BuiltinFunction(self.holding)), @@ -685,9 +687,9 @@ def _property_function(args): return pyobjects.PyObject(Property(parameters[0])) -class Lambda(pyobjects.AbstractFunction): +class Lambda(pyobjects.PyObject): ###(pyobjects.AbstractFunction): def __init__(self, node, scope): - super().__init__() + pyobjects.PyObject.__init__(self, get_base_type("Function")) self.node = node self.arguments = node.args self.scope = scope diff --git a/rope/base/pyobjects.py b/rope/base/pyobjects.py index 47c910907..d551ead0a 100644 --- a/rope/base/pyobjects.py +++ b/rope/base/pyobjects.py @@ -85,7 +85,7 @@ def get_base_type(name: str) -> PyObject: _anchor_types = { "Function": PyObject(base_type), "Module": PyObject(base_type), - "Type": base_type, + "Type": base_type, # a Class. "Unknown": PyObject(base_type), } return _anchor_types[name] @@ -107,21 +107,6 @@ def get_unknown() -> PyObject: return get_base_type("Unknown") -class AbstractClass(PyObject): - def __init__(self): - super().__init__(get_base_type("Type")) - - -class AbstractFunction(PyObject): - def __init__(self): - super().__init__(get_base_type("Function")) - - -class AbstractModule(PyObject): - def __init__(self, doc=None): - super().__init__(get_base_type("Module")) - - class PyDefinedObject: """Python defined names that rope can access their sources""" @@ -221,8 +206,13 @@ def _create_scope(self): pass -class PyFunction(PyDefinedObject, AbstractFunction): - pass +class PyFunction(PyDefinedObject, PyObject): ###, AbstractFunction): + ### pass + def __init__(self, pycore, ast_node, parent): + PyObject.__init__(self, get_base_type("Function")) + PyDefinedObject.__init__(self, pycore, ast_node, parent) + + class PyComprehension(PyDefinedObject, PyObject): @@ -232,8 +222,11 @@ def get_name(self): return "" -class PyClass(PyDefinedObject, AbstractClass): - pass +class PyClass(PyDefinedObject, PyObject): ###, AbstractClass): + ### pass + def __init__(self, pycore, ast_node, parent): + PyObject.__init__(self, get_base_type("Type")) + PyDefinedObject.__init__(self, pycore, ast_node, parent) class _ConcludedData: @@ -255,11 +248,12 @@ def __str__(self): return "<" + str(self.data) + ">" -class _PyModule(PyDefinedObject, AbstractModule): +class _PyModule(PyDefinedObject, PyObject): ###, AbstractModule): def __init__(self, pycore, ast_node, resource): self.resource = resource self.concluded_data = [] - AbstractModule.__init__(self) + ### AbstractModule.__init__(self) + PyObject.__init__(self, get_base_type("Module")) PyDefinedObject.__init__(self, pycore, ast_node, None) @property diff --git a/rope/base/pyobjectsdef.py b/rope/base/pyobjectsdef.py index 62f10d678..092e00852 100644 --- a/rope/base/pyobjectsdef.py +++ b/rope/base/pyobjectsdef.py @@ -19,8 +19,8 @@ class PyFunction(pyobjects.PyFunction): def __init__(self, pycore, ast_node, parent): - rope.base.pyobjects.AbstractFunction.__init__(self) - rope.base.pyobjects.PyDefinedObject.__init__(self, pycore, ast_node, parent) + ### rope.base.pyobjects.AbstractFunction.__init__(self) + super().__init__(pycore, ast_node, parent) ### self.arguments = self.ast_node.args self.parameter_pyobjects = pynamesdef._Inferred( self._infer_parameters, self.get_module()._get_concluded_data() @@ -130,8 +130,8 @@ def get_kind(self): class PyClass(pyobjects.PyClass): def __init__(self, pycore, ast_node, parent): self.visitor_class = _ClassVisitor - rope.base.pyobjects.AbstractClass.__init__(self) - rope.base.pyobjects.PyDefinedObject.__init__(self, pycore, ast_node, parent) + # rope.base.pyobjects.AbstractClass.__init__(self) + rope.base.pyobjects.PyClass.__init__(self, pycore, ast_node, parent) self.parent = parent self._superclasses = self.get_module()._get_concluded_data() diff --git a/rope/base/utils/predicates.py b/rope/base/utils/predicates.py index 8b4a5d2fe..ddc01b7a2 100644 --- a/rope/base/utils/predicates.py +++ b/rope/base/utils/predicates.py @@ -25,4 +25,6 @@ def is_abstract_function(obj): def is_abstract_module(obj): - return isinstance(obj, (builtins.BuiltinModule, pyobjects._PyModule)) + return isinstance(obj, ( + builtins.BuiltinModule, pyobjects._PyModule), + ) diff --git a/ropetest/pycoretest.py b/ropetest/pycoretest.py index b41c44097..e422a7a5a 100644 --- a/ropetest/pycoretest.py +++ b/ropetest/pycoretest.py @@ -6,7 +6,7 @@ from rope.base.builtins import BuiltinClass, File from rope.base.pycore import _TextChangeDetector from rope.base.pynamesdef import AssignedName -from rope.base.pyobjects import AbstractFunction, get_base_type +from rope.base.pyobjects import get_base_type from ropetest import testutils From d3f46b5dd83271df44f0da323f8fdb5db3e89fad Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Sun, 12 Feb 2023 18:24:47 -0600 Subject: [PATCH 09/23] Cleanups --- rope/base/builtins.py | 9 +++++---- rope/base/pyobjects.py | 4 +--- rope/base/utils/predicates.py | 5 +++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/rope/base/builtins.py b/rope/base/builtins.py index 16efb360b..242788be7 100644 --- a/rope/base/builtins.py +++ b/rope/base/builtins.py @@ -10,7 +10,7 @@ class BuiltinModule(pyobjects.PyObject): ### (pyobjects.AbstractModule): def __init__(self, name, pycore=None, initial={}): - pyobjects.PyObject.__init__(self, get_base_type("Module")) ### + pyobjects.PyObject.__init__(self, get_base_type("Module")) self.name = name self.pycore = pycore self.initial = initial @@ -70,7 +70,7 @@ def parent(self): return self._parent -class BuiltinClass(_BuiltinElement, pyobjects.PyObject): ###, pyobjects.AbstractClass): +class BuiltinClass(_BuiltinElement, pyobjects.PyObject): ###, pyobjects.AbstractClass): def __init__(self, builtin, attributes, parent=None): pyobjects.PyObject.__init__(self, get_base_type("Type")) _BuiltinElement.__init__(self, builtin, parent) @@ -89,13 +89,14 @@ def get_superclasses(self): return [] -class BuiltinFunction(_BuiltinElement, pyobjects.PyObject): ###, pyobjects.AbstractFunction): +class BuiltinFunction( + _BuiltinElement, pyobjects.PyObject +): ###, pyobjects.AbstractFunction): def __init__( self, returned=None, function=None, builtin=None, argnames=[], parent=None ): pyobjects.PyObject.__init__(self, get_base_type("Function")) _BuiltinElement.__init__(self, builtin, parent) - ### pyobjects.AbstractFunction.__init__(self) self.argnames = argnames self.returned = returned self.function = function diff --git a/rope/base/pyobjects.py b/rope/base/pyobjects.py index d551ead0a..87603849d 100644 --- a/rope/base/pyobjects.py +++ b/rope/base/pyobjects.py @@ -206,15 +206,13 @@ def _create_scope(self): pass -class PyFunction(PyDefinedObject, PyObject): ###, AbstractFunction): +class PyFunction(PyDefinedObject, PyObject): ###, AbstractFunction): ### pass def __init__(self, pycore, ast_node, parent): PyObject.__init__(self, get_base_type("Function")) PyDefinedObject.__init__(self, pycore, ast_node, parent) - - class PyComprehension(PyDefinedObject, PyObject): pass diff --git a/rope/base/utils/predicates.py b/rope/base/utils/predicates.py index ddc01b7a2..6d3b0f0ac 100644 --- a/rope/base/utils/predicates.py +++ b/rope/base/utils/predicates.py @@ -25,6 +25,7 @@ def is_abstract_function(obj): def is_abstract_module(obj): - return isinstance(obj, ( - builtins.BuiltinModule, pyobjects._PyModule), + return isinstance( + obj, + (builtins.BuiltinModule, pyobjects._PyModule), ) From c5840540e13782c3bf5a677d0dd84f753b444ba6 Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Mon, 13 Feb 2023 02:15:01 -0600 Subject: [PATCH 10/23] Tweaks --- rope/base/builtins.py | 14 ++++++-------- rope/base/pyobjects.py | 3 +-- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/rope/base/builtins.py b/rope/base/builtins.py index 242788be7..5b2f6cdb6 100644 --- a/rope/base/builtins.py +++ b/rope/base/builtins.py @@ -790,14 +790,12 @@ def _super_function(args): passed_class, passed_self = args.get_arguments(["type", "self"]) if passed_self is None: return passed_class - else: - # pyclass = passed_self.get_type() - pyclass = passed_class - if is_abstract_class(pyclass): - supers = pyclass.get_superclasses() - if supers: - return pyobjects.PyObject(supers[0]) - return passed_self + pyclass = passed_class + if is_abstract_class(pyclass): + supers = pyclass.get_superclasses() + if supers: + return pyobjects.PyObject(supers[0]) + return passed_self def _zip_function(args): diff --git a/rope/base/pyobjects.py b/rope/base/pyobjects.py index 87603849d..884fc30c6 100644 --- a/rope/base/pyobjects.py +++ b/rope/base/pyobjects.py @@ -5,7 +5,7 @@ class PyObject: def __init__(self, type_): - self.type = type_ or self + self.type = self if type_ is None else type_ def get_attributes(self): if self.type is self: @@ -250,7 +250,6 @@ class _PyModule(PyDefinedObject, PyObject): ###, AbstractModule): def __init__(self, pycore, ast_node, resource): self.resource = resource self.concluded_data = [] - ### AbstractModule.__init__(self) PyObject.__init__(self, get_base_type("Module")) PyDefinedObject.__init__(self, pycore, ast_node, None) From 8da72cb20c5437e2fb2b574c81c05d3473ffeee2 Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Mon, 13 Feb 2023 02:25:47 -0600 Subject: [PATCH 11/23] Convert ### comments to `# was...` comments. --- rope/base/builtins.py | 16 ++++++++-------- rope/base/pyobjects.py | 13 ++++++++----- rope/base/pyobjectsdef.py | 3 +-- rope/refactor/wildcards.py | 2 +- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/rope/base/builtins.py b/rope/base/builtins.py index 5b2f6cdb6..be9217940 100644 --- a/rope/base/builtins.py +++ b/rope/base/builtins.py @@ -8,7 +8,7 @@ from rope.base.utils.predicates import is_abstract_class, is_abstract_function -class BuiltinModule(pyobjects.PyObject): ### (pyobjects.AbstractModule): +class BuiltinModule(pyobjects.PyObject): # was pyobjects.AbstractModule. def __init__(self, name, pycore=None, initial={}): pyobjects.PyObject.__init__(self, get_base_type("Module")) self.name = name @@ -70,7 +70,8 @@ def parent(self): return self._parent -class BuiltinClass(_BuiltinElement, pyobjects.PyObject): ###, pyobjects.AbstractClass): +class BuiltinClass(_BuiltinElement, pyobjects.PyObject): + # was (_BuiltinElement, pyobjects.AbstractClass). def __init__(self, builtin, attributes, parent=None): pyobjects.PyObject.__init__(self, get_base_type("Type")) _BuiltinElement.__init__(self, builtin, parent) @@ -89,9 +90,8 @@ def get_superclasses(self): return [] -class BuiltinFunction( - _BuiltinElement, pyobjects.PyObject -): ###, pyobjects.AbstractFunction): +class BuiltinFunction(_BuiltinElement, pyobjects.PyObject): + # was (_BuiltinElement, pyobjects.AbstractFunction). def __init__( self, returned=None, function=None, builtin=None, argnames=[], parent=None ): @@ -587,7 +587,7 @@ def get_definition_location(self): return (None, None) -class Iterator(pyobjects.PyObject): ###(pyobjects.AbstractClass): +class Iterator(pyobjects.PyObject): # was pyobjects.AbstractClass def __init__(self, holding=None): pyobjects.PyObject.__init__(self, get_base_type("Type")) self.holding = holding @@ -606,7 +606,7 @@ def get_returned_object(self, args): get_iterator = _create_builtin_getter(Iterator) -class Generator(pyobjects.PyObject): ###(pyobjects.AbstractClass): +class Generator(pyobjects.PyObject): # was pyobjects.AbstractClass. def __init__(self, holding=None): pyobjects.PyObject.__init__(self, get_base_type("Type")) self.holding = holding @@ -688,7 +688,7 @@ def _property_function(args): return pyobjects.PyObject(Property(parameters[0])) -class Lambda(pyobjects.PyObject): ###(pyobjects.AbstractFunction): +class Lambda(pyobjects.PyObject): # was pyobjects.AbstractFunction. def __init__(self, node, scope): pyobjects.PyObject.__init__(self, get_base_type("Function")) self.node = node diff --git a/rope/base/pyobjects.py b/rope/base/pyobjects.py index 884fc30c6..8ff0efa78 100644 --- a/rope/base/pyobjects.py +++ b/rope/base/pyobjects.py @@ -206,8 +206,8 @@ def _create_scope(self): pass -class PyFunction(PyDefinedObject, PyObject): ###, AbstractFunction): - ### pass +class PyFunction(PyDefinedObject, PyObject): + # was (PyDefinedObject, AbstractFunction). def __init__(self, pycore, ast_node, parent): PyObject.__init__(self, get_base_type("Function")) PyDefinedObject.__init__(self, pycore, ast_node, parent) @@ -220,8 +220,9 @@ def get_name(self): return "" -class PyClass(PyDefinedObject, PyObject): ###, AbstractClass): - ### pass +class PyClass(PyDefinedObject, PyObject): + # AbstractClass. + def __init__(self, pycore, ast_node, parent): PyObject.__init__(self, get_base_type("Type")) PyDefinedObject.__init__(self, pycore, ast_node, parent) @@ -246,7 +247,9 @@ def __str__(self): return "<" + str(self.data) + ">" -class _PyModule(PyDefinedObject, PyObject): ###, AbstractModule): +class _PyModule(PyDefinedObject, PyObject): + # was (PyDefinedObject, AbstractModule). + def __init__(self, pycore, ast_node, resource): self.resource = resource self.concluded_data = [] diff --git a/rope/base/pyobjectsdef.py b/rope/base/pyobjectsdef.py index 092e00852..a68612143 100644 --- a/rope/base/pyobjectsdef.py +++ b/rope/base/pyobjectsdef.py @@ -19,8 +19,7 @@ class PyFunction(pyobjects.PyFunction): def __init__(self, pycore, ast_node, parent): - ### rope.base.pyobjects.AbstractFunction.__init__(self) - super().__init__(pycore, ast_node, parent) ### + super().__init__(pycore, ast_node, parent) self.arguments = self.ast_node.args self.parameter_pyobjects = pynamesdef._Inferred( self._infer_parameters, self.get_module()._get_concluded_data() diff --git a/rope/refactor/wildcards.py b/rope/refactor/wildcards.py index 1a153c59b..2adea6a28 100644 --- a/rope/refactor/wildcards.py +++ b/rope/refactor/wildcards.py @@ -1,4 +1,4 @@ -from rope.base import ast, builtins, evaluate ###, pyobjects +from rope.base import ast, builtins, evaluate from rope.refactor import occurrences, patchedast from rope.base.utils.predicates import is_abstract_class From b16c27ce8b531a0d488de9cf558a470bd9236c2d Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Mon, 13 Feb 2023 03:34:10 -0600 Subject: [PATCH 12/23] OMG! Single inheritance is so easy! --- rope/base/oi/type_hinting/utils.py | 6 ++--- rope/base/pyobjects.py | 37 ++++++++++++++++++------------ rope/base/pyobjectsdef.py | 5 ++-- 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/rope/base/oi/type_hinting/utils.py b/rope/base/oi/type_hinting/utils.py index 73e6d0dea..f881d2642 100644 --- a/rope/base/oi/type_hinting/utils.py +++ b/rope/base/oi/type_hinting/utils.py @@ -1,10 +1,11 @@ import logging -from typing import Optional, Union +### Deleted annotation comment. +### from typing import Optional, Union import rope.base.utils as base_utils from rope.base import evaluate from rope.base.exceptions import AttributeNotFoundError -from rope.base.pyobjects import PyClass, PyDefinedObject, PyFunction, PyObject +from rope.base.pyobjects import PyClass, PyFunction ### PyDefinedObject, PyObject def get_super_func(pyfunc): @@ -73,7 +74,6 @@ def get_mro(pyclass): def resolve_type(type_name, pyobject): - # type: (str, Union[PyDefinedObject, PyObject]) -> Optional[PyDefinedObject, PyObject] """ Find proper type object from its name. """ diff --git a/rope/base/pyobjects.py b/rope/base/pyobjects.py index 8ff0efa78..a124a35bb 100644 --- a/rope/base/pyobjects.py +++ b/rope/base/pyobjects.py @@ -107,10 +107,12 @@ def get_unknown() -> PyObject: return get_base_type("Unknown") -class PyDefinedObject: +class PyDefinedObject (PyObject): """Python defined names that rope can access their sources""" + # was PyDefinedObject: - def __init__(self, pycore, ast_node, parent): + def __init__(self, pycore, ast_node, parent, type_): + super().__init__(type_) ### self.pycore = pycore self.ast_node = ast_node self.scope = None @@ -206,11 +208,13 @@ def _create_scope(self): pass -class PyFunction(PyDefinedObject, PyObject): - # was (PyDefinedObject, AbstractFunction). +class PyFunction(PyDefinedObject): ###, PyObject): + # 1. was (PyDefinedObject, AbstractFunction). + # 2. was (PyDefinedObject) def __init__(self, pycore, ast_node, parent): - PyObject.__init__(self, get_base_type("Function")) - PyDefinedObject.__init__(self, pycore, ast_node, parent) + ### PyObject.__init__(self, get_base_type("Function")) + ### PyDefinedObject.__init__(self, pycore, ast_node, parent) + super().__init__(pycore, ast_node, parent, get_base_type("Function")) class PyComprehension(PyDefinedObject, PyObject): @@ -220,13 +224,13 @@ def get_name(self): return "" -class PyClass(PyDefinedObject, PyObject): +class PyClass(PyDefinedObject): ###, PyObject): # AbstractClass. def __init__(self, pycore, ast_node, parent): - PyObject.__init__(self, get_base_type("Type")) - PyDefinedObject.__init__(self, pycore, ast_node, parent) - + ### PyObject.__init__(self, get_base_type("Type")) + ### PyDefinedObject.__init__(self, pycore, ast_node, parent) + super().__init__(pycore, ast_node, parent, get_base_type("Type")) class _ConcludedData: def __init__(self): @@ -247,14 +251,17 @@ def __str__(self): return "<" + str(self.data) + ">" -class _PyModule(PyDefinedObject, PyObject): - # was (PyDefinedObject, AbstractModule). - +class _PyModule(PyDefinedObject): ###, PyObject): + # 1. was (PyDefinedObject, AbstractModule). + # 2. Was (PyDefinedObject, PyObject). + def __init__(self, pycore, ast_node, resource): self.resource = resource self.concluded_data = [] - PyObject.__init__(self, get_base_type("Module")) - PyDefinedObject.__init__(self, pycore, ast_node, None) + ### PyObject.__init__(self, get_base_type("Module")) + ### PyDefinedObject.__init__(self, pycore, ast_node, None) + super().__init__(pycore, ast_node, None, get_base_type("Module")) + @property def absolute_name(self) -> str: diff --git a/rope/base/pyobjectsdef.py b/rope/base/pyobjectsdef.py index a68612143..8f7f0d6b9 100644 --- a/rope/base/pyobjectsdef.py +++ b/rope/base/pyobjectsdef.py @@ -114,8 +114,9 @@ def decorators(self): class PyComprehension(pyobjects.PyComprehension): def __init__(self, pycore, ast_node, parent): self.visitor_class = _ComprehensionVisitor - rope.base.pyobjects.PyObject.__init__(self, type_="Comp") - rope.base.pyobjects.PyDefinedObject.__init__(self, pycore, ast_node, parent) + ### rope.base.pyobjects.PyObject.__init__(self, type_="Comp") + ### rope.base.pyobjects.PyDefinedObject.__init__(self, pycore, ast_node, parent) + rope.base.pyobjects.PyDefinedObject.__init__(self, pycore, ast_node, parent, type_="Comp") def _create_scope(self): return rope.base.pyscopes.ComprehensionScope( From 7fca6bfe9a75ea9ebad19ba75b7d9ef925a7fff3 Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Mon, 13 Feb 2023 03:45:39 -0600 Subject: [PATCH 13/23] Single inheritance! PyDefinedObject is a PyObject --- rope/base/oi/type_hinting/utils.py | 4 +--- rope/base/pyobjects.py | 27 ++++++++++++--------------- rope/base/pyobjectsdef.py | 6 +++--- 3 files changed, 16 insertions(+), 21 deletions(-) diff --git a/rope/base/oi/type_hinting/utils.py b/rope/base/oi/type_hinting/utils.py index f881d2642..76c398965 100644 --- a/rope/base/oi/type_hinting/utils.py +++ b/rope/base/oi/type_hinting/utils.py @@ -1,11 +1,9 @@ import logging -### Deleted annotation comment. -### from typing import Optional, Union import rope.base.utils as base_utils from rope.base import evaluate from rope.base.exceptions import AttributeNotFoundError -from rope.base.pyobjects import PyClass, PyFunction ### PyDefinedObject, PyObject +from rope.base.pyobjects import PyClass, PyFunction def get_super_func(pyfunc): diff --git a/rope/base/pyobjects.py b/rope/base/pyobjects.py index a124a35bb..96453335b 100644 --- a/rope/base/pyobjects.py +++ b/rope/base/pyobjects.py @@ -107,12 +107,13 @@ def get_unknown() -> PyObject: return get_base_type("Unknown") -class PyDefinedObject (PyObject): +class PyDefinedObject(PyObject): """Python defined names that rope can access their sources""" + # was PyDefinedObject: def __init__(self, pycore, ast_node, parent, type_): - super().__init__(type_) ### + super().__init__(type_) self.pycore = pycore self.ast_node = ast_node self.scope = None @@ -208,12 +209,11 @@ def _create_scope(self): pass -class PyFunction(PyDefinedObject): ###, PyObject): +class PyFunction(PyDefinedObject): # 1. was (PyDefinedObject, AbstractFunction). - # 2. was (PyDefinedObject) + # 2. was (PyDefinedObject, PyObject) + def __init__(self, pycore, ast_node, parent): - ### PyObject.__init__(self, get_base_type("Function")) - ### PyDefinedObject.__init__(self, pycore, ast_node, parent) super().__init__(pycore, ast_node, parent, get_base_type("Function")) @@ -224,14 +224,14 @@ def get_name(self): return "" -class PyClass(PyDefinedObject): ###, PyObject): - # AbstractClass. +class PyClass(PyDefinedObject): + # 1. Was (PyDefinedObject, AbstractClass). + # 2. Was (PyDefinedObject, PyObject). def __init__(self, pycore, ast_node, parent): - ### PyObject.__init__(self, get_base_type("Type")) - ### PyDefinedObject.__init__(self, pycore, ast_node, parent) super().__init__(pycore, ast_node, parent, get_base_type("Type")) + class _ConcludedData: def __init__(self): self.data_ = None @@ -251,18 +251,15 @@ def __str__(self): return "<" + str(self.data) + ">" -class _PyModule(PyDefinedObject): ###, PyObject): +class _PyModule(PyDefinedObject): # 1. was (PyDefinedObject, AbstractModule). # 2. Was (PyDefinedObject, PyObject). - + def __init__(self, pycore, ast_node, resource): self.resource = resource self.concluded_data = [] - ### PyObject.__init__(self, get_base_type("Module")) - ### PyDefinedObject.__init__(self, pycore, ast_node, None) super().__init__(pycore, ast_node, None, get_base_type("Module")) - @property def absolute_name(self) -> str: return self.get_name() diff --git a/rope/base/pyobjectsdef.py b/rope/base/pyobjectsdef.py index 8f7f0d6b9..3c7286d9d 100644 --- a/rope/base/pyobjectsdef.py +++ b/rope/base/pyobjectsdef.py @@ -114,9 +114,9 @@ def decorators(self): class PyComprehension(pyobjects.PyComprehension): def __init__(self, pycore, ast_node, parent): self.visitor_class = _ComprehensionVisitor - ### rope.base.pyobjects.PyObject.__init__(self, type_="Comp") - ### rope.base.pyobjects.PyDefinedObject.__init__(self, pycore, ast_node, parent) - rope.base.pyobjects.PyDefinedObject.__init__(self, pycore, ast_node, parent, type_="Comp") + rope.base.pyobjects.PyDefinedObject.__init__( + self, pycore, ast_node, parent, type_="Comp" + ) def _create_scope(self): return rope.base.pyscopes.ComprehensionScope( From 3dd8127f21f4beb9d4b5f360f9120c0fe20fa947 Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Mon, 13 Feb 2023 04:01:40 -0600 Subject: [PATCH 14/23] Use super().__init__ where possible --- rope/base/builtins.py | 8 ++++---- rope/base/pyobjects.py | 4 +--- rope/base/pyobjectsdef.py | 5 ++--- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/rope/base/builtins.py b/rope/base/builtins.py index be9217940..637e7238b 100644 --- a/rope/base/builtins.py +++ b/rope/base/builtins.py @@ -10,7 +10,7 @@ class BuiltinModule(pyobjects.PyObject): # was pyobjects.AbstractModule. def __init__(self, name, pycore=None, initial={}): - pyobjects.PyObject.__init__(self, get_base_type("Module")) + super().__init__(get_base_type("Module")) self.name = name self.pycore = pycore self.initial = initial @@ -589,7 +589,7 @@ def get_definition_location(self): class Iterator(pyobjects.PyObject): # was pyobjects.AbstractClass def __init__(self, holding=None): - pyobjects.PyObject.__init__(self, get_base_type("Type")) + super().__init__(get_base_type("Type")) self.holding = holding self.attributes = { "next": BuiltinName(BuiltinFunction(self.holding)), @@ -608,7 +608,7 @@ def get_returned_object(self, args): class Generator(pyobjects.PyObject): # was pyobjects.AbstractClass. def __init__(self, holding=None): - pyobjects.PyObject.__init__(self, get_base_type("Type")) + super().__init__(get_base_type("Type")) self.holding = holding self.attributes = { "next": BuiltinName(BuiltinFunction(self.holding)), @@ -690,7 +690,7 @@ def _property_function(args): class Lambda(pyobjects.PyObject): # was pyobjects.AbstractFunction. def __init__(self, node, scope): - pyobjects.PyObject.__init__(self, get_base_type("Function")) + super().__init__(get_base_type("Function")) self.node = node self.arguments = node.args self.scope = scope diff --git a/rope/base/pyobjects.py b/rope/base/pyobjects.py index 96453335b..9b663f258 100644 --- a/rope/base/pyobjects.py +++ b/rope/base/pyobjects.py @@ -107,11 +107,9 @@ def get_unknown() -> PyObject: return get_base_type("Unknown") -class PyDefinedObject(PyObject): +class PyDefinedObject(PyObject): # was: had no base class. """Python defined names that rope can access their sources""" - # was PyDefinedObject: - def __init__(self, pycore, ast_node, parent, type_): super().__init__(type_) self.pycore = pycore diff --git a/rope/base/pyobjectsdef.py b/rope/base/pyobjectsdef.py index 3c7286d9d..567e413b2 100644 --- a/rope/base/pyobjectsdef.py +++ b/rope/base/pyobjectsdef.py @@ -130,8 +130,7 @@ def get_kind(self): class PyClass(pyobjects.PyClass): def __init__(self, pycore, ast_node, parent): self.visitor_class = _ClassVisitor - # rope.base.pyobjects.AbstractClass.__init__(self) - rope.base.pyobjects.PyClass.__init__(self, pycore, ast_node, parent) + super().__init__(pycore, ast_node, parent) self.parent = parent self._superclasses = self.get_module()._get_concluded_data() @@ -401,7 +400,7 @@ def _Slice(self, node): class _ScopeVisitor(_ExpressionVisitor): def __init__(self, pycore, owner_object): - _ExpressionVisitor.__init__(self, scope_visitor=self) + super().__init__(scope_visitor=self) self.pycore = pycore self.owner_object = owner_object self.names = {} From 740aa8e049d7212f7e73af725c5347c48c2ebfbb Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Mon, 13 Feb 2023 04:06:34 -0600 Subject: [PATCH 15/23] Annotate resolve_type w/o a union! --- rope/base/oi/type_hinting/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rope/base/oi/type_hinting/utils.py b/rope/base/oi/type_hinting/utils.py index 76c398965..fec780254 100644 --- a/rope/base/oi/type_hinting/utils.py +++ b/rope/base/oi/type_hinting/utils.py @@ -3,7 +3,7 @@ import rope.base.utils as base_utils from rope.base import evaluate from rope.base.exceptions import AttributeNotFoundError -from rope.base.pyobjects import PyClass, PyFunction +from rope.base.pyobjects import PyClass, PyFunction, PyObject def get_super_func(pyfunc): @@ -71,7 +71,7 @@ def get_mro(pyclass): return class_list -def resolve_type(type_name, pyobject): +def resolve_type(type_name, pyobject: PyObject) -> PyObject: # No need for Union. """ Find proper type object from its name. """ From 6ca16a7a8e5a3b8721592a68512793eb181c79fb Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Mon, 13 Feb 2023 04:18:37 -0600 Subject: [PATCH 16/23] One more super().__init__ --- rope/base/pyobjectsdef.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/rope/base/pyobjectsdef.py b/rope/base/pyobjectsdef.py index 567e413b2..801370816 100644 --- a/rope/base/pyobjectsdef.py +++ b/rope/base/pyobjectsdef.py @@ -114,9 +114,7 @@ def decorators(self): class PyComprehension(pyobjects.PyComprehension): def __init__(self, pycore, ast_node, parent): self.visitor_class = _ComprehensionVisitor - rope.base.pyobjects.PyDefinedObject.__init__( - self, pycore, ast_node, parent, type_="Comp" - ) + super().__init__(pycore, ast_node, parent, type_="Comp") def _create_scope(self): return rope.base.pyscopes.ComprehensionScope( From a040a0f6c77022e7e9bcce121442470dc72d6d6d Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Mon, 13 Feb 2023 04:35:31 -0600 Subject: [PATCH 17/23] Remove redundant base class --- rope/base/pyobjects.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rope/base/pyobjects.py b/rope/base/pyobjects.py index 9b663f258..17fba4aff 100644 --- a/rope/base/pyobjects.py +++ b/rope/base/pyobjects.py @@ -215,7 +215,7 @@ def __init__(self, pycore, ast_node, parent): super().__init__(pycore, ast_node, parent, get_base_type("Function")) -class PyComprehension(PyDefinedObject, PyObject): +class PyComprehension(PyDefinedObject): pass def get_name(self): From b20ec1b8bec530941f8f50fd4a78895153dd29a2 Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Mon, 13 Feb 2023 05:55:33 -0600 Subject: [PATCH 18/23] Add two methods from AbstractFunction, per mypy warning --- rope/base/pyobjects.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/rope/base/pyobjects.py b/rope/base/pyobjects.py index 17fba4aff..061f63cb2 100644 --- a/rope/base/pyobjects.py +++ b/rope/base/pyobjects.py @@ -214,6 +214,14 @@ class PyFunction(PyDefinedObject): def __init__(self, pycore, ast_node, parent): super().__init__(pycore, ast_node, parent, get_base_type("Function")) + # From AbstractFunction. + + def get_param_names(self, special_args=True): + return [] + + def get_returned_object(self, args): + return get_unknown() + class PyComprehension(PyDefinedObject): pass From c9c277ac0e1948cdc79f45ab58ad37a379a13454 Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Mon, 13 Feb 2023 06:21:52 -0600 Subject: [PATCH 19/23] Add one method from AbstractClass --- rope/base/pyobjects.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/rope/base/pyobjects.py b/rope/base/pyobjects.py index 061f63cb2..b2ab0329a 100644 --- a/rope/base/pyobjects.py +++ b/rope/base/pyobjects.py @@ -237,6 +237,11 @@ class PyClass(PyDefinedObject): def __init__(self, pycore, ast_node, parent): super().__init__(pycore, ast_node, parent, get_base_type("Type")) + # From AbstractClass. + + def get_superclasses(self): + return [] + class _ConcludedData: def __init__(self): From c34f711f29390365ea0dc44300eb586d9b1b117e Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Mon, 13 Feb 2023 07:34:30 -0600 Subject: [PATCH 20/23] Move predicates to pyobjects.py --- rope/base/arguments.py | 2 +- rope/base/builtins.py | 2 +- rope/base/evaluate.py | 2 +- rope/base/oi/soa.py | 2 +- rope/base/oi/soi.py | 2 +- rope/base/oi/transform.py | 2 +- rope/base/pyobjects.py | 26 +++++++++++++++++++++ rope/base/pyobjectsdef.py | 2 +- rope/base/utils/predicates.py | 43 ++++++++++++++++++----------------- rope/contrib/codeassist.py | 2 +- rope/refactor/rename.py | 2 +- rope/refactor/wildcards.py | 2 +- ropetest/pycoretest.py | 2 +- 13 files changed, 59 insertions(+), 32 deletions(-) diff --git a/rope/base/arguments.py b/rope/base/arguments.py index 5f16fd8fb..3bfcb8af3 100644 --- a/rope/base/arguments.py +++ b/rope/base/arguments.py @@ -1,6 +1,6 @@ import rope.base.evaluate from rope.base import ast -from rope.base.utils.predicates import is_abstract_class +from rope.base.pyobjects import is_abstract_class class Arguments: diff --git a/rope/base/builtins.py b/rope/base/builtins.py index 637e7238b..bbae06219 100644 --- a/rope/base/builtins.py +++ b/rope/base/builtins.py @@ -5,7 +5,7 @@ import rope.base.evaluate from rope.base import arguments, ast, pynames, pyobjects, utils from rope.base.pyobjects import get_base_type -from rope.base.utils.predicates import is_abstract_class, is_abstract_function +from rope.base.pyobjects import is_abstract_class, is_abstract_function class BuiltinModule(pyobjects.PyObject): # was pyobjects.AbstractModule. diff --git a/rope/base/evaluate.py b/rope/base/evaluate.py index 7c500385f..224c8f4e2 100644 --- a/rope/base/evaluate.py +++ b/rope/base/evaluate.py @@ -13,7 +13,7 @@ pyobjectsdef, worder, ) -from rope.base.utils.predicates import is_abstract_class, is_abstract_function +from rope.base.pyobjects import is_abstract_class, is_abstract_function BadIdentifierError = exceptions.BadIdentifierError diff --git a/rope/base/oi/soa.py b/rope/base/oi/soa.py index 592927ff0..3a479b600 100644 --- a/rope/base/oi/soa.py +++ b/rope/base/oi/soa.py @@ -2,7 +2,7 @@ import rope.base.oi.soi import rope.base.pynames from rope.base import arguments, evaluate, nameanalyze, pyobjects -from rope.base.utils.predicates import is_abstract_class, is_abstract_function +from rope.base.pyobjects import is_abstract_class, is_abstract_function def analyze_module(pycore, pymodule, should_analyze, search_subscopes, followed_calls): diff --git a/rope/base/oi/soi.py b/rope/base/oi/soi.py index 797cfdc1f..1b3b026f8 100644 --- a/rope/base/oi/soi.py +++ b/rope/base/oi/soi.py @@ -7,7 +7,7 @@ import rope.base.builtins # Use full qualification for clarity. from rope.base import arguments, evaluate, pynames, pyobjects, utils from rope.base.oi.type_hinting.factory import get_type_hinting_factory -from rope.base.utils.predicates import is_abstract_function +from rope.base.pyobjects import is_abstract_function _ignore_inferred = utils.ignore_exception(pyobjects.IsBeingInferredError) diff --git a/rope/base/oi/transform.py b/rope/base/oi/transform.py index aba627ac8..2d88e9144 100644 --- a/rope/base/oi/transform.py +++ b/rope/base/oi/transform.py @@ -4,7 +4,7 @@ import rope.base.builtins # Use full qualification for clarity. from rope.base import exceptions -from rope.base.utils.predicates import is_abstract_class +from rope.base.pyobjects import is_abstract_class class PyObjectToTextual: diff --git a/rope/base/pyobjects.py b/rope/base/pyobjects.py index b2ab0329a..1e75e6121 100644 --- a/rope/base/pyobjects.py +++ b/rope/base/pyobjects.py @@ -1,6 +1,7 @@ from typing import Optional from rope.base import ast, exceptions, utils +import rope.base.builtins class PyObject: @@ -62,6 +63,31 @@ def __iter__(self): return iter(self.get_attributes()) +def is_abstract_class(obj): + return isinstance( + obj, + ( + rope.base.builtins.BuiltinClass, + rope.base.builtins.Generator, + rope.base.builtins.Iterator, + PyClass, + ), + ) + + +def is_abstract_function(obj): + return isinstance( + obj, (rope.base.builtins.BuiltinFunction, rope.base.builtins.Lambda, PyFunction) + ) + + +def is_abstract_module(obj): + return isinstance( + obj, + (rope.base.builtins.BuiltinModule, _PyModule), + ) + + _anchor_types = None diff --git a/rope/base/pyobjectsdef.py b/rope/base/pyobjectsdef.py index 801370816..d7ea9b307 100644 --- a/rope/base/pyobjectsdef.py +++ b/rope/base/pyobjectsdef.py @@ -14,7 +14,7 @@ pyobjects, utils, ) -from rope.base.utils.predicates import is_abstract_module +from rope.base.pyobjects import is_abstract_module class PyFunction(pyobjects.PyFunction): diff --git a/rope/base/utils/predicates.py b/rope/base/utils/predicates.py index 6d3b0f0ac..790f60618 100644 --- a/rope/base/utils/predicates.py +++ b/rope/base/utils/predicates.py @@ -2,30 +2,31 @@ """ -import rope.base.builtins as builtins -import rope.base.pyobjects as pyobjects +# import rope.base.builtins as builtins +# import rope.base.pyobjects as pyobjects -def is_abstract_class(obj): - return isinstance( - obj, - ( - builtins.BuiltinClass, - builtins.Generator, - builtins.Iterator, - pyobjects.PyClass, - ), - ) +# def is_abstract_class(obj): +# return isinstance( +# obj, +# ( +# builtins.BuiltinClass, +# builtins.Generator, +# builtins.Iterator, +# pyobjects.PyClass, +# ), +# ) -def is_abstract_function(obj): - return isinstance( - obj, (builtins.BuiltinFunction, builtins.Lambda, pyobjects.PyFunction) - ) +# def is_abstract_function(obj): +# return isinstance( +# obj, (builtins.BuiltinFunction, builtins.Lambda, pyobjects.PyFunction) +# ) -def is_abstract_module(obj): - return isinstance( - obj, - (builtins.BuiltinModule, pyobjects._PyModule), - ) + +# def is_abstract_module(obj): +# return isinstance( +# obj, +# (builtins.BuiltinModule, pyobjects._PyModule), +# ) diff --git a/rope/contrib/codeassist.py b/rope/contrib/codeassist.py index ffab3301f..4ea0c61f5 100644 --- a/rope/contrib/codeassist.py +++ b/rope/contrib/codeassist.py @@ -16,7 +16,7 @@ ) from rope.contrib import fixsyntax from rope.refactor import functionutils -from rope.base.utils.predicates import ( +from rope.base.pyobjects import ( is_abstract_class, is_abstract_function, is_abstract_module, diff --git a/rope/refactor/rename.py b/rope/refactor/rename.py index 004548cfa..23513b4b5 100644 --- a/rope/refactor/rename.py +++ b/rope/refactor/rename.py @@ -12,7 +12,7 @@ ) from rope.base.change import ChangeContents, ChangeSet, MoveResource from rope.refactor import occurrences -from rope.base.utils.predicates import is_abstract_module +from rope.base.pyobjects import is_abstract_module class Rename: diff --git a/rope/refactor/wildcards.py b/rope/refactor/wildcards.py index 2adea6a28..5cd9debee 100644 --- a/rope/refactor/wildcards.py +++ b/rope/refactor/wildcards.py @@ -1,6 +1,6 @@ from rope.base import ast, builtins, evaluate from rope.refactor import occurrences, patchedast -from rope.base.utils.predicates import is_abstract_class +from rope.base.pyobjects import is_abstract_class class Wildcard: diff --git a/ropetest/pycoretest.py b/ropetest/pycoretest.py index e422a7a5a..9ab795430 100644 --- a/ropetest/pycoretest.py +++ b/ropetest/pycoretest.py @@ -120,7 +120,7 @@ def __init__(self): def f(): pass """) - from rope.base.utils.predicates import is_abstract_function + from rope.base.pyobjects import is_abstract_function mod.write(code) mod_element = self.project.get_module("mod") sample_class = mod_element["C"].get_object() From e646a11d275dd9cbc6ffc60e94896b0657294d17 Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Mon, 13 Feb 2023 07:37:49 -0600 Subject: [PATCH 21/23] Remove predicates.py --- rope/base/utils/predicates.py | 32 -------------------------------- 1 file changed, 32 deletions(-) delete mode 100644 rope/base/utils/predicates.py diff --git a/rope/base/utils/predicates.py b/rope/base/utils/predicates.py deleted file mode 100644 index 790f60618..000000000 --- a/rope/base/utils/predicates.py +++ /dev/null @@ -1,32 +0,0 @@ -"""An experimental module containing predicates to replace `Abstract` classes. - -""" - - -# import rope.base.builtins as builtins -# import rope.base.pyobjects as pyobjects - - -# def is_abstract_class(obj): -# return isinstance( -# obj, -# ( -# builtins.BuiltinClass, -# builtins.Generator, -# builtins.Iterator, -# pyobjects.PyClass, -# ), -# ) - - -# def is_abstract_function(obj): -# return isinstance( -# obj, (builtins.BuiltinFunction, builtins.Lambda, pyobjects.PyFunction) -# ) - - -# def is_abstract_module(obj): -# return isinstance( -# obj, -# (builtins.BuiltinModule, pyobjects._PyModule), -# ) From 28e4540ed9bb26960f88df71e84270ae6ae4e970 Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Mon, 13 Feb 2023 07:44:18 -0600 Subject: [PATCH 22/23] Add a comment --- rope/base/pyobjects.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rope/base/pyobjects.py b/rope/base/pyobjects.py index 1e75e6121..c88a1c81a 100644 --- a/rope/base/pyobjects.py +++ b/rope/base/pyobjects.py @@ -289,6 +289,8 @@ def __str__(self): class _PyModule(PyDefinedObject): + """The base class for PyModule and PyPackage.""" + # 1. was (PyDefinedObject, AbstractModule). # 2. Was (PyDefinedObject, PyObject). From c88d48758b16cecd377b0e9109341c4743885a88 Mon Sep 17 00:00:00 2001 From: "Edward K. Ream" Date: Mon, 13 Feb 2023 08:56:20 -0600 Subject: [PATCH 23/23] Add notes and trace --- rope/base/pyobjectsdef.py | 2 ++ ropetest/advanced_oi_test.py | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/rope/base/pyobjectsdef.py b/rope/base/pyobjectsdef.py index d7ea9b307..d9d37ee98 100644 --- a/rope/base/pyobjectsdef.py +++ b/rope/base/pyobjectsdef.py @@ -228,6 +228,8 @@ def get_name(self): return rope.base.libutils.modname(self.resource) if self.resource else "" +# PyModule = PyDefinedModule # Fails +# PyDefinedModule = PyModule # Passes. class PyPackage(pyobjects.PyPackage): def __init__(self, pycore, resource=None, force_errors=False): self.resource = resource diff --git a/ropetest/advanced_oi_test.py b/ropetest/advanced_oi_test.py index 79f514ad0..817ca9bad 100644 --- a/ropetest/advanced_oi_test.py +++ b/ropetest/advanced_oi_test.py @@ -38,9 +38,14 @@ def a_func(arg): return eval("arg") a_var = a_func(mod1) """) + # breakpoint() mod2.write(code) self.pycore.run_module(mod2).wait_process() pymod2 = self.project.get_pymodule(mod2) + if 1: # trace + print('') + print('test_module_dti:', self.project.get_pymodule(mod1).__class__.__name__) + print('test_module_dti:', pymod2["a_var"].get_object().__class__.__name__) self.assertEqual(self.project.get_pymodule(mod1), pymod2["a_var"].get_object()) def test_class_from_another_module_dti(self):