Problems reported:

parser/error_recovery/for_in_with_colon:6:13: For-in loops use 'in' rather than a colon.
  for(int i : [1, 2, 3]) {
            ^

beginCompilationUnit(main)
  beginMetadataStar(main)
  endMetadataStar(0)
  beginTopLevelMember(main)
    beginTopLevelMethod(, null)
      handleNoType()
      handleIdentifier(main, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        beginForStatement(for)
          beginMetadataStar(int)
          endMetadataStar(0)
          handleIdentifier(int, typeReference)
          handleNoTypeArguments(i)
          handleType(int, null)
          beginVariablesDeclaration(i, null, null)
            handleIdentifier(i, localVariableDeclaration)
            beginInitializedIdentifier(i)
              handleNoVariableInitializer(i)
            endInitializedIdentifier(i)
          endVariablesDeclaration(1, null)
          handleForInitializerLocalVariableDeclaration(i, true)
          handleRecoverableError(ColonInPlaceOfIn, :, :)
          beginForInExpression([)
            handleNoTypeArguments([)
            handleLiteralInt(1)
            handleLiteralInt(2)
            handleLiteralInt(3)
            handleLiteralList(3, [, null, ])
          endForInExpression())
          handleForInLoopParts(null, for, (, :)
          beginForInBody({)
            beginBlock({, BlockKind(statement))
              handleIdentifier(print, expression)
              handleNoTypeArguments(()
              beginArguments(()
                handleIdentifier(i, expression)
                handleNoTypeArguments())
                handleNoArguments())
                handleSend(i, ))
              endArguments(1, (, ))
              handleSend(print, ;)
              handleExpressionStatement(;)
            endBlock(1, {, }, BlockKind(statement))
          endForInBody(})
        endForIn(})
      endBlockFunctionBody(1, {, })
    endTopLevelMethod(main, null, })
  endTopLevelDeclaration()
endCompilationUnit(1, )
