Exemplo n.º 1
0
        protected internal Invocation(NRefactory.InvocationExpression invocationExpression, IScope scope, INRefcatoryExpressionVisitor visitor)
            : base(scope, visitor)
        {
            var methodReference = invocationExpression.Annotation <Mono.Cecil.MethodReference>();

            _invocationExpression = invocationExpression;

            if (methodReference != null)
            {
                MethodInfo methodInfo = null;
                Member = methodInfo = methodReference.GetActualMethod <MethodInfo>();

                if (IsInitializeArray(methodInfo))
                {
                    var first           = _invocationExpression.Arguments.First().AcceptVisitor(Visitor, ParentScope);
                    var invocation      = _invocationExpression.Arguments.Last() as NRefactory.InvocationExpression;
                    var second          = invocation.Arguments.First();
                    var memberReference = invocationExpression.Target as NRefactory.MemberReferenceExpression;
                    var target          = memberReference.Target as NRefactory.TypeReferenceExpression;
                    var type            = target.Type.GetActualType();
                    var parameters      = methodReference.Parameters;
                    return;
                }
            }

            BuildInvocation();
        }
Exemplo n.º 2
0
        private void BuildInvocation()
        {
            var target     = _invocationExpression.Target;
            var expression = target.AcceptVisitor(Visitor, ParentScope);

            switch (expression.AstNodeType)
            {
            case AstExpressionType.MemberReference:

                var memberReference             = expression as MemberReference;
                var memberType                  = memberReference.Member.MemberType;
                Action <MemberReference> action = null;

                switch (memberType)
                {
                case MemberTypes.Event:
                case MemberTypes.TypeInfo:

                    throw new NotSupportedException();

                case MemberTypes.Field:

                    action          = BuildFieldInvocation;
                    _reduceFunction = ReduceToFieldInvocation;
                    break;

                case MemberTypes.Method:

                    var astExpression = memberReference.Expression as AstExpression;

                    if (astExpression != null)
                    {
                        if (astExpression.AstNodeType == AstExpressionType.MethodOf ||
                            astExpression.AstNodeType == AstExpressionType.TypeOf)
                        {
                            action = BuildGetHandleInvocation;
                        }
                        else
                        {
                            action = BuildMethodInvocation;
                        }
                    }
                    else
                    {
                        action = BuildMethodInvocation;
                    }

                    _reduceFunction = ReduceToMethodInvocation;
                    break;

                case MemberTypes.Property:

                    action          = BuildPropertyInvocation;
                    _reduceFunction = ReduceToPropertyInvocation;
                    break;
                }

                action(memberReference);
                break;

            case AstExpressionType.Identifer:

                var identifier = expression as Identifier;
                BuildAnonymousMethodInvocation(identifier);
                _reduceFunction = ReduceToMethodInvocation;
                break;

            case AstExpressionType.Invocation:

                var        invocation      = expression as Invocation;
                var        methodReference = _invocationExpression.Annotation <MethodReference>();
                MethodInfo methodInfo      = methodReference.GetActualMethod <MethodInfo>();
                var        returnType      = methodInfo.ReturnType;

                MethodArguments = GetArguments(methodInfo);
                Instance        = invocation;
                Member          = methodInfo;
                InternalType    = methodInfo.ReturnType;
                _reduceFunction = ReduceToMethodInvocation;
                break;

            default:

                throw new NotSupportedException();
            }
        }