beginCompilationUnit(class)
  beginMetadataStar(class)
  endMetadataStar(0)
  beginClassOrMixinOrNamedMixinApplicationPrelude(class)
    handleIdentifier(Foo, classOrMixinDeclaration)
    handleNoTypeVariables({)
    beginClassDeclaration(class, null, null, null, Foo)
      handleNoType(Foo)
      handleClassExtends(null, 1)
      handleClassNoWithClause()
      handleImplements(null, 0)
      handleClassHeader(class, class, null)
      beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
        beginMetadataStar(String)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Class, null, null, null, null, null, null, null, {)
            handleIdentifier(String, typeReference)
            handleNoTypeArguments(?)
            handleType(String, ?)
            handleIdentifier(x, fieldDeclaration)
            handleNoFieldInitializer(;)
          endClassFields(null, null, null, null, null, null, null, 1, String, ;)
        endMember()
        beginMetadataStar(int)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Class, null, null, null, null, null, null, null, ;)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(y)
            handleType(int, null)
            handleIdentifier(y, fieldDeclaration)
            handleNoFieldInitializer(;)
          endClassFields(null, null, null, null, null, null, null, 1, int, ;)
        endMember()
        beginMetadataStar(Foo)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, null, null, null, null, null, null, Foo)
            handleNoType(;)
            handleIdentifier(Foo, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
              beginMetadataStar(Object)
              endMetadataStar(0)
              beginFormalParameter(Object, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(Object, typeReference)
                handleNoTypeArguments(?)
                handleType(Object, ?)
                handleIdentifier(o, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, null, o, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
            endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
            beginInitializers(:)
              beginInitializer(x)
                handleIdentifier(x, expression)
                handleNoTypeArguments(=)
                handleNoArguments(=)
                handleSend(x, =)
                handleIdentifier(o, expression)
                handleNoTypeArguments(as)
                handleNoArguments(as)
                handleSend(o, as)
                beginAsOperatorType(as)
                  handleIdentifier(String, typeReference)
                  handleNoTypeArguments(,)
                  handleType(String, null)
                endAsOperatorType(as)
                handleAsOperator(as)
                handleAssignmentExpression(=)
              endInitializer(,)
              beginInitializer(y)
                handleIdentifier(y, expression)
                handleNoTypeArguments(=)
                handleNoArguments(=)
                handleSend(y, =)
                handleLiteralInt(0)
                handleAssignmentExpression(=)
              endInitializer(;)
            endInitializers(2, :, ;)
            handleAsyncModifier(null, null)
            handleEmptyFunctionBody(;)
          endClassConstructor(null, Foo, (, :, ;)
        endMember()
      endClassOrMixinOrExtensionBody(DeclarationKind.Class, 3, {, })
    endClassDeclaration(class, })
  endTopLevelDeclaration()
endCompilationUnit(1, )
