parseUnit(main)
  skipErrorTokens(main)
  listener: beginCompilationUnit(main)
  syntheticPreviousToken(main)
  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
    parseMetadataStar()
      listener: beginMetadataStar(main)
      listener: endMetadataStar(0)
    parseTopLevelMemberImpl()
      listener: beginTopLevelMember(main)
      isReservedKeyword(()
      parseTopLevelMethod(, null, , Instance of 'NoType', null, main, false)
        listener: beginTopLevelMethod(, null)
        listener: handleNoType()
        ensureIdentifierPotentiallyRecovered(, topLevelFunctionDeclaration, false)
          listener: handleIdentifier(main, topLevelFunctionDeclaration)
        parseMethodTypeVar(main)
          listener: handleNoTypeVariables(()
        parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
          parseFormalParameters(main, MemberKind.TopLevelMethod)
            parseFormalParametersRest((, MemberKind.TopLevelMethod)
              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
              listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
        parseAsyncModifierOpt())
          listener: handleAsyncModifier(null, null)
          inPlainSync()
        parseFunctionBody(), false, false)
          listener: beginBlockFunctionBody({)
          notEofOrValue(}, switch)
          parseStatement({)
            parseStatementX({)
              parseSwitchStatement({)
                listener: beginSwitchStatement(switch)
                ensureParenthesizedCondition(switch)
                  parseExpressionInParenthesisRest(()
                    parseExpression(()
                      parsePrecedenceExpression((, 1, true)
                        parseUnaryExpression((, true)
                          parsePrimary((, expression)
                            parseSendOrFunctionLiteral((, expression)
                              parseSend((, expression)
                                isNextIdentifier(()
                                ensureIdentifier((, expression)
                                  listener: handleIdentifier(a, expression)
                                listener: handleNoTypeArguments())
                                parseArgumentsOpt(a)
                                  listener: handleNoArguments())
                                listener: handleSend(a, ))
                    ensureCloseParen(a, ()
                  listener: handleParenthesizedCondition(()
                parseSwitchBlock())
                  ensureBlock(), null, switch statement)
                  listener: beginSwitchBlock({)
                  notEofOrValue(}, case)
                  peekPastLabels(case)
                  listener: beginCaseExpression(case)
                  parseExpression(case)
                    parsePrecedenceExpression(case, 1, true)
                      parseUnaryExpression(case, true)
                        parsePrimary(case, expression)
                          parseSendOrFunctionLiteral(case, expression)
                            parseSend(case, expression)
                              isNextIdentifier(case)
                              ensureIdentifier(case, expression)
                                listener: handleIdentifier(x, expression)
                              listener: handleNoTypeArguments(?)
                              parseArgumentsOpt(x)
                                listener: handleNoArguments(?)
                              listener: handleSend(x, ?)
                      canParseAsConditional(?)
                        parseExpressionWithoutCascade(?)
                          parsePrecedenceExpression(?, 1, false)
                            parseUnaryExpression(?, false)
                              parsePrimary(?, expression)
                                parseLiteralListSuffix(?, null)
                                  parseExpression([)
                                    parsePrecedenceExpression([, 1, true)
                                      parseUnaryExpression([, true)
                                        parsePrimary([, expression)
                                          parseLiteralInt([)
                        parseExpressionWithoutCascade(:)
                          parsePrecedenceExpression(:, 1, false)
                            parseUnaryExpression(:, false)
                              parsePrimary(:, expression)
                                parseSendOrFunctionLiteral(:, expression)
                                  parseSend(:, expression)
                                    isNextIdentifier(:)
                                    ensureIdentifier(:, expression)
                                    parseArgumentsOpt(baz)
                      parseConditionalExpressionRest(x)
                        listener: beginConditionalExpression(?)
                        parseExpressionWithoutCascade(?)
                          parsePrecedenceExpression(?, 1, false)
                            parseUnaryExpression(?, false)
                              parsePrimary(?, expression)
                                listener: handleNoTypeArguments([)
                                parseLiteralListSuffix(?, null)
                                  parseExpression([)
                                    parsePrecedenceExpression([, 1, true)
                                      parseUnaryExpression([, true)
                                        parsePrimary([, expression)
                                          parseLiteralInt([)
                                            listener: handleLiteralInt(4)
                                  listener: handleLiteralList(1, [, null, ])
                        ensureColon(])
                        listener: handleConditionalExpressionColon()
                        parseExpressionWithoutCascade(:)
                          parsePrecedenceExpression(:, 1, false)
                            parseUnaryExpression(:, false)
                              parsePrimary(:, expression)
                                parseSendOrFunctionLiteral(:, expression)
                                  parseSend(:, expression)
                                    isNextIdentifier(:)
                                    ensureIdentifier(:, expression)
                                      listener: handleIdentifier(baz, expression)
                                    listener: handleNoTypeArguments(:)
                                    parseArgumentsOpt(baz)
                                      listener: handleNoArguments(:)
                                    listener: handleSend(baz, :)
                        listener: endConditionalExpression(?, :)
                  ensureColon(baz)
                  listener: endCaseExpression(:)
                  listener: handleCaseMatch(case, :)
                  peekPastLabels(break)
                  parseStatementsInSwitchCase(:, break, case, 0, 1, null, null)
                    listener: beginSwitchCase(0, 1, case)
                    parseStatement(:)
                      parseStatementX(:)
                        parseBreakStatement(:)
                          isBreakAllowed()
                          ensureSemicolon(break)
                          listener: handleBreakStatement(false, break, ;)
                    peekPastLabels(})
                    listener: endSwitchCase(0, 1, null, null, 1, case, })
                  notEofOrValue(}, })
                  listener: endSwitchBlock(1, {, })
                listener: endSwitchStatement(switch, })
          notEofOrValue(}, })
          listener: endBlockFunctionBody(1, {, })
        listener: endTopLevelMethod(main, null, })
  listener: endTopLevelDeclaration()
  reportAllErrorTokens(main)
  listener: endCompilationUnit(1, )
