Example #1
0
        public override BoundNode VisitDelegateCreationExpression(BoundDelegateCreationExpression node)
        {
            BoundSpillSequenceBuilder builder = null;
            var argument = VisitExpression(ref builder, node.Argument);

            return(UpdateExpression(builder, node.Update(argument, node.MethodOpt, node.IsExtensionMethod, node.Type)));
        }
        public override BoundNode VisitDelegateCreationExpression(BoundDelegateCreationExpression node)
        {
            if (node.Argument.HasDynamicType())
            {
                var loweredArgument = VisitExpression(node.Argument);

                // Creates a delegate whose instance is the delegate that is returned by the call-site and the method is Invoke.
                var loweredReceiver = _dynamicFactory.MakeDynamicConversion(loweredArgument, isExplicit: false, isArrayIndex: false, isChecked: false, resultType: node.Type).ToExpression();

                return(new BoundDelegateCreationExpression(node.Syntax, loweredReceiver, methodOpt: null, isExtensionMethod: false, type: node.Type));
            }

            if (node.Argument.Kind == BoundKind.MethodGroup)
            {
                var mg        = (BoundMethodGroup)node.Argument;
                var method    = node.MethodOpt;
                var oldSyntax = _factory.Syntax;
                _factory.Syntax = (mg.ReceiverOpt ?? mg).Syntax;
                var receiver = (!method.RequiresInstanceReceiver && !node.IsExtensionMethod) ? _factory.Type(method.ContainingType) : VisitExpression(mg.ReceiverOpt);
                _factory.Syntax = oldSyntax;
                return(node.Update(receiver, method, node.IsExtensionMethod, node.Type));
            }

            return(base.VisitDelegateCreationExpression(node));
        }
        public override BoundNode VisitDelegateCreationExpression(BoundDelegateCreationExpression node)
        {
            BoundExpression argument = (BoundExpression)this.Visit(node.Argument);
            TypeSymbol      type     = this.VisitType(node.Type);

            if (argument.Kind != BoundKind.SpillSequence)
            {
                return(node.Update(argument, node.MethodOpt, node.IsExtensionMethod, type));
            }

            var spill = (BoundSpillSequence)argument;

            return(RewriteSpillSequence(spill,
                                        node.Update(
                                            spill.Value,
                                            node.MethodOpt,
                                            node.IsExtensionMethod,
                                            type)));
        }
Example #4
0
 public override BoundNode VisitDelegateCreationExpression(BoundDelegateCreationExpression node)
 {
     BoundSpillSequence2 ss = null;
     var argument = VisitExpression(ref ss, node.Argument);
     return UpdateExpression(ss, node.Update(argument, node.MethodOpt, node.IsExtensionMethod, node.Type));
 }
        public override BoundNode VisitDelegateCreationExpression(BoundDelegateCreationExpression node)
        {
            BoundExpression argument = (BoundExpression)this.Visit(node.Argument);
            TypeSymbol type = this.VisitType(node.Type);

            if (argument.Kind != BoundKind.SpillSequence)
            {
                return node.Update(argument, node.MethodOpt, node.IsExtensionMethod, type);
            }

            var spill = (BoundSpillSequence)argument;
            return RewriteSpillSequence(spill,
                node.Update(
                    spill.Value,
                    node.MethodOpt,
                    node.IsExtensionMethod,
                    type));
        }