public override BoundNode VisitEventAssignmentOperator(BoundEventAssignmentOperator node) { BoundExpression rewrittenReceiverOpt = VisitExpression(node.ReceiverOpt); BoundExpression rewrittenArgument = VisitExpression(node.Argument); if (rewrittenReceiverOpt != null && node.Event.ContainingAssembly.IsLinked && node.Event.ContainingType.IsInterfaceType()) { var @interface = node.Event.ContainingType; foreach (var attrData in @interface.GetAttributes()) { if (attrData.IsTargetAttribute(@interface, AttributeDescription.ComEventInterfaceAttribute) && attrData.CommonConstructorArguments.Length == 2) { return RewriteNoPiaEventAssignmentOperator(node, rewrittenReceiverOpt, rewrittenArgument); } } } if (node.Event.IsWindowsRuntimeEvent) { EventAssignmentKind kind = node.IsAddition ? EventAssignmentKind.Addition : EventAssignmentKind.Subtraction; return RewriteWindowsRuntimeEventAssignmentOperator(node.Syntax, node.Event, kind, node.IsDynamic, rewrittenReceiverOpt, rewrittenArgument); } var rewrittenArguments = ImmutableArray.Create<BoundExpression>(rewrittenArgument); MethodSymbol method = node.IsAddition ? node.Event.AddMethod : node.Event.RemoveMethod; return MakeCall(node.Syntax, rewrittenReceiverOpt, method, rewrittenArguments, node.Type); }
public override BoundNode VisitEventAssignmentOperator(BoundEventAssignmentOperator node) { BoundExpression rewrittenReceiverOpt = VisitExpression(node.ReceiverOpt); BoundExpression rewrittenArgument = VisitExpression(node.Argument); if (rewrittenReceiverOpt != null && node.Event.ContainingAssembly.IsLinked && node.Event.ContainingType.IsInterfaceType()) { var @interface = node.Event.ContainingType; foreach (var attrData in @interface.GetAttributes()) { if (attrData.IsTargetAttribute(@interface, AttributeDescription.ComEventInterfaceAttribute) && attrData.CommonConstructorArguments.Length == 2) { return(RewriteNoPiaEventAssignmentOperator(node, rewrittenReceiverOpt, rewrittenArgument)); } } } if (node.Event.IsWindowsRuntimeEvent) { EventAssignmentKind kind = node.IsAddition ? EventAssignmentKind.Addition : EventAssignmentKind.Subtraction; return(RewriteWindowsRuntimeEventAssignmentOperator(node.Syntax, node.Event, kind, node.IsDynamic, rewrittenReceiverOpt, rewrittenArgument)); } var rewrittenArguments = ImmutableArray.Create <BoundExpression>(rewrittenArgument); MethodSymbol method = node.IsAddition ? node.Event.AddMethod : node.Event.RemoveMethod; return(MakeCall(node.Syntax, rewrittenReceiverOpt, method, rewrittenArguments, node.Type)); }
public override BoundNode VisitEventAssignmentOperator(BoundEventAssignmentOperator node) { if (_inExpressionLambda) { Error(ErrorCode.ERR_ExpressionTreeContainsAssignment, node); } bool hasBaseReceiver = node.ReceiverOpt != null && node.ReceiverOpt.Kind == BoundKind.BaseReference; Binder.ReportDiagnosticsIfObsolete(_diagnostics, node.Event, ((AssignmentExpressionSyntax)node.Syntax).Left, hasBaseReceiver, _containingSymbol, _containingSymbol.ContainingType, BinderFlags.None); CheckReceiverIfField(node.ReceiverOpt); return(base.VisitEventAssignmentOperator(node)); }
private BoundExpression RewriteNoPiaEventAssignmentOperator(BoundEventAssignmentOperator node, BoundExpression rewrittenReceiver, BoundExpression rewrittenArgument) { // In the new NoPIA scenario, myPIA.event += someevent translates into // // new System.Runtime.InteropServices.ComAwareEventInfo(typeof(myPIA), "event").AddEventHandler(myPIA, someevent) BoundExpression result = null; SyntaxNode oldSyntax = _factory.Syntax; _factory.Syntax = node.Syntax; var ctor = _factory.WellKnownMethod(WellKnownMember.System_Runtime_InteropServices_ComAwareEventInfo__ctor); if ((object)ctor != null) { var addRemove = _factory.WellKnownMethod(node.IsAddition ? WellKnownMember.System_Runtime_InteropServices_ComAwareEventInfo__AddEventHandler : WellKnownMember.System_Runtime_InteropServices_ComAwareEventInfo__RemoveEventHandler); if ((object)addRemove != null) { BoundExpression eventInfo = _factory.New(ctor, _factory.Typeof(node.Event.ContainingType), _factory.Literal(node.Event.MetadataName)); result = _factory.Call(eventInfo, addRemove, _factory.Convert(addRemove.Parameters[0].Type, rewrittenReceiver), _factory.Convert(addRemove.Parameters[1].Type, rewrittenArgument)); } } _factory.Syntax = oldSyntax; // The code we just generated doesn't contain any direct references to the event itself, // but the com event binder needs the event to exist on the local type. We'll poke the pia reference // cache directly so that the event is embedded. var module = this.EmitModule; if (module != null) { module.EmbeddedTypesManagerOpt.EmbedEventIfNeedTo(node.Event, node.Syntax, _diagnostics, isUsedForComAwareEventBinding: true); } if (result != null) { return(result); } return(new BoundBadExpression(node.Syntax, LookupResultKind.NotCreatable, ImmutableArray.Create <Symbol>(node.Event), ImmutableArray.Create(rewrittenReceiver, rewrittenArgument), ErrorTypeSymbol.UnknownResultType)); }
private BoundExpression RewriteNoPiaEventAssignmentOperator(BoundEventAssignmentOperator node, BoundExpression rewrittenReceiver, BoundExpression rewrittenArgument) { // In the new NoPIA scenario, myPIA.event += someevent translates into // // new System.Runtime.InteropServices.ComAwareEventInfo(typeof(myPIA), "event").AddEventHandler(myPIA, someevent) BoundExpression result = null; SyntaxNode oldSyntax = _factory.Syntax; _factory.Syntax = node.Syntax; var ctor = _factory.WellKnownMethod(WellKnownMember.System_Runtime_InteropServices_ComAwareEventInfo__ctor); if ((object)ctor != null) { var addRemove = _factory.WellKnownMethod(node.IsAddition ? WellKnownMember.System_Runtime_InteropServices_ComAwareEventInfo__AddEventHandler : WellKnownMember.System_Runtime_InteropServices_ComAwareEventInfo__RemoveEventHandler); if ((object)addRemove != null) { BoundExpression eventInfo = _factory.New(ctor, _factory.Typeof(node.Event.ContainingType), _factory.Literal(node.Event.MetadataName)); result = _factory.Call(eventInfo, addRemove, _factory.Convert(addRemove.Parameters[0].Type, rewrittenReceiver), _factory.Convert(addRemove.Parameters[1].Type, rewrittenArgument)); } } _factory.Syntax = oldSyntax; // The code we just generated doesn't contain any direct references to the event itself, // but the com event binder needs the event to exist on the local type. We'll poke the pia reference // cache directly so that the event is embedded. var module = this.EmitModule; if (module != null) { module.EmbeddedTypesManagerOpt.EmbedEventIfNeedTo(node.Event, node.Syntax, _diagnostics, isUsedForComAwareEventBinding: true); } if (result != null) { return result; } return new BoundBadExpression(node.Syntax, LookupResultKind.NotCreatable, ImmutableArray.Create<Symbol>(node.Event), ImmutableArray.Create<BoundNode>(rewrittenReceiver, rewrittenArgument), ErrorTypeSymbol.UnknownResultType); }
public override BoundNode VisitEventAssignmentOperator(BoundEventAssignmentOperator node) { if (_inExpressionLambda) { Error(ErrorCode.ERR_ExpressionTreeContainsAssignment, node); } bool hasBaseReceiver = node.ReceiverOpt != null && node.ReceiverOpt.Kind == BoundKind.BaseReference; Binder.ReportDiagnosticsIfObsolete(_diagnostics, node.Event, ((AssignmentExpressionSyntax)node.Syntax).Left, hasBaseReceiver, _containingSymbol, _containingSymbol.ContainingType, BinderFlags.None); CheckReceiverIfField(node.ReceiverOpt); return base.VisitEventAssignmentOperator(node); }