public override void VisitMethodDeclaration()

in Clients/CrossBrowser/Xamarin.CrossBrowser.Generator/DomBinder.cs [353:452]


        public override void VisitMethodDeclaration (MethodDeclaration methodDeclaration)
        {
            if (!methodDeclaration.Body.IsNull) {
                base.VisitMethodDeclaration (methodDeclaration);
                return;
            }

            if (methodDeclaration.Name == "ToString" && methodDeclaration.Parameters.Count == 0)
                methodDeclaration.Modifiers |= Modifiers.Override;

            methodDeclaration.Modifiers |= Modifiers.Public;
            methodDeclaration.Body = new BlockStatement {
                BindMethodBody (methodDeclaration)
            };

            base.VisitMethodDeclaration (methodDeclaration);

            if (IsIgnored (methodDeclaration))
                methodDeclaration.Remove ();

            RemoveAttributes (methodDeclaration.Attributes);

            var typeDeclaration = methodDeclaration.GetParent<TypeDeclaration> ();
            if (typeDeclaration == null ||
                !CurrentTypeData.IsReadOnlyList ||
                methodDeclaration.Name != "Item")
                return;

            var indexerDeclaration = new IndexerDeclaration {
                Modifiers = Modifiers.Public,
                ReturnType = methodDeclaration.ReturnType.Clone (),
                Getter = new Accessor {
                    Body = (BlockStatement)methodDeclaration.Body.Clone ()
                }
            };

            foreach (var param in methodDeclaration.Parameters)
                indexerDeclaration.Parameters.Add (param.Clone ());

            methodDeclaration.ReplaceWith (indexerDeclaration);

            typeDeclaration.BaseTypes.Add (
                new SimpleType ("IReadOnlyList", methodDeclaration.ReturnType.Clone ())
            );

            var forStatement = new ForStatement {
                Initializers = {
                    new VariableDeclarationStatement (
                        indexerDeclaration.Parameters.First ().Type.Clone (),
                        "i",
                        new PrimitiveExpression (0)
                    ),
                    new ExpressionStatement (
                        new AssignmentExpression (
                            new IdentifierExpression ("n"),
                            new IdentifierExpression ("Count")
                        )
                    )
                },
                Condition = new BinaryOperatorExpression (
                    new IdentifierExpression ("i"),
                    BinaryOperatorType.LessThan,
                    new IdentifierExpression ("n")
                ),
                Iterators = {
                    new ExpressionStatement (
                        new UnaryOperatorExpression (
                            UnaryOperatorType.PostIncrement,
                            new IdentifierExpression ("i")
                        )
                    )
                },
                EmbeddedStatement = new YieldReturnStatement {
                    Expression = new IndexerExpression (
                        new ThisReferenceExpression (),
                        new IdentifierExpression ("i")
                    )
                },

            };

            typeDeclaration.Members.Add (new MethodDeclaration {
                Modifiers = Modifiers.Public,
                Name = "GetEnumerator",
                ReturnType = new SimpleType ("IEnumerator", methodDeclaration.ReturnType.Clone ()),
                Body = new BlockStatement {
                    forStatement
                }
            });

            typeDeclaration.Members.Add (new MethodDeclaration {
                Name = "IEnumerable.GetEnumerator",
                ReturnType = AstType.Create ("IEnumerator"),
                Body = new BlockStatement {
                    new ReturnStatement (
                        new IdentifierExpression ("GetEnumerator").Invoke ()
                    )
                }
            });
        }