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(); }
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(); } }