Skip to content

Commit 01189b3

Browse files
authored
Merge branch 'master' into iade
2 parents ff48189 + 00df9a6 commit 01189b3

File tree

4 files changed

+70
-7
lines changed

4 files changed

+70
-7
lines changed

mypy/expandtype.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -251,9 +251,9 @@ def visit_type_var(self, t: TypeVarType) -> Type:
251251
if (tvar_id := repl.id) in self.recursive_tvar_guard:
252252
return self.recursive_tvar_guard[tvar_id] or repl
253253
self.recursive_tvar_guard[tvar_id] = None
254-
repl = repl.accept(self)
255-
if isinstance(repl, TypeVarType):
256-
repl.default = repl.default.accept(self)
254+
repl.default = repl.default.accept(self)
255+
expanded = repl.accept(self) # Note: `expanded is repl` may be true.
256+
repl = repl if isinstance(expanded, TypeVarType) else expanded
257257
self.recursive_tvar_guard[tvar_id] = repl
258258
return repl
259259

mypy/report.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -141,12 +141,9 @@ def should_skip_path(path: str) -> bool:
141141

142142
def iterate_python_lines(path: str) -> Iterator[tuple[int, str]]:
143143
"""Return an iterator over (line number, line text) from a Python file."""
144-
try:
144+
if not os.path.isdir(path): # can happen with namespace packages
145145
with tokenize.open(path) as input_file:
146146
yield from enumerate(input_file, 1)
147-
except IsADirectoryError:
148-
# can happen with namespace packages
149-
pass
150147

151148

152149
class FuncCounterVisitor(TraverserVisitor):

test-data/unit/check-typevar-defaults.test

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,38 @@ def func_c4(
416416
reveal_type(m) # N: Revealed type is "__main__.ClassC4[builtins.int, builtins.float]"
417417
[builtins fixtures/tuple.pyi]
418418

419+
[case testTypeVarDefaultsSwap]
420+
from typing import TypeVar, Generic
421+
422+
T = TypeVar("T")
423+
X = TypeVar("X", default=object)
424+
Y = TypeVar("Y", default=object)
425+
426+
427+
class Foo(Generic[T, Y]):
428+
def test(self) -> None:
429+
reveal_type( Foo[Y, T]() ) # N: Revealed type is "__main__.Foo[Y`2 = builtins.object, T`1]"
430+
431+
432+
class Bar(Generic[X, Y]):
433+
def test(self) -> None:
434+
reveal_type( Bar[Y, X]() ) # N: Revealed type is "__main__.Bar[Y`2 = builtins.object, X`1 = builtins.object]"
435+
436+
437+
[case testTypeVarDefaultsSwap2]
438+
from typing import TypeVar, Generic
439+
440+
X = TypeVar("X", default=object)
441+
Y = TypeVar("Y", default=object)
442+
U = TypeVar("U", default=object)
443+
V = TypeVar("V", default=object)
444+
445+
class Transform(Generic[X, Y]):
446+
def invert(self) -> "Transform[Y, X]": ...
447+
448+
class Foo(Transform[U, V], Generic[U, V]):
449+
def invert(self) -> "Foo[V, U]": ...
450+
419451
[case testTypeVarDefaultsClassRecursive1]
420452
# flags: --disallow-any-generics
421453
from typing import Generic, TypeVar, List

test-data/unit/reports.test

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,3 +555,37 @@ namespace_packages = True
555555
[file folder/subfolder/something.py]
556556
class Something:
557557
pass
558+
559+
[case testReportCoberturaCrashOnNamespacePackages]
560+
# cmd: mypy --cobertura-xml-report report -p folder
561+
-- Regression test for https://github.com/python/mypy/issues/19843
562+
[file folder/subfolder/something.py]
563+
-- This output is not important, but due to the way tests are run we need to check it.
564+
[outfile report/cobertura.xml]
565+
<coverage timestamp="$TIMESTAMP" version="$VERSION" line-rate="1.0" branch-rate="0" lines-covered="0" lines-valid="0">
566+
<sources>
567+
<source>$PWD</source>
568+
</sources>
569+
<packages>
570+
<package complexity="1.0" name="folder" branch-rate="0" line-rate="1.0">
571+
<classes>
572+
<class complexity="1.0" filename="folder" name="folder" branch-rate="0" line-rate="1.0">
573+
<methods/>
574+
<lines/>
575+
</class>
576+
<class complexity="1.0" filename="folder/subfolder" name="subfolder" branch-rate="0" line-rate="1.0">
577+
<methods/>
578+
<lines/>
579+
</class>
580+
</classes>
581+
</package>
582+
<package complexity="1.0" name="folder.subfolder" branch-rate="0" line-rate="1.0">
583+
<classes>
584+
<class complexity="1.0" filename="folder/subfolder/something.py" name="something.py" branch-rate="0" line-rate="1.0">
585+
<methods/>
586+
<lines/>
587+
</class>
588+
</classes>
589+
</package>
590+
</packages>
591+
</coverage>

0 commit comments

Comments
 (0)