Skip to content

Commit ea73f07

Browse files
authored
Fix fine-grained dependencies for super() (#5793)
This fixes both normal and logical dependencies. We now generate dependencies from potential target attributes in base classes. Also, we don't generate logical dependencies based on the type object in Python 2 style `super()` expressions, since they aren't relevant.
1 parent ac34ac5 commit ea73f07

File tree

3 files changed

+46
-5
lines changed

3 files changed

+46
-5
lines changed

mypy/server/deps.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -644,9 +644,18 @@ def get_unimported_fullname(self, e: MemberExpr, typ: AnyType) -> Optional[str]:
644644
return None
645645

646646
def visit_super_expr(self, e: SuperExpr) -> None:
647-
super().visit_super_expr(e)
647+
# Arguments in "super(C, self)" won't generate useful logical deps.
648+
if not self.use_logical_deps():
649+
super().visit_super_expr(e)
648650
if e.info is not None:
649-
self.add_dependency(make_trigger(e.info.fullname() + '.' + e.name))
651+
name = e.name
652+
for base in non_trivial_bases(e.info):
653+
self.add_dependency(make_trigger(base.fullname() + '.' + name))
654+
if name in base.names:
655+
# No need to depend on further base classes, since we found
656+
# the target. This is safe since if the target gets
657+
# deleted or modified, we'll trigger it.
658+
break
650659

651660
def visit_call_expr(self, e: CallExpr) -> None:
652661
super().visit_call_expr(e)

test-data/unit/deps-classes.test

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,10 +136,8 @@ class D(C):
136136
<m.C.(abstract)> -> <m.D.__init__>, m
137137
<m.C.__init__> -> <m.D.__init__>, m.D.__init__
138138
<m.C.__new__> -> <m.D.__new__>
139-
<m.C.foo> -> <m.D.foo>
139+
<m.C.foo> -> <m.D.foo>, m.D.__init__
140140
<m.C> -> m, m.C, m.D
141-
<m.D.__init__> -> m.D.__init__
142-
<m.D.foo> -> m.D.__init__
143141
<m.D> -> m.D
144142

145143
[case testClassMissingInit]

test-data/unit/deps.test

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1315,3 +1315,37 @@ def h() -> None:
13151315
<m.D.__init__> -> m.h
13161316
<m.D.__new__> -> m.h
13171317
<m.D> -> m.D, m.h
1318+
1319+
[case testLogicalSuperPython2]
1320+
# flags: --logical-deps --py2
1321+
class A:
1322+
def __init__(self):
1323+
pass
1324+
def m(self):
1325+
pass
1326+
class B(A):
1327+
def m(self):
1328+
pass
1329+
class C(B):
1330+
pass
1331+
class D(C):
1332+
def __init__(self):
1333+
# type: () -> None
1334+
super(B, self).__init__()
1335+
def mm(self):
1336+
# type: () -> None
1337+
super(B, self).m()
1338+
[out]
1339+
<m.A.__init__> -> m.D.__init__
1340+
<m.A.m> -> <m.B.m>, m.B.m
1341+
<m.A.mm> -> m.D.mm
1342+
<m.A> -> m, m.A, m.B
1343+
<m.B.__init__> -> m.D.__init__
1344+
<m.B.m> -> m.D.mm
1345+
<m.B.mm> -> m.D.mm
1346+
<m.B> -> m, m.B, m.C
1347+
<m.C.__init__> -> m.D.__init__
1348+
<m.C.m> -> m.D.mm
1349+
<m.C.mm> -> m.D.mm
1350+
<m.C> -> m, m.C, m.D
1351+
<m.D> -> m.D

0 commit comments

Comments
 (0)