[case testHello]
print("hello")
[out]
MypyFile:1(
  ExpressionStmt:1(
    CallExpr:1(
      NameExpr(print)
      Args(
        StrExpr(hello)))))

[case testMemberExpr]
foo_bar.xyz2
[out]
MypyFile:1(
  ExpressionStmt:1(
    MemberExpr:1(
      NameExpr(foo_bar)
      xyz2)))

[case testTupleExpr]
("a", "b")
[out]
MypyFile:1(
  ExpressionStmt:1(
    TupleExpr:1(
      StrExpr(a)
      StrExpr(b))))

[case testOpExpr]
("x" + "y") * "z"
[out]
MypyFile:1(
  ExpressionStmt:1(
    OpExpr:1(
      *
      OpExpr:1(
        +
        StrExpr(x)
        StrExpr(y))
      StrExpr(z))))

[case testIntExpr]
(0, 1, 2, 203, 5345, 50123, 1234567890, 9982374892739487239847897928374897298374, 0x1950A86A20F9469CFC6C)
[out]
MypyFile:1(
  ExpressionStmt:1(
    TupleExpr:1(
      IntExpr(0)
      IntExpr(1)
      IntExpr(2)
      IntExpr(203)
      IntExpr(5345)
      IntExpr(50123)
      IntExpr(1234567890)
      IntExpr(9982374892739487239847897928374897298374)
      IntExpr(119547037146038801333356))))

[case testAssignmentStmt]
x = 1
a, b = c = 6
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    IntExpr(1))
  AssignmentStmt:2(
    Lvalues(
      TupleExpr:2(
        NameExpr(a)
        NameExpr(b))
      NameExpr(c))
    IntExpr(6)))

[case testOperatorAssignment]
x += 1
y -= 2
z *= 3
[out]
MypyFile:1(
  OperatorAssignmentStmt:1(
    +
    NameExpr(x)
    IntExpr(1))
  OperatorAssignmentStmt:2(
    -
    NameExpr(y)
    IntExpr(2))
  OperatorAssignmentStmt:3(
    *
    NameExpr(z)
    IntExpr(3)))

[case testIfStmt]
if x:
    y
if a:
    b
else:
    c
[out]
MypyFile:1(
  IfStmt:1(
    If(
      NameExpr(x))
    Then(
      ExpressionStmt:2(
        NameExpr(y))))
  IfStmt:3(
    If(
      NameExpr(a))
    Then(
      ExpressionStmt:4(
        NameExpr(b)))
    Else(
      ExpressionStmt:6(
        NameExpr(c)))))

[case testIfStmtElif]
if a:
    b
elif c:
    d
else:
    e
[out]
MypyFile:1(
  IfStmt:1(
    If(
      NameExpr(a))
    Then(
      ExpressionStmt:2(
        NameExpr(b)))
    Else(
      IfStmt:3(
        If(
          NameExpr(c))
        Then(
          ExpressionStmt:4(
            NameExpr(d)))
        Else(
          ExpressionStmt:6(
            NameExpr(e)))))))

[case testIfStmtMultipleElif]
if 1:
    2
elif 3:
    4
elif 5:
    6
else:
    7
[out]
MypyFile:1(
  IfStmt:1(
    If(
      IntExpr(1))
    Then(
      ExpressionStmt:2(
        IntExpr(2)))
    Else(
      IfStmt:3(
        If(
          IntExpr(3))
        Then(
          ExpressionStmt:4(
            IntExpr(4)))
        Else(
          IfStmt:5(
            If(
              IntExpr(5))
            Then(
              ExpressionStmt:6(
                IntExpr(6)))
            Else(
              ExpressionStmt:8(
                IntExpr(7)))))))))

[case testIfStmtElifNoElse]
if a:
    b
elif c:
    d
[out]
MypyFile:1(
  IfStmt:1(
    If(
      NameExpr(a))
    Then(
      ExpressionStmt:2(
        NameExpr(b)))
    Else(
      IfStmt:3(
        If(
          NameExpr(c))
        Then(
          ExpressionStmt:4(
            NameExpr(d)))))))

[case testWhileStmt]
while a:
    b
while c:
    d
else:
    e
[out]
MypyFile:1(
  WhileStmt:1(
    NameExpr(a)
    Block:2(
      ExpressionStmt:2(
        NameExpr(b))))
  WhileStmt:3(
    NameExpr(c)
    Block:4(
      ExpressionStmt:4(
        NameExpr(d)))
    Else(
      ExpressionStmt:6(
        NameExpr(e)))))

[case testIndexExpr]
a[b]
[out]
MypyFile:1(
  ExpressionStmt:1(
    IndexExpr:1(
      NameExpr(a)
      NameExpr(b))))

[case testListAndSetExpr]
a = []
b = [1, 2]
c = {3}
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(a)
    ListExpr:1())
  AssignmentStmt:2(
    NameExpr(b)
    ListExpr:2(
      IntExpr(1)
      IntExpr(2)))
  AssignmentStmt:3(
    NameExpr(c)
    SetExpr:3(
      IntExpr(3))))

[case testBoolOpAnd]
a and b
a and b and c
[out]
MypyFile:1(
  ExpressionStmt:1(
    OpExpr:1(
      and
      NameExpr(a)
      NameExpr(b)))
  ExpressionStmt:2(
    OpExpr:2(
      and
      NameExpr(a)
      OpExpr:2(
        and
        NameExpr(b)
        NameExpr(c)))))

[case testBoolOpOr]
x or y
1 or 2 or 3
[out]
MypyFile:1(
  ExpressionStmt:1(
    OpExpr:1(
      or
      NameExpr(x)
      NameExpr(y)))
  ExpressionStmt:2(
    OpExpr:2(
      or
      IntExpr(1)
      OpExpr:2(
        or
        IntExpr(2)
        IntExpr(3)))))

[case testComparisonSimple]
a < b
x == y
[out]
MypyFile:1(
  ExpressionStmt:1(
    ComparisonExpr:1(
      <
      NameExpr(a)
      NameExpr(b)))
  ExpressionStmt:2(
    ComparisonExpr:2(
      ==
      NameExpr(x)
      NameExpr(y))))

[case testComparisonChained]
a < b < c
x == y != z
[out]
MypyFile:1(
  ExpressionStmt:1(
    ComparisonExpr:1(
      <
      <
      NameExpr(a)
      NameExpr(b)
      NameExpr(c)))
  ExpressionStmt:2(
    ComparisonExpr:2(
      ==
      !=
      NameExpr(x)
      NameExpr(y)
      NameExpr(z))))

[case testComparisonIsNotIn]
a is b
x is not y
z in w
q not in r
[out]
MypyFile:1(
  ExpressionStmt:1(
    ComparisonExpr:1(
      is
      NameExpr(a)
      NameExpr(b)))
  ExpressionStmt:2(
    ComparisonExpr:2(
      is not
      NameExpr(x)
      NameExpr(y)))
  ExpressionStmt:3(
    ComparisonExpr:3(
      in
      NameExpr(z)
      NameExpr(w)))
  ExpressionStmt:4(
    ComparisonExpr:4(
      not in
      NameExpr(q)
      NameExpr(r))))

[case testLiterals]
(None, True, False, ...)
[out]
MypyFile:1(
  ExpressionStmt:1(
    TupleExpr:1(
      NameExpr(None)
      NameExpr(True)
      NameExpr(False)
      Ellipsis)))

[case testSimpleFunction]
def foo():
    x = 1
[out]
MypyFile:1(
  FuncDef:1(
    foo
    Block:2(
      AssignmentStmt:2(
        NameExpr(x)
        IntExpr(1)))))

[case testFunctionWithArgs]
def add(x, y):
    return x + y
[out]
MypyFile:1(
  FuncDef:1(
    add
    Args(
      Var(x)
      Var(y))
    Block:2(
      ReturnStmt:2(
        OpExpr:2(
          +
          NameExpr(x)
          NameExpr(y))))))

[case testFunctionWithVarArgs]
def foo(*args):
    pass
[out]
MypyFile:1(
  FuncDef:1(
    foo
    VarArg(
      Var(args))
    Block:2(
      PassStmt:2())))

[case testFunctionWithKwargs]
def bar(**kwargs):
    pass
[out]
MypyFile:1(
  FuncDef:1(
    bar
    DictVarArg(
      Var(kwargs))
    Block:2(
      PassStmt:2())))

[case testFunctionWithKwOnly]
def baz(x, *, y):
    pass
[out]
MypyFile:1(
  FuncDef:1(
    baz
    MaxPos(1)
    Args(
      Var(x)
      Var(y))
    Block:2(
      PassStmt:2())))

[case testFunctionWithAllArgKinds]
def complex_fn(a, b, *args, c, **kwargs):
    pass
[out]
MypyFile:1(
  FuncDef:1(
    complex_fn
    MaxPos(2)
    Args(
      Var(a)
      Var(b)
      Var(c))
    VarArg(
      Var(args))
    DictVarArg(
      Var(kwargs))
    Block:2(
      PassStmt:2())))

[case testAsyncFunction]
async def async_foo():
    pass
[out]
MypyFile:1(
  FuncDef:1(
    async_foo
    Async
    Block:2(
      PassStmt:2())))

[case testFunctionWithDefaultArg]
def greet(name="World"):
    pass
[out]
MypyFile:1(
  FuncDef:1(
    greet
    Args(
      default(
        Var(name)
        StrExpr(World)))
    Block:2(
      PassStmt:2())))

[case testFunctionWithMultipleDefaults]
def add(x=1, y=2):
    return x
[out]
MypyFile:1(
  FuncDef:1(
    add
    Args(
      default(
        Var(x)
        IntExpr(1))
      default(
        Var(y)
        IntExpr(2)))
    Block:2(
      ReturnStmt:2(
        NameExpr(x)))))

[case testFunctionMixedDefaultsAndRegular]
def func(a, b=5, c=10):
    pass
[out]
MypyFile:1(
  FuncDef:1(
    func
    Args(
      Var(a)
      default(
        Var(b)
        IntExpr(5))
      default(
        Var(c)
        IntExpr(10)))
    Block:2(
      PassStmt:2())))

[case testFunctionWithKwOnlyDefault]
def func(*, x=42):
    pass
[out]
MypyFile:1(
  FuncDef:1(
    func
    MaxPos(0)
    Args(
      default(
        Var(x)
        IntExpr(42)))
    Block:2(
      PassStmt:2())))

[case testCallWithKeywordArgs]
foo(x=1, y=2)
[out]
MypyFile:1(
  ExpressionStmt:1(
    CallExpr:1(
      NameExpr(foo)
      Args()
      KwArgs(
        x
        IntExpr(1))
      KwArgs(
        y
        IntExpr(2)))))

[case testCallMixedPositionalAndKeyword]
bar(1, 2, x=3, y=4)
[out]
MypyFile:1(
  ExpressionStmt:1(
    CallExpr:1(
      NameExpr(bar)
      Args(
        IntExpr(1)
        IntExpr(2))
      KwArgs(
        x
        IntExpr(3))
      KwArgs(
        y
        IntExpr(4)))))

[case testCallWithStarArgs]
f(1, *x, 2)
[out]
MypyFile:1(
  ExpressionStmt:1(
    CallExpr:1(
      NameExpr(f)
      Args(
        IntExpr(1)
        NameExpr(x)
        IntExpr(2))
      VarArg)))

[case testCallWithDictStarArgs]
f(**x)
f(1, **y)
[out]
MypyFile:1(
  ExpressionStmt:1(
    CallExpr:1(
      NameExpr(f)
      Args()
      DictVarArg(
        NameExpr(x))))
  ExpressionStmt:2(
    CallExpr:2(
      NameExpr(f)
      Args(
        IntExpr(1))
      DictVarArg(
        NameExpr(y)))))

[case testCallWithAllArgTypes]
f(1, *x, a=2, **y)
[out]
MypyFile:1(
  ExpressionStmt:1(
    CallExpr:1(
      NameExpr(f)
      Args(
        IntExpr(1)
        NameExpr(x))
      VarArg
      KwArgs(
        a
        IntExpr(2))
      DictVarArg(
        NameExpr(y)))))

[case testSimpleClass]
class A:
    pass
[out]
MypyFile:1(
  ClassDef:1(
    A
    PassStmt:2()))

[case testClassWithMethod]
class Foo:
    def bar(self):
        return 1
[out]
MypyFile:1(
  ClassDef:1(
    Foo
    FuncDef:2(
      bar
      Args(
        Var(self))
      Block:3(
        ReturnStmt:3(
          IntExpr(1))))))

[case testClassWithSingleBase]
class A(B):
    pass
[out]
MypyFile:1(
  ClassDef:1(
    A
    BaseTypeExpr(
      NameExpr(B))
    PassStmt:2()))

[case testClassWithMultipleBases]
class Child(Base1, Base2):
    x = 1
[out]
MypyFile:1(
  ClassDef:1(
    Child
    BaseTypeExpr(
      NameExpr(Base1)
      NameExpr(Base2))
    AssignmentStmt:2(
      NameExpr(x)
      IntExpr(1))))

[case testFloatLiteral]
x = 3.14
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    FloatExpr(3.14)))

[case testUnaryExpressions]
-x
+y
~z
not w
[out]
MypyFile:1(
  ExpressionStmt:1(
    UnaryExpr:1(
      -
      NameExpr(x)))
  ExpressionStmt:2(
    UnaryExpr:2(
      +
      NameExpr(y)))
  ExpressionStmt:3(
    UnaryExpr:3(
      ~
      NameExpr(z)))
  ExpressionStmt:4(
    UnaryExpr:4(
      not
      NameExpr(w))))

[case testDictionaryExpression]
{}
{1:x}
[out]
MypyFile:1(
  ExpressionStmt:1(
    DictExpr:1())
  ExpressionStmt:2(
    DictExpr:2(
      IntExpr(1)
      NameExpr(x))))

[case testComplexLiteral]
1j
2.5j
[out]
MypyFile:1(
  ExpressionStmt:1(
    ComplexExpr(1j))
  ExpressionStmt:2(
    ComplexExpr(2.5j)))

[case testSlices]
x[1:2]
x[:1]
x[1:]
x[:]
[out]
MypyFile:1(
  ExpressionStmt:1(
    IndexExpr:1(
      NameExpr(x)
      SliceExpr:1(
        IntExpr(1)
        IntExpr(2))))
  ExpressionStmt:2(
    IndexExpr:2(
      NameExpr(x)
      SliceExpr:2(
        <empty>
        IntExpr(1))))
  ExpressionStmt:3(
    IndexExpr:3(
      NameExpr(x)
      SliceExpr:3(
        IntExpr(1)
        <empty>)))
  ExpressionStmt:4(
    IndexExpr:4(
      NameExpr(x)
      SliceExpr:4(
        <empty>
        <empty>))))

[case testSliceWithStride]
x[1:2:3]
x[1::2]
x[:1:2]
x[::2]
[out]
MypyFile:1(
  ExpressionStmt:1(
    IndexExpr:1(
      NameExpr(x)
      SliceExpr:1(
        IntExpr(1)
        IntExpr(2)
        IntExpr(3))))
  ExpressionStmt:2(
    IndexExpr:2(
      NameExpr(x)
      SliceExpr:2(
        IntExpr(1)
        <empty>
        IntExpr(2))))
  ExpressionStmt:3(
    IndexExpr:3(
      NameExpr(x)
      SliceExpr:3(
        <empty>
        IntExpr(1)
        IntExpr(2))))
  ExpressionStmt:4(
    IndexExpr:4(
      NameExpr(x)
      SliceExpr:4(
        <empty>
        <empty>
        IntExpr(2)))))

[case testFunctionSignature]
def f() -> int:
    pass
def g() -> None:
    pass
def h(x: foo.bar, y, z: x.y.z):
    pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    def () -> int?
    Block:2(
      PassStmt:2()))
  FuncDef:3(
    g
    def () -> None?
    Block:4(
      PassStmt:4()))
  FuncDef:5(
    h
    Args(
      Var(x)
      Var(y)
      Var(z))
    def (x: foo.bar?, y: Any, z: x.y.z?) -> Any
    Block:6(
      PassStmt:6())))

[case testFunctionSignature2]
def f(x: a[b]) -> c.d[e.f.g[h], i]:
    pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    Args(
      Var(x))
    def (x: a?[b?]) -> c.d?[e.f.g?[h?], i?]
    Block:2(
      PassStmt:2())))

[case testUnionTypes]
def f(x: int | str) -> bool | None:
    pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    Args(
      Var(x))
    def (x: int? | str?) -> bool? | None?
    Block:2(
      PassStmt:2())))

[case testAnnotatedAssignment]
x: int
y: str = "hello"
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    TempNode:1(
      Any)
    int?)
  AssignmentStmt:2(
    NameExpr(y)
    StrExpr(hello)
    str?))

[case testImportStatements]
import x
import a, b
import y as z
[out]
MypyFile:1(
  Import:1(x)
  Import:2(a, b)
  Import:3(y : z))

[case testImportFromStatements]
from os import path
from sys import argv, exit
from typing import List as L
from . import foo
from .. import bar
from .pkg import baz
[out]
MypyFile:1(
  ImportFrom:1(os, [path])
  ImportFrom:2(sys, [argv, exit])
  ImportFrom:3(typing, [List : L])
  ImportFrom:4(., [foo])
  ImportFrom:5(.., [bar])
  ImportFrom:6(.pkg, [baz]))

[case testImportAllStatements]
from os import *
from . import *
from .. import *
from .pkg import *
[out]
MypyFile:1(
  ImportAll:1(os)
  ImportAll:2(.)
  ImportAll:3(..)
  ImportAll:4(.pkg))

[case testRaiseStatements]
raise
raise ValueError
raise ValueError("error message")
raise KeyError from e
[out]
MypyFile:1(
  RaiseStmt:1()
  RaiseStmt:2(
    NameExpr(ValueError))
  RaiseStmt:3(
    CallExpr:3(
      NameExpr(ValueError)
      Args(
        StrExpr(error message))))
  RaiseStmt:4(
    NameExpr(KeyError)
    NameExpr(e)))

[case testAssertStatements]
assert x
assert x == y
assert condition, "error message"
[out]
MypyFile:1(
  AssertStmt:1(
    NameExpr(x))
  AssertStmt:2(
    ComparisonExpr:2(
      ==
      NameExpr(x)
      NameExpr(y)))
  AssertStmt:3(
    NameExpr(condition)
    StrExpr(error message)))

[case testForStatements]
for x in items:
    pass
for i, j in pairs:
    x = 1
for y in range(10):
    break
else:
    continue
[out]
MypyFile:1(
  ForStmt:1(
    NameExpr(x)
    NameExpr(items)
    Block:2(
      PassStmt:2()))
  ForStmt:3(
    TupleExpr:3(
      NameExpr(i)
      NameExpr(j))
    NameExpr(pairs)
    Block:4(
      AssignmentStmt:4(
        NameExpr(x)
        IntExpr(1))))
  ForStmt:5(
    NameExpr(y)
    CallExpr:5(
      NameExpr(range)
      Args(
        IntExpr(10)))
    Block:6(
      BreakStmt:6())
    Else(
      ContinueStmt:8())))

[case testWithStatements]
with f:
    pass
with open("file") as f:
    x = 1
with a as x, b as y:
    break
[out]
MypyFile:1(
  WithStmt:1(
    Expr(
      NameExpr(f))
    Block:2(
      PassStmt:2()))
  WithStmt:3(
    Expr(
      CallExpr:3(
        NameExpr(open)
        Args(
          StrExpr(file))))
    Target(
      NameExpr(f))
    Block:4(
      AssignmentStmt:4(
        NameExpr(x)
        IntExpr(1))))
  WithStmt:5(
    Expr(
      NameExpr(a))
    Target(
      NameExpr(x))
    Expr(
      NameExpr(b))
    Target(
      NameExpr(y))
    Block:6(
      BreakStmt:6())))

[case testBreakAndContinue]
while True:
    break
while x:
    continue
while y:
    if z:
        break
    else:
        continue
[out]
MypyFile:1(
  WhileStmt:1(
    NameExpr(True)
    Block:2(
      BreakStmt:2()))
  WhileStmt:3(
    NameExpr(x)
    Block:4(
      ContinueStmt:4()))
  WhileStmt:5(
    NameExpr(y)
    Block:6(
      IfStmt:6(
        If(
          NameExpr(z))
        Then(
          BreakStmt:7())
        Else(
          ContinueStmt:9())))))

[case testGeneratorExpressions]
(x for x in items)
(x * 2 for x in range(10) if x > 5)
(x + y for x in range(3) for y in range(2))
[out]
MypyFile:1(
  ExpressionStmt:1(
    GeneratorExpr:1(
      NameExpr(x)
      NameExpr(x)
      NameExpr(items)))
  ExpressionStmt:2(
    GeneratorExpr:2(
      OpExpr:2(
        *
        NameExpr(x)
        IntExpr(2))
      NameExpr(x)
      CallExpr:2(
        NameExpr(range)
        Args(
          IntExpr(10)))
      ComparisonExpr:2(
        >
        NameExpr(x)
        IntExpr(5))))
  ExpressionStmt:3(
    GeneratorExpr:3(
      OpExpr:3(
        +
        NameExpr(x)
        NameExpr(y))
      NameExpr(x)
      NameExpr(y)
      CallExpr:3(
        NameExpr(range)
        Args(
          IntExpr(3)))
      CallExpr:3(
        NameExpr(range)
        Args(
          IntExpr(2))))))

[case testYieldExpressions]
def gen():
    yield
    yield 1
    yield from items
[out]
MypyFile:1(
  FuncDef:1(
    gen
    Block:2(
      ExpressionStmt:2(
        YieldExpr:2())
      ExpressionStmt:3(
        YieldExpr:3(
          IntExpr(1)))
      ExpressionStmt:4(
        YieldFromExpr:4(
          NameExpr(items))))))

[case testListAndSetComprehensions]
a = [x for x in items]
b = [x * 2 for x in range(10) if x > 5]
c = {y for y in data}
d = {z + 1 for z in nums if z < 100}
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(a)
    ListComprehension:1(
      GeneratorExpr:1(
        NameExpr(x)
        NameExpr(x)
        NameExpr(items))))
  AssignmentStmt:2(
    NameExpr(b)
    ListComprehension:2(
      GeneratorExpr:2(
        OpExpr:2(
          *
          NameExpr(x)
          IntExpr(2))
        NameExpr(x)
        CallExpr:2(
          NameExpr(range)
          Args(
            IntExpr(10)))
        ComparisonExpr:2(
          >
          NameExpr(x)
          IntExpr(5)))))
  AssignmentStmt:3(
    NameExpr(c)
    SetComprehension:3(
      GeneratorExpr:3(
        NameExpr(y)
        NameExpr(y)
        NameExpr(data))))
  AssignmentStmt:4(
    NameExpr(d)
    SetComprehension:4(
      GeneratorExpr:4(
        OpExpr:4(
          +
          NameExpr(z)
          IntExpr(1))
        NameExpr(z)
        NameExpr(nums)
        ComparisonExpr:4(
          <
          NameExpr(z)
          IntExpr(100))))))

[case testDictComprehensions]
a = {k: v for k, v in items}
b = {x: x * 2 for x in range(10) if x > 5}
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(a)
    DictionaryComprehension:1(
      NameExpr(k)
      NameExpr(v)
      TupleExpr:1(
        NameExpr(k)
        NameExpr(v))
      NameExpr(items)))
  AssignmentStmt:2(
    NameExpr(b)
    DictionaryComprehension:2(
      NameExpr(x)
      OpExpr:2(
        *
        NameExpr(x)
        IntExpr(2))
      NameExpr(x)
      CallExpr:2(
        NameExpr(range)
        Args(
          IntExpr(10)))
      ComparisonExpr:2(
        >
        NameExpr(x)
        IntExpr(5)))))

[case testDecoratedFuncDef]
@dec
def foo():
    pass
class C:
    @dec()
    @staticmethod
    def foo():
        pass
[out]
MypyFile:1(
  Decorator:1(
    Var(foo)
    NameExpr(dec)
    FuncDef:2(
      foo
      Block:3(
        PassStmt:3())))
  ClassDef:4(
    C
    Decorator:5(
      Var(foo)
      CallExpr:5(
        NameExpr(dec)
        Args())
      NameExpr(staticmethod)
      FuncDef:7(
        foo
        Block:8(
          PassStmt:8())))))
[case testTryFinally]
try:
    x
finally:
    y
[out]
MypyFile:1(
  TryStmt:1(
    Block:2(
      ExpressionStmt:2(
        NameExpr(x)))
    Finally(
      ExpressionStmt:4(
        NameExpr(y)))))

[case testTryExcept]
try:
    x
except Exception:
    y
[out]
MypyFile:1(
  TryStmt:1(
    Block:2(
      ExpressionStmt:2(
        NameExpr(x)))
    NameExpr(Exception)
    Block:4(
      ExpressionStmt:4(
        NameExpr(y)))))

[case testTryExceptWithVar]
try:
    x
except Exception as e:
    y
[out]
MypyFile:1(
  TryStmt:1(
    Block:2(
      ExpressionStmt:2(
        NameExpr(x)))
    NameExpr(Exception)
    NameExpr(e)
    Block:4(
      ExpressionStmt:4(
        NameExpr(y)))))

[case testTryExceptElse]
try:
    x
except Exception:
    y
else:
    z
[out]
MypyFile:1(
  TryStmt:1(
    Block:2(
      ExpressionStmt:2(
        NameExpr(x)))
    NameExpr(Exception)
    Block:4(
      ExpressionStmt:4(
        NameExpr(y)))
    Else(
      ExpressionStmt:6(
        NameExpr(z)))))

[case testTryMultipleExcept]
try:
    x
except ValueError:
    y
except KeyError as e:
    z
[out]
MypyFile:1(
  TryStmt:1(
    Block:2(
      ExpressionStmt:2(
        NameExpr(x)))
    NameExpr(ValueError)
    Block:4(
      ExpressionStmt:4(
        NameExpr(y)))
    NameExpr(KeyError)
    NameExpr(e)
    Block:6(
      ExpressionStmt:6(
        NameExpr(z)))))

[case testTryExceptStar]
try:
    x
except* ValueError:
    y
[out]
MypyFile:1(
  TryStmt:1(
    Block:2(
      ExpressionStmt:2(
        NameExpr(x)))
    *
    NameExpr(ValueError)
    Block:4(
      ExpressionStmt:4(
        NameExpr(y)))))

[case testTryExceptStarWithVar]
try:
    x
except* Exception as e:
    y
[out]
MypyFile:1(
  TryStmt:1(
    Block:2(
      ExpressionStmt:2(
        NameExpr(x)))
    *
    NameExpr(Exception)
    NameExpr(e)
    Block:4(
      ExpressionStmt:4(
        NameExpr(y)))))

[case testTryMultipleExceptStar]
try:
    x
except* ValueError:
    y
except* KeyError as e:
    z
[out]
MypyFile:1(
  TryStmt:1(
    Block:2(
      ExpressionStmt:2(
        NameExpr(x)))
    *
    NameExpr(ValueError)
    Block:4(
      ExpressionStmt:4(
        NameExpr(y)))
    NameExpr(KeyError)
    NameExpr(e)
    Block:6(
      ExpressionStmt:6(
        NameExpr(z)))))

[case testTryExceptStarElseFinally]
try:
    x
except* ValueError:
    y
else:
    z
finally:
    w
[out]
MypyFile:1(
  TryStmt:1(
    Block:2(
      ExpressionStmt:2(
        NameExpr(x)))
    *
    NameExpr(ValueError)
    Block:4(
      ExpressionStmt:4(
        NameExpr(y)))
    Else(
      ExpressionStmt:6(
        NameExpr(z)))
    Finally(
      ExpressionStmt:8(
        NameExpr(w)))))

[case testConditionalExprSimple]
x if y else z
[out]
MypyFile:1(
  ExpressionStmt:1(
    ConditionalExpr:1(
      Condition(
        NameExpr(y))
      NameExpr(x)
      NameExpr(z))))

[case testFunctionWithCallableType]
def f(x: Callable[[int, str], None]) -> None:
    pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    Args(
      Var(x))
    def (x: Callable?[<TypeList int?, str?>, None?]) -> None?
    Block:2(
      PassStmt:2())))

[case testFunctionWithEmptyCallableType]
def g(callback: Callable[[], bool]) -> int:
    return 1
[out]
MypyFile:1(
  FuncDef:1(
    g
    Args(
      Var(callback))
    def (callback: Callable?[<TypeList >, bool?]) -> int?
    Block:2(
      ReturnStmt:2(
        IntExpr(1)))))

[case testFunctionWithComplexCallableType]
def h(f: Callable[[List[int], Dict[str, int]], Tuple[int, str]]) -> None:
    pass
[out]
MypyFile:1(
  FuncDef:1(
    h
    Args(
      Var(f))
    def (f: Callable?[<TypeList List?[int?], Dict?[str?, int?]>, Tuple?[int?, str?]]) -> None?
    Block:2(
      PassStmt:2())))

[case testFunctionWithEllipsisCallableType]
def f(callback: Callable[..., int]) -> None:
    pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    Args(
      Var(callback))
    def (callback: Callable?[..., int?]) -> None?
    Block:2(
      PassStmt:2())))

[case testCallableWithArgConstructor]
from typing import Callable
from mypy_extensions import Arg
def f(x: Callable[[Arg(int, 'x'), Arg(str, 'y')], bool]) -> None:
    pass
[out]
MypyFile:1(
  ImportFrom:1(typing, [Callable])
  ImportFrom:2(mypy_extensions, [Arg])
  FuncDef:3(
    f
    Args(
      Var(x))
    def (x: Callable?[<TypeList Arg(int?, x), Arg(str?, y)>, bool?]) -> None?
    Block:4(
      PassStmt:4())))

[case testCallableWithArgConstructorKeywordSyntax]
from typing import Callable
from mypy_extensions import Arg
def f(callback: Callable[[Arg(type=int, name='value')], str]) -> None:
    pass
[out]
MypyFile:1(
  ImportFrom:1(typing, [Callable])
  ImportFrom:2(mypy_extensions, [Arg])
  FuncDef:3(
    f
    Args(
      Var(callback))
    def (callback: Callable?[<TypeList Arg(int?, value)>, str?]) -> None?
    Block:4(
      PassStmt:4())))

[case testCallableWithArgNoName]
from typing import Callable
from mypy_extensions import Arg
def f(x: Callable[[Arg(int)], bool]) -> None:
    pass
[out]
MypyFile:1(
  ImportFrom:1(typing, [Callable])
  ImportFrom:2(mypy_extensions, [Arg])
  FuncDef:3(
    f
    Args(
      Var(x))
    def (x: Callable?[<TypeList Arg(int?)>, bool?]) -> None?
    Block:4(
      PassStmt:4())))

[case testLiteralTypes]
x: Literal[True, False]
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    TempNode:1(
      Any)
    Literal?[True, False]))

[case testLiteralIntTypes]
x: Literal[1]
y: Literal[1, 2, 3]
z: Literal[-1]
w: Literal[-1, 0, 1]
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    TempNode:1(
      Any)
    Literal?[1])
  AssignmentStmt:2(
    NameExpr(y)
    TempNode:2(
      Any)
    Literal?[1, 2, 3])
  AssignmentStmt:3(
    NameExpr(z)
    TempNode:3(
      Any)
    Literal?[-1])
  AssignmentStmt:4(
    NameExpr(w)
    TempNode:4(
      Any)
    Literal?[-1, 0, 1]))

[case testDelStmt]
del x
del x[0], y[1]
del a.b
[out]
MypyFile:1(
  DelStmt:1(
    NameExpr(x))
  DelStmt:2(
    TupleExpr:2(
      IndexExpr:2(
        NameExpr(x)
        IntExpr(0))
      IndexExpr:2(
        NameExpr(y)
        IntExpr(1))))
  DelStmt:3(
    MemberExpr:3(
      NameExpr(a)
      b)))

[case testFString]
f"foo {x}"
[out]
MypyFile:1(
  ExpressionStmt:1(
    CallExpr:1(
      MemberExpr:1(
        StrExpr()
        join)
      Args(
        ListExpr:1(
          StrExpr(foo )
          CallExpr:1(
            MemberExpr:1(
              StrExpr({:{}})
              format)
            Args(
              NameExpr(x)
              StrExpr())))))))

[case testFStringWithConversion]
x = 'mypy'
F'Hello {x!r}'
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    StrExpr(mypy))
  ExpressionStmt:2(
    CallExpr:2(
      MemberExpr:2(
        StrExpr()
        join)
      Args(
        ListExpr:2(
          StrExpr(Hello )
          CallExpr:2(
            MemberExpr:2(
              StrExpr({!r:{}})
              format)
            Args(
              NameExpr(x)
              StrExpr())))))))

[case testFStringTrivial]
f"foo"
f"{x}"
f"foo" "bar"
[out]
MypyFile:1(
  ExpressionStmt:1(
    StrExpr(foo))
  ExpressionStmt:2(
    CallExpr:2(
      MemberExpr:2(
        StrExpr({:{}})
        format)
      Args(
        NameExpr(x)
        StrExpr())))
  ExpressionStmt:3(
    StrExpr(foobar)))

[case testFStringWithOnlyFormatSpecifier]
x = 'mypy'
f'Hello {x:<30}'
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    StrExpr(mypy))
  ExpressionStmt:2(
    CallExpr:2(
      MemberExpr:2(
        StrExpr()
        join)
      Args(
        ListExpr:2(
          StrExpr(Hello )
          CallExpr:2(
            MemberExpr:2(
              StrExpr({:{}})
              format)
            Args(
              NameExpr(x)
              StrExpr(<30))))))))

[case testFStringWithFormatSpecifierExpression]
x = 'mypy'
y = 30
f'Hello {x!s:<{y+y}}'
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    StrExpr(mypy))
  AssignmentStmt:2(
    NameExpr(y)
    IntExpr(30))
  ExpressionStmt:3(
    CallExpr:3(
      MemberExpr:3(
        StrExpr()
        join)
      Args(
        ListExpr:3(
          StrExpr(Hello )
          CallExpr:3(
            MemberExpr:3(
              StrExpr({!s:{}})
              format)
            Args(
              NameExpr(x)
              CallExpr:3(
                MemberExpr:3(
                  StrExpr()
                  join)
                Args(
                  ListExpr:3(
                    StrExpr(<)
                    CallExpr:3(
                      MemberExpr:3(
                        StrExpr({:{}})
                        format)
                      Args(
                        OpExpr:3(
                          +
                          NameExpr(y)
                          NameExpr(y))
                        StrExpr()))))))))))))

[case testSimpleLambda]
lambda: 1
[out]
MypyFile:1(
  ExpressionStmt:1(
    LambdaExpr:1(
      Block:1(
        ReturnStmt:1(
          IntExpr(1))))))

[case testLambdaWithOneArg]
lambda x: y + 1
[out]
MypyFile:1(
  ExpressionStmt:1(
    LambdaExpr:1(
      Args(
        Var(x))
      Block:1(
        ReturnStmt:1(
          OpExpr:1(
            +
            NameExpr(y)
            IntExpr(1)))))))

[case testLambdaWithMultipleArgs]
lambda x, y: x + y
[out]
MypyFile:1(
  ExpressionStmt:1(
    LambdaExpr:1(
      Args(
        Var(x)
        Var(y))
      Block:1(
        ReturnStmt:1(
          OpExpr:1(
            +
            NameExpr(x)
            NameExpr(y)))))))

[case testLambdaWithDefault]
lambda x=2: x
[out]
MypyFile:1(
  ExpressionStmt:1(
    LambdaExpr:1(
      Args(
        default(
          Var(x)
          IntExpr(2)))
      Block:1(
        ReturnStmt:1(
          NameExpr(x))))))

[case testLambdaInCall]
map(lambda x: x * 2, items)
[out]
MypyFile:1(
  ExpressionStmt:1(
    CallExpr:1(
      NameExpr(map)
      Args(
        LambdaExpr:1(
          Args(
            Var(x))
          Block:1(
            ReturnStmt:1(
              OpExpr:1(
                *
                NameExpr(x)
                IntExpr(2)))))
        NameExpr(items)))))

[case testNamedExprSimple]
if (x := 1):
    pass
[out]
MypyFile:1(
  IfStmt:1(
    If(
      AssignmentExpr:1(
        NameExpr(x)
        IntExpr(1)))
    Then(
      PassStmt:2())))

[case testStarExpression]
*a
*a, b
a, *b
[out]
MypyFile:1(
  ExpressionStmt:1(
    StarExpr:1(
      NameExpr(a)))
  ExpressionStmt:2(
    TupleExpr:2(
      StarExpr:2(
        NameExpr(a))
      NameExpr(b)))
  ExpressionStmt:3(
    TupleExpr:3(
      NameExpr(a)
      StarExpr:3(
        NameExpr(b)))))

[case testBytesLiteral]
b"foo"
b"foobar"
b"x\\n\\'"
[out]
MypyFile:1(
  ExpressionStmt:1(
    BytesExpr(foo))
  ExpressionStmt:2(
    BytesExpr(foobar))
  ExpressionStmt:3(
    BytesExpr(x\\n\\\')))

[case testBytesLiteralWithEscapes]
b'\r\n\t\x2f\xbe'
[out]
MypyFile:1(
  ExpressionStmt:1(
    BytesExpr(\r\n\t/\xbe)))

[case testBytesLiteralOctalEscapes]
b'\1\476'
[out]
MypyFile:1(
  ExpressionStmt:1(
    BytesExpr(\x01>)))
[case testGlobalAndNonlocal]
x = 1
y = 2
def outer():
    global x
    def inner():
        nonlocal y
        global z
        y = 3
        z = 4
    x = 5
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    IntExpr(1))
  AssignmentStmt:2(
    NameExpr(y)
    IntExpr(2))
  FuncDef:3(
    outer
    Block:4(
      GlobalDecl:4(
        x)
      FuncDef:5(
        inner
        Block:6(
          NonlocalDecl:6(
            y)
          GlobalDecl:7(
            z)
          AssignmentStmt:8(
            NameExpr(y)
            IntExpr(3))
          AssignmentStmt:9(
            NameExpr(z)
            IntExpr(4))))
      AssignmentStmt:10(
        NameExpr(x)
        IntExpr(5)))))
[case testAwaitExpression]
async def foo():
    x = await bar()
    return await baz(x)
[out]
MypyFile:1(
  FuncDef:1(
    foo
    Async
    Block:2(
      AssignmentStmt:2(
        NameExpr(x)
        AwaitExpr:2(
          CallExpr:2(
            NameExpr(bar)
            Args())))
      ReturnStmt:3(
        AwaitExpr:3(
          CallExpr:3(
            NameExpr(baz)
            Args(
              NameExpr(x))))))))

[case testFunctionOverload]
@overload
def f() -> x: pass
@overload
def f() -> y: pass
[out]
MypyFile:1(
  OverloadedFuncDef:1(
    Decorator:1(
      Var(f)
      NameExpr(overload)
      FuncDef:2(
        f
        def () -> x?
        Block:2(
          PassStmt:2())))
    Decorator:3(
      Var(f)
      NameExpr(overload)
      FuncDef:4(
        f
        def () -> y?
        Block:4(
          PassStmt:4())))))

[case testFunctionOverloadWithImplementation]
@overload
def f(a: x) -> x: ...
@overload
def f(a: y) -> y: ...
def f(a): pass
[out]
MypyFile:1(
  OverloadedFuncDef:1(
    Decorator:1(
      Var(f)
      NameExpr(overload)
      FuncDef:2(
        f
        Args(
          Var(a))
        def (a: x?) -> x?
        Block:2(
          ExpressionStmt:2(
            Ellipsis))))
    Decorator:3(
      Var(f)
      NameExpr(overload)
      FuncDef:4(
        f
        Args(
          Var(a))
        def (a: y?) -> y?
        Block:4(
          ExpressionStmt:4(
            Ellipsis))))
    FuncDef:5(
      f
      Args(
        Var(a))
      Block:5(
        PassStmt:5()))))

[case testTypeIgnores]
x = 1  # type: ignore
y = (
   2  # type: ignore  # Comment
)
y = 1 # foo: ignore
z = 1  #type: ignore[x]
zz = 1  #type: ignore [ foo, arg-type ]
[out]
ignore: 1
ignore: 3
ignore: 6 [x]
ignore: 7 [foo, arg-type]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    IntExpr(1))
  AssignmentStmt:2(
    NameExpr(y)
    IntExpr(2))
  AssignmentStmt:5(
    NameExpr(y)
    IntExpr(1))
  AssignmentStmt:6(
    NameExpr(z)
    IntExpr(1))
  AssignmentStmt:7(
    NameExpr(zz)
    IntExpr(1)))

[case testMetaclass]
class Foo(metaclass=Bar): pass
[out]
MypyFile:1(
  ClassDef:1(
    Foo
    Keywords(metaclass=NameExpr(Bar))
    Metaclass(NameExpr(Bar))
    PassStmt:1()))

[case testClassWithKeywordArgs]
class Foo(_root=None, total=False): pass
[out]
MypyFile:1(
  ClassDef:1(
    Foo
    Keywords(_root=NameExpr(None), total=NameExpr(False))
    PassStmt:1()))

[case testClassDecorator]
@foo
class X: pass
@foo(bar)
@x.y
class Z: pass
[out]
MypyFile:1(
  ClassDef:2(
    X
    Decorators(
      NameExpr(foo))
    PassStmt:2())
  ClassDef:5(
    Z
    Decorators(
      CallExpr:3(
        NameExpr(foo)
        Args(
          NameExpr(bar)))
      MemberExpr:4(
        NameExpr(x)
        y))
    PassStmt:5()))

[case testUnpackTypeInSignature]
def f(*args: *Ts) -> None:
    pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    def (*args: *Ts?) -> None?
    VarArg(
      Var(args))
    Block:2(
      PassStmt:2())))

[case testUnpackTypeInTuple]
x: tuple[int, *Ts, str]
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    TempNode:1(
      Any)
    tuple?[int?, *Ts?, str?]))


[case testLiteralStringType]
from typing import Literal
x: Literal["hello"]
[out]
MypyFile:1(
  ImportFrom:1(typing, [Literal])
  AssignmentStmt:2(
    NameExpr(x)
    TempNode:2(
      Any)
    Literal?[hello?]))

[case testLiteralStringWithEscapes]
from typing import Literal
x: Literal["hello\nworld"]
[out]
MypyFile:1(
  ImportFrom:1(typing, [Literal])
  AssignmentStmt:2(
    NameExpr(x)
    TempNode:2(
      Any)
    Literal?['hello\nworld']))

[case testForwardReference]
x: "int"
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    TempNode:1(
      Any)
    int?))

[case testForwardReferenceWithUnion]
x: "int | str"
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    TempNode:1(
      Any)
    int? | str?))

[case testForwardReferenceWithComplexType]
x: "list[int]"
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    TempNode:1(
      Any)
    list?[int?]))

[case testMultipleLiteralStrings]
from typing import Literal
x: Literal["a", "b", "c"]
[out]
MypyFile:1(
  ImportFrom:1(typing, [Literal])
  AssignmentStmt:2(
    NameExpr(x)
    TempNode:2(
      Any)
    Literal?[a?, b?, c?]))

[case testLiteralBytesType]
from typing import Literal
x: Literal[b"foo"]
y: Literal[b"hello\nworld", b"\x00\xff"]
[out]
MypyFile:1(
  ImportFrom:1(typing, [Literal])
  AssignmentStmt:2(
    NameExpr(x)
    TempNode:2(
      Any)
    Literal?[b'foo'])
  AssignmentStmt:3(
    NameExpr(y)
    TempNode:3(
      Any)
    Literal?[b'hello\nworld', b'\x00\xff']))

[case testStripFunctionBodiesIfIgnoringErrors]
# mypy: ignore-errors=True
def f(self):
    self.x = 1  # Cannot define an attribute
    return 1
[out]
MypyFile:1(
  FuncDef:2(
    f
    Args(
      Var(self))
    Block:3()))

[case testStripMethodBodiesIfIgnoringErrors]
# mypy: ignore-errors=True
class C:
    def f(self):
        x = self.x
        for x in y:
            pass
        with a as y:
            pass
        while self.foo():
            self.bah()
            a[self.x] = 1
[out]
MypyFile:1(
  ClassDef:2(
    C
    FuncDef:3(
      f
      Args(
        Var(self))
      Block:4())))

[case testDoNotStripModuleTopLevelOrClassBody]
# mypy: ignore-errors=True
f()
class C:
    x = 5
[out]
MypyFile:1(
  ExpressionStmt:2(
    CallExpr:2(
      NameExpr(f)
      Args()))
  ClassDef:3(
    C
    AssignmentStmt:4(
      NameExpr(x)
      IntExpr(5))))

[case testDoNotStripMethodThatAssignsToAttribute]
# mypy: ignore-errors=True
class C:
    def m1(self):
        self.x = 0
    def m2(self):
        a, self.y = 0
[out]
MypyFile:1(
  ClassDef:2(
    C
    FuncDef:3(
      m1
      Args(
        Var(self))
      Block:4(
        AssignmentStmt:4(
          MemberExpr:4(
            NameExpr(self)
            x)
          IntExpr(0))))
    FuncDef:5(
      m2
      Args(
        Var(self))
      Block:6(
        AssignmentStmt:6(
          TupleExpr:6(
            NameExpr(a)
            MemberExpr:6(
              NameExpr(self)
              y))
          IntExpr(0))))))

[case testDoNotStripMethodThatAssignsToAttributeWithinStatement]
# mypy: ignore-errors=True
class C:
    def m1(self):
        for x in y:
            self.x = 0
    def m2(self):
        with x:
            self.y = 0
    def m3(self):
        if x:
            self.y = 0
        else:
            x = 4
[out]
MypyFile:1(
  ClassDef:2(
    C
    FuncDef:3(
      m1
      Args(
        Var(self))
      Block:4(
        ForStmt:4(
          NameExpr(x)
          NameExpr(y)
          Block:5(
            AssignmentStmt:5(
              MemberExpr:5(
                NameExpr(self)
                x)
              IntExpr(0))))))
    FuncDef:6(
      m2
      Args(
        Var(self))
      Block:7(
        WithStmt:7(
          Expr(
            NameExpr(x))
          Block:8(
            AssignmentStmt:8(
              MemberExpr:8(
                NameExpr(self)
                y)
              IntExpr(0))))))
    FuncDef:9(
      m3
      Args(
        Var(self))
      Block:10(
        IfStmt:10(
          If(
            NameExpr(x))
          Then(
            AssignmentStmt:11(
              MemberExpr:11(
                NameExpr(self)
                y)
              IntExpr(0)))
          Else(
            AssignmentStmt:13(
              NameExpr(x)
              IntExpr(4))))))))

[case testDoNotStripMethodThatDefinesAttributeWithoutAssignment]
# mypy: ignore-errors=True
class C:
    def m1(self):
        with y as self.x:
            pass
    def m2(self):
        for self.y in x:
            pass
[out]
MypyFile:1(
  ClassDef:2(
    C
    FuncDef:3(
      m1
      Args(
        Var(self))
      Block:4(
        WithStmt:4(
          Expr(
            NameExpr(y))
          Target(
            MemberExpr:4(
              NameExpr(self)
              x))
          Block:5(
            PassStmt:5()))))
    FuncDef:6(
      m2
      Args(
        Var(self))
      Block:7(
        ForStmt:7(
          MemberExpr:7(
            NameExpr(self)
            y)
          NameExpr(x)
          Block:8(
            PassStmt:8()))))))

[case testStripDecoratedFunctionOrMethod]
# mypy: ignore-errors=True
@deco
def f():
    x = 0

class C:
    @deco
    def m1(self):
        x = 0

    @deco
    def m2(self):
        self.x = 0
[out]
MypyFile:1(
  Decorator:2(
    Var(f)
    NameExpr(deco)
    FuncDef:3(
      f
      Block:4()))
  ClassDef:6(
    C
    Decorator:7(
      Var(m1)
      NameExpr(deco)
      FuncDef:8(
        m1
        Args(
          Var(self))
        Block:9()))
    Decorator:11(
      Var(m2)
      NameExpr(deco)
      FuncDef:12(
        m2
        Args(
          Var(self))
        Block:13(
          AssignmentStmt:13(
            MemberExpr:13(
              NameExpr(self)
              x)
            IntExpr(0)))))))

[case testStripOverloadedMethod]
# mypy: ignore-errors=True
class C:
    @overload
    def m1(self, x: int) -> None: ...
    @overload
    def m1(self, x: str) -> None: ...
    def m1(self, x):
        x = 0

    @overload
    def m2(self, x: int) -> None: ...
    @overload
    def m2(self, x: str) -> None: ...
    def m2(self, x):
        self.x = 0
[out]
MypyFile:1(
  ClassDef:2(
    C
    OverloadedFuncDef:3(
      Decorator:3(
        Var(m1)
        NameExpr(overload)
        FuncDef:4(
          m1
          Args(
            Var(self)
            Var(x))
          def (self: Any, x: int?) -> None?
          Block:4(
            ExpressionStmt:4(
              Ellipsis))))
      Decorator:5(
        Var(m1)
        NameExpr(overload)
        FuncDef:6(
          m1
          Args(
            Var(self)
            Var(x))
          def (self: Any, x: str?) -> None?
          Block:6(
            ExpressionStmt:6(
              Ellipsis))))
      FuncDef:7(
        m1
        Args(
          Var(self)
          Var(x))
        Block:8()))
    OverloadedFuncDef:10(
      Decorator:10(
        Var(m2)
        NameExpr(overload)
        FuncDef:11(
          m2
          Args(
            Var(self)
            Var(x))
          def (self: Any, x: int?) -> None?
          Block:11(
            ExpressionStmt:11(
              Ellipsis))))
      Decorator:12(
        Var(m2)
        NameExpr(overload)
        FuncDef:13(
          m2
          Args(
            Var(self)
            Var(x))
          def (self: Any, x: str?) -> None?
          Block:13(
            ExpressionStmt:13(
              Ellipsis))))
      FuncDef:14(
        m2
        Args(
          Var(self)
          Var(x))
        Block:15(
          AssignmentStmt:15(
            MemberExpr:15(
              NameExpr(self)
              x)
            IntExpr(0)))))))

[case testStripMethodInNestedClass]
# mypy: ignore-errors=True
class C:
    class D:
        def m1(self):
             self.x = 1
        def m2(self):
             return self.x
[out]
MypyFile:1(
  ClassDef:2(
    C
    ClassDef:3(
      D
      FuncDef:4(
        m1
        Args(
          Var(self))
        Block:5(
          AssignmentStmt:5(
            MemberExpr:5(
              NameExpr(self)
              x)
            IntExpr(1))))
      FuncDef:6(
        m2
        Args(
          Var(self))
        Block:7()))))

[case testSuperExpr]
super().x
[out]
MypyFile:1(
  ExpressionStmt:1(
    SuperExpr:1(
      x
      CallExpr:1(
        NameExpr(super)
        Args()))))

[case testTypeCommentSimple]
x = []  # type: list[int]
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    ListExpr:1()
    list?[int?]))

[case testTypeCommentMultiple]
x = []  # type: list[int]
y = {}  # type: dict[str, int]
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    ListExpr:1()
    list?[int?])
  AssignmentStmt:2(
    NameExpr(y)
    DictExpr:2()
    dict?[str?, int?]))

[case testTypeCommentWithTrailingComment]
x = []  # type: list[str]  # This is a comment
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    ListExpr:1()
    list?[str?]))

[case testTypeCommentUnion]
x = None  # type: str | None
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    NameExpr(None)
    str? | None?))

[case testNestedListAssignment]
a1, [b1, c1] = a2, [b2, c2]
[out]
MypyFile:1(
  AssignmentStmt:1(
    TupleExpr:1(
      NameExpr(a1)
      TupleExpr:1(
        NameExpr(b1)
        NameExpr(c1)))
    TupleExpr:1(
      NameExpr(a2)
      ListExpr:1(
        NameExpr(b2)
        NameExpr(c2)))))

[case testSyntaxError1]
x = [1 2]
y = 2
[out]
1:8: error: Expected `,`, found int
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    ListExpr:1(
      IntExpr(1)
      IntExpr(2)))
  AssignmentStmt:2(
    NameExpr(y)
    IntExpr(2)))

[case testSyntaxError2]
f(a.)
[out]
1:5: error: Expected an identifier
MypyFile:1(
  ExpressionStmt:1(
    CallExpr:1(
      NameExpr(f)
      Args(
        MemberExpr:1(
          NameExpr(a)
          )))))

[case testSyntaxError3]
f(a[])
[out]
1:5: error: Expected index or slice expression
MypyFile:1(
  ExpressionStmt:1(
    CallExpr:1(
      NameExpr(f)
      Args(
        IndexExpr:1(
          NameExpr(a)
          NameExpr())))))

[case testSyntaxError4]
from m import
1
[out]
1:14: error: Expected one or more symbol names after import
MypyFile:1(
  ImportFrom:1(m, [])
  ExpressionStmt:2(
    IntExpr(1)))

[case testSyntaxError5]
from m
1
[out]
1:7: error: Expected `import`, found newline
MypyFile:1(
  ImportFrom:1(m, [])
  ExpressionStmt:2(
    IntExpr(1)))

[case testSyntaxError6]
from m
1
[out]
1:7: error: Expected `import`, found newline
MypyFile:1(
  ImportFrom:1(m, [])
  ExpressionStmt:2(
    IntExpr(1)))

[case testSyntaxError7]
def f():
    g(
    h()

def g(): ...
[out]
3:8: error: Expected `)`, found newline
MypyFile:1(
  FuncDef:1(
    f
    Block:2(
      ExpressionStmt:2(
        CallExpr:2(
          NameExpr(g)
          Args(
            CallExpr:3(
              NameExpr(h)
              Args()))))))
  FuncDef:5(
    g
    Block:5(
      ExpressionStmt:5(
        Ellipsis))))

[case testSyntaxError8]
def f(
    x,
    y

def g(): ...
[out]
3:6: error: Expected `)`, found newline
5:1: error: Expected an indented block after function definition
MypyFile:1(
  FuncDef:1(
    f
    Args(
      Var(x)
      Var(y))
    Block:1())
  FuncDef:5(
    g
    Block:5(
      ExpressionStmt:5(
        Ellipsis))))

[case testSyntaxError9]
class A

def f(): pass
[out]
1:8: error: Expected `:`, found newline
3:1: error: Expected an indented block after `class` definition
MypyFile:1(
  ClassDef:1(
    A)
  FuncDef:3(
    f
    Block:3(
      PassStmt:3())))

[case testArgConstructorTooManyArgs]
from typing import Callable
from mypy_extensions import Arg
def f(x: Callable[[Arg(int, 'x', 'extra')], bool]) -> None:
    pass
[out]
3:19: error: Too many arguments for argument constructor
MypyFile:1(
  ImportFrom:1(typing, [Callable])
  ImportFrom:2(mypy_extensions, [Arg])
  FuncDef:3(
    f
    Args(
      Var(x))
    def (x: Callable?[<TypeList Arg(int?, x)>, bool?]) -> None?
    Block:4(
      PassStmt:4())))

[case testArgConstructorMultipleValuesForName]
from typing import Callable
from mypy_extensions import Arg
def f(x: Callable[[Arg(int, 'x', name='y')], bool]) -> None:
    pass
[out]
3:19: error: "Arg" gets multiple values for keyword argument "name"
MypyFile:1(
  ImportFrom:1(typing, [Callable])
  ImportFrom:2(mypy_extensions, [Arg])
  FuncDef:3(
    f
    Args(
      Var(x))
    def (x: Callable?[<TypeList Arg(int?, y)>, bool?]) -> None?
    Block:4(
      PassStmt:4())))

[case testArgConstructorMultipleValuesForType]
from typing import Callable
from mypy_extensions import Arg
def f(x: Callable[[Arg(int, type=str)], bool]) -> None:
    pass
[out]
3:19: error: "Arg" gets multiple values for keyword argument "type"
MypyFile:1(
  ImportFrom:1(typing, [Callable])
  ImportFrom:2(mypy_extensions, [Arg])
  FuncDef:3(
    f
    Args(
      Var(x))
    def (x: Callable?[<TypeList Arg(str?)>, bool?]) -> None?
    Block:4(
      PassStmt:4())))

[case testArgConstructorUnexpectedArg]
from typing import Callable
from mypy_extensions import Arg
def f(x: Callable[[Arg(int, foo='bar')], bool]) -> None:
    pass
[out]
3:19: error: Unexpected argument "foo" for argument constructor
MypyFile:1(
  ImportFrom:1(typing, [Callable])
  ImportFrom:2(mypy_extensions, [Arg])
  FuncDef:3(
    f
    Args(
      Var(x))
    def (x: Callable?[<TypeList Arg(int?)>, bool?]) -> None?
    Block:4(
      PassStmt:4())))

[case testArgConstructorMultipleErrors]
from typing import Callable
from mypy_extensions import Arg
def f(x: Callable[[Arg(int, 'x', 'extra', foo='bar', name='y')], bool]) -> None:
    pass
[out]
3:19: error: Too many arguments for argument constructor
3:19: error: Unexpected argument "foo" for argument constructor
3:19: error: "Arg" gets multiple values for keyword argument "name"
MypyFile:1(
  ImportFrom:1(typing, [Callable])
  ImportFrom:2(mypy_extensions, [Arg])
  FuncDef:3(
    f
    Args(
      Var(x))
    def (x: Callable?[<TypeList Arg(int?, y)>, bool?]) -> None?
    Block:4(
      PassStmt:4())))

[case testArgConstructorValidSyntax]
from typing import Callable
from mypy_extensions import Arg, DefaultArg, VarArg, KwArg
def f(x: Callable[[Arg(int, 'x'), DefaultArg(str, 'y'), VarArg(bool), KwArg(float)], None]) -> None:
    pass
[out]
MypyFile:1(
  ImportFrom:1(typing, [Callable])
  ImportFrom:2(mypy_extensions, [Arg, DefaultArg, VarArg, KwArg])
  FuncDef:3(
    f
    Args(
      Var(x))
    def (x: Callable?[<TypeList Arg(int?, x), DefaultArg(str?, y), VarArg(bool?), KwArg(float?)>, None?]) -> None?
    Block:4(
      PassStmt:4())))
[case testInvalidTypeFloatLiteral]
x: 3.14
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    TempNode:1(
      Any)
    None))

[case testInvalidTypeComplexLiteral]
y: 1j
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(y)
    TempNode:1(
      Any)
    None))

[case testInvalidTypeBinaryOperatorAdd]
z: int + str
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(z)
    TempNode:1(
      Any)
    None))

[case testInvalidTypeBinaryOperatorMul]
a: int * str
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(a)
    TempNode:1(
      Any)
    None))

[case testInvalidTypeUnaryOperatorNot]
b: not int
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(b)
    TempNode:1(
      Any)
    None))

[case testInvalidTypeUnaryOperatorInvert]
c: ~int
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(c)
    TempNode:1(
      Any)
    None))

[case testInvalidTypeSetExpression]
f: {1, 2, 3}
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(f)
    TempNode:1(
      Any)
    None))

[case testInvalidTypeListComprehension]
g: [x for x in range(10)]
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(g)
    TempNode:1(
      Any)
    None))

[case testInvalidTypeLambda]
h: lambda x: x
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(h)
    TempNode:1(
      Any)
    None))

[case testInvalidTypeIfExpression]
i: int if True else str
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(i)
    TempNode:1(
      Any)
    None))

[case testInvalidTypeComparisonExpression]
j: int < str
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(j)
    TempNode:1(
      Any)
    None))

[case testInvalidTypePositiveUnaryOp]
k: +5
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(k)
    TempNode:1(
      Any)
    5))

[case testConditionalOverload1]
@overload
def foo(x: int): ...
if sys.version_info[0] > 2:
    @overload
    def foo(x: str): ...
def foo(x): pass
[out]
MypyFile:1(
  IfStmt:3(
    If(
      ComparisonExpr:3(
        >
        IndexExpr:3(
          MemberExpr:3(
            NameExpr(sys)
            version_info)
          IntExpr(0))
        IntExpr(2)))
    Then()
    Else())
  OverloadedFuncDef:1(
    Decorator:1(
      Var(foo)
      NameExpr(overload)
      FuncDef:2(
        foo
        Args(
          Var(x))
        def (x: int?) -> Any
        Block:2(
          ExpressionStmt:2(
            Ellipsis))))
    Decorator:4(
      Var(foo)
      NameExpr(overload)
      FuncDef:5(
        foo
        Args(
          Var(x))
        def (x: str?) -> Any
        Block:5(
          ExpressionStmt:5(
            Ellipsis))))
    FuncDef:6(
      foo
      Args(
        Var(x))
      Block:6(
        PassStmt:6()))))

[case testConditionalOverload2]
@overload
def foo(x: int): ...
if sys.platform == "foo":
    @overload
    def foo(x: str): ...
def foo(x): pass
[out]
MypyFile:1(
  IfStmt:3(
    If(
      ComparisonExpr:3(
        ==
        MemberExpr:3(
          NameExpr(sys)
          platform)
        StrExpr(foo)))
    Then())
  OverloadedFuncDef:1(
    Decorator:1(
      Var(foo)
      NameExpr(overload)
      FuncDef:2(
        foo
        Args(
          Var(x))
        def (x: int?) -> Any
        Block:2(
          ExpressionStmt:2(
            Ellipsis))))
    FuncDef:6(
      foo
      Args(
        Var(x))
      Block:6(
        PassStmt:6()))))

[case testConditionalOverload3]
if sys.version_info[0] > 2:
    @overload
    def foo(x: str): ...
@overload
def foo(x: int): ...
def foo(x): pass
[out]
MypyFile:1(
  IfStmt:1(
    If(
      ComparisonExpr:1(
        >
        IndexExpr:1(
          MemberExpr:1(
            NameExpr(sys)
            version_info)
          IntExpr(0))
        IntExpr(2)))
    Then()
    Else())
  OverloadedFuncDef:2(
    Decorator:2(
      Var(foo)
      NameExpr(overload)
      FuncDef:3(
        foo
        Args(
          Var(x))
        def (x: str?) -> Any
        Block:3(
          ExpressionStmt:3(
            Ellipsis))))
    Decorator:4(
      Var(foo)
      NameExpr(overload)
      FuncDef:5(
        foo
        Args(
          Var(x))
        def (x: int?) -> Any
        Block:5(
          ExpressionStmt:5(
            Ellipsis))))
    FuncDef:6(
      foo
      Args(
        Var(x))
      Block:6(
        PassStmt:6()))))

[case testMatchStmt]
match x:
    case foo(y):
        pass
    case _:
        pass
[out]
MypyFile:1(
  MatchStmt:1(
    NameExpr(x)
    Pattern(
      ClassPattern:2(
        NameExpr(foo)
        Positionals(
          AsPattern:2(
            NameExpr(y)))))
    Body(
      PassStmt:3())
    Pattern(
      AsPattern:4())
    Body(
      PassStmt:5())))

[case testMatchLiteralPatterns]
match x:
    case 1:
        pass
    case "hello":
        pass
    case True:
        pass
    case None:
        pass
[out]
MypyFile:1(
  MatchStmt:1(
    NameExpr(x)
    Pattern(
      ValuePattern:2(
        IntExpr(1)))
    Body(
      PassStmt:3())
    Pattern(
      ValuePattern:4(
        StrExpr(hello)))
    Body(
      PassStmt:5())
    Pattern(
      SingletonPattern:6(
        True))
    Body(
      PassStmt:7())
    Pattern(
      SingletonPattern:8())
    Body(
      PassStmt:9())))

[case testMatchOrPattern]
match x:
    case 1 | 2 | 3:
        pass
[out]
MypyFile:1(
  MatchStmt:1(
    NameExpr(x)
    Pattern(
      OrPattern:2(
        ValuePattern:2(
          IntExpr(1))
        ValuePattern:2(
          IntExpr(2))
        ValuePattern:2(
          IntExpr(3))))
    Body(
      PassStmt:3())))

[case testMatchSequencePattern]
match x:
    case [a, *rest, b]:
        pass
[out]
MypyFile:1(
  MatchStmt:1(
    NameExpr(x)
    Pattern(
      SequencePattern:2(
        AsPattern:2(
          NameExpr(a))
        StarredPattern:2(
          NameExpr(rest))
        AsPattern:2(
          NameExpr(b))))
    Body(
      PassStmt:3())))

[case testMatchMappingPattern]
match x:
    case {"key": value, "x": y}:
        pass
[out]
MypyFile:1(
  MatchStmt:1(
    NameExpr(x)
    Pattern(
      MappingPattern:2(
        Key(
          StrExpr(key))
        Value(
          AsPattern:2(
            NameExpr(value)))
        Key(
          StrExpr(x))
        Value(
          AsPattern:2(
            NameExpr(y)))))
    Body(
      PassStmt:3())))

[case testMatchGuard]
match x:
    case y if y > 0:
        pass
[out]
MypyFile:1(
  MatchStmt:1(
    NameExpr(x)
    Pattern(
      AsPattern:2(
        NameExpr(y)))
    Guard(
      ComparisonExpr:2(
        >
        NameExpr(y)
        IntExpr(0)))
    Body(
      PassStmt:3())))

[case testPEP695TypeAlias]
# comment
type A[T] = C[T]
[out]
MypyFile:1(
  TypeAliasStmt:2(
    NameExpr(A)
    TypeParam(
      T)
    LambdaExpr:2(
      Block:-1(
        ReturnStmt:2(
          IndexExpr:2(
            NameExpr(C)
            NameExpr(T)))))))

[case testPEP695GenericFunction]
# comment

def f[T](): pass
def g[T: str](): pass
def h[T: (int, str)](): pass
[out]
MypyFile:1(
  FuncDef:3(
    f
    TypeParam(
      T)
    Block:3(
      PassStmt:3()))
  FuncDef:4(
    g
    TypeParam(
      T
      str?)
    Block:4(
      PassStmt:4()))
  FuncDef:5(
    h
    TypeParam(
      T
      Values(
        int?
        str?))
    Block:5(
      PassStmt:5())))

[case testPEP695ParamSpec]
# comment

def f[**P](): pass
class C[T: int, **P]: pass
[out]
MypyFile:1(
  FuncDef:3(
    f
    TypeParam(
      **P)
    Block:3(
      PassStmt:3()))
  ClassDef:4(
    C
    TypeParam(
      T
      int?)
    TypeParam(
      **P)
    PassStmt:4()))

[case testPEP695TypeVarTuple]
# comment

def f[*Ts](): pass
class C[T: int, *Ts]: pass
[out]
MypyFile:1(
  FuncDef:3(
    f
    TypeParam(
      *Ts)
    Block:3(
      PassStmt:3()))
  ClassDef:4(
    C
    TypeParam(
      T
      int?)
    TypeParam(
      *Ts)
    PassStmt:4()))

[case testTypeCommentLastLine]
d = [
   # Placeholder for items
]  # type: list[int]
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(d)
    ListExpr:1()
    list?[int?]))

[case testDebugFString]
f"test {x=}"
[out]
MypyFile:1(
  ExpressionStmt:1(
    CallExpr:1(
      MemberExpr:1(
        StrExpr()
        join)
      Args(
        ListExpr:1(
          StrExpr(test x=)
          CallExpr:1(
            MemberExpr:1(
              StrExpr({!r:{}})
              format)
            Args(
              NameExpr(x)
              StrExpr())))))))
