public override bool VisitInvocationExpression(InvocationExpression invocationExpression)
		{
			bool result = base.VisitInvocationExpression(invocationExpression);
			var rr = invocationExpression.GetResolveResult();
			if (rr != null && rr.Type is PointerType)
				return true;
			return result;
		}
        public override bool VisitInvocationExpression(InvocationExpression invocationExpression)
        {
            bool result = base.VisitInvocationExpression(invocationExpression);
            var  rr     = invocationExpression.GetResolveResult();

            if (IsPointer(rr?.Type))
            {
                return(true);
            }
            return(result);
        }
Beispiel #3
0
        public override void VisitInvocationExpression(InvocationExpression invocationExpression)
        {
            base.VisitInvocationExpression(invocationExpression);
            if (!CanTransformToExtensionMethodCall(resolver, invocationExpression, out var memberRefExpr,
                                                   out var target, out var firstArgument))
            {
                return;
            }
            var method = (IMethod)invocationExpression.GetSymbol();

            if (firstArgument is DirectionExpression dirExpr)
            {
                if (!context.Settings.RefExtensionMethods || dirExpr.FieldDirection == FieldDirection.Out)
                {
                    return;
                }
                firstArgument = dirExpr.Expression;
                target        = firstArgument.GetResolveResult();
                dirExpr.Detach();
            }
            else if (firstArgument is NullReferenceExpression)
            {
                Debug.Assert(context.RequiredNamespacesSuperset.Contains(method.Parameters[0].Type.Namespace));
                firstArgument = firstArgument.ReplaceWith(expr => new CastExpression(context.TypeSystemAstBuilder.ConvertType(method.Parameters[0].Type), expr.Detach()));
            }
            if (invocationExpression.Target is IdentifierExpression identifierExpression)
            {
                identifierExpression.Detach();
                memberRefExpr = new MemberReferenceExpression(firstArgument.Detach(), method.Name, identifierExpression.TypeArguments.Detach());
                invocationExpression.Target = memberRefExpr;
            }
            else
            {
                memberRefExpr.Target = firstArgument.Detach();
            }
            if (invocationExpression.GetResolveResult() is CSharpInvocationResolveResult irr)
            {
                // do not forget to update the CSharpInvocationResolveResult => set IsExtensionMethodInvocation == true
                invocationExpression.RemoveAnnotations <CSharpInvocationResolveResult>();
                var newResolveResult = new CSharpInvocationResolveResult(
                    irr.TargetResult, irr.Member, irr.Arguments, irr.OverloadResolutionErrors,
                    isExtensionMethodInvocation: true, irr.IsExpandedForm, irr.IsDelegateInvocation,
                    irr.GetArgumentToParameterMap(), irr.InitializerStatements);
                invocationExpression.AddAnnotation(newResolveResult);
            }
        }
        public override bool VisitInvocationExpression(InvocationExpression invocationExpression)
        {
            bool result = base.VisitInvocationExpression(invocationExpression);
            var  rr     = invocationExpression.GetResolveResult();

            if (IsUnsafeType(rr?.Type))
            {
                return(true);
            }
            if ((rr as MemberResolveResult)?.Member is IParameterizedMember pm)
            {
                if (pm.Parameters.Any(p => IsUnsafeType(p.Type)))
                {
                    return(true);
                }
            }
            return(result);
        }
        public override void VisitInvocationExpression(InvocationExpression invocationExpression)
        {
            base.VisitInvocationExpression(invocationExpression);
            var method = invocationExpression.GetSymbol() as IMethod;

            if (method == null || !method.IsExtensionMethod || !invocationExpression.Arguments.Any())
            {
                return;
            }
            IReadOnlyList <IType>     typeArguments;
            MemberReferenceExpression memberRefExpr;

            switch (invocationExpression.Target)
            {
            case MemberReferenceExpression mre:
                typeArguments = mre.TypeArguments.Any() ? method.TypeArguments : EmptyList <IType> .Instance;
                memberRefExpr = mre;
                break;

            case IdentifierExpression ide:
                typeArguments = ide.TypeArguments.Any() ? method.TypeArguments : EmptyList <IType> .Instance;
                memberRefExpr = null;
                break;

            default: return;
            }

            var firstArgument = invocationExpression.Arguments.First();

            if (firstArgument is NamedArgumentExpression)
            {
                return;
            }
            var target = firstArgument.GetResolveResult();

            if (target is ConstantResolveResult crr && crr.ConstantValue == null)
            {
                target = new ConversionResolveResult(method.Parameters[0].Type, crr, Conversion.NullLiteralConversion);
            }
            ResolveResult[] args     = new ResolveResult[invocationExpression.Arguments.Count - 1];
            string[]        argNames = null;
            int             pos      = 0;

            foreach (var arg in invocationExpression.Arguments.Skip(1))
            {
                if (arg is NamedArgumentExpression nae)
                {
                    if (argNames == null)
                    {
                        argNames = new string[args.Length];
                    }
                    argNames[pos] = nae.Name;
                    args[pos]     = nae.Expression.GetResolveResult();
                }
                else
                {
                    args[pos] = arg.GetResolveResult();
                }
                pos++;
            }
            if (!CanTransformToExtensionMethodCall(resolver, method, typeArguments, target, args, argNames))
            {
                return;
            }
            if (firstArgument is DirectionExpression dirExpr)
            {
                if (!context.Settings.RefExtensionMethods || dirExpr.FieldDirection == FieldDirection.Out)
                {
                    return;
                }
                firstArgument = dirExpr.Expression;
                target        = firstArgument.GetResolveResult();
                dirExpr.Detach();
            }
            else if (firstArgument is NullReferenceExpression)
            {
                Debug.Assert(context.RequiredNamespacesSuperset.Contains(method.Parameters[0].Type.Namespace));
                firstArgument = firstArgument.ReplaceWith(expr => new CastExpression(context.TypeSystemAstBuilder.ConvertType(method.Parameters[0].Type), expr.Detach()));
            }
            if (invocationExpression.Target is IdentifierExpression identifierExpression)
            {
                identifierExpression.Detach();
                memberRefExpr = new MemberReferenceExpression(firstArgument.Detach(), method.Name, identifierExpression.TypeArguments.Detach());
                invocationExpression.Target = memberRefExpr;
            }
            else
            {
                memberRefExpr.Target = firstArgument.Detach();
            }
            if (invocationExpression.GetResolveResult() is CSharpInvocationResolveResult irr)
            {
                // do not forget to update the CSharpInvocationResolveResult => set IsExtensionMethodInvocation == true
                invocationExpression.RemoveAnnotations <CSharpInvocationResolveResult>();
                var newResolveResult = new CSharpInvocationResolveResult(
                    irr.TargetResult, irr.Member, irr.Arguments, irr.OverloadResolutionErrors,
                    isExtensionMethodInvocation: true, irr.IsExpandedForm, irr.IsDelegateInvocation,
                    irr.GetArgumentToParameterMap(), irr.InitializerStatements);
                invocationExpression.AddAnnotation(newResolveResult);
            }
        }