diff --git a/mypy/main.py b/mypy/main.py index e859e4fed42a..1074a9ac70d8 100644 --- a/mypy/main.py +++ b/mypy/main.py @@ -975,9 +975,9 @@ def add_invertible_flag( help="Use a custom typing module", ) internals_group.add_argument( - "--enable-recursive-aliases", + "--disable-recursive-aliases", action="store_true", - help="Experimental support for recursive type aliases", + help="Disable experimental support for recursive type aliases", ) internals_group.add_argument( "--custom-typeshed-dir", metavar="DIR", help="Use the custom typeshed in DIR" diff --git a/mypy/options.py b/mypy/options.py index 379ce1a7441f..76df064842f2 100644 --- a/mypy/options.py +++ b/mypy/options.py @@ -312,8 +312,8 @@ def __init__(self) -> None: # skip most errors after this many messages have been reported. # -1 means unlimited. self.many_errors_threshold = defaults.MANY_ERRORS_THRESHOLD - # Enable recursive type aliases (currently experimental) - self.enable_recursive_aliases = False + # Disable recursive type aliases (currently experimental) + self.disable_recursive_aliases = False # To avoid breaking plugin compatibility, keep providing new_semantic_analyzer @property diff --git a/mypy/semanal.py b/mypy/semanal.py index ec7b6b857efd..5a1787c50650 100644 --- a/mypy/semanal.py +++ b/mypy/semanal.py @@ -3238,7 +3238,7 @@ def check_and_set_up_type_alias(self, s: AssignmentStmt) -> bool: ) if not res: return False - if self.options.enable_recursive_aliases and not self.is_func_scope(): + if not self.options.disable_recursive_aliases and not self.is_func_scope(): # Only marking incomplete for top-level placeholders makes recursive aliases like # `A = Sequence[str | A]` valid here, similar to how we treat base classes in class # definitions, allowing `class str(Sequence[str]): ...` @@ -5749,7 +5749,7 @@ def process_placeholder(self, name: str, kind: str, ctx: Context) -> None: def cannot_resolve_name(self, name: str, kind: str, ctx: Context) -> None: self.fail(f'Cannot resolve {kind} "{name}" (possible cyclic definition)', ctx) - if self.options.enable_recursive_aliases and self.is_func_scope(): + if not self.options.disable_recursive_aliases and self.is_func_scope(): self.note("Recursive types are not allowed at function scope", ctx) def qualified_name(self, name: str) -> str: diff --git a/mypy/semanal_namedtuple.py b/mypy/semanal_namedtuple.py index 6cb42d6c3ede..1727c18b6fd9 100644 --- a/mypy/semanal_namedtuple.py +++ b/mypy/semanal_namedtuple.py @@ -176,7 +176,7 @@ def check_namedtuple_classdef( # it would be inconsistent with type aliases. analyzed = self.api.anal_type( stmt.type, - allow_placeholder=self.options.enable_recursive_aliases + allow_placeholder=not self.options.disable_recursive_aliases and not self.api.is_func_scope(), ) if analyzed is None: @@ -443,7 +443,7 @@ def parse_namedtuple_fields_with_types( # We never allow recursive types at function scope. analyzed = self.api.anal_type( type, - allow_placeholder=self.options.enable_recursive_aliases + allow_placeholder=not self.options.disable_recursive_aliases and not self.api.is_func_scope(), ) # Workaround #4987 and avoid introducing a bogus UnboundType diff --git a/mypy/semanal_newtype.py b/mypy/semanal_newtype.py index b571ed538e09..b6fb64532e6e 100644 --- a/mypy/semanal_newtype.py +++ b/mypy/semanal_newtype.py @@ -203,7 +203,7 @@ def check_newtype_args( self.api.anal_type( unanalyzed_type, report_invalid_types=False, - allow_placeholder=self.options.enable_recursive_aliases + allow_placeholder=not self.options.disable_recursive_aliases and not self.api.is_func_scope(), ) ) diff --git a/mypy/semanal_typeddict.py b/mypy/semanal_typeddict.py index 0b5b1a37a7cf..fd6b1bbd2bbf 100644 --- a/mypy/semanal_typeddict.py +++ b/mypy/semanal_typeddict.py @@ -218,7 +218,7 @@ def analyze_base_args(self, base: IndexExpr, ctx: Context) -> list[Type] | None: analyzed = self.api.anal_type( type, allow_required=True, - allow_placeholder=self.options.enable_recursive_aliases + allow_placeholder=not self.options.disable_recursive_aliases and not self.api.is_func_scope(), ) if analyzed is None: @@ -289,7 +289,7 @@ def analyze_typeddict_classdef_fields( analyzed = self.api.anal_type( stmt.type, allow_required=True, - allow_placeholder=self.options.enable_recursive_aliases + allow_placeholder=not self.options.disable_recursive_aliases and not self.api.is_func_scope(), ) if analyzed is None: @@ -484,7 +484,7 @@ def parse_typeddict_fields_with_types( analyzed = self.api.anal_type( type, allow_required=True, - allow_placeholder=self.options.enable_recursive_aliases + allow_placeholder=not self.options.disable_recursive_aliases and not self.api.is_func_scope(), ) if analyzed is None: diff --git a/mypy/typeanal.py b/mypy/typeanal.py index fc90b867acf4..2ed9523c410d 100644 --- a/mypy/typeanal.py +++ b/mypy/typeanal.py @@ -402,7 +402,7 @@ def cannot_resolve_type(self, t: UnboundType) -> None: # need access to MessageBuilder here. Also move the similar # message generation logic in semanal.py. self.api.fail(f'Cannot resolve name "{t.name}" (possible cyclic definition)', t) - if self.options.enable_recursive_aliases and self.api.is_func_scope(): + if not self.options.disable_recursive_aliases and self.api.is_func_scope(): self.note("Recursive types are not allowed at function scope", t) def apply_concatenate_operator(self, t: UnboundType) -> Type: diff --git a/test-data/unit/check-classes.test b/test-data/unit/check-classes.test index be0871ecc84f..ff38297ae488 100644 --- a/test-data/unit/check-classes.test +++ b/test-data/unit/check-classes.test @@ -4779,7 +4779,7 @@ class A(Tuple[int, str]): pass -- ----------------------- [case testCrashOnSelfRecursiveNamedTupleVar] - +# flags: --disable-recursive-aliases from typing import NamedTuple N = NamedTuple('N', [('x', N)]) # E: Cannot resolve name "N" (possible cyclic definition) @@ -4809,7 +4809,7 @@ lst = [n, m] [builtins fixtures/isinstancelist.pyi] [case testCorrectJoinOfSelfRecursiveTypedDicts] - +# flags: --disable-recursive-aliases from mypy_extensions import TypedDict class N(TypedDict): diff --git a/test-data/unit/check-dataclasses.test b/test-data/unit/check-dataclasses.test index 3f9fbb46a60b..4b2ff1af2151 100644 --- a/test-data/unit/check-dataclasses.test +++ b/test-data/unit/check-dataclasses.test @@ -1915,7 +1915,6 @@ takes_cp(MyDataclass) [builtins fixtures/dataclasses.pyi] [case testDataclassTypeAnnotationAliasUpdated] -# flags: --enable-recursive-aliases import a [file a.py] from dataclasses import dataclass diff --git a/test-data/unit/check-incremental.test b/test-data/unit/check-incremental.test index 7da379f0be01..ac005001b135 100644 --- a/test-data/unit/check-incremental.test +++ b/test-data/unit/check-incremental.test @@ -4600,7 +4600,7 @@ def outer() -> None: [out2] [case testRecursiveAliasImported] - +# flags: --disable-recursive-aliases import a [file a.py] @@ -5759,7 +5759,7 @@ class C: [builtins fixtures/tuple.pyi] [case testNamedTupleUpdateNonRecursiveToRecursiveCoarse] -# flags: --enable-recursive-aliases +# flags: --strict-optional import c [file a.py] from b import M @@ -5802,7 +5802,7 @@ tmp/c.py:5: error: Incompatible types in assignment (expression has type "Option tmp/c.py:7: note: Revealed type is "Tuple[Union[Tuple[Union[..., None], builtins.int, fallback=b.M], None], builtins.int, fallback=a.N]" [case testTupleTypeUpdateNonRecursiveToRecursiveCoarse] -# flags: --enable-recursive-aliases +# flags: --strict-optional import c [file a.py] from b import M @@ -5835,7 +5835,7 @@ tmp/c.py:4: note: Revealed type is "Tuple[Union[Tuple[Union[..., None], builtins tmp/c.py:5: error: Incompatible types in assignment (expression has type "Optional[N]", variable has type "int") [case testTypeAliasUpdateNonRecursiveToRecursiveCoarse] -# flags: --enable-recursive-aliases +# flags: --strict-optional import c [file a.py] from b import M @@ -5868,7 +5868,7 @@ tmp/c.py:4: note: Revealed type is "Tuple[Union[Tuple[Union[..., None], builtins tmp/c.py:5: error: Incompatible types in assignment (expression has type "Optional[N]", variable has type "int") [case testTypedDictUpdateNonRecursiveToRecursiveCoarse] -# flags: --enable-recursive-aliases +# flags: --strict-optional import c [file a.py] from b import M diff --git a/test-data/unit/check-namedtuple.test b/test-data/unit/check-namedtuple.test index 4552cfb118cc..438e17a6ba0a 100644 --- a/test-data/unit/check-namedtuple.test +++ b/test-data/unit/check-namedtuple.test @@ -617,7 +617,7 @@ tmp/b.py:4: note: Revealed type is "Tuple[Any, fallback=a.N]" tmp/b.py:7: note: Revealed type is "Tuple[Any, fallback=a.N]" [case testSimpleSelfReferentialNamedTuple] - +# flags: --disable-recursive-aliases from typing import NamedTuple class MyNamedTuple(NamedTuple): parent: 'MyNamedTuple' # E: Cannot resolve name "MyNamedTuple" (possible cyclic definition) @@ -655,7 +655,7 @@ class B: [out] [case testSelfRefNT1] - +# flags: --disable-recursive-aliases from typing import Tuple, NamedTuple Node = NamedTuple('Node', [ @@ -667,7 +667,7 @@ reveal_type(n) # N: Revealed type is "Tuple[builtins.str, builtins.tuple[Any, .. [builtins fixtures/tuple.pyi] [case testSelfRefNT2] - +# flags: --disable-recursive-aliases from typing import Tuple, NamedTuple A = NamedTuple('A', [ @@ -683,7 +683,7 @@ reveal_type(n) # N: Revealed type is "Tuple[builtins.str, builtins.tuple[Any, .. [builtins fixtures/tuple.pyi] [case testSelfRefNT3] - +# flags: --disable-recursive-aliases from typing import NamedTuple, Tuple class B(NamedTuple): @@ -703,7 +703,7 @@ reveal_type(lst[0]) # N: Revealed type is "Tuple[builtins.object, builtins.objec [builtins fixtures/tuple.pyi] [case testSelfRefNT4] - +# flags: --disable-recursive-aliases from typing import NamedTuple class B(NamedTuple): @@ -719,7 +719,7 @@ reveal_type(n.y[0]) # N: Revealed type is "Any" [builtins fixtures/tuple.pyi] [case testSelfRefNT5] - +# flags: --disable-recursive-aliases from typing import NamedTuple B = NamedTuple('B', [ @@ -737,7 +737,7 @@ reveal_type(f) # N: Revealed type is "def (m: Tuple[Any, builtins.int, fallback= [builtins fixtures/tuple.pyi] [case testRecursiveNamedTupleInBases] - +# flags: --disable-recursive-aliases from typing import List, NamedTuple, Union Exp = Union['A', 'B'] # E: Cannot resolve name "Exp" (possible cyclic definition) \ @@ -781,7 +781,7 @@ tp = NamedTuple('tp', [('x', int)]) [out] [case testSubclassOfRecursiveNamedTuple] - +# flags: --disable-recursive-aliases from typing import List, NamedTuple class Command(NamedTuple): diff --git a/test-data/unit/check-newsemanal.test b/test-data/unit/check-newsemanal.test index d784aadffd67..a52be03e31ce 100644 --- a/test-data/unit/check-newsemanal.test +++ b/test-data/unit/check-newsemanal.test @@ -434,6 +434,7 @@ def main() -> None: x # E: Name "x" is not defined [case testNewAnalyzerCyclicDefinitions] +# flags: --disable-recursive-aliases gx = gy # E: Cannot resolve name "gy" (possible cyclic definition) gy = gx def main() -> None: @@ -1499,6 +1500,7 @@ reveal_type(x[0][0]) # N: Revealed type is "__main__.C" [builtins fixtures/list.pyi] [case testNewAnalyzerAliasToNotReadyDirectBase] +# flags: --disable-recursive-aliases from typing import List x: B @@ -1509,11 +1511,11 @@ reveal_type(x) reveal_type(x[0][0]) [builtins fixtures/list.pyi] [out] -main:3: error: Cannot resolve name "B" (possible cyclic definition) main:4: error: Cannot resolve name "B" (possible cyclic definition) -main:4: error: Cannot resolve name "C" (possible cyclic definition) -main:7: note: Revealed type is "Any" +main:5: error: Cannot resolve name "B" (possible cyclic definition) +main:5: error: Cannot resolve name "C" (possible cyclic definition) main:8: note: Revealed type is "Any" +main:9: note: Revealed type is "Any" [case testNewAnalyzerAliasToNotReadyTwoDeferralsFunction] import a @@ -1532,6 +1534,7 @@ reveal_type(f) # N: Revealed type is "def (x: builtins.list[a.C]) -> builtins.l [builtins fixtures/list.pyi] [case testNewAnalyzerAliasToNotReadyDirectBaseFunction] +# flags: --disable-recursive-aliases import a [file a.py] from typing import List @@ -2119,6 +2122,7 @@ class B(List[C]): [builtins fixtures/list.pyi] [case testNewAnalyzerNewTypeForwardClassAliasDirect] +# flags: --disable-recursive-aliases from typing import NewType, List x: D @@ -2131,12 +2135,12 @@ class B(D): pass [builtins fixtures/list.pyi] [out] -main:3: error: Cannot resolve name "D" (possible cyclic definition) -main:4: note: Revealed type is "Any" -main:6: error: Cannot resolve name "D" (possible cyclic definition) -main:6: error: Cannot resolve name "C" (possible cyclic definition) -main:7: error: Argument 2 to NewType(...) must be a valid type -main:7: error: Cannot resolve name "B" (possible cyclic definition) +main:4: error: Cannot resolve name "D" (possible cyclic definition) +main:5: note: Revealed type is "Any" +main:7: error: Cannot resolve name "D" (possible cyclic definition) +main:7: error: Cannot resolve name "C" (possible cyclic definition) +main:8: error: Argument 2 to NewType(...) must be a valid type +main:8: error: Cannot resolve name "B" (possible cyclic definition) -- Copied from check-classes.test (tricky corner cases). [case testNewAnalyzerNoCrashForwardRefToBrokenDoubleNewTypeClass] @@ -2153,6 +2157,7 @@ class C: [builtins fixtures/dict.pyi] [case testNewAnalyzerForwardTypeAliasInBase] +# flags: --disable-recursive-aliases from typing import List, Generic, TypeVar, NamedTuple T = TypeVar('T') @@ -2593,6 +2598,7 @@ import n def __getattr__(x): pass [case testNewAnalyzerReportLoopInMRO2] +# flags: --disable-recursive-aliases def f() -> None: class A(A): ... # E: Cannot resolve name "A" (possible cyclic definition) diff --git a/test-data/unit/check-recursive-types.test b/test-data/unit/check-recursive-types.test index 8a491e208c44..cbbc6d7005ef 100644 --- a/test-data/unit/check-recursive-types.test +++ b/test-data/unit/check-recursive-types.test @@ -1,7 +1,6 @@ -- Tests checking that basic functionality works [case testRecursiveAliasBasic] -# flags: --enable-recursive-aliases from typing import Dict, List, Union, TypeVar, Sequence JSON = Union[str, List[JSON], Dict[str, JSON]] @@ -17,7 +16,6 @@ x = ["foo", {"bar": [Bad()]}] # E: List item 0 has incompatible type "Bad"; exp [builtins fixtures/isinstancelist.pyi] [case testRecursiveAliasBasicGenericSubtype] -# flags: --enable-recursive-aliases from typing import Union, TypeVar, Sequence, List T = TypeVar("T") @@ -37,7 +35,6 @@ xx = yy # OK [builtins fixtures/isinstancelist.pyi] [case testRecursiveAliasBasicGenericInference] -# flags: --enable-recursive-aliases from typing import Union, TypeVar, Sequence, List T = TypeVar("T") @@ -61,7 +58,6 @@ x = [1, [Bad()]] # E: List item 0 has incompatible type "Bad"; expected "Union[ [builtins fixtures/isinstancelist.pyi] [case testRecursiveAliasGenericInferenceNested] -# flags: --enable-recursive-aliases from typing import Union, TypeVar, Sequence, List T = TypeVar("T") @@ -77,7 +73,6 @@ reveal_type(flatten([[B(), [[B()]]]])) # N: Revealed type is "builtins.list[__m [builtins fixtures/isinstancelist.pyi] [case testRecursiveAliasNewStyleSupported] -# flags: --enable-recursive-aliases from test import A x: A @@ -93,7 +88,6 @@ A = int | list[A] -- Tests duplicating some existing type alias tests with recursive aliases enabled [case testRecursiveAliasesMutual] -# flags: --enable-recursive-aliases from typing import Type, Callable, Union A = Union[B, int] @@ -103,7 +97,6 @@ x: A reveal_type(x) # N: Revealed type is "Union[def (Union[Type[def (...) -> builtins.int], Type[builtins.int]]) -> builtins.int, builtins.int]" [case testRecursiveAliasesProhibited-skip] -# flags: --enable-recursive-aliases from typing import Type, Callable, Union A = Union[B, int] @@ -111,7 +104,6 @@ B = Union[A, int] C = Type[C] [case testRecursiveAliasImported] -# flags: --enable-recursive-aliases import lib x: lib.A reveal_type(x) # N: Revealed type is "builtins.list[builtins.list[...]]" @@ -128,7 +120,6 @@ B = List[A] [builtins fixtures/list.pyi] [case testRecursiveAliasViaBaseClass] -# flags: --enable-recursive-aliases from typing import List x: B @@ -140,7 +131,6 @@ reveal_type(x[0][0]) # N: Revealed type is "__main__.C" [builtins fixtures/list.pyi] [case testRecursiveAliasViaBaseClass2] -# flags: --enable-recursive-aliases from typing import NewType, List x: D @@ -154,7 +144,6 @@ class B(D): [builtins fixtures/list.pyi] [case testRecursiveAliasViaBaseClass3] -# flags: --enable-recursive-aliases from typing import List, Generic, TypeVar, NamedTuple T = TypeVar('T') @@ -173,7 +162,6 @@ reveal_type(x) # N: Revealed type is "__main__.G[Tuple[builtins.int, fallback=_ [builtins fixtures/list.pyi] [case testRecursiveAliasViaBaseClassImported] -# flags: --enable-recursive-aliases import a [file a.py] from typing import List @@ -190,7 +178,6 @@ reveal_type(f) # N: Revealed type is "def (x: builtins.list[a.C]) -> builtins.l [builtins fixtures/list.pyi] [case testRecursiveAliasViaNamedTuple] -# flags: --enable-recursive-aliases from typing import List, NamedTuple, Union Exp = Union['A', 'B'] @@ -210,7 +197,6 @@ my_eval(A([B(1), B(2)])) [builtins fixtures/isinstancelist.pyi] [case testRecursiveAliasesSimplifiedUnion] -# flags: --enable-recursive-aliases from typing import Sequence, TypeVar, Union class A: ... @@ -231,7 +217,6 @@ x = y # E: Incompatible types in assignment (expression has type "Sequence[Unio [builtins fixtures/isinstancelist.pyi] [case testRecursiveAliasesJoins] -# flags: --enable-recursive-aliases from typing import Sequence, TypeVar, Union class A: ... @@ -257,7 +242,6 @@ x = y3 # E: Incompatible types in assignment (expression has type "Sequence[Uni [builtins fixtures/isinstancelist.pyi] [case testRecursiveAliasesRestrictions] -# flags: --enable-recursive-aliases from typing import Sequence, Mapping, Union A = Sequence[Union[int, A]] @@ -272,7 +256,6 @@ else: [builtins fixtures/isinstancelist.pyi] [case testRecursiveAliasesRestrictions2] -# flags: --enable-recursive-aliases from typing import Sequence, Union class A: ... @@ -296,7 +279,6 @@ if isinstance(b[0], Sequence): [builtins fixtures/isinstancelist.pyi] [case testRecursiveAliasWithRecursiveInstance] -# flags: --enable-recursive-aliases from typing import Sequence, Union, TypeVar class A: ... @@ -317,7 +299,6 @@ reveal_type(join(b, a)) # N: Revealed type is "typing.Sequence[Union[__main__.A [builtins fixtures/isinstancelist.pyi] [case testRecursiveAliasWithRecursiveInstanceInference] -# flags: --enable-recursive-aliases from typing import Sequence, Union, TypeVar, List T = TypeVar("T") @@ -338,7 +319,6 @@ reveal_type(bar(nib)) # N: Revealed type is "__main__.B" [builtins fixtures/isinstancelist.pyi] [case testRecursiveAliasTopUnion] -# flags: --enable-recursive-aliases from typing import Sequence, Union, TypeVar, List class A: ... @@ -363,7 +343,6 @@ reveal_type(foo(xx)) # N: Revealed type is "__main__.B" [builtins fixtures/isinstancelist.pyi] [case testRecursiveAliasInferenceExplicitNonRecursive] -# flags: --enable-recursive-aliases from typing import Sequence, Union, TypeVar, List T = TypeVar("T") @@ -390,7 +369,6 @@ reveal_type(bar(llla)) # N: Revealed type is "__main__.A" [builtins fixtures/isinstancelist.pyi] [case testRecursiveAliasesWithOptional] -# flags: --enable-recursive-aliases from typing import Optional, Sequence A = Sequence[Optional[A]] @@ -398,7 +376,6 @@ x: A y: str = x[0] # E: Incompatible types in assignment (expression has type "Optional[A]", variable has type "str") [case testRecursiveAliasesProhibitBadAliases] -# flags: --enable-recursive-aliases from typing import Union, Type, List, TypeVar NR = List[int] @@ -440,7 +417,7 @@ reveal_type(d) # N: Revealed type is "Any" [builtins fixtures/isinstancelist.pyi] [case testBasicRecursiveNamedTuple] -# flags: --enable-recursive-aliases +# flags: --strict-optional from typing import NamedTuple, Optional NT = NamedTuple("NT", [("x", Optional[NT]), ("y", int)]) @@ -454,7 +431,6 @@ if nt.x is not None: [builtins fixtures/tuple.pyi] [case testBasicRecursiveNamedTupleSpecial] -# flags: --enable-recursive-aliases from typing import NamedTuple, TypeVar, Tuple NT = NamedTuple("NT", [("x", NT), ("y", int)]) @@ -476,7 +452,7 @@ reveal_type(f(tnt, nt)) # N: Revealed type is "builtins.tuple[Any, ...]" [builtins fixtures/tuple.pyi] [case testBasicRecursiveNamedTupleClass] -# flags: --enable-recursive-aliases +# flags: --strict-optional from typing import NamedTuple, Optional class NT(NamedTuple): @@ -493,7 +469,6 @@ if nt.x is not None: [builtins fixtures/tuple.pyi] [case testRecursiveRegularTupleClass] -# flags: --enable-recursive-aliases from typing import Tuple x: B @@ -505,7 +480,6 @@ reveal_type(b.x) # N: Revealed type is "builtins.int" [builtins fixtures/tuple.pyi] [case testRecursiveTupleClassesNewType] -# flags: --enable-recursive-aliases from typing import Tuple, NamedTuple, NewType x: C @@ -528,7 +502,6 @@ reveal_type(bnt.y) # N: Revealed type is "builtins.int" -- Tests duplicating some existing named tuple tests with recursive aliases enabled [case testMutuallyRecursiveNamedTuples] -# flags: --enable-recursive-aliases from typing import Tuple, NamedTuple, TypeVar, Union A = NamedTuple('A', [('x', str), ('y', Tuple[B, ...])]) @@ -547,7 +520,6 @@ y: str = x # E: Incompatible types in assignment (expression has type "Union[st [builtins fixtures/tuple.pyi] [case testMutuallyRecursiveNamedTuplesJoin] -# flags: --enable-recursive-aliases from typing import NamedTuple, Tuple class B(NamedTuple): @@ -564,7 +536,6 @@ reveal_type(lst[0]) # N: Revealed type is "Tuple[builtins.object, builtins.objec [builtins fixtures/tuple.pyi] [case testMutuallyRecursiveNamedTuplesClasses] -# flags: --enable-recursive-aliases from typing import NamedTuple, Tuple class B(NamedTuple): @@ -587,7 +558,6 @@ t = m # E: Incompatible types in assignment (expression has type "B", variable [builtins fixtures/tuple.pyi] [case testMutuallyRecursiveNamedTuplesCalls] -# flags: --enable-recursive-aliases from typing import NamedTuple B = NamedTuple('B', [('x', A), ('y', int)]) @@ -600,7 +570,6 @@ f(n) # E: Argument 1 to "f" has incompatible type "A"; expected "B" [builtins fixtures/tuple.pyi] [case testNoRecursiveTuplesAtFunctionScope] -# flags: --enable-recursive-aliases from typing import NamedTuple, Tuple def foo() -> None: class B(NamedTuple): @@ -608,11 +577,10 @@ def foo() -> None: # N: Recursive types are not allowed at function scope y: int b: B - reveal_type(b) # N: Revealed type is "Tuple[Any, builtins.int, fallback=__main__.B@4]" + reveal_type(b) # N: Revealed type is "Tuple[Any, builtins.int, fallback=__main__.B@3]" [builtins fixtures/tuple.pyi] [case testBasicRecursiveGenericNamedTuple] -# flags: --enable-recursive-aliases from typing import Generic, NamedTuple, TypeVar, Union T = TypeVar("T", covariant=True) @@ -636,7 +604,6 @@ reveal_type(last(ntb)) # N: Revealed type is "__main__.B" [builtins fixtures/tuple.pyi] [case testBasicRecursiveTypedDictClass] -# flags: --enable-recursive-aliases from typing import TypedDict class TD(TypedDict): @@ -650,7 +617,6 @@ s: str = td["y"] # E: Incompatible types in assignment (expression has type "TD [typing fixtures/typing-typeddict.pyi] [case testBasicRecursiveTypedDictCall] -# flags: --enable-recursive-aliases from typing import TypedDict TD = TypedDict("TD", {"x": int, "y": TD}) @@ -668,7 +634,6 @@ td = td3 # E: Incompatible types in assignment (expression has type "TD3", vari [typing fixtures/typing-typeddict.pyi] [case testBasicRecursiveTypedDictExtending] -# flags: --enable-recursive-aliases from typing import TypedDict class TDA(TypedDict): @@ -689,7 +654,6 @@ reveal_type(td) # N: Revealed type is "TypedDict('__main__.TD', {'xb': builtins [typing fixtures/typing-typeddict.pyi] [case testRecursiveTypedDictCreation] -# flags: --enable-recursive-aliases from typing import TypedDict, Optional class TD(TypedDict): @@ -705,7 +669,7 @@ itd2 = TD(x=0, y=TD(x=0, y=TD(x=0, y=None))) [typing fixtures/typing-typeddict.pyi] [case testRecursiveTypedDictMethods] -# flags: --enable-recursive-aliases +# flags: --strict-optional from typing import TypedDict class TD(TypedDict, total=False): @@ -725,7 +689,6 @@ td.update({"x": 0, "y": {"x": 1, "y": {"x": 2, "y": 42}}}) # E: Incompatible ty [typing fixtures/typing-typeddict.pyi] [case testRecursiveTypedDictSubtyping] -# flags: --enable-recursive-aliases from typing import TypedDict class TDA1(TypedDict): @@ -752,7 +715,6 @@ fb(tda1) # E: Argument 1 to "fb" has incompatible type "TDA1"; expected "TDB" [typing fixtures/typing-typeddict.pyi] [case testRecursiveTypedDictJoin] -# flags: --enable-recursive-aliases from typing import TypedDict, TypeVar class TDA1(TypedDict): @@ -778,7 +740,6 @@ reveal_type(f(tda1, tdb)) # N: Revealed type is "TypedDict({})" [typing fixtures/typing-typeddict.pyi] [case testBasicRecursiveGenericTypedDict] -# flags: --enable-recursive-aliases from typing import TypedDict, TypeVar, Generic, Optional, List T = TypeVar("T") @@ -794,7 +755,6 @@ reveal_type(collect({"left": {"right": {"value": 0}}})) # N: Revealed type is " [typing fixtures/typing-typeddict.pyi] [case testRecursiveGenericTypedDictExtending] -# flags: --enable-recursive-aliases from typing import TypedDict, Generic, TypeVar, List T = TypeVar("T") @@ -812,7 +772,7 @@ reveal_type(std) # N: Revealed type is "TypedDict('__main__.STD', {'val': built [typing fixtures/typing-typeddict.pyi] [case testRecursiveClassLevelAlias] -# flags: --enable-recursive-aliases +# flags: --strict-optional from typing import Union, Sequence class A: diff --git a/test-data/unit/check-type-aliases.test b/test-data/unit/check-type-aliases.test index 2849a226727b..8dafc8f47a6c 100644 --- a/test-data/unit/check-type-aliases.test +++ b/test-data/unit/check-type-aliases.test @@ -197,7 +197,7 @@ Alias = Tuple[int, T] [out] [case testRecursiveAliasesErrors1] - +# flags: --disable-recursive-aliases # Recursive aliases are not supported yet. from typing import Type, Callable, Union @@ -206,7 +206,7 @@ B = Callable[[B], int] # E: Cannot resolve name "B" (possible cyclic definition) C = Type[C] # E: Cannot resolve name "C" (possible cyclic definition) [case testRecursiveAliasesErrors2] - +# flags: --disable-recursive-aliases # Recursive aliases are not supported yet. from typing import Type, Callable, Union @@ -243,8 +243,7 @@ reveal_type(x[0].x) # N: Revealed type is "builtins.str" [out] [case testJSONAliasApproximation] - -# Recursive aliases are not supported yet. +# flags: --disable-recursive-aliases from typing import List, Union, Dict x: JSON # E: Cannot resolve name "JSON" (possible cyclic definition) JSON = Union[int, str, List[JSON], Dict[str, JSON]] # E: Cannot resolve name "JSON" (possible cyclic definition) @@ -772,7 +771,6 @@ f(string, string) [typing fixtures/typing-medium.pyi] [case testForwardTypeVarRefWithRecursiveFlag] -# flags: --enable-recursive-aliases import c [file a.py] from typing import TypeVar, List, Any, Generic diff --git a/test-data/unit/check-typeddict.test b/test-data/unit/check-typeddict.test index 5bfe9f4c5555..bbd6874c6263 100644 --- a/test-data/unit/check-typeddict.test +++ b/test-data/unit/check-typeddict.test @@ -1443,7 +1443,7 @@ reveal_type(x['a']['b']) # N: Revealed type is "builtins.int" [case testSelfRecursiveTypedDictInheriting] from mypy_extensions import TypedDict - +# flags: --disable-recursive-aliases class MovieBase(TypedDict): name: str year: int @@ -1457,7 +1457,7 @@ reveal_type(m['director']['name']) # N: Revealed type is "Any" [out] [case testSubclassOfRecursiveTypedDict] - +# flags: --disable-recursive-aliases from typing import List from mypy_extensions import TypedDict diff --git a/test-data/unit/check-unions.test b/test-data/unit/check-unions.test index f29e9d4b3f6b..733e2be1eac6 100644 --- a/test-data/unit/check-unions.test +++ b/test-data/unit/check-unions.test @@ -1004,7 +1004,7 @@ def takes_int(arg: int) -> None: pass takes_int(x) # E: Argument 1 to "takes_int" has incompatible type "Union[ExtremelyLongTypeNameWhichIsGenericSoWeCanUseItMultipleTimes[int], ExtremelyLongTypeNameWhichIsGenericSoWeCanUseItMultipleTimes[object], ExtremelyLongTypeNameWhichIsGenericSoWeCanUseItMultipleTimes[float], ExtremelyLongTypeNameWhichIsGenericSoWeCanUseItMultipleTimes[str], ExtremelyLongTypeNameWhichIsGenericSoWeCanUseItMultipleTimes[Any], ExtremelyLongTypeNameWhichIsGenericSoWeCanUseItMultipleTimes[bytes]]"; expected "int" [case testRecursiveForwardReferenceInUnion] - +# flags: --disable-recursive-aliases from typing import List, Union MYTYPE = List[Union[str, "MYTYPE"]] # E: Cannot resolve name "MYTYPE" (possible cyclic definition) [builtins fixtures/list.pyi] diff --git a/test-data/unit/fine-grained.test b/test-data/unit/fine-grained.test index 364e4049b961..27c062531903 100644 --- a/test-data/unit/fine-grained.test +++ b/test-data/unit/fine-grained.test @@ -3449,7 +3449,6 @@ f(a.x) == [case testNamedTupleUpdate5] -# flags: --enable-recursive-aliases import b [file a.py] from typing import NamedTuple, Optional @@ -3503,7 +3502,7 @@ def foo() -> None: b.py:4: error: Incompatible types in assignment (expression has type "str", variable has type "int") [case testNamedTupleUpdateNonRecursiveToRecursiveFine] -# flags: --enable-recursive-aliases +# flags: --strict-optional import c [file a.py] from b import M @@ -3546,7 +3545,7 @@ c.py:5: error: Incompatible types in assignment (expression has type "Optional[N c.py:7: note: Revealed type is "Tuple[Union[Tuple[Union[..., None], builtins.int, fallback=b.M], None], builtins.int, fallback=a.N]" [case testTupleTypeUpdateNonRecursiveToRecursiveFine] -# flags: --enable-recursive-aliases +# flags: --strict-optional import c [file a.py] from b import M @@ -3579,7 +3578,7 @@ c.py:4: note: Revealed type is "Tuple[Union[Tuple[Union[..., None], builtins.int c.py:5: error: Incompatible types in assignment (expression has type "Optional[N]", variable has type "int") [case testTypeAliasUpdateNonRecursiveToRecursiveFine] -# flags: --enable-recursive-aliases +# flags: --strict-optional import c [file a.py] from b import M @@ -3668,7 +3667,6 @@ def foo(x: Point) -> int: b.py:3: error: Unsupported operand types for + ("int" and "str") [case testTypedDictUpdate3] -# flags: --enable-recursive-aliases import b [file a.py] from mypy_extensions import TypedDict diff --git a/test-data/unit/pythoneval.test b/test-data/unit/pythoneval.test index da326c915ffd..59ab586b17e6 100644 --- a/test-data/unit/pythoneval.test +++ b/test-data/unit/pythoneval.test @@ -1621,7 +1621,6 @@ _testEnumValueWithPlaceholderNodeType.py:6: error: Incompatible types in assignm _testEnumValueWithPlaceholderNodeType.py:6: error: Name "Missing" is not defined [case testTypeshedRecursiveTypesExample] -# flags: --enable-recursive-aliases from typing import List, Union Recursive = Union[str, List["Recursive"]]