beginCompilationUnit(Logger)
  beginMetadataStar(Logger)
  endMetadataStar(0)
  beginTopLevelMember(Logger)
    beginTopLevelMethod(, null, null)
      handleIdentifier(Logger, typeReference)
      handleNoTypeArguments(get)
      handleType(Logger, null)
      handleIdentifier(log, topLevelFunctionDeclaration)
      handleNoTypeVariables(=>)
      handleNoFormalParameters(=>, MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginParenthesizedExpressionOrRecordLiteral(()
        handleIdentifier(Zone, expression)
        handleNoTypeArguments(.)
        handleNoArguments(.)
        handleSend(Zone, .)
        handleIdentifier(current, expressionContinuation)
        handleNoTypeArguments([)
        handleNoArguments([)
        handleSend(current, [)
        handleEndingBinaryExpression(.)
        handleIdentifier(logKey, expression)
        handleNoTypeArguments(])
        handleNoArguments(])
        handleSend(logKey, ])
        handleIndexedExpression(null, [, ])
        beginAsOperatorType(as)
          handleIdentifier(Logger, typeReference)
          handleNoTypeArguments(?)
          handleType(Logger, ?)
        endAsOperatorType(as)
        handleAsOperator(as)
      endParenthesizedExpression(()
      beginBinaryExpression(??)
        handleIdentifier(_default, expression)
        handleNoTypeArguments(;)
        handleNoArguments(;)
        handleSend(_default, ;)
      endBinaryExpression(??)
      handleExpressionFunctionBody(=>, ;)
    endTopLevelMethod(Logger, get, ;)
  endTopLevelDeclaration()
endCompilationUnit(1, )
