+ if (left == null)
+ left = new TargetExpression (target);
+
+ source = new Binary (op, left, right, true);
+
+ // TODO: TargetExpression breaks MemberAccess composition
+ if (target is DynamicMemberBinder) {
+ Arguments targs = ((DynamicMemberBinder) target).Arguments;
+ source = source.Resolve (ec);
+
+ Arguments args = new Arguments (2);
+ args.AddRange (targs);
+ args.Add (new Argument (source));
+ source = new DynamicMemberBinder (true, ma.Name, args, loc).Resolve (ec);
+
+ // Handles possible event addition/subtraction
+ if (op == Binary.Operator.Addition || op == Binary.Operator.Subtraction) {
+ args = new Arguments (2);
+ args.AddRange (targs);
+ args.Add (new Argument (right));
+ string method_prefix = op == Binary.Operator.Addition ?
+ Event.AEventAccessor.AddPrefix : Event.AEventAccessor.RemovePrefix;
+
+ Expression invoke = new DynamicInvocation (
+ new MemberAccess (right, method_prefix + ma.Name, loc), args, loc).Resolve (ec);
+
+ args = new Arguments (1);
+ args.AddRange (targs);
+ source = new DynamicEventCompoundAssign (ma.Name, args,
+ (ExpressionStatement) source, (ExpressionStatement) invoke, loc).Resolve (ec);
+ }
+
+ return source;
+ }
+