-- Test cases for parser. Each test case consists of two sections.
-- The first section contains [case NAME] followed by the input code, while
-- the second section contains [out] followed by the output from the parser.
--
-- Lines starting with "--" in this file will be ignored, except for lines
-- starting with "----" that are not ignored. The first two dashes of these
-- lines are interpreted as escapes and removed.

[case testEmptyFile]
[out]
MypyFile:1()

[case testExpressionStatement]
1
[out]
MypyFile:1(
  ExpressionStmt:1(
    IntExpr(1)))

[case testAssignment]
x = 1
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    IntExpr(1)))

[case testExpressionBasics]
x = f(1, None)
123 * (2 + x)
"hello".lower()
-1.23
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    CallExpr:1(
      NameExpr(f)
      Args(
        IntExpr(1)
        NameExpr(None))))
  ExpressionStmt:2(
    OpExpr:2(
      *
      IntExpr(123)
      OpExpr:2(
        +
        IntExpr(2)
        NameExpr(x))))
  ExpressionStmt:3(
    CallExpr:3(
      MemberExpr:3(
        StrExpr(hello)
        lower)
      Args()))
  ExpressionStmt:4(
    UnaryExpr:4(
      -
      FloatExpr(1.23))))

[case testSingleQuotedStr]
''
'foo'
'foo\
bar'
[out]
MypyFile:1(
  ExpressionStmt:1(
    StrExpr())
  ExpressionStmt:2(
    StrExpr(foo))
  ExpressionStmt:3(
    StrExpr(foobar)))

[case testDoubleQuotedStr]
""
"foo"
"foo\
bar"
[out]
MypyFile:1(
  ExpressionStmt:1(
    StrExpr())
  ExpressionStmt:2(
    StrExpr(foo))
  ExpressionStmt:3(
    StrExpr(foobar)))

[case testTripleQuotedStr]
''''''
'''foo'''
'''foo\
bar'''
'''\nfoo
bar'''
'''fo''bar'''
""""""
"""foo"""
"""foo\
bar"""
"""\nfoo
bar"""
"""fo""bar"""
[out]
MypyFile:1(
  ExpressionStmt:1(
    StrExpr())
  ExpressionStmt:2(
    StrExpr(foo))
  ExpressionStmt:3(
    StrExpr(foobar))
  ExpressionStmt:5(
    StrExpr(\u000afoo\u000abar))
  ExpressionStmt:6(
    StrExpr(fo''bar))
  ExpressionStmt:7(
    StrExpr())
  ExpressionStmt:8(
    StrExpr(foo))
  ExpressionStmt:9(
    StrExpr(foobar))
  ExpressionStmt:11(
    StrExpr(\u000afoo\u000abar))
  ExpressionStmt:12(
    StrExpr(fo""bar)))

[case testRawStr]
r'x\n\''
r"x\n\""
[out]
MypyFile:1(
  ExpressionStmt:1(
    StrExpr(x\n\'))
  ExpressionStmt:2(
    StrExpr(x\n\")))
--" fix syntax highlight

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

[case testEscapesInStrings]
'\r\n\t\x2f\u123f'
b'\r\n\t\x2f\u123f'
[out]
MypyFile:1(
  ExpressionStmt:1(
    StrExpr(\u000d\u000a\u0009/\u123f))
  ExpressionStmt:2(
    BytesExpr(\r\n\t/\\\u123f)))
-- Note \\u in the b'...' case (\u sequence not translated)

[case testEscapedQuote]
'\''
[out]
MypyFile:1(
  ExpressionStmt:1(
    StrExpr(')))
--'

[case testOctalEscapes]
'\0\1\177\1234'
b'\1\476'
[out]
MypyFile:1(
  ExpressionStmt:1(
    StrExpr(\u0000\u0001\u007fS4))
  ExpressionStmt:2(
    BytesExpr(\x01>)))

[case testUnicodeLiteralInPython3]
u'foo'
[out]
MypyFile:1(
  ExpressionStmt:1(
    StrExpr(foo)))

[case testArrays]
a = []
a = [1, 2]
a[[1]] = a[2]
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(a)
    ListExpr:1())
  AssignmentStmt:2(
    NameExpr(a)
    ListExpr:2(
      IntExpr(1)
      IntExpr(2)))
  AssignmentStmt:3(
    IndexExpr:3(
      NameExpr(a)
      ListExpr:3(
        IntExpr(1)))
    IndexExpr:3(
      NameExpr(a)
      IntExpr(2))))

[case testTuples]
()
(1,)
(1, foo)
a, b = 1, (2, 3)
[out]
MypyFile:1(
  ExpressionStmt:1(
    TupleExpr:1())
  ExpressionStmt:2(
    TupleExpr:2(
      IntExpr(1)))
  ExpressionStmt:3(
    TupleExpr:3(
      IntExpr(1)
      NameExpr(foo)))
  AssignmentStmt:4(
    TupleExpr:4(
      NameExpr(a)
      NameExpr(b))
    TupleExpr:4(
      IntExpr(1)
      TupleExpr:4(
        IntExpr(2)
        IntExpr(3)))))

[case testSimpleFunction]
def main():
  1
[out]
MypyFile:1(
  FuncDef:1(
    main
    Block:1(
      ExpressionStmt:2(
        IntExpr(1)))))

[case testPass]
def f():
    pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    Block:1(
      PassStmt:2())))

[case testIf]
if 1:
    2
[out]
MypyFile:1(
  IfStmt:1(
    If(
      IntExpr(1))
    Then(
      ExpressionStmt:2(
        IntExpr(2)))))

[case testIfElse]
if 1:
    2
else:
    3
[out]
MypyFile:1(
  IfStmt:1(
    If(
      IntExpr(1))
    Then(
      ExpressionStmt:2(
        IntExpr(2)))
    Else(
      ExpressionStmt:4(
        IntExpr(3)))))

[case testIfElif]
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 testWhile]
while 1:
    pass
[out]
MypyFile:1(
  WhileStmt:1(
    IntExpr(1)
    Block:1(
      PassStmt:2())))

[case testReturn]
def f():
    return 1
[out]
MypyFile:1(
  FuncDef:1(
    f
    Block:1(
      ReturnStmt:2(
        IntExpr(1)))))


[case testReturnWithoutValue]
def f():
    return
[out]
MypyFile:1(
  FuncDef:1(
    f
    Block:1(
      ReturnStmt:2())))

[case testBreak]
while 1:
    break
[out]
MypyFile:1(
  WhileStmt:1(
    IntExpr(1)
    Block:1(
      BreakStmt:2())))

[case testLargeBlock]
if 1:
    x = 1
    while 2:
        pass
    y = 2
[out]
MypyFile:1(
  IfStmt:1(
    If(
      IntExpr(1))
    Then(
      AssignmentStmt:2(
        NameExpr(x)
        IntExpr(1))
      WhileStmt:3(
        IntExpr(2)
        Block:3(
          PassStmt:4()))
      AssignmentStmt:5(
        NameExpr(y)
        IntExpr(2)))))

[case testSimpleClass]
class A:
    def f(self):
        pass
[out]
MypyFile:1(
  ClassDef:1(
    A
    FuncDef:2(
      f
      Args(
        Var(self))
      Block:2(
        PassStmt:3()))))

[case testGlobalVarWithType]
x = 0 # type: int
y = False # type: bool
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    IntExpr(0)
    int?)
  AssignmentStmt:2(
    NameExpr(y)
    NameExpr(False)
    bool?))

[case testLocalVarWithType]
def f():
  x = 0 # type: int
  y = False # type: bool
  a = None # type: Any
[out]
MypyFile:1(
  FuncDef:1(
    f
    Block:1(
      AssignmentStmt:2(
        NameExpr(x)
        IntExpr(0)
        int?)
      AssignmentStmt:3(
        NameExpr(y)
        NameExpr(False)
        bool?)
      AssignmentStmt:4(
        NameExpr(a)
        NameExpr(None)
        Any?))))

[case testFunctionDefWithType]
def f(y: str) -> int:
  return
class A:
  def f(self, a: int, b: Any) -> x:
    pass
  def g(self) -> Any:
    pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    Args(
      Var(y))
    def (y: str?) -> int?
    Block:1(
      ReturnStmt:2()))
  ClassDef:3(
    A
    FuncDef:4(
      f
      Args(
        Var(self)
        Var(a)
        Var(b))
      def (self: Any, a: int?, b: Any?) -> x?
      Block:4(
        PassStmt:5()))
    FuncDef:6(
      g
      Args(
        Var(self))
      def (self: Any) -> Any?
      Block:6(
        PassStmt:7()))))

[case testFuncWithNoneReturn]
def f() -> None:
  pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    def () -> None?
    Block:1(
      PassStmt:2())))

[case testVarDefWithGenericType]
x = None # type: List[str]
y = None # type: Dict[int, Any]
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    NameExpr(None)
    List?[str?])
  AssignmentStmt:2(
    NameExpr(y)
    NameExpr(None)
    Dict?[int?, Any?]))

[case testSignatureWithGenericTypes]
def f(y: t[Any, x]) -> a[b[c], d]:
    pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    Args(
      Var(y))
    def (y: t?[Any?, x?]) -> a?[b?[c?], d?]
    Block:1(
      PassStmt:2())))

[case testParsingExpressionsWithLessAndGreaterThan]
# The operators < > can sometimes be confused with generic types.
x = a < b > c
f(x < b, y > c)
a < b > 1
x < b, y > 2
(a < b > c)
[out]
MypyFile:1(
  AssignmentStmt:2(
    NameExpr(x)
    ComparisonExpr:2(
      <
      >
      NameExpr(a)
      NameExpr(b)
      NameExpr(c)))
  ExpressionStmt:3(
    CallExpr:3(
      NameExpr(f)
      Args(
        ComparisonExpr:3(
          <
          NameExpr(x)
          NameExpr(b))
        ComparisonExpr:3(
          >
          NameExpr(y)
          NameExpr(c)))))
  ExpressionStmt:4(
    ComparisonExpr:4(
      <
      >
      NameExpr(a)
      NameExpr(b)
      IntExpr(1)))
  ExpressionStmt:5(
    TupleExpr:5(
      ComparisonExpr:5(
        <
        NameExpr(x)
        NameExpr(b))
      ComparisonExpr:5(
        >
        NameExpr(y)
        IntExpr(2))))
  ExpressionStmt:6(
    ComparisonExpr:6(
      <
      >
      NameExpr(a)
      NameExpr(b)
      NameExpr(c))))

[case testLineContinuation]
if (1 +
    2):
  pass
[out]
MypyFile:1(
  IfStmt:1(
    If(
      OpExpr:1(
        +
        IntExpr(1)
        IntExpr(2)))
    Then(
      PassStmt:3())))

[case testMultipleVarDef]
x, y = z # type: int, a[c]
[out]
MypyFile:1(
  AssignmentStmt:1(
    TupleExpr:1(
      NameExpr(x)
      NameExpr(y))
    NameExpr(z)
    Tuple[int?, a?[c?]]))

[case testMultipleVarDef2]
(xx, z, i) = 1 # type: (a[c], Any, int)
[out]
MypyFile:1(
  AssignmentStmt:1(
    TupleExpr:1(
      NameExpr(xx)
      NameExpr(z)
      NameExpr(i))
    IntExpr(1)
    Tuple[a?[c?], Any?, int?]))

[case testMultipleVarDef3]
(xx, (z, i)) = 1 # type: (a[c], (Any, int))
[out]
MypyFile:1(
  AssignmentStmt:1(
    TupleExpr:1(
      NameExpr(xx)
      TupleExpr:1(
        NameExpr(z)
        NameExpr(i)))
    IntExpr(1)
    Tuple[a?[c?], Tuple[Any?, int?]]))

[case testAnnotateAssignmentViaSelf]
class A:
    def __init__(self):
        self.x = 1 # type: int
[out]
MypyFile:1(
  ClassDef:1(
    A
    FuncDef:2(
      __init__
      Args(
        Var(self))
      Block:2(
        AssignmentStmt:3(
          MemberExpr:3(
            NameExpr(self)
            x)
          IntExpr(1)
          int?)))))

[case testCommentAfterTypeComment]
x = 0 # type: int # bar!
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    IntExpr(0)
    int?))

[case testMultilineAssignmentAndAnnotations]
(x,
 y) = (1,
      2) # type: foo, bar
[out]
MypyFile:1(
  AssignmentStmt:1(
    TupleExpr:1(
      NameExpr(x)
      NameExpr(y))
    TupleExpr:2(
      IntExpr(1)
      IntExpr(2))
    Tuple[foo?, bar?]))

[case testWhitespaceAndCommentAnnotation]
x = 1#type:int
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    IntExpr(1)
    int?))

[case testWhitespaceAndCommentAnnotation2]
x = 1#   type:   int
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    IntExpr(1)
    int?))

[case testWhitespaceAndCommentAnnotation3]
x = 1# type : int       # not recognized!
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    IntExpr(1)))

[case testInvalidAnnotation]
x=1 ##type: int
y=1 #.type: int
z=1 # Type: int
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    IntExpr(1))
  AssignmentStmt:2(
    NameExpr(y)
    IntExpr(1))
  AssignmentStmt:3(
    NameExpr(z)
    IntExpr(1)))

[case testEmptyClass]
class C:
  pass
[out]
MypyFile:1(
  ClassDef:1(
    C
    PassStmt:2()))

[case testOperatorPrecedence]
a | b ^ c
a & b << c
[out]
MypyFile:1(
  ExpressionStmt:1(
    OpExpr:1(
      |
      NameExpr(a)
      OpExpr:1(
        ^
        NameExpr(b)
        NameExpr(c))))
  ExpressionStmt:2(
    OpExpr:2(
      &
      NameExpr(a)
      OpExpr:2(
        <<
        NameExpr(b)
        NameExpr(c)))))

[case testOperatorAssociativity]
1 - 2 + 3
1 << 2 << 3
[out]
MypyFile:1(
  ExpressionStmt:1(
    OpExpr:1(
      +
      OpExpr:1(
        -
        IntExpr(1)
        IntExpr(2))
      IntExpr(3)))
  ExpressionStmt:2(
    OpExpr:2(
      <<
      OpExpr:2(
        <<
        IntExpr(1)
        IntExpr(2))
      IntExpr(3))))

[case testUnaryOperators]
-2 * +3 * ~3 * 2
~3**2
[out]
MypyFile:1(
  ExpressionStmt:1(
    OpExpr:1(
      *
      OpExpr:1(
        *
        OpExpr:1(
          *
          UnaryExpr:1(
            -
            IntExpr(2))
          UnaryExpr:1(
            +
            IntExpr(3)))
        UnaryExpr:1(
          ~
          IntExpr(3)))
      IntExpr(2)))
  ExpressionStmt:2(
    UnaryExpr:2(
      ~
      OpExpr:2(
        **
        IntExpr(3)
        IntExpr(2)))))

[case testSingleLineBodies]
if 1: pass
while 1: pass
def f(): pass
def g() -> int: return 1
[out]
MypyFile:1(
  IfStmt:1(
    If(
      IntExpr(1))
    Then(
      PassStmt:1()))
  WhileStmt:2(
    IntExpr(1)
    Block:2(
      PassStmt:2()))
  FuncDef:3(
    f
    Block:3(
      PassStmt:3()))
  FuncDef:4(
    g
    def () -> int?
    Block:4(
      ReturnStmt:4(
        IntExpr(1)))))

[case testForStatement]
for x in y:
  pass
for x, (y, w) in z:
  1
for [x, (y, w)] in z:
  1
[out]
MypyFile:1(
  ForStmt:1(
    NameExpr(x)
    NameExpr(y)
    Block:1(
      PassStmt:2()))
  ForStmt:3(
    TupleExpr:3(
      NameExpr(x)
      TupleExpr:3(
        NameExpr(y)
        NameExpr(w)))
    NameExpr(z)
    Block:3(
      ExpressionStmt:4(
        IntExpr(1))))
  ForStmt:5(
    TupleExpr:5(
      NameExpr(x)
      TupleExpr:5(
        NameExpr(y)
        NameExpr(w)))
    NameExpr(z)
    Block:5(
      ExpressionStmt:6(
        IntExpr(1)))))

[case testGlobalDecl]
global x
def f():
  global x, y
[out]
MypyFile:1(
  GlobalDecl:1(
    x)
  FuncDef:2(
    f
    Block:2(
      GlobalDecl:3(
        x
        y))))

[case testNonlocalDecl]
def f():
  def g():
    nonlocal x, y
[out]
MypyFile:1(
  FuncDef:1(
    f
    Block:1(
      FuncDef:2(
        g
        Block:2(
          NonlocalDecl:3(
            x
            y))))))

[case testRaiseStatement]
raise foo
[out]
MypyFile:1(
  RaiseStmt:1(
    NameExpr(foo)))

[case testRaiseWithoutArg]
try:
  pass
except:
  raise
[out]
MypyFile:1(
  TryStmt:1(
    Block:1(
      PassStmt:2())
    Block:3(
      RaiseStmt:4())))

[case testRaiseFrom]
raise e from x
[out]
MypyFile:1(
  RaiseStmt:1(
    NameExpr(e)
    NameExpr(x)))

[case testBaseclasses]
class A(B):
  pass
class A(B[T], C[Any, d[x]]):
  pass
[out]
MypyFile:1(
  ClassDef:1(
    A
    BaseTypeExpr(
      NameExpr(B))
    PassStmt:2())
  ClassDef:3(
    A
    BaseTypeExpr(
      IndexExpr:3(
        NameExpr(B)
        NameExpr(T))
      IndexExpr:3(
        NameExpr(C)
        TupleExpr:3(
          NameExpr(Any)
          IndexExpr:3(
            NameExpr(d)
            NameExpr(x)))))
    PassStmt:4()))

[case testIsNot]
x is not y
[out]
MypyFile:1(
  ExpressionStmt:1(
    ComparisonExpr:1(
      is not
      NameExpr(x)
      NameExpr(y))))

[case testNotIn]
x not in y
not x not in y
x not in y | z
[out]
MypyFile:1(
  ExpressionStmt:1(
    ComparisonExpr:1(
      not in
      NameExpr(x)
      NameExpr(y)))
  ExpressionStmt:2(
    UnaryExpr:2(
      not
      ComparisonExpr:2(
        not in
        NameExpr(x)
        NameExpr(y))))
  ExpressionStmt:3(
    ComparisonExpr:3(
      not in
      NameExpr(x)
      OpExpr:3(
        |
        NameExpr(y)
        NameExpr(z)))))

[case testNotAsBinaryOp]
x not y # E: invalid syntax
[out]

[case testNotIs]
x not is y # E: invalid syntax
[out]

[case testBinaryNegAsBinaryOp]
1 ~ 2 # E: invalid syntax
[out]

[case testDictionaryExpression]
{}
{1:x}
{1:x, 2 or 1:2 and 3}
[out]
MypyFile:1(
  ExpressionStmt:1(
    DictExpr:1())
  ExpressionStmt:2(
    DictExpr:2(
      IntExpr(1)
      NameExpr(x)))
  ExpressionStmt:3(
    DictExpr:3(
      IntExpr(1)
      NameExpr(x)
      OpExpr:3(
        or
        IntExpr(2)
        IntExpr(1))
      OpExpr:3(
        and
        IntExpr(2)
        IntExpr(3)))))

[case testImport]
import x
import y.z.foo, __foo__.bar
[out]
MypyFile:1(
  Import:1(x)
  Import:2(y.z.foo, __foo__.bar))

[case testVariableTypeWithQualifiedName]
x = None # type: x.y
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    NameExpr(None)
    x.y?))

[case testTypeInSignatureWithQualifiedName]
def f() -> x.y[a.b.c]: pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    def () -> x.y?[a.b.c?]
    Block:1(
      PassStmt:1())))

[case testImportFrom]
from m import x
from m.n import x, y, z
[out]
MypyFile:1(
  ImportFrom:1(m, [x])
  ImportFrom:2(m.n, [x, y, z]))

[case testImportFromAs]
from m import x as y
from x import y, z as a, c as c
[out]
MypyFile:1(
  ImportFrom:1(m, [x : y])
  ImportFrom:2(x, [y, z : a, c : c]))

[case testImportStar]
from x import *
[out]
MypyFile:1(
  ImportAll:1(x))

[case testImportsInDifferentPlaces]
1
import x
def f():
  from x import y
  from z import *
[out]
MypyFile:1(
  ExpressionStmt:1(
    IntExpr(1))
  Import:2(x)
  FuncDef:3(
    f
    Block:3(
      ImportFrom:4(x, [y])
      ImportAll:5(z))))

[case testImportWithExtraComma]
from x import (y, z,)
[out]
MypyFile:1(
  ImportFrom:1(x, [y, z]))

[case testDefaultArgs]
def f(x=1):
  pass
def g(x, y=1+2, z=(1, 2)):
  pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    Args(
      default(
        Var(x)
        IntExpr(1)))
    Block:1(
      PassStmt:2()))
  FuncDef:3(
    g
    Args(
      Var(x)
      default(
        Var(y)
        OpExpr:3(
          +
          IntExpr(1)
          IntExpr(2)))
      default(
        Var(z)
        TupleExpr:3(
          IntExpr(1)
          IntExpr(2))))
    Block:3(
      PassStmt:4())))

[case testTryFinally]
try:
  1
finally:
  2
[out]
MypyFile:1(
  TryStmt:1(
    Block:1(
      ExpressionStmt:2(
        IntExpr(1)))
    Finally(
      ExpressionStmt:4(
        IntExpr(2)))))

[case testTry]
try:
  1
except x:
  2
[out]
MypyFile:1(
  TryStmt:1(
    Block:1(
      ExpressionStmt:2(
        IntExpr(1)))
    NameExpr(x)
    Block:3(
      ExpressionStmt:4(
        IntExpr(2)))))

[case testComplexTry]
try:
  1
except x as y:
  2
except x.y:
  3
[out]
MypyFile:1(
  TryStmt:1(
    Block:1(
      ExpressionStmt:2(
        IntExpr(1)))
    NameExpr(x)
    NameExpr(y)
    Block:3(
      ExpressionStmt:4(
        IntExpr(2)))
    MemberExpr:5(
      NameExpr(x)
      y)
    Block:5(
      ExpressionStmt:6(
        IntExpr(3)))))

[case testGeneratorExpression]
(x for y in z)
[out]
MypyFile:1(
  ExpressionStmt:1(
    GeneratorExpr:1(
      NameExpr(x)
      NameExpr(y)
      NameExpr(z))))

[case testGeneratorExpressionNested]
(x for y, (p, q) in z)
[out]
MypyFile:1(
  ExpressionStmt:1(
    GeneratorExpr:1(
      NameExpr(x)
      TupleExpr:1(
        NameExpr(y)
        TupleExpr:1(
          NameExpr(p)
          NameExpr(q)))
      NameExpr(z))))

[case testListComprehension]
x=[x for y in z]
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    ListComprehension:1(
      GeneratorExpr:1(
        NameExpr(x)
        NameExpr(y)
        NameExpr(z)))))

[case testComplexListComprehension]
x=[(x, y) for y, z in (1, 2)]
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    ListComprehension:1(
      GeneratorExpr:1(
        TupleExpr:1(
          NameExpr(x)
          NameExpr(y))
        TupleExpr:1(
          NameExpr(y)
          NameExpr(z))
        TupleExpr:1(
          IntExpr(1)
          IntExpr(2))))))

[case testListComprehension2]
([x + 1 for x in a])
[out]
MypyFile:1(
  ExpressionStmt:1(
    ListComprehension:1(
      GeneratorExpr:1(
        OpExpr:1(
          +
          NameExpr(x)
          IntExpr(1))
        NameExpr(x)
        NameExpr(a)))))

[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:-1(
        <empty>
        IntExpr(1))))
  ExpressionStmt:3(
    IndexExpr:3(
      NameExpr(x)
      SliceExpr:-1(
        IntExpr(1)
        <empty>)))
  ExpressionStmt:4(
    IndexExpr:4(
      NameExpr(x)
      SliceExpr:-1(
        <empty>
        <empty>))))

[case testSliceWithStride]
x[1:2:3]
x[1::2]
x[:1:2]
x[::2]
x[1: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:-1(
        IntExpr(1)
        <empty>
        IntExpr(2))))
  ExpressionStmt:3(
    IndexExpr:3(
      NameExpr(x)
      SliceExpr:-1(
        <empty>
        IntExpr(1)
        IntExpr(2))))
  ExpressionStmt:4(
    IndexExpr:4(
      NameExpr(x)
      SliceExpr:-1(
        <empty>
        <empty>
        IntExpr(2))))
  ExpressionStmt:5(
    IndexExpr:5(
      NameExpr(x)
      SliceExpr:-1(
        IntExpr(1)
        IntExpr(2)))))

[case testYield]
def f():
    yield x + 1
[out]
MypyFile:1(
  FuncDef:1(
    f
    Block:1(
      ExpressionStmt:2(
        YieldExpr:2(
          OpExpr:2(
            +
            NameExpr(x)
            IntExpr(1)))))))

[case testYieldFrom]
def f():
    yield from h()
[out]
MypyFile:1(
  FuncDef:1(
    f
    Block:1(
      ExpressionStmt:2(
        YieldFromExpr:2(
          CallExpr:2(
            NameExpr(h)
            Args()))))))

[case testYieldFromAssignment]
def f():
    a = yield from h()
[out]
MypyFile:1(
  FuncDef:1(
    f
    Block:1(
      AssignmentStmt:2(
        NameExpr(a)
        YieldFromExpr:2(
          CallExpr:2(
            NameExpr(h)
            Args()))))))

[case testDel]
del x
del x[0], y[1]
[out]
MypyFile:1(
  DelStmt:1(
    NameExpr(x))
  DelStmt:2(
    TupleExpr:2(
      IndexExpr:2(
        NameExpr(x)
        IntExpr(0))
      IndexExpr:2(
        NameExpr(y)
        IntExpr(1)))))

[case testExtraCommas]
1, 2,
+[1, 2,]
f(1,)
{1:2,}
[out]
MypyFile:1(
  ExpressionStmt:1(
    TupleExpr:1(
      IntExpr(1)
      IntExpr(2)))
  ExpressionStmt:2(
    UnaryExpr:2(
      +
      ListExpr:2(
        IntExpr(1)
        IntExpr(2))))
  ExpressionStmt:3(
    CallExpr:3(
      NameExpr(f)
      Args(
        IntExpr(1))))
  ExpressionStmt:4(
    DictExpr:4(
      IntExpr(1)
      IntExpr(2))))

[case testExtraCommaInFunc]
def f(x,):
  pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    Args(
      Var(x))
    Block:1(
      PassStmt:2())))

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

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

[case testLambdaPrecedence]
lambda x: 1, 2
[out]
MypyFile:1(
  ExpressionStmt:1(
    TupleExpr:1(
      LambdaExpr:1(
        Args(
          Var(x))
        Block:1(
          ReturnStmt:1(
            IntExpr(1))))
      IntExpr(2))))

[case testForIndicesInParens]
for (i, j) in x:
  pass
[out]
MypyFile:1(
  ForStmt:1(
    TupleExpr:1(
      NameExpr(i)
      NameExpr(j))
    NameExpr(x)
    Block:1(
      PassStmt:2())))

[case testForAndTrailingCommaAfterIndexVar]
for i, in x:
    pass
[out]
MypyFile:1(
  ForStmt:1(
    TupleExpr:1(
      NameExpr(i))
    NameExpr(x)
    Block:1(
      PassStmt:2())))

[case testListComprehensionAndTrailingCommaAfterIndexVar]
x = [a for b, in c]
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    ListComprehension:1(
      GeneratorExpr:1(
        NameExpr(a)
        TupleExpr:1(
          NameExpr(b))
        NameExpr(c)))))

[case testForAndTrailingCommaAfterIndexVars]
for i, j, in x:
    pass
[out]
MypyFile:1(
  ForStmt:1(
    TupleExpr:1(
      NameExpr(i)
      NameExpr(j))
    NameExpr(x)
    Block:1(
      PassStmt:2())))

[case testGeneratorWithCondition]
(x for y in z if 0)
[out]
MypyFile:1(
  ExpressionStmt:1(
    GeneratorExpr:1(
      NameExpr(x)
      NameExpr(y)
      NameExpr(z)
      IntExpr(0))))

[case testListComprehensionWithCondition]
raise [x for y in z if 0]
[out]
MypyFile:1(
  RaiseStmt:1(
    ListComprehension:1(
      GeneratorExpr:1(
        NameExpr(x)
        NameExpr(y)
        NameExpr(z)
        IntExpr(0)))))

[case testListComprehensionWithConditions]
raise [x for y in z if 0 if 1]
[out]
MypyFile:1(
  RaiseStmt:1(
    ListComprehension:1(
      GeneratorExpr:1(
        NameExpr(x)
        NameExpr(y)
        NameExpr(z)
        IntExpr(0)
        IntExpr(1)))))

[case testListComprehensionWithCrazyConditions]
raise [x for y in z if (1 if 2 else 3) if 1]
[out]
MypyFile:1(
  RaiseStmt:1(
    ListComprehension:1(
      GeneratorExpr:1(
        NameExpr(x)
        NameExpr(y)
        NameExpr(z)
        ConditionalExpr:1(
          Condition(
            IntExpr(2))
          IntExpr(1)
          IntExpr(3))
        IntExpr(1)))))

[case testDictionaryComprehension]
a = {x: y for x, y in xys}
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(a)
    DictionaryComprehension:1(
      NameExpr(x)
      NameExpr(y)
      TupleExpr:1(
        NameExpr(x)
        NameExpr(y))
      NameExpr(xys))))

[case testDictionaryComprehensionComplex]
a = {x: y for x, y in xys for p, q in pqs if c}
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(a)
    DictionaryComprehension:1(
      NameExpr(x)
      NameExpr(y)
      TupleExpr:1(
        NameExpr(x)
        NameExpr(y))
      TupleExpr:1(
        NameExpr(p)
        NameExpr(q))
      NameExpr(xys)
      NameExpr(pqs)
      NameExpr(c))))

[case testSetComprehension]
a = {i for i in l}
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(a)
    SetComprehension:1(
      GeneratorExpr:1(
        NameExpr(i)
        NameExpr(i)
        NameExpr(l)))))

[case testSetComprehensionComplex]
a = {x + p for x in xys for p in pqs if c}
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(a)
    SetComprehension:1(
      GeneratorExpr:1(
        OpExpr:1(
          +
          NameExpr(x)
          NameExpr(p))
        NameExpr(x)
        NameExpr(p)
        NameExpr(xys)
        NameExpr(pqs)
        NameExpr(c)))))

[case testWithStatement]
with open('foo') as f:
  pass
[out]
MypyFile:1(
  WithStmt:1(
    Expr(
      CallExpr:1(
        NameExpr(open)
        Args(
          StrExpr(foo))))
    Target(
      NameExpr(f))
    Block:1(
      PassStmt:2())))

[case testWithStatementWithoutTarget]
with foo:
  pass
[out]
MypyFile:1(
  WithStmt:1(
    Expr(
      NameExpr(foo))
    Block:1(
      PassStmt:2())))

[case testHexOctBinLiterals]
0xa, 0Xaf, 0o7, 0O12, 0b1, 0B101
[out]
MypyFile:1(
  ExpressionStmt:1(
    TupleExpr:1(
      IntExpr(10)
      IntExpr(175)
      IntExpr(7)
      IntExpr(10)
      IntExpr(1)
      IntExpr(5))))

[case testImportFromWithParens]
from x import (y)
from x import (y,
               z)
[out]
MypyFile:1(
  ImportFrom:1(x, [y])
  ImportFrom:2(x, [y, z]))

[case testContinueStmt]
while 1:
  continue
[out]
MypyFile:1(
  WhileStmt:1(
    IntExpr(1)
    Block:1(
      ContinueStmt:2())))

[case testStrLiteralConcatenate]
'f' 'bar'
('x'
 'y'
 'z')
[out]
MypyFile:1(
  ExpressionStmt:1(
    StrExpr(fbar))
  ExpressionStmt:2(
    StrExpr(xyz)))

[case testCatchAllExcept]
try:
  1
except:
  pass
try:
  1
except x:
  pass
except:
  2
[out]
MypyFile:1(
  TryStmt:1(
    Block:1(
      ExpressionStmt:2(
        IntExpr(1)))
    Block:3(
      PassStmt:4()))
  TryStmt:5(
    Block:5(
      ExpressionStmt:6(
        IntExpr(1)))
    NameExpr(x)
    Block:7(
      PassStmt:8())
    Block:9(
      ExpressionStmt:10(
        IntExpr(2)))))

[case testTryElse]
try:
  pass
except x:
  1
else:
  2
[out]
MypyFile:1(
  TryStmt:1(
    Block:1(
      PassStmt:2())
    NameExpr(x)
    Block:3(
      ExpressionStmt:4(
        IntExpr(1)))
    Else(
      ExpressionStmt:6(
        IntExpr(2)))))

[case testExceptWithMultipleTypes]
try:
  pass
except (x, y):
  pass
except (a, b, c) as e:
  pass
[out]
MypyFile:1(
  TryStmt:1(
    Block:1(
      PassStmt:2())
    TupleExpr:3(
      NameExpr(x)
      NameExpr(y))
    Block:3(
      PassStmt:4())
    TupleExpr:5(
      NameExpr(a)
      NameExpr(b)
      NameExpr(c))
    NameExpr(e)
    Block:5(
      PassStmt:6())))

[case testNestedFunctions]
def f():
  def g():
    pass
def h() -> int:
  def g() -> int:
    pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    Block:1(
      FuncDef:2(
        g
        Block:2(
          PassStmt:3()))))
  FuncDef:4(
    h
    def () -> int?
    Block:4(
      FuncDef:5(
        g
        def () -> int?
        Block:5(
          PassStmt:6())))))

[case testStatementsAndDocStringsInClassBody]
class A:
  "doc string"
  x = y
  def f(self):
    pass
[out]
MypyFile:1(
  ClassDef:1(
    A
    ExpressionStmt:2(
      StrExpr(doc string))
    AssignmentStmt:3(
      NameExpr(x)
      NameExpr(y))
    FuncDef:4(
      f
      Args(
        Var(self))
      Block:4(
        PassStmt:5()))))

[case testSingleLineClass]
class a: pass
[out]
MypyFile:1(
  ClassDef:1(
    a
    PassStmt:1()))

[case testDecorator]
@property
def f():
  pass
[out]
MypyFile:1(
  Decorator:1(
    Var(f)
    NameExpr(property)
    FuncDef:2(
      f
      Block:2(
        PassStmt:3()))))

[case testComplexDecorator]
@foo(bar, 1)
@zar
def f() -> int:
  pass
[out]
MypyFile:1(
  Decorator:1(
    Var(f)
    CallExpr:1(
      NameExpr(foo)
      Args(
        NameExpr(bar)
        IntExpr(1)))
    NameExpr(zar)
    FuncDef:3(
      f
      def () -> int?
      Block:3(
        PassStmt:4()))))

[case testKeywordArgInCall]
f(x=1)
[out]
MypyFile:1(
  ExpressionStmt:1(
    CallExpr:1(
      NameExpr(f)
      Args()
      KwArgs(
        x
        IntExpr(1)))))

[case testComplexKeywordArgs]
f(x, y=1 or 2, z=y)
[out]
MypyFile:1(
  ExpressionStmt:1(
    CallExpr:1(
      NameExpr(f)
      Args(
        NameExpr(x))
      KwArgs(
        y
        OpExpr:1(
          or
          IntExpr(1)
          IntExpr(2)))
      KwArgs(
        z
        NameExpr(y)))))

[case testChainedAssignment]
x = z = 1
[out]
MypyFile:1(
  AssignmentStmt:1(
    Lvalues(
      NameExpr(x)
      NameExpr(z))
    IntExpr(1)))

[case testVarArgs]
def f(x, *a): pass
f(1, *2)
[out]
MypyFile:1(
  FuncDef:1(
    f
    Args(
      Var(x))
    VarArg(
      Var(a))
    Block:1(
      PassStmt:1()))
  ExpressionStmt:2(
    CallExpr:2(
      NameExpr(f)
      Args(
        IntExpr(1)
        IntExpr(2))
      VarArg)))

[case testVarArgWithType]
def f(x: str, *a: int): pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    Args(
      Var(x))
    def (x: str?, *a: int?) -> Any
    VarArg(
      Var(a))
    Block:1(
      PassStmt:1())))

[case testDictVarArgs]
def f(x, **a): pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    Args(
      Var(x))
    DictVarArg(
      Var(a))
    Block:1(
      PassStmt:1())))

[case testBothVarArgs]
def f(x, *a, **b): pass
def g(*a, **b): pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    Args(
      Var(x))
    VarArg(
      Var(a))
    DictVarArg(
      Var(b))
    Block:1(
      PassStmt:1()))
  FuncDef:2(
    g
    VarArg(
      Var(a))
    DictVarArg(
      Var(b))
    Block:2(
      PassStmt:2())))

[case testDictVarArgsWithType]
def f(x: X, **a: A) -> None: pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    Args(
      Var(x))
    def (x: X?, **a: A?) -> None?
    DictVarArg(
      Var(a))
    Block:1(
      PassStmt:1())))

[case testCallDictVarArgs]
f(**x)
f(x, **y)
f(*x, **y)
f(x, *y, **z)
[out]
MypyFile:1(
  ExpressionStmt:1(
    CallExpr:1(
      NameExpr(f)
      Args()
      DictVarArg(
        NameExpr(x))))
  ExpressionStmt:2(
    CallExpr:2(
      NameExpr(f)
      Args(
        NameExpr(x))
      DictVarArg(
        NameExpr(y))))
  ExpressionStmt:3(
    CallExpr:3(
      NameExpr(f)
      Args(
        NameExpr(x))
      VarArg
      DictVarArg(
        NameExpr(y))))
  ExpressionStmt:4(
    CallExpr:4(
      NameExpr(f)
      Args(
        NameExpr(x)
        NameExpr(y))
      VarArg
      DictVarArg(
        NameExpr(z)))))

[case testAssert]
assert x == y
[out]
MypyFile:1(
  AssertStmt:1(
    ComparisonExpr:1(
      ==
      NameExpr(x)
      NameExpr(y))))

[case testYieldWithoutExpressions]
def f():
  yield
[out]
MypyFile:1(
  FuncDef:1(
    f
    Block:1(
      ExpressionStmt:2(
        YieldExpr:2()))))

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

[case testConditionalExpressionInListComprehension]
a = [x if y else z for a in b]
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(a)
    ListComprehension:1(
      GeneratorExpr:1(
        ConditionalExpr:1(
          Condition(
            NameExpr(y))
          NameExpr(x)
          NameExpr(z))
        NameExpr(a)
        NameExpr(b)))))

[case testConditionalExpressionInTuple]
1 if 2 else 3, 4
[out]
MypyFile:1(
  ExpressionStmt:1(
    TupleExpr:1(
      ConditionalExpr:1(
        Condition(
          IntExpr(2))
        IntExpr(1)
        IntExpr(3))
      IntExpr(4))))

[case testSetLiteral]
{x or y}
{1, 2}
[out]
MypyFile:1(
  ExpressionStmt:1(
    SetExpr:1(
      OpExpr:1(
        or
        NameExpr(x)
        NameExpr(y))))
  ExpressionStmt:2(
    SetExpr:2(
      IntExpr(1)
      IntExpr(2))))

[case testSetLiteralWithExtraComma]
{x,}
[out]
MypyFile:1(
  ExpressionStmt:1(
    SetExpr:1(
      NameExpr(x))))

[case testImportAs]
import x as y
import x, z as y, a.b as c, d as d
[out]
MypyFile:1(
  Import:1(x : y)
  Import:2(x, z : y, a.b : c, d : d))

[case testForAndElse]
for x in y:
  pass
else:
  x
[out]
MypyFile:1(
  ForStmt:1(
    NameExpr(x)
    NameExpr(y)
    Block:1(
      PassStmt:2())
    Else(
      ExpressionStmt:4(
        NameExpr(x)))))

[case testWhileAndElse]
while x:
  pass
else:
  y
[out]
MypyFile:1(
  WhileStmt:1(
    NameExpr(x)
    Block:1(
      PassStmt:2())
    Else(
      ExpressionStmt:4(
        NameExpr(y)))))

[case testWithAndMultipleOperands]
with x as y, a as b:
  pass
with x(), y():
  pass
[out]
MypyFile:1(
  WithStmt:1(
    Expr(
      NameExpr(x))
    Target(
      NameExpr(y))
    Expr(
      NameExpr(a))
    Target(
      NameExpr(b))
    Block:1(
      PassStmt:2()))
  WithStmt:3(
    Expr(
      CallExpr:3(
        NameExpr(x)
        Args()))
    Expr(
      CallExpr:3(
        NameExpr(y)
        Args()))
    Block:3(
      PassStmt:4())))

[case testOperatorAssignment]
x += 1
x -= 1
x *= 1
x /= 1
x //= 1
x %= 1
x **= 1
x |= 1
x &= 1
x ^= 1
x >>= 1
x <<= 1
[out]
MypyFile:1(
  OperatorAssignmentStmt:1(
    +
    NameExpr(x)
    IntExpr(1))
  OperatorAssignmentStmt:2(
    -
    NameExpr(x)
    IntExpr(1))
  OperatorAssignmentStmt:3(
    *
    NameExpr(x)
    IntExpr(1))
  OperatorAssignmentStmt:4(
    /
    NameExpr(x)
    IntExpr(1))
  OperatorAssignmentStmt:5(
    //
    NameExpr(x)
    IntExpr(1))
  OperatorAssignmentStmt:6(
    %
    NameExpr(x)
    IntExpr(1))
  OperatorAssignmentStmt:7(
    **
    NameExpr(x)
    IntExpr(1))
  OperatorAssignmentStmt:8(
    |
    NameExpr(x)
    IntExpr(1))
  OperatorAssignmentStmt:9(
    &
    NameExpr(x)
    IntExpr(1))
  OperatorAssignmentStmt:10(
    ^
    NameExpr(x)
    IntExpr(1))
  OperatorAssignmentStmt:11(
    >>
    NameExpr(x)
    IntExpr(1))
  OperatorAssignmentStmt:12(
    <<
    NameExpr(x)
    IntExpr(1)))

[case testNestedClasses]
class A:
  class B:
    pass
  class C:
    pass
[out]
MypyFile:1(
  ClassDef:1(
    A
    ClassDef:2(
      B
      PassStmt:3())
    ClassDef:4(
      C
      PassStmt:5())))

[case testTryWithExceptAndFinally]
try:
  pass
except x:
  x
finally:
  y
[out]
MypyFile:1(
  TryStmt:1(
    Block:1(
      PassStmt:2())
    NameExpr(x)
    Block:3(
      ExpressionStmt:4(
        NameExpr(x)))
    Finally(
      ExpressionStmt:6(
        NameExpr(y)))))

[case testBareAsteriskInFuncDef]
def f(x, *, y=1): pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    MaxPos(1)
    Args(
      Var(x)
      default(
        Var(y)
        IntExpr(1)))
    Block:1(
      PassStmt:1())))

[case testBareAsteriskInFuncDefWithSignature]
def f(x: A, *, y: B = 1) -> None: pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    MaxPos(1)
    Args(
      Var(x)
      default(
        Var(y)
        IntExpr(1)))
    def (x: A?, *, y: B? =) -> None?
    Block:1(
      PassStmt:1())))

[case testBareAsteriskNamedDefault]
def f(*, y: B = 1) -> None: pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    MaxPos(0)
    Args(
      default(
        Var(y)
        IntExpr(1)))
    def (*, y: B? =) -> None?
    Block:1(
      PassStmt:1())))

[case testBareAsteriskNamedNoDefault]
def f(*, y: B) -> None: pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    MaxPos(0)
    Args(
      Var(y))
    def (*, y: B?) -> None?
    Block:1(
      PassStmt:1())))

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

[case testKeywordAndDictArgs]
f(x = y, **kwargs)
[out]
MypyFile:1(
  ExpressionStmt:1(
    CallExpr:1(
      NameExpr(f)
      Args()
      KwArgs(
        x
        NameExpr(y))
      DictVarArg(
        NameExpr(kwargs)))))

[case testSimpleFunctionType]
f = None # type: Callable[[], None]
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(f)
    NameExpr(None)
    Callable?[<TypeList >, None?]))

[case testFunctionTypeWithArgument]
f = None # type: Callable[[str], int]
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(f)
    NameExpr(None)
    Callable?[<TypeList str?>, int?]))

[case testFunctionTypeWithTwoArguments]
f = None # type: Callable[[a[b], x.y], List[int]]
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(f)
    NameExpr(None)
    Callable?[<TypeList a?[b?], x.y?>, List?[int?]]))

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

[case testSimpleStringLiteralType]
def f() -> 'A': pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    def () -> A?
    Block:1(
      PassStmt:1())))

[case testGenericStringLiteralType]
def f() -> 'A[B, C]': pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    def () -> A?[B?, C?]
    Block:1(
      PassStmt:1())))

[case testPartialStringLiteralType]
def f() -> A['B', C]: pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    def () -> A?[B?, C?]
    Block:1(
      PassStmt:1())))

[case testWhitespaceInStringLiteralType]
def f() -> '  A  [  X  ]  ': pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    def () -> A?[X?]
    Block:1(
      PassStmt:1())))

[case testEscapeInStringLiteralType]
def f() -> '\x41': pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    def () -> A?
    Block:1(
      PassStmt:1())))

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

[case testQualifiedMetaclass]
class Foo(metaclass=foo.Bar): pass
[out]
MypyFile:1(
  ClassDef:1(
    Foo
    Metaclass(MemberExpr:1(
      NameExpr(foo)
      Bar))
    PassStmt:1()))

[case testBaseAndMetaclass]
class Foo(foo.bar[x], metaclass=Bar): pass
[out]
MypyFile:1(
  ClassDef:1(
    Foo
    Metaclass(NameExpr(Bar))
    BaseTypeExpr(
      IndexExpr:1(
        MemberExpr:1(
          NameExpr(foo)
          bar)
        NameExpr(x)))
    PassStmt:1()))

[case testClassKeywordArgs]
class Foo(_root=None): pass
[out]
MypyFile:1(
  ClassDef:1(
    Foo
    PassStmt:1()))

[case testClassKeywordArgsBeforeMeta]
class Foo(_root=None, metaclass=Bar): pass
[out]
MypyFile:1(
  ClassDef:1(
    Foo
    Metaclass(NameExpr(Bar))
    PassStmt:1()))

[case testClassKeywordArgsAfterMeta]
class Foo(metaclass=Bar, _root=None): pass
[out]
MypyFile:1(
  ClassDef:1(
    Foo
    Metaclass(NameExpr(Bar))
    PassStmt:1()))

[case testNamesThatAreNoLongerKeywords]
any = interface
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(any)
    NameExpr(interface)))

[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 testFunctionOverloadAndOtherStatements]
x
@overload
def f() -> x: pass
@overload
def f() -> y: pass
x
[out]
MypyFile:1(
  ExpressionStmt:1(
    NameExpr(x))
  OverloadedFuncDef:2(
    Decorator:2(
      Var(f)
      NameExpr(overload)
      FuncDef:3(
        f
        def () -> x?
        Block:3(
          PassStmt:3())))
    Decorator:4(
      Var(f)
      NameExpr(overload)
      FuncDef:5(
        f
        def () -> y?
        Block:5(
          PassStmt:5()))))
  ExpressionStmt:6(
    NameExpr(x)))

[case testFunctionOverloadWithThreeVariants]
@overload
def f() -> x: pass
@overload
def f() -> y: 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())))
    Decorator:5(
      Var(f)
      NameExpr(overload)
      FuncDef:6(
        f
        Args(
          Var(y))
        Block:6(
          PassStmt:6())))))

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

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

[case testCommentFunctionAnnotation]
def f(): # type: () -> A
  pass
def g(x): # type: (A) -> B
  pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    def () -> A?
    Block:1(
      PassStmt:2()))
  FuncDef:3(
    g
    Args(
      Var(x))
    def (x: A?) -> B?
    Block:3(
      PassStmt:4())))

[case testCommentMethodAnnotation]
class A:
  def f(self): # type: () -> A
    pass
  def g(xself, x): # type: (A) -> B
    pass
[out]
MypyFile:1(
  ClassDef:1(
    A
    FuncDef:2(
      f
      Args(
        Var(self))
      def (self: Any) -> A?
      Block:2(
        PassStmt:3()))
    FuncDef:4(
      g
      Args(
        Var(xself)
        Var(x))
      def (xself: Any, x: A?) -> B?
      Block:4(
        PassStmt:5()))))

[case testCommentMethodAnnotationAndNestedFunction]
class A:
  def f(self): # type: () -> A
    def g(x): # type: (A) -> B
      pass
[out]
MypyFile:1(
  ClassDef:1(
    A
    FuncDef:2(
      f
      Args(
        Var(self))
      def (self: Any) -> A?
      Block:2(
        FuncDef:3(
          g
          Args(
            Var(x))
          def (x: A?) -> B?
          Block:3(
            PassStmt:4()))))))

[case testCommentFunctionAnnotationOnSeparateLine]
def f(x):
  # type: (X) -> Y
  pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    Args(
      Var(x))
    def (x: X?) -> Y?
    Block:1(
      PassStmt:3())))

[case testCommentFunctionAnnotationOnSeparateLine2]
def f(x):

     # type: (X) -> Y       # bar

  pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    Args(
      Var(x))
    def (x: X?) -> Y?
    Block:1(
      PassStmt:5())))

[case testCommentFunctionAnnotationAndVarArg]
def f(x, *y): # type: (X, *Y) -> Z
  pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    Args(
      Var(x))
    def (x: X?, *y: Y?) -> Z?
    VarArg(
      Var(y))
    Block:1(
      PassStmt:2())))

[case testCommentFunctionAnnotationAndAllVarArgs]
def f(x, *y, **z): # type: (X, *Y, **Z) -> A
  pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    Args(
      Var(x))
    def (x: X?, *y: Y?, **z: Z?) -> A?
    VarArg(
      Var(y))
    DictVarArg(
      Var(z))
    Block:1(
      PassStmt:2())))

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

[case testTrailingSemicolon]
def x():
    pass;

def y():
    pass
[out]
MypyFile:1(
  FuncDef:1(
    x
    Block:1(
      PassStmt:2()))
  FuncDef:4(
    y
    Block:4(
      PassStmt:5())))

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

[case testStarExpression]
*a
*a, b
a, *b
a, (*x, y)
a, (x, *y)
[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))))
  ExpressionStmt:4(
    TupleExpr:4(
      NameExpr(a)
      TupleExpr:4(
        StarExpr:4(
          NameExpr(x))
        NameExpr(y))))
  ExpressionStmt:5(
    TupleExpr:5(
      NameExpr(a)
      TupleExpr:5(
        NameExpr(x)
        StarExpr:5(
          NameExpr(y))))))

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

[case testStarExpressionInFor]
for *a in b:
    pass

for a, *b in c:
    pass

for *a, b in c:
    pass
[out]
MypyFile:1(
  ForStmt:1(
    StarExpr:1(
      NameExpr(a))
    NameExpr(b)
    Block:1(
      PassStmt:2()))
  ForStmt:4(
    TupleExpr:4(
      NameExpr(a)
      StarExpr:4(
        NameExpr(b)))
    NameExpr(c)
    Block:4(
      PassStmt:5()))
  ForStmt:7(
    TupleExpr:7(
      StarExpr:7(
        NameExpr(a))
      NameExpr(b))
    NameExpr(c)
    Block:7(
      PassStmt:8())))

[case testStarExprInGeneratorExpr]
(x for y, *p in z)
(x for *p, y in z)
(x for y, *p, q in z)
[out]
MypyFile:1(
  ExpressionStmt:1(
    GeneratorExpr:1(
      NameExpr(x)
      TupleExpr:1(
        NameExpr(y)
        StarExpr:1(
          NameExpr(p)))
      NameExpr(z)))
  ExpressionStmt:2(
    GeneratorExpr:2(
      NameExpr(x)
      TupleExpr:2(
        StarExpr:2(
          NameExpr(p))
        NameExpr(y))
      NameExpr(z)))
  ExpressionStmt:3(
    GeneratorExpr:3(
      NameExpr(x)
      TupleExpr:3(
        NameExpr(y)
        StarExpr:3(
          NameExpr(p))
        NameExpr(q))
      NameExpr(z))))

[case testParseNamedtupleBaseclass]
class A(namedtuple('x', ['y'])): pass
[out]
MypyFile:1(
  ClassDef:1(
    A
    BaseTypeExpr(
      CallExpr:1(
        NameExpr(namedtuple)
        Args(
          StrExpr(x)
          ListExpr:1(
            StrExpr(y)))))
    PassStmt:1()))

[case testEllipsis]
...
a[1,...,2]
....__class__
[out]
MypyFile:1(
  ExpressionStmt:1(
    Ellipsis)
  ExpressionStmt:2(
    IndexExpr:2(
      NameExpr(a)
      TupleExpr:2(
        IntExpr(1)
        Ellipsis
        IntExpr(2))))
  ExpressionStmt:3(
    MemberExpr:3(
      Ellipsis
      __class__)))

[case testFunctionWithManyKindsOfArgs]
def f(x, *args,  y=None, **kw): pass
[out]
MypyFile:1(
  FuncDef:1(
    f
    MaxPos(1)
    Args(
      Var(x)
      default(
        Var(y)
        NameExpr(None)))
    VarArg(
      Var(args))
    DictVarArg(
      Var(kw))
    Block:1(
      PassStmt:1())))

[case testIfWithSemicolons]
if 1: a; b
[out]
MypyFile:1(
  IfStmt:1(
    If(
      IntExpr(1))
    Then(
      ExpressionStmt:1(
        NameExpr(a))
      ExpressionStmt:1(
        NameExpr(b)))))

[case testIfWithSemicolonsNested]
while 2:
    if 1: a; b
[out]
MypyFile:1(
  WhileStmt:1(
    IntExpr(2)
    Block:1(
      IfStmt:2(
        If(
          IntExpr(1))
        Then(
          ExpressionStmt:2(
            NameExpr(a))
          ExpressionStmt:2(
            NameExpr(b)))))))

[case testIfElseWithSemicolons]
if 1: global x; y = 1
else: x = 1; return 3
4
[out]
MypyFile:1(
  IfStmt:1(
    If(
      IntExpr(1))
    Then(
      GlobalDecl:1(
        x)
      AssignmentStmt:1(
        NameExpr(y)
        IntExpr(1)))
    Else(
      AssignmentStmt:2(
        NameExpr(x)
        IntExpr(1))
      ReturnStmt:2(
        IntExpr(3))))
  ExpressionStmt:3(
    IntExpr(4)))

[case testIfElseWithSemicolonsNested]
while 2:
    if 1: global x; y = 1
    else: x = 1; return 3
4
[out]
MypyFile:1(
  WhileStmt:1(
    IntExpr(2)
    Block:1(
      IfStmt:2(
        If(
          IntExpr(1))
        Then(
          GlobalDecl:2(
            x)
          AssignmentStmt:2(
            NameExpr(y)
            IntExpr(1)))
        Else(
          AssignmentStmt:3(
            NameExpr(x)
            IntExpr(1))
          ReturnStmt:3(
            IntExpr(3))))))
  ExpressionStmt:4(
    IntExpr(4)))

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

[case testConditionalExpressionInSetComprehension]
{ 1 if x else 2 for x in y }
[out]
MypyFile:1(
  ExpressionStmt:1(
    SetComprehension:1(
      GeneratorExpr:1(
        ConditionalExpr:1(
          Condition(
            NameExpr(x))
          IntExpr(1)
          IntExpr(2))
        NameExpr(x)
        NameExpr(y)))))

[case testConditionalExpressionInListComprehension]
a = [ 1 if x else 2 for x in y ]
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(a)
    ListComprehension:1(
      GeneratorExpr:1(
        ConditionalExpr:1(
          Condition(
            NameExpr(x))
          IntExpr(1)
          IntExpr(2))
        NameExpr(x)
        NameExpr(y)))))

[case testComplexWithLvalue]
with x as y.z: pass
[out]
MypyFile:1(
  WithStmt:1(
    Expr(
      NameExpr(x))
    Target(
      MemberExpr:1(
        NameExpr(y)
        z))
    Block:1(
      PassStmt:1())))

[case testRelativeImportWithEllipsis]
from ... import x
[out]
MypyFile:1(
  ImportFrom:1(..., [x]))

[case testRelativeImportWithEllipsis2]
from .... import x
[out]
MypyFile:1(
  ImportFrom:1(...., [x]))

[case testParseExtendedSlicing]
a[:, :]
[out]
MypyFile:1(
  ExpressionStmt:1(
    IndexExpr:1(
      NameExpr(a)
      TupleExpr:-1(
        SliceExpr:-1(
          <empty>
          <empty>)
        SliceExpr:-1(
          <empty>
          <empty>)))))

[case testParseExtendedSlicing2]
a[1:2:, :,]
[out]
MypyFile:1(
  ExpressionStmt:1(
    IndexExpr:1(
      NameExpr(a)
      TupleExpr:-1(
        SliceExpr:-1(
          IntExpr(1)
          IntExpr(2))
        SliceExpr:-1(
          <empty>
          <empty>)))))

[case testParseExtendedSlicing3]
a[1:2:3, ..., 1]
[out]
MypyFile:1(
  ExpressionStmt:1(
    IndexExpr:1(
      NameExpr(a)
      TupleExpr:-1(
        SliceExpr:-1(
          IntExpr(1)
          IntExpr(2)
          IntExpr(3))
        Ellipsis
        IntExpr(1)))))

[case testParseIfExprInDictExpr]
test =  { 'spam': 'eggs' if True else 'bacon' }
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(test)
    DictExpr:1(
      StrExpr(spam)
      ConditionalExpr:1(
        Condition(
          NameExpr(True))
        StrExpr(eggs)
        StrExpr(bacon)))))

[case testIgnoreLine]
import x # type: ignore
[out]
MypyFile:1(
  Import:1(x)
  IgnoredLines(1))

[case testIgnore2Lines]
x
y # type: ignore
z # type: ignore
[out]
MypyFile:1(
  ExpressionStmt:1(
    NameExpr(x))
  ExpressionStmt:2(
    NameExpr(y))
  ExpressionStmt:3(
    NameExpr(z))
  IgnoredLines(2, 3))

[case testCommentedOutIgnoreAnnotation]
y ## type: ignore
[out]
MypyFile:1(
  ExpressionStmt:1(
    NameExpr(y)))

[case testInvalidIgnoreAnnotations]
y # type: ignored
y # type: IGNORE
y # type : ignore
[out]
MypyFile:1(
  ExpressionStmt:1(
    NameExpr(y))
  ExpressionStmt:2(
    NameExpr(y))
  ExpressionStmt:3(
    NameExpr(y)))

[case testSpaceInIgnoreAnnotations]
y #  type:  ignore    # foo
y #type:ignore
[out]
MypyFile:1(
  ExpressionStmt:1(
    NameExpr(y))
  ExpressionStmt:2(
    NameExpr(y))
  IgnoredLines(1, 2))

[case testIgnoreAnnotationAndMultilineStatement]
x = {
  1: 2  # type: ignore
}
y = {   # type: ignore
  1: 2
}       # type: ignore
[out]
MypyFile:1(
  AssignmentStmt:1(
    NameExpr(x)
    DictExpr:1(
      IntExpr(1)
      IntExpr(2)))
  AssignmentStmt:4(
    NameExpr(y)
    DictExpr:4(
      IntExpr(1)
      IntExpr(2)))
  IgnoredLines(2, 4, 6))

[case testIgnoreAnnotationAndMultilineStatement2]
from m import ( # type: ignore
  x, y
)
[out]
MypyFile:1(
  ImportFrom:1(m, [x, y])
  IgnoredLines(1))

[case testYieldExpression]
def f():
    x = yield f()
[out]
MypyFile:1(
  FuncDef:1(
    f
    Block:1(
      AssignmentStmt:2(
        NameExpr(x)
        YieldExpr:2(
          CallExpr:2(
            NameExpr(f)
            Args()))))))

[case testForWithSingleItemTuple]
for x in 1,: pass
[out]
MypyFile:1(
  ForStmt:1(
    NameExpr(x)
    TupleExpr:1(
      IntExpr(1))
    Block:1(
      PassStmt:1())))

[case testIsoLatinUnixEncoding]
# coding: iso-latin-1-unix
[out]
MypyFile:1()

[case testLatinUnixEncoding]
# coding: latin-1-unix
[out]
MypyFile:1()

[case testLatinUnixEncoding]
# coding: iso-latin-1
[out]
MypyFile:1()

[case testYieldExpressionInParens]
def f():
    (yield)
[out]
MypyFile:1(
  FuncDef:1(
    f
    Block:1(
      ExpressionStmt:2(
        YieldExpr:2()))))
