summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaudiu Popa <pcmanticore@gmail.com>2020-04-28 08:12:14 +0200
committerClaudiu Popa <pcmanticore@gmail.com>2020-04-28 08:33:50 +0200
commit90d42153b9e337ebdc21a6e829197d2ef4f6afb7 (patch)
tree93d34f7d19305d750905b7ed290b7f5760a47f50
parent089f510623e468c60b2f44365fec3db942591d3d (diff)
downloadpylint-git-90d42153b9e337ebdc21a6e829197d2ef4f6afb7.tar.gz
Fix a crash in `method-hidden` lookup for unknown base classes
The patch replaces `mro()` with `ancestors()` as the former is not fully capable of generating the complete linearization when dealing with ambiguous inferences. Close #3527
-rw-r--r--ChangeLog9
-rw-r--r--pylint/checkers/classes.py13
-rw-r--r--tests/functional/m/method_hidden.py11
3 files changed, 24 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 2f7c22c77..58df80de3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,15 @@
Pylint's ChangeLog
------------------
+What's New in Pylint 2.5.1?
+===========================
+
+Release date: TBA
+
+* Fix a crash in `method-hidden` lookup for unknown base classes
+
+ Close #3527
+
What's New in Pylint 2.5.0?
===========================
diff --git a/pylint/checkers/classes.py b/pylint/checkers/classes.py
index d96d6b9ed..775f8aad2 100644
--- a/pylint/checkers/classes.py
+++ b/pylint/checkers/classes.py
@@ -988,15 +988,10 @@ a metaclass class method.",
return
# If a subclass defined the method then it's not our fault.
- try:
- mro = klass.mro()
- except (InconsistentMroError, DuplicateBasesError):
- pass
- else:
- for subklass in mro[1 : mro.index(overridden_frame) + 1]:
- for obj in subklass.lookup(node.name)[1]:
- if isinstance(obj, astroid.FunctionDef):
- return
+ for ancestor in klass.ancestors():
+ for obj in ancestor.lookup(node.name)[1]:
+ if isinstance(obj, astroid.FunctionDef):
+ return
args = (overridden.root().name, overridden.fromlineno)
self.add_message("method-hidden", args=args, node=node)
except astroid.NotFoundError:
diff --git a/tests/functional/m/method_hidden.py b/tests/functional/m/method_hidden.py
index 3070c3b5a..7131ba21a 100644
--- a/tests/functional/m/method_hidden.py
+++ b/tests/functional/m/method_hidden.py
@@ -79,3 +79,14 @@ class One:
class Two(One):
def one(self):
pass
+
+try:
+ import unknown as js
+except ImportError:
+ import json as js
+
+
+class JsonEncoder(js.JSONEncoder):
+ # pylint: disable=useless-super-delegation
+ def default(self, o):
+ return super(JsonEncoder, self).default(o)