/// <summary> /// Writes many expressions isolated from outer and inner operations by opening, closing and separator characters. /// </summary> /// <param name="context">The Javascript conversion context.</param> /// <param name="opening">First character to render, isolating from outer operation.</param> /// <param name="closing">Last character to render, isolating from outer operation.</param> /// <param name="separator">Separator character to render, isolating one parameter from the other.</param> /// <param name="nodes">Nodes to render.</param> public static JavascriptConversionContext WriteManyIsolated( this JavascriptConversionContext context, char opening, char closing, char separator, IEnumerable <Expression> nodes) { var writer = context.GetWriter(); writer.Write(opening); using (writer.Operation(0)) context.WriteMany(separator, nodes); writer.Write(closing); return(context); }
public override void ConvertToJavascript(JavascriptConversionContext context) { var methodCall = context.Node as MethodCallExpression; if (methodCall != null) { if (methodCall.Method.DeclaringType == typeof(string)) { switch (methodCall.Method.Name) { case "Concat": { context.PreventDefault(); var writer = context.GetWriter(); using (writer.Operation(JavascriptOperationTypes.Concat)) { if (methodCall.Arguments.Count == 0) { writer.Write("''"); } else { if (GetTypeOfExpression(methodCall.Arguments[0]) != typeof(string)) { writer.Write("''+"); } context.WriteMany('+', methodCall.Arguments); } } return; } case "Join": { context.PreventDefault(); var writer = context.GetWriter(); using (writer.Operation(JavascriptOperationTypes.Call)) { using (writer.Operation(JavascriptOperationTypes.IndexerProperty)) { var pars = methodCall.Method.GetParameters(); if (pars.Length == 4 && pars[1].ParameterType.IsArray && pars[2].ParameterType == typeof(int) && pars[3].ParameterType == typeof(int)) { throw new NotSupportedException("The `String.Join` method with start and count paramaters is not supported."); } if (pars.Length != 2 || !TypeHelpers.IsEnumerableType(pars[1].ParameterType)) { throw new NotSupportedException("This `String.Join` method is not supported."); } // if second parameter is an enumerable, render it directly context.Visitor.Visit(methodCall.Arguments[1]); writer.Write(".join"); } writer.Write('('); // separator using (writer.Operation(0)) context.Visitor.Visit(methodCall.Arguments[0]); writer.Write(')'); } return; } } } } }