Example #1
0
            private void ProcessCandidateMethodInvocation(Ast.Expression methodInvocationExpression,
                                                          Ast.MethodReferenceExpression methodRef)
            {
                var method = GetMethodDefinition(methodRef);

                if (null == method)
                {
                    UnsupportedExpression(methodInvocationExpression);
                }

                AssertMethodCanBeVisited(methodInvocationExpression, method);

                var expression = GetQueryExpression(method);

                if (null == expression)
                {
                    UnsupportedExpression(methodInvocationExpression);
                }

                EnterCandidateMethod(method);
                try
                {
                    Visit(expression);
                }
                finally
                {
                    LeaveCandidateMethod(method);
                }
            }
Example #2
0
            private void ProcessRegularMethodInvocation(Ast.MethodInvocationExpression node,
                                                        Ast.MethodReferenceExpression methodRef)
            {
                if (node.Arguments.Count != 0)
                {
                    UnsupportedExpression(node);
                }

                var target = methodRef.Target;

                switch (target.CodeElementType)
                {
                case Ast.CodeElementType.ThisReferenceExpression:
                    if (!InsideCandidate)
                    {
                        UnsupportedExpression(node);
                    }
                    ProcessCandidateMethodInvocation(node, methodRef);
                    break;

                case Ast.CodeElementType.ArgumentReferenceExpression:
                    ProcessCandidateMethodInvocation(node, methodRef);
                    break;

                default:
                    Push(ToFieldValue(target));
                    ProcessCandidateMethodInvocation(node, methodRef);
                    break;
                }
            }
Example #3
0
            private void ProcessStringMethod(Ast.MethodInvocationExpression node,
                                             Ast.MethodReferenceExpression methodRef)
            {
                var method = methodRef.Method;

                if (method.Parameters.Count != 1 ||
                    !IsSystemString(method.Parameters[0].ParameterType))
                {
                    UnsupportedExpression(methodRef);
                }

                switch (method.Name)
                {
                case "Contains":
                    PushComparison(methodRef.Target, node.Arguments[0], ComparisonOperator.Contains);
                    break;

                case "StartsWith":
                    PushComparison(methodRef.Target, node.Arguments[0], ComparisonOperator.StartsWith);
                    break;

                case "EndsWith":
                    PushComparison(methodRef.Target, node.Arguments[0], ComparisonOperator.EndsWith);
                    break;

                case "Equals":
                    PushComparison(methodRef.Target, node.Arguments[0], ComparisonOperator.ValueEquality);
                    break;

                default:
                    UnsupportedExpression(methodRef);
                    break;
                }
            }
Example #4
0
        private static MethodDefinition LoadExternalMethodDefinition(Ast.MethodReferenceExpression methodRef)
        {
            var method      = methodRef.Method;
            var assemblyDef = new AssemblyResolver(_assemblyCachingStrategy).ForTypeReference(method.DeclaringType);
            var type        = assemblyDef.MainModule.GetType(method.DeclaringType.FullName);

            return(GetMethod(type, method));
        }
Example #5
0
        private static MethodDefinition GetMethodDefinition(Ast.MethodReferenceExpression methodRef)
        {
            var definition = methodRef.Method as MethodDefinition;

            return(definition ?? LoadExternalMethodDefinition(methodRef));
        }