private static void WriteIndexOf(MethodTranslationContext context) { context.Translator.Translate(context.Expression.Object, context); var isCaseInsensitive = ArgumentIs(context, 1, true) || GetIsCaseInsensitive(context.Expression); if (isCaseInsensitive) { context.Writer.Write(".toLowerCase()"); } context.Writer.Write(".indexOf("); context.Translator.Translate(context.Expression.Arguments[0], context); if (isCaseInsensitive) { context.Writer.Write(".toLowerCase()"); } context.Writer.Write(")"); }
protected static void DefaultIfEmpty(MethodTranslationContext context) { var array = context.Expression.Arguments.First(); var defaultValueExpression = context.Expression.Arguments.Skip(1).FirstOrDefault(); context.Writer.Write("(function(arr){ return arr.length ? arr : ["); if (defaultValueExpression != null) { context.Translator.Translate(defaultValueExpression, context); } else { var enumType = array.GetExpressionType(); var defaultValue = (enumType.GetGenericArguments().FirstOrDefault() ?? typeof(object)).GetDefaultValue(); context.Writer.Write(context.Translator.TranslateValue(defaultValue)); } context.Writer.Write("];})("); context.Writer.Write("("); context.Translator.Translate(array, context); context.Writer.Write(")) "); }
private static void EndsWith(MethodTranslationContext context) { /* * √ public bool EndsWith(String value); * √ public bool EndsWith(String value, bool ignoreCase, CultureInfo culture); * √ public bool EndsWith(String value, StringComparison comparisonType); * √ public bool EndsWith(char value); */ context.Writer.Write("("); WriteIndexOf(context); context.Writer.Write(context.Negated ? "< 0 || " : ">= 0 && "); WriteIndexOf(context); context.Writer.Write(context.Negated ? " !== (" : " === ("); context.Translator.Translate(context.Expression.Object, context); context.Writer.Write(".length - "); context.Translator.Translate(context.Expression.Arguments[0], context); context.Writer.Write(".length)"); context.Writer.Write(")"); }
private static void Equals(MethodTranslationContext context) { /* * √ public static bool Equals(String a, String b, StringComparison comparisonType); * √ public static bool Equals(String a, String b); * √ public bool Equals(String b, StringComparison comparisonType); * √ public bool Equals(String b); */ Expression value1; Expression value2; if (context.Expression.Method.IsStatic) { value1 = context.Expression.Arguments.First(); value2 = context.Expression.Arguments.Skip(1).First(); } else { value1 = context.Expression.Object; value2 = context.Expression.Arguments.First(); } context.Translator.Translate(value1, context); var isCaseInsensitive = GetIsCaseInsensitive(context.Expression); if (isCaseInsensitive) { context.Writer.Write(".toLowerCase()"); } context.Writer.Write(context.Negated ? "!==" : " === "); WriteArguments(context.Translator, new[] { value2 }, context); if (isCaseInsensitive) { context.Writer.Write(".toLowerCase()"); } }
private static void Contains(MethodTranslationContext context) { /* * √ public bool Contains(String value) */ context.Translator.Translate(context.Expression.Object, context); var isCaseInsensitive = GetIsCaseInsensitive(context.Expression); if (isCaseInsensitive) { context.Writer.Write(".toLowerCase()"); } context.Writer.Write(".indexOf("); WriteArguments(context.Translator, context.Expression.Arguments, context); if (isCaseInsensitive) { context.Writer.Write(".toLowerCase()"); } context.Writer.Write(context.Negated ? ") < 0" : ") >= 0"); }
private static void Compare(MethodTranslationContext context) { /* * Х public static int Compare(String strA, int indexA, String strB, int indexB, int length, bool ignoreCase); * Х public static int Compare(String strA, int indexA, String strB, int indexB, int length, StringComparison comparisonType); * √ public static int Compare(String strA, String strB); * √ public static int Compare(String strA, String strB, bool ignoreCase); * √! public static int Compare(String strA, String strB, bool ignoreCase, CultureInfo culture); * √ public static int Compare(String strA, String strB, CultureInfo culture, CompareOptions options); * Х public static int Compare(String strA, int indexA, String strB, int indexB, int length, bool ignoreCase, CultureInfo culture); * Х public static int Compare(String strA, int indexA, String strB, int indexB, int length, CultureInfo culture, CompareOptions context); * √ public static int Compare(String strA, String strB, StringComparison comparisonType); * Х public static int Compare(String strA, int indexA, String strB, int indexB, int length); */ if (context.Expression.Method.GetParameters().Any(p => p.ParameterType == typeof(int))) { throw new MethodNotSupportedException(context.Expression, "Only override without any indexes can be translated to JavaScript"); } var arguments = context.Expression.Arguments; context.Translator.Translate(arguments.FirstOrDefault(), context); var isCaseInsensitive = ArgumentIs(context, 2, true) || GetIsCaseInsensitive(context.Expression); if (isCaseInsensitive) { context.Writer.Write(".toLowerCase()"); } context.Writer.Write(".localeCompare("); context.Translator.Translate(arguments[1], context); if (isCaseInsensitive) { context.Writer.Write(".toLowerCase()"); } context.Writer.Write(")"); }
private static void IndexOf(MethodTranslationContext context) { /* * √ public int IndexOf(char value); * Х public int IndexOf(char value, int startIndex); * Х public int IndexOf(char value, int startIndex, int count); * √ public int IndexOf(String value); * Х public int IndexOf(String value, int startIndex, int count); * Х public int IndexOf(String value, int startIndex, int count, StringComparison comparisonType); * Х public int IndexOf(String value, int startIndex, StringComparison comparisonType); * √ public int IndexOf(String value, StringComparison comparisonType); * Х public int IndexOf(String value, int startIndex); */ if (context.Expression.Method.GetParameters().Any(p => p.ParameterType == typeof(int))) { throw new MethodNotSupportedException(context.Expression, "Only override without any indexes can be translated to JavaScript"); } var arguments = context.Expression.Arguments; context.Translator.Translate(context.Expression.Object, context); var isCaseInsensitive = GetIsCaseInsensitive(context.Expression); if (isCaseInsensitive) { context.Writer.Write(".toLowerCase()"); } context.Writer.Write(".indexOf("); context.Translator.Translate(arguments[1], context); if (isCaseInsensitive) { context.Writer.Write(".toLowerCase()"); } context.Writer.Write(")"); }
private static void TranslateAnyMethod(MethodTranslationContext context) { context.Writer.Write("Dryvue.validateAsync('"); context.Writer.Write(context.Expression.Method.Name); context.Writer.Write("', {"); var sep = string.Empty; var method = context.Expression.Method; var methodParameters = method.GetParameters(); var i = 0; foreach (var argument in context.Expression.Arguments) { var parameter = methodParameters[i++]; context.Writer.Write(sep); context.Writer.Write(parameter.Name); context.Writer.Write(": "); context.Translator.Translate(argument, context); sep = ",\n"; } context.Writer.Write("})"); }
protected static void Sum(MethodTranslationContext context) { Reduce(context, "return a+b"); }
private static void Error(MethodTranslationContext context) { context.Writer.Write("{ type:'error', message:"); context.Translator.Translate(context.Expression.Arguments.First(), context); context.Writer.Write(" }"); }
protected static void Count(MethodTranslationContext context) { TranslateSelect(context, "return arr.length;"); }
protected static void Last(MethodTranslationContext context) { TranslateSelect(context, "return arr[arr.length - 1];"); }
protected static void Any(MethodTranslationContext context) { Translate(context, "some"); }
protected static void Average(MethodTranslationContext context) { context.Writer.Write("(function(){var _c = 0; return "); Reduce(context, "++_c; return a + b"); context.Writer.Write(" / (_c > 0 ? _c + 1 : 0);})()"); }
protected static void LastOrDefault(MethodTranslationContext context) { TranslateSelect(context, "return arr.length ? arr[arr.length - 1] : null;"); }
protected static void All(MethodTranslationContext context) { Translate(context, "every"); }
private static void Success(MethodTranslationContext context) { context.Writer.Write("null"); }
protected static void SingleOrDefault(MethodTranslationContext context) { TranslateSelect(context, "return arr.length == 1 ? arr[0] : null;"); }
protected static void Single(MethodTranslationContext context) { TranslateSelect(context, "return arr[0];"); }
protected static void Select(MethodTranslationContext context) { Translate(context, "map"); }
protected static void Min(MethodTranslationContext context) { Reduce(context, "return a > b ? b : a"); }
private static void Warning(MethodTranslationContext context) { context.Writer.Write("{ type:\"warning\", message:"); context.Translator.Translate(context.Expression.Arguments.First(), context); context.Writer.Write(" }"); }
protected static void Where(MethodTranslationContext context) { Translate(context, "filter"); }