private EXPR BindWinRTEventAccessor(EventWithType ewt, EXPR callingObject, ArgumentObject[] arguments, Dictionary<int, LocalVariableSymbol> dictionary, bool isAddAccessor)
{
// We want to generate either:
// WindowsRuntimeMarshal.AddEventHandler<delegType>(new Func<delegType, EventRegistrationToken>(x.add_foo), new Action<EventRegistrationToken>(x.remove_foo), value)
// or
// WindowsRuntimeMarshal.RemoveEventHandler<delegType>(new Action<EventRegistrationToken>(x.remove_foo), value)
Type evtType = ewt.Event().type.AssociatedSystemType;
// Get new Action<EventRegistrationToken>(x.remove_foo)
MethPropWithInst removemwi = new MethPropWithInst(ewt.Event().methRemove, ewt.Ats);
EXPRMEMGRP removeMethGrp = _exprFactory.CreateMemGroup(callingObject, removemwi);
removeMethGrp.flags &= ~EXPRFLAG.EXF_USERCALLABLE;
Type eventRegistrationTokenType = SymbolTable.EventRegistrationTokenType;
Type actionType = Expression.GetActionType(eventRegistrationTokenType);
EXPR removeMethArg = _binder.mustConvert(removeMethGrp, _symbolTable.GetCTypeFromType(actionType));
// The value
EXPR delegateVal = CreateArgumentEXPR(arguments[1], dictionary[1]);
EXPRLIST args;
string methodName;
if (isAddAccessor)
{
// Get new Func<delegType, EventRegistrationToken>(x.add_foo)
MethPropWithInst addmwi = new MethPropWithInst(ewt.Event().methAdd, ewt.Ats);
EXPRMEMGRP addMethGrp = _exprFactory.CreateMemGroup(callingObject, addmwi);
addMethGrp.flags &= ~EXPRFLAG.EXF_USERCALLABLE;
Type funcType = Expression.GetFuncType(evtType, eventRegistrationTokenType);
EXPR addMethArg = _binder.mustConvert(addMethGrp, _symbolTable.GetCTypeFromType(funcType));
args = _exprFactory.CreateList(addMethArg, removeMethArg, delegateVal);
methodName = SymbolLoader.GetNameManager().GetPredefName(PredefinedName.PN_ADDEVENTHANDLER).Text;
}
else
{
args = _exprFactory.CreateList(removeMethArg, delegateVal);
methodName = SymbolLoader.GetNameManager().GetPredefName(PredefinedName.PN_REMOVEEVENTHANDLER).Text;
}
// WindowsRuntimeMarshal.Add\RemoveEventHandler(...)
Type windowsRuntimeMarshalType = SymbolTable.WindowsRuntimeMarshalType;
_symbolTable.PopulateSymbolTableWithName(methodName, new List<Type> { evtType }, windowsRuntimeMarshalType);
EXPRCLASS marshalClass = _exprFactory.CreateClass(_symbolTable.GetCTypeFromType(windowsRuntimeMarshalType), null, null);
EXPRMEMGRP addEventGrp = CreateMemberGroupEXPR(methodName, new List<Type> { evtType }, marshalClass, SYMKIND.SK_MethodSymbol);
EXPR expr = _binder.BindMethodGroupToArguments(
BindingFlag.BIND_RVALUEREQUIRED | BindingFlag.BIND_STMTEXPRONLY,
addEventGrp,
args);
return expr;
}