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); } }
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; } }
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; } }
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)); }
private static MethodDefinition GetMethodDefinition(Ast.MethodReferenceExpression methodRef) { var definition = methodRef.Method as MethodDefinition; return(definition ?? LoadExternalMethodDefinition(methodRef)); }