beginCompilationUnit(void)
  beginMetadataStar(void)
  endMetadataStar(0)
  beginTopLevelMember(void)
    beginTopLevelMethod(, null, null)
      handleVoidKeyword(void)
      handleIdentifier(foo, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        beginMetadataStar(var)
        endMetadataStar(0)
        handleNoType(var)
        beginVariablesDeclaration(record, null, var)
          handleIdentifier(record, localVariableDeclaration)
          beginInitializedIdentifier(record)
            beginVariableInitializer(=)
              beginParenthesizedExpressionOrRecordLiteral(()
                handleLiteralInt(1)
                handleLiteralInt(2)
                handleIdentifier(a, namedRecordFieldReference)
                handleLiteralInt(3)
                handleNamedRecordField(:)
                handleIdentifier(b, namedRecordFieldReference)
                handleLiteralInt(4)
                handleNamedRecordField(:)
              endRecordLiteral((, 4)
            endVariableInitializer(=)
          endInitializedIdentifier(record)
        endVariablesDeclaration(1, ;)
      endBlockFunctionBody(1, {, })
    endTopLevelMethod(void, null, })
  endTopLevelDeclaration()
endCompilationUnit(1, )
