Statement TransformForeachOnArray(ForStatement forStatement)
        {
            if (!context.Settings.ForEachStatement)
            {
                return(null);
            }
            Match m = forOnArrayPattern.Match(forStatement);

            if (!m.Success)
            {
                return(null);
            }
            var itemVariable  = m.Get <IdentifierExpression>("itemVariable").Single().GetILVariable();
            var indexVariable = m.Get <IdentifierExpression>("indexVariable").Single().GetILVariable();
            var arrayVariable = m.Get <IdentifierExpression>("arrayVariable").Single().GetILVariable();
            var loopContainer = forStatement.Annotation <IL.BlockContainer>();

            if (itemVariable == null || indexVariable == null || arrayVariable == null)
            {
                return(null);
            }
            if (!itemVariable.IsSingleDefinition || (itemVariable.CaptureScope != null && itemVariable.CaptureScope != loopContainer))
            {
                return(null);
            }
            if (indexVariable.StoreCount != 2 || indexVariable.LoadCount != 3 || indexVariable.AddressCount != 0)
            {
                return(null);
            }
            var body = new BlockStatement();

            foreach (var statement in m.Get <Statement>("statements"))
            {
                body.Statements.Add(statement.Detach());
            }
            var foreachStmt = new ForeachStatement {
                VariableType      = context.Settings.AnonymousTypes && itemVariable.Type.ContainsAnonymousType() ? new SimpleType("var") : context.TypeSystemAstBuilder.ConvertType(itemVariable.Type),
                VariableName      = itemVariable.Name,
                InExpression      = m.Get <IdentifierExpression>("arrayVariable").Single().Detach(),
                EmbeddedStatement = body
            };

            foreachStmt.CopyAnnotationsFrom(forStatement);
            itemVariable.Kind = IL.VariableKind.ForeachLocal;
            // Add the variable annotation for highlighting (TokenTextWriter expects it directly on the ForeachStatement).
            foreachStmt.AddAnnotation(new ILVariableResolveResult(itemVariable, itemVariable.Type));
            // TODO : add ForeachAnnotation
            forStatement.ReplaceWith(foreachStmt);
            return(foreachStmt);
        }