public static ITranslation For(MethodCallExpression methodCall, ITranslationContext context) { if (methodCall.Method.IsPropertyGetterOrSetterCall(out var property)) { var getterTranslation = new PropertyGetterTranslation(methodCall, property, context); if (methodCall.HasReturnType()) { return(getterTranslation); } return(new PropertySetterTranslation(methodCall, getterTranslation, context)); } if (IsStringConcatCall(methodCall)) { return(new StringConcatenationTranslation(Call, methodCall.Arguments, context)); } var method = new BclMethodWrapper(methodCall.Method); var parameters = ParameterSetTranslation.For(method, methodCall.Arguments, context); if (methodCall.Method.IsImplicitOperator()) { return(new CodeBlockTranslation(parameters[0], context).WithNodeType(Call)); } var subject = methodCall.GetSubjectTranslation(context); if (IsIndexedPropertyAccess(methodCall)) { return(new IndexAccessTranslation(subject, parameters, methodCall.Type)); } parameters = parameters.WithParentheses(); if (methodCall.Method.IsExplicitOperator()) { return(CastTranslation.ForExplicitOperator( parameters[0], context.GetTranslationFor(methodCall.Method.ReturnType))); } var methodCallTranslation = new StandardMethodCallTranslation(Call, subject, method, parameters, context); if (context.IsPartOfMethodCallChain(methodCall)) { methodCallTranslation.AsPartOfMethodCallChain(); } return(methodCallTranslation); }