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 ()
)
}
});
}